407 lines
11 KiB
JavaScript
Raw Permalink Normal View History

2026-07-27 11:28:33 +08:00
const utils = require("../utils");
const qrcodeStatistics = require("./qrcodeStatistics");
const staffqrcodeCate = require("./staff-qrcode-cate");
const dayjs = require("dayjs");
const common = require("../../common");
const api = require("../../api");
let db = null;
let currentCorpId = "";
exports.main = async (content, DB) => {
db = DB;
currentCorpId = content.corpId;
switch (content.type) {
case "addStaffQrcode":
return await exports.addStaffQrcode(content);
case "getStaffQrcode":
return await exports.getStaffQrcode(content);
case "getStaffQrcodeByQrcodeId":
return await exports.getStaffQrcodeByQrcodeId(content);
case "removeStaffQrcode":
return await exports.removeStaffQrcode(content);
case "updateStaffQrcode":
return await exports.updateStaffQrcode(content);
case "getStaffQrCodeDetail":
return await exports.getStaffQrCodeDetail(content);
case "getPersonalQrCode":
return await exports.getPersonalQrCode(content);
case "getPersonalQrcodeList":
return await exports.getPersonalQrcodeList(content);
case "getStaffQrcodeCount":
return await getStaffQrcodeCount(content);
case "addStaffQrcodeCate":
case "updateStaffQrcodeCate":
case "deleteStaffQrcodeCate":
case "getStaffQrcodeCateList":
case "initCorpStaffQrcodeCate":
case "sortStaffQrcodeCate":
return await staffqrcodeCate.main(content, db);
}
};
exports.getStaffQrcodeByQrcodeId = async (content) => {
const { qrcodeId, corpId } = content;
const qrCodeInfo = await db.collection("staff-qrcode").findOne({
qrcodeId,
corpId,
});
return {
success: true,
data: qrCodeInfo,
};
};
exports.addStaffQrcode = async (context) => {
let { params } = context;
const {
corpUserId,
qrCodetype = 1,
corpId,
tagIds,
qrCodeName,
customerSource,
welcomContent,
skipVerify,
fileList,
qrCodeStatus,
creator,
qrcodeId,
staffQrcodeType,
archiveLink,
autoCreateCustomer,
qrCode,
configId,
cateId,
headerImage,
} = params;
try {
const query = {
_id: common.generateRandomString(24),
corpId,
corpUserId,
qrCodetype,
qrCode,
configId,
tagIds,
qrCodeName,
customerSource,
welcomContent,
skipVerify,
fileList,
qrCodeStatus,
createTime: new Date().getTime(),
creator,
qrcodeId,
staffQrcodeType,
headerImage,
cateId,
autoCreateCustomer:
typeof autoCreateCustomer === "boolean" ? autoCreateCustomer : false,
};
if (archiveLink) query.archiveLink = archiveLink;
await db.collection("staff-qrcode").insertOne(query);
return {
success: true,
message: "添加成功",
};
} catch (error) {
return {
success: false,
message: "添加失败",
};
}
};
exports.getStaffQrcode = async (context) => {
try {
let { page, pageSize, params } = context;
page = parseInt(page) > 0 ? parseInt(page) : 1;
pageSize = parseInt(pageSize) > 0 ? parseInt(pageSize) : 10;
const { corpId, qrCodeName, qrCodetype, qrCodeStatus } = params || {};
const cateIds = Array.isArray(params.cateIds) ? params.cateIds : [];
if (!corpId) return { success: false, message: "机构id不能为空" };
// MongoDB 查询条件
const query = {
staffQrcodeType: { $ne: "personal" },
corpId,
cateId: { $in: cateIds },
};
// 添加可选条件
if (typeof qrCodeName === "string" && qrCodeName.trim()) {
query.qrCodeName = {
$regex: ".*" + qrCodeName.trim() + ".*",
$options: "i",
};
}
if (qrCodetype) query.qrCodetype = qrCodetype;
if (qrCodeStatus) query.qrCodeStatus = qrCodeStatus;
// 时间戳
const todayStartTimestamp = dayjs().startOf("day").valueOf();
const todayEndTimestamp = dayjs().endOf("day").valueOf();
// 获取总数和分页数据
const totalQuery = db.collection("staff-qrcode").countDocuments(query);
const listQuery = db
.collection("staff-qrcode")
.aggregate([
{ $match: query },
{
$lookup: {
from: "qrcode-statistics",
localField: "configId",
foreignField: "configId",
as: "addList",
},
},
{
$addFields: {
allAddCustomerCount: { $size: "$addList" },
todayAddCustomerCount: {
$size: {
$filter: {
input: "$addList",
as: "item",
cond: {
$and: [
{ $gt: ["$$item.createTime", todayStartTimestamp] },
{ $lt: ["$$item.createTime", todayEndTimestamp] },
],
},
},
},
},
},
},
{ $project: { addList: 0 } },
{ $sort: { createTime: -1 } },
{ $skip: (page - 1) * pageSize },
{ $limit: pageSize },
])
.toArray();
const [total, list] = await Promise.all([totalQuery, listQuery]);
const pages = Math.ceil(total / pageSize);
return { data: list, total, pages, size: pageSize, success: true };
} catch (error) {
return { success: false, message: error.message };
}
};
exports.removeStaffQrcode = async (context) => {
let { id, params } = context;
const { corpId, configId, allAddCustomerCount } = params;
try {
if (allAddCustomerCount > 0) {
await db
.collection("staff-qrcode")
.updateOne({ _id: id }, { $set: { qrCodeStatus: "disable" } });
const res = await api.getWecomApi({
type: "delContactWay",
corpId,
configId,
});
return res;
} else {
await db.collection("staff-qrcode").deleteOne({ _id: id });
return {
success: true,
message: "删除成功",
};
}
} catch (error) {
return {
success: false,
message: "删除失败",
};
}
};
exports.updateStaffQrcode = async (context) => {
let { id, params } = context;
params["updateTime"] = new Date().getTime();
if ("archiveLink" in params && !params.archiveLink) {
params.archiveLink = null;
}
await db.collection("staff-qrcode").updateOne({ _id: id }, { $set: params });
for (let key in params) {
if (!params[key]) {
delete params[key];
}
}
await api.getWecomApi({
type: "updateContactWay",
params,
corpId: currentCorpId,
});
return {
success: true,
message: "更新成功",
};
};
exports.getStaffQrCodeDetail = async (context) => {
let { id } = context;
const item = await db.collection("staff-qrcode").findOne({ _id: id });
let res = await qrcodeStatistics.main(
{
type: "getAllQrcodeCustomerCount",
item,
corpId: currentCorpId,
},
db
);
const { allAddCustomerCount, todayAddCustomerCount } = res.data;
item.allAddCustomerCount = allAddCustomerCount;
item.todayAddCustomerCount = todayAddCustomerCount;
return {
success: true,
message: "获取成功",
data: item,
res,
};
};
exports.getPersonalQrCode = async (context) => {
let { corpUserId, corpId, creator } = context;
let qrcode = {};
async function createStaffQrcode(corpUserId, corpId) {
const data = await db.collection("staff-qrcode").findOne({
corpUserId,
corpId,
staffQrcodeType: "personal",
qrCodeStatus: "enable",
});
return data;
}
try {
qrcode = await createStaffQrcode(corpUserId, corpId);
const DEFAULT_WELCOME_MESSAGE =
"你好,很高兴能与您建立联系。接下来,我会为您提供专业的健康咨询和贴心的服务。为了更好的为您提供一对一的精致服务,请您发送一下您的真实姓名和联系方式。感谢您的信任!";
if (!qrcode) {
let params = {
corpUserId: [corpUserId],
qrCodetype: 1,
corpId,
qrCodeName: "个人二维码",
skipVerify: 1,
qrCodeStatus: "enable",
creator: creator || corpUserId,
qrcodeId: `q&${utils.getRandomStr(5)}`,
tagIds: [],
fileList: [],
welcomContent: DEFAULT_WELCOME_MESSAGE,
customerSource: "",
staffQrcodeType: "personal",
};
let result = await api.getWecomApi({
type: "addContactWay",
corpId,
corpUserId,
qrCodetype: 1,
qrcodeId: params.qrcodeId,
});
if (!result.success)
return {
success: false,
message: result.message,
};
params["configId"] = result.configId;
params["qrCode"] = result.data;
const { success, message } = await this.addStaffQrcode({ params });
if (!success) return { success, message };
qrcode = await createStaffQrcode(corpUserId, corpId);
}
return {
success: true,
message: "获取成功",
data: qrcode,
};
} catch (error) {
return {
success: false,
message: "获取失败",
};
}
};
exports.getPersonalQrcodeList = async (context) => {
try {
let { params } = context;
const { corpId, userIds, qrCodeStatus } = params || {};
if (!corpId) return { success: false, message: "机构id不能为空" };
const query = {
staffQrcodeType: "personal",
qrCodetype: 1,
corpId,
};
if (Array.isArray(userIds) && userIds.length)
query.corpUserId = { $in: userIds };
if (qrCodeStatus) query.qrCodeStatus = qrCodeStatus;
const todayStartTimestamp = dayjs().startOf("day").valueOf();
const todayEndTimestamp = dayjs().endOf("day").valueOf();
const data = await db
.collection("staff-qrcode")
.aggregate([
{ $match: query },
{ $limit: 1000 },
{
$lookup: {
from: "qrcode-statistics",
localField: "configId",
foreignField: "configId",
as: "addList",
},
},
{
$addFields: {
allAddCustomerCount: { $size: "$addList" },
todayAddCustomerCount: {
$size: {
$filter: {
input: "$addList",
as: "item",
cond: {
$and: [
{ $gt: ["$$item.createTime", todayStartTimestamp] },
{ $lt: ["$$item.createTime", todayEndTimestamp] },
],
},
},
},
},
},
},
{ $project: { addList: 0 } },
{ $sort: { createTime: -1 } },
])
.toArray();
return { data, success: true };
} catch (error) {
return {
success: false,
message: error.message,
};
}
};
async function getStaffQrcodeCount(context) {
const { corpId, cateIds } = context;
if (!corpId) return { success: false, msg: "缺少corpId参数" };
if (!Array.isArray(cateIds))
return { success: false, msg: "缺少cateIds参数" };
try {
const total = await db
.collection("staff-qrcode")
.find({
corpId,
cateId: { $in: cateIds },
})
.count();
return { success: true, data: total };
} catch (e) {
return { success: false, msg: e.message };
}
}