448 lines
15 KiB
JavaScript
Raw Normal View History

2026-07-27 11:28:33 +08:00
let db = null;
const common = require("../../common");
const api = require("../../api");
exports.main = async (context, mongodb) => {
db = mongodb;
switch (context.type) {
case "addDept":
return await addDept(context);
case "updateDept":
return await updateDept(context);
case "deleteDept":
return await deleteDept(context);
case "getDeptList":
return await getDeptList(context);
case "sortDeptList":
return await sortDeptList(context);
case "ifCateExist":
return await ifCateExist(context);
case "addDeptUserId":
return await addDeptUserId(context);
case "deleteDeptUserId":
return await deleteDeptUserId(context);
case "getUsersByDept":
return await getUsersByDept(context);
case "addDeptStaff":
return await addDeptStaff(context);
case "removeDeptStaff":
return await removeDeptStaff(context);
case "getDeptStaff":
return await getDeptStaff(context);
case "updateStaffDept":
return await updateStaffDept(context);
}
};
async function addDept(context) {
let { corpId, parentId, params } = context;
const { deptName, deptId } = params;
if (typeof corpId !== 'string' || corpId.trim() === '') {
return { success: false, message: "无效的机构id" }
}
if (typeof deptName !== "string" || deptName.trim() === "") {
return { success: false, message: "科室名称无效" };
}
if (typeof deptId !== "string" || deptId.trim() === "") {
return { success: false, message: "科室ID无效" };
}
if (/\W/.test(deptId)) {
return { success: false, message: "科室ID只能由数字字母组成" };
}
if (deptName.trim().length > 10)
return { success: false, message: "科室名称不能超过10个字" };
try {
const data = {
corpId: corpId.trim(),
deptName: deptName.trim(),
deptId: deptId.trim(),
deptDesc: typeof params.deptDesc === "string" ? params.deptDesc.trim() : "",
}
const total = await db.collection("dept-list").countDocuments({ corpId, deptId: deptId.trim() });
if (total > 0) {
return { success: false, message: "科室ID已存在" };
}
if (parentId) {
const parent = await db
.collection("dept-list")
.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("dept-list").insertOne({
_id: common.generateRandomString(24),
corpId,
level: parent.level + 1,
parentId,
createTime: Date.now(),
...data,
});
return { success: true, data: res, message: "添加科室成功" };
}
const res = await db.collection("dept-list").insertOne({
_id: common.generateRandomString(24),
corpId,
level: 1,
createTime: Date.now(),
...data,
});
return { success: true, data: res, message: "添加科室成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function updateDept(context) {
let { corpId, id: _id, params } = context;
const { deptName, deptId } = params;
if (typeof corpId !== 'string' || corpId.trim() === '') return { success: false, message: "机构id不能为空" };
if (typeof _id !== 'string' || _id.trim() === '') return { success: false, message: "科室id不能为空" };
if (typeof deptName !== "string" || deptName.trim() === "") {
return { success: false, message: "科室名称无效" };
}
if (deptName.trim().length > 10) {
return { success: false, message: "科室名称不能超过10个字" };
}
if (typeof deptId !== "string" || deptId.trim() === "") {
return { success: false, message: "科室ID无效" };
}
if (/\W/.test(deptId)) {
return { success: false, message: "科室ID只能由数字字母组成" };
}
try {
const data = {
corpId: corpId.trim(),
deptName: deptName.trim(),
deptId: deptId.trim(),
deptDesc: typeof params.deptDesc === "string" ? params.deptDesc.trim() : "",
}
const total = await db.collection("dept-list").countDocuments({ corpId, deptId: data.deptId, _id: { $ne: _id } });
if (total > 0) {
return { success: false, message: "科室ID已存在其他科室" };
}
const dept = await db.collection("dept-list").findOne({ _id, corpId }, { projection: { deptId: 1, deptName: 1 } });
if (!dept) return { success: false, message: "科室不存在" };
const res = await db
.collection("dept-list")
.updateOne({ _id: dept._id }, { $set: data });
if (dept.deptId !== data.deptId || dept.deptName !== data.deptName) {
console.log('需要更新对应信息')
await updateHlwPeopleDept({ corpId, deptCodes: [dept.deptId], newDeptCode: data.deptId, newDeptName: data.deptName });
}
return { success: true, data: res, message: "更新科室成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function addDeptUserId(context) {
let { corpId, deptId, userIds } = context;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
if (!Array.isArray(userIds) || userIds.length === 0)
return { success: false, message: "用户id不能为空" };
try {
await db
.collection("dept-list")
.updateOne(
{ corpId, _id: deptId },
{ $addToSet: { userIds: { $each: userIds } } }
);
return { success: true, message: "添加用户成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function deleteDeptUserId(context) {
let { corpId, deptId, userId } = context;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
if (!userId) return { success: false, message: "用户id不能为空" };
try {
await db
.collection("dept-list")
.updateOne({ corpId, _id: deptId }, { $pull: { userIds: userId } });
return { success: true, message: "删除用户成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function getUsersByDept(context) {
let { corpId, deptId } = context;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
try {
const data = await db
.collection("dept-list")
.aggregate([
{ $match: { corpId, _id: deptId } },
{
$lookup: {
from: "corp-member",
localField: "userIds",
foreignField: "userid",
as: "users",
},
},
{ $project: { _id: 0, users: 1 } },
])
.toArray();
if (data.length === 0) {
return { success: false, message: "未找到相关用户" };
}
return { success: true, list: data, message: "查询用户成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function deleteDept(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("dept-list").findOne({ _id: _id, corpId }, { projection: { level: 1, _id: 1, deptId: 1 } });
if (!cate) return { success: false, message: "科室不存在" };
const ids = [_id];
const deptIds = [cate.deptId];
if (cate.level < 3) {
const children = await db
.collection("dept-list")
.find({ corpId, parentId: _id }, { projection: { _id: 1, deptId: 1 } })
.toArray();
const childrenIds = children.map((item) => item._id);
deptIds.push(...children.map((item) => item.deptId));
if (cate.level === 1 && childrenIds.length) {
const grandchildren = await db
.collection("dept-list")
.find({ corpId, parentId: { $in: childrenIds } }, { projection: { _id: 1, deptId: 1 } })
.toArray();
ids.push(...grandchildren.map((item) => item._id));
deptIds.push(...grandchildren.map((item) => item.deptId));
}
ids.push(...childrenIds);
}
const { success } = await updateHlwPeopleDept({ corpId, deptCodes: deptIds, newDeptCode: '', newDeptName: '' })
if (!success) {
return { success: false, message: "删除互联网医院科室失败" };
}
const res = await db
.collection("dept-list")
.deleteMany({ corpId, _id: { $in: ids } });
return { success: true, data: res, message: "删除科室成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function getDeptList(context) {
let { corpId } = context;
if (!corpId) return { success: false, message: "机构id不能为空" };
try {
const list = await db
.collection("dept-list")
.find({ corpId, init: { $exists: false } })
.sort({ createTime: 1 })
.limit(10000)
.toArray();
return { success: true, list, message: "获取科室成功" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function sortDeptList(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 bulkOps = arr.map((item) => ({
updateOne: {
filter: { corpId, _id: item._id },
update: { $set: { sort: item.sort } },
},
}));
const res = await db.collection("dept-list").bulkWrite(bulkOps);
return { success: true, message: "操作成功", res };
} 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("dept-list")
.findOne({ corpId, _id: cateId });
return cate ? { success: true } : { success: false, message: "科室不存在" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function addDeptStaff(ctx) {
const { corpId, deptId, userIds } = ctx;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
if (!Array.isArray(userIds) || userIds.length === 0)
return { success: false, message: "人员id不能为空" };
try {
const dept = await db
.collection("dept-list")
.findOne({ corpId, _id: deptId });
if (!dept) return { success: false, message: "科室不存在" };
const staffs = await db
.collection("corp-member")
.find({ corpId, userid: { $in: userIds } })
.toArray();
const bulkOps = staffs.map((staff) => {
if (Array.isArray(staff.deptIds)) {
return {
updateOne: {
filter: { corpId, _id: staff._id },
update: { $push: { deptIds: deptId } },
},
};
} else {
return {
updateOne: {
filter: { corpId, _id: staff._id },
update: { $set: { deptIds: [deptId] } },
},
};
}
});
const res = await db.collection("corp-member").bulkWrite(bulkOps);
return { success: true, message: "操作成功", res };
} catch (e) {
return { success: false, message: e.message };
}
}
async function removeDeptStaff(ctx) {
const { corpId, deptId, userId } = ctx;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
if (!userId) return { success: false, message: "人员id不能为空" };
try {
const staff = await db
.collection("corp-member")
.findOne({ corpId, deptIds: deptId, userid: userId });
if (staff) {
const res = await db
.collection("corp-member")
.updateOne(
{ _id: staff._id },
{ $pull: { deptIds: deptId } }
);
return { success: true, message: "操作成功", res };
}
return { success: false, message: "科室人员不存在" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function getDeptStaff(ctx) {
const { corpId, deptId } = ctx;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!deptId) return { success: false, message: "科室id不能为空" };
try {
const query = { corpId, deptIds: deptId };
const list = await db
.collection("corp-member")
.aggregate([
{ $match: query },
{
$lookup: {
from: "dept-list",
localField: "deptIds",
foreignField: "_id",
as: "depts",
},
},
{ $unwind: { path: "$depts", preserveNullAndEmptyArrays: true } },
{
$group: {
_id: "$_id",
deptNames: { $addToSet: "$depts.deptName" },
name: { $first: "$anotherName" },
job: { $first: "$job" },
userId: { $first: "$userid" },
deptIds: { $first: "$deptIds" },
},
},
{
$project: {
_id: 1,
deptIds: 1,
deptNames: 1,
name: 1,
job: 1,
userId: 1,
},
},
])
.limit(1000)
.toArray();
return { success: true, message: "查询成功", list };
} catch (e) {
return { success: false, message: e.message };
}
}
async function updateStaffDept(ctx) {
const { corpId, deptIds, userId } = ctx;
if (!corpId) return { success: false, message: "机构id不能为空" };
if (!userId) return { success: false, message: "人员id不能为空" };
if (!Array.isArray(deptIds) || !deptIds.length)
return { success: false, message: "科室id无效" };
try {
const depts = await db
.collection("dept-list")
.find({ corpId, _id: { $in: deptIds } })
.toArray();
const invalidIds = deptIds.filter(
(id) => !depts.some((d) => d._id === id)
);
if (invalidIds.length)
return { success: false, message: `科室id无效: ${invalidIds.join(",")}` };
const staff = await db
.collection("corp-member")
.findOne({ corpId, userid: userId });
if (staff) {
const res = await db
.collection("corp-member")
.updateOne({ corpId, _id: staff._id }, { $set: { deptIds } });
return { success: true, message: "操作成功", res };
}
return { success: false, message: "科室人员不存在" };
} catch (e) {
return { success: false, message: e.message };
}
}
async function updateHlwPeopleDept({ corpId, deptCodes, newDeptCode, newDeptName }) {
try {
const res = await api.getInternetHospitalApi({ type: 'updateHlwPersonDeptInfo', corpId, deptCodes, newDeptCode, newDeptName });
return res
} catch (e) {
return { success: false, message: e.message }
}
}