448 lines
15 KiB
JavaScript
448 lines
15 KiB
JavaScript
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 }
|
|
}
|
|
} |