187 lines
6.8 KiB
JavaScript
187 lines
6.8 KiB
JavaScript
const common = require('../../common.js');
|
||
let db = null;
|
||
|
||
exports.main = async (context, DB) => {
|
||
db = DB;
|
||
switch (context.type) {
|
||
case "addSopCate":
|
||
return await addSopCate(context);
|
||
case "updateSopCate":
|
||
return await updateSopCate(context);
|
||
case "deleteSopCate":
|
||
return await deleteSopCate(context);
|
||
case "getSopCateList":
|
||
return await getSopCateList(context);
|
||
case "sortSopCate":
|
||
return await sortSopCate(context);
|
||
case "ifCateExist":
|
||
return await ifCateExist(context);
|
||
}
|
||
};
|
||
|
||
async function addSopCate(context) {
|
||
let { corpId, label, parentId } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
if (typeof label !== "string" || label.trim() === "")
|
||
return { success: false, message: "分类名称无效" };
|
||
if (label.trim().length > 10)
|
||
return { success: false, message: "分类名称不能超过10个字" };
|
||
try {
|
||
if (parentId) {
|
||
const parent = await db.collection("sop_cate").findOne({ _id: parentId, corpId });
|
||
if (!parent) return { success: false, message: "父级分类不存在" };
|
||
if (![1, 2].includes(parent.level))
|
||
return { success: false, message: "父级分类层级错误" };
|
||
const res = await db.collection("sop_cate").insertOne({
|
||
_id: common.generateRandomString(24),
|
||
corpId,
|
||
label,
|
||
level: parent.level + 1,
|
||
parentId,
|
||
createTime: Date.now(),
|
||
});
|
||
return { success: true, data: res, message: "添加分类成功" };
|
||
}
|
||
const res = await db.collection("sop_cate").insertOne({
|
||
_id: common.generateRandomString(24),
|
||
corpId,
|
||
label,
|
||
level: 1,
|
||
createTime: Date.now()
|
||
});
|
||
return { success: true, data: res, message: "添加分类成功" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function updateSopCate(context) {
|
||
let { corpId, id: _id, label } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
if (!_id) return { success: false, message: "分类id不能为空" };
|
||
if (typeof label !== "string" || label.trim() === "")
|
||
return { success: false, message: "分类名称无效" };
|
||
if (label.trim().length > 10)
|
||
return { success: false, message: "分类名称不能超过10个字" };
|
||
try {
|
||
const res = await db.collection("sop_cate").updateOne(
|
||
{ _id, corpId },
|
||
{ $set: { label: label.trim() } }
|
||
);
|
||
return { success: true, data: res, message: "更新分类成功" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function deleteSopCate(context) {
|
||
let { corpId, id: _id } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
if (!_id) return { success: false, message: "分类id不能为空" };
|
||
try {
|
||
const cate = await db.collection("sop_cate").findOne({ _id, corpId });
|
||
if (!cate) return { success: false, message: "分类不存在" };
|
||
const ids = [_id];
|
||
if (cate.level < 3) {
|
||
const children = await db.collection("sop_cate").find({ corpId, parentId: _id }).toArray();
|
||
const childrenIds = children.map((item) => item._id);
|
||
if (cate.level === 1 && childrenIds.length) {
|
||
const grandchildren = await db.collection("sop_cate").find({ corpId, parentId: { $in: childrenIds } }).toArray();
|
||
ids.push(...grandchildren.map((item) => item._id));
|
||
}
|
||
ids.push(...childrenIds);
|
||
}
|
||
const total = await getActiveSopCount(corpId, ids);
|
||
if (total > 0) {
|
||
return {
|
||
success: false,
|
||
message: `该分类下有${total}个SOP未停用或者未结束,请先停用或者结束`,
|
||
};
|
||
}
|
||
const res = await db.collection("sop_cate").deleteMany({ corpId, _id: { $in: ids } });
|
||
const res2 = await db.collection("sop-tasks").deleteMany({ corpId, classId: { $in: ids } });
|
||
return { success: true, data: [res, res2], message: "删除分类成功" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function getSopCateList(context) {
|
||
let { corpId } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
try {
|
||
const list = await db.collection("sop_cate").find({ corpId, init: { $exists: false } }).sort({ createTime: 1 }).limit(10000).toArray();
|
||
if (list.length) return { success: true, list, message: "获取分类成功" };
|
||
const initRecord = await db.collection("sop_cate").findOne({ corpId, init: true });
|
||
if (initRecord) return { success: true, list: [], message: "获取分类成功" };
|
||
await db.collection("sop_cate").insertOne({ _id: common.generateRandomString(24), corpId, init: true });
|
||
await db.collection("sop_cate").insertOne({ _id: common.generateRandomString(24), corpId, label: "默认", level: 1, createTime: Date.now() });
|
||
const newlist = await db.collection("sop_cate").find({ corpId, init: { $exists: false } }).sort({ createTime: 1 }).limit(10000).toArray();
|
||
return { success: true, list: newlist, message: "获取分类成功" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function sortSopCate(context) {
|
||
const { corpId, sortData } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
const arr = Array.isArray(sortData)
|
||
? sortData.filter(
|
||
(i) =>
|
||
i._id && typeof i.sort === "number" && i.sort % 1 === 0 && i.sort >= 0
|
||
)
|
||
: [];
|
||
if (arr.length === 0) return { success: false, message: "参数错误" };
|
||
|
||
try {
|
||
const list = await db.collection("sop_cate").find({
|
||
corpId,
|
||
_id: { $in: arr.map((i) => i._id) },
|
||
parentId: { $exists: false },
|
||
}).toArray();
|
||
const ids = list.map((i) => i._id);
|
||
const queue = arr.filter((i) => ids.includes(i._id));
|
||
|
||
const bulkOps = queue.map((item) => ({
|
||
updateOne: {
|
||
filter: { _id: item._id },
|
||
update: { $set: { sort: item.sort } },
|
||
},
|
||
}));
|
||
|
||
if (bulkOps.length > 0) {
|
||
await db.collection("sop_cate").bulkWrite(bulkOps);
|
||
}
|
||
|
||
return { success: true, message: "操作成功" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function ifCateExist(context) {
|
||
const { corpId, cateId } = context;
|
||
if (!corpId) return { success: false, message: "机构id不能为空" };
|
||
try {
|
||
const cate = await db.collection("sop_cate").findOne({ corpId, _id: cateId });
|
||
return cate ? { success: true } : { success: false, message: "分类不存在" };
|
||
} catch (e) {
|
||
return { success: false, message: e.message };
|
||
}
|
||
}
|
||
|
||
async function getActiveSopCount(corpId, cateIds) {
|
||
const query = {
|
||
corpId,
|
||
classId: { $in: cateIds },
|
||
$or: [
|
||
{ executeEndTime: "" },
|
||
{ executeEndTime: { $gt: new Date().getTime() } }
|
||
],
|
||
sopEnableStatus: { $ne: "disable" },
|
||
};
|
||
const total = await db.collection("sop-tasks").countDocuments(query);
|
||
return total;
|
||
}
|