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