You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

196 lines
5.9 KiB

const { Dept } = require("../models/dept");
const { validatedRequest } = require("../utils/middleware/validatedRequest");
const {
strictMultiUserRoleValid,
ROLES
} = require("../utils/middleware/multiUserProtected");
const { reqBody } = require("../utils/http");
function deptEndpoints(app) {
if (!app) return;
app.get(
"/dept/list",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (_request, response) => {
try {
const depts = await Dept.where();
response.status(200).json({ depts });
} catch (e) {
console.error(e);
response.sendStatus(500).end();
}
}
);
// 获取部门树状结构
app.get(
"/dept/tree",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (_request, response) => {
try {
const deptTree = await Dept.getDeptTree();
response.status(200).json({ deptTree });
} catch (e) {
console.error(e);
response.sendStatus(500).end();
}
}
);
// 懒加载子部门列表
app.get(
"/dept/children",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (request, response) => {
try {
const parentId = request.query.parentId
? parseInt(request.query.parentId)
: null;
const children = await Dept.getChildrenByParentId(parentId);
response.status(200).json({ children });
} catch (e) {
console.error(e);
response.sendStatus(500).end();
}
}
);
app.post("/dept/add",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (request, response) => {
try {
const dept = reqBody(request); // 获取请求体中的部门数据
console.log("dept 类型:", typeof dept);
// 检查部门名称是否唯一
const isUnique = await Dept.checkDeptNameUnique(dept);
if (!isUnique) {
return response.status(400).json({
success: false,
message: `新增部门 '${dept.deptName}' 失败,部门名称已存在`,
});
};
// 按照deptId查询父部门
const parentDept = await Dept.get({ deptId: dept.parentId });
dept.ancestors = parentDept.dept.ancestors + ',' + dept.parentId;
// 插入部门数据
const insertedDept = await Dept.insertDept(dept);
// 返回成功响应
response.status(200).json({
success: true,
data: insertedDept,
});
} catch (error) {
// 处理错误
console.error("添加部门失败:", error);
response.status(500).json({
success: false,
message: "添加部门失败,服务器内部错误",
});
}
});
app.post("/dept/edit/:deptId",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (request, response) => {
try {
const deptId = parseInt(request.params.deptId);
const dept = reqBody(request); // 获取请求体中的部门数据
// 检查部门名称是否唯一
const isUnique = await Dept.checkDeptNameUnique(dept);
console.log("isUnique:", isUnique);
if (!isUnique) {
return response.status(400).json({
success: false,
message: `修改部门 '${dept.deptName}' 失败,部门名称已存在`,
});
}
// 检查上级部门是否是自己
if (dept.parentId === deptId) {
return response.status(400).json({
success: false,
message: `修改部门 '${dept.deptName}' 失败,上级部门不能是自己`,
});
}
// 检查部门是否包含未停用的子部门
if (dept.status === 1) {
const normalChildrenCount = await Dept.selectNormalChildrenDeptById(deptId);
if (normalChildrenCount > 0) {
return response.status(400).json({
success: false,
message: "该部门包含未停用的子部门!",
});
}
}
// 更新部门数据
const updatedDept = await Dept.update(deptId, dept);
// 返回成功响应
response.status(200).json({
success: true,
data: updatedDept,
});
} catch (error) {
// 处理错误
console.error("修改部门失败:", error);
response.status(500).json({
success: false,
message: "修改部门失败,服务器内部错误",
});
}
});
// 删除部门的接口
app.delete("/dept/:deptId",
[validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
async (request, response) => {
try {
const deptId = parseInt(request.params.deptId); // 获取部门 ID
// 检查部门是否有子部门
const hasChild = await Dept.hasChildByDeptId(deptId);
if (hasChild) {
return response.status(400).json({
success: false,
message: "存在下级部门,不允许删除",
});
}
// 检查部门是否存在用户
const hasUser = await Dept.checkDeptExistUser(deptId);
if (hasUser) {
return response.status(400).json({
success: false,
message: "部门存在用户,不允许删除",
});
}
// // 检查部门数据权限
// const hasDataScope = await Dept.checkDeptDataScope(deptId);
// if (!hasDataScope) {
// return response.status(403).json({
// success: false,
// message: "无权限删除该部门",
// });
// }
// 删除部门
const deletedDept = await Dept.deleteDeptById(deptId);
// 返回成功响应
response.status(200).json({
success: true,
data: deletedDept,
});
} catch (error) {
// 处理错误
console.error("删除部门失败:", error);
response.status(500).json({
success: false,
message: "删除部门失败,服务器内部错误",
});
}
});
}
module.exports = { deptEndpoints };