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.

160 lines
4.9 KiB

10 months ago
  1. const { Dept } = require("../models/dept");
  2. const { validatedRequest } = require("../utils/middleware/validatedRequest");
  3. const {
  4. strictMultiUserRoleValid,
  5. ROLES
  6. } = require("../utils/middleware/multiUserProtected");
  7. function deptEndpoints(app) {
  8. if (!app) return;
  9. app.get(
  10. "/dept/list",
  11. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  12. async (_request, response) => {
  13. try {
  14. const depts = await Dept.where();
  15. response.status(200).json({ depts });
  16. } catch (e) {
  17. console.error(e);
  18. response.sendStatus(500).end();
  19. }
  20. }
  21. );
  22. app.post("/dept/add",
  23. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  24. async (request, response) => {
  25. try {
  26. const dept = request.body; // 获取请求体中的部门数据
  27. // 检查部门名称是否唯一
  28. const isUnique = await Dept.checkDeptNameUnique(dept);
  29. if (!isUnique) {
  30. return response.status(400).json({
  31. success: false,
  32. message: `新增部门 '${dept.deptName}' 失败,部门名称已存在`,
  33. });
  34. };
  35. // 按照deptId查询父部门
  36. const parentDept = await Dept.get({ deptId: dept.parentId });
  37. dept.ancestors = parentDept.dept.ancestors + ',' + dept.parentId;
  38. // 插入部门数据
  39. const insertedDept = await Dept.insertDept(dept);
  40. // 返回成功响应
  41. response.status(200).json({
  42. success: true,
  43. data: insertedDept,
  44. });
  45. } catch (error) {
  46. // 处理错误
  47. console.error("添加部门失败:", error);
  48. response.status(500).json({
  49. success: false,
  50. message: "添加部门失败,服务器内部错误",
  51. });
  52. }
  53. });
  54. app.post("/dept/edit",
  55. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  56. async (request, response) => {
  57. try {
  58. const dept = request.body; // 获取请求体中的部门数据
  59. // 检查部门名称是否唯一
  60. const isUnique = await Dept.checkDeptNameUnique(dept);
  61. if (!isUnique) {
  62. return response.status(400).json({
  63. success: false,
  64. message: `修改部门 '${dept.deptName}' 失败,部门名称已存在`,
  65. });
  66. }
  67. // 检查上级部门是否是自己
  68. if (dept.parentId === dept.deptId) {
  69. return response.status(400).json({
  70. success: false,
  71. message: `修改部门 '${dept.deptName}' 失败,上级部门不能是自己`,
  72. });
  73. }
  74. // 检查部门是否包含未停用的子部门
  75. if (dept.status === 1) {
  76. const normalChildrenCount = await Dept.selectNormalChildrenDeptById(dept.deptId);
  77. if (normalChildrenCount > 0) {
  78. return response.status(400).json({
  79. success: false,
  80. message: "该部门包含未停用的子部门!",
  81. });
  82. }
  83. }
  84. // 更新部门数据
  85. const updatedDept = await Dept.update(dept);
  86. // 返回成功响应
  87. response.status(200).json({
  88. success: true,
  89. data: updatedDept,
  90. });
  91. } catch (error) {
  92. // 处理错误
  93. console.error("修改部门失败:", error);
  94. response.status(500).json({
  95. success: false,
  96. message: "修改部门失败,服务器内部错误",
  97. });
  98. }
  99. });
  100. // 删除部门的接口
  101. app.delete("/dept/:deptId",
  102. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  103. async (request, response) => {
  104. try {
  105. const deptId = parseInt(request.params.deptId); // 获取部门 ID
  106. // 检查部门是否有子部门
  107. const hasChild = await Dept.hasChildByDeptId(deptId);
  108. if (hasChild) {
  109. return response.status(400).json({
  110. success: false,
  111. message: "存在下级部门,不允许删除",
  112. });
  113. }
  114. // 检查部门是否存在用户
  115. const hasUser = await Dept.checkDeptExistUser(deptId);
  116. if (hasUser) {
  117. return response.status(400).json({
  118. success: false,
  119. message: "部门存在用户,不允许删除",
  120. });
  121. }
  122. // // 检查部门数据权限
  123. // const hasDataScope = await Dept.checkDeptDataScope(deptId);
  124. // if (!hasDataScope) {
  125. // return response.status(403).json({
  126. // success: false,
  127. // message: "无权限删除该部门",
  128. // });
  129. // }
  130. // 删除部门
  131. const deletedDept = await Dept.deleteDeptById(deptId);
  132. // 返回成功响应
  133. response.status(200).json({
  134. success: true,
  135. data: deletedDept,
  136. });
  137. } catch (error) {
  138. // 处理错误
  139. console.error("删除部门失败:", error);
  140. response.status(500).json({
  141. success: false,
  142. message: "删除部门失败,服务器内部错误",
  143. });
  144. }
  145. });
  146. }
  147. module.exports = { deptEndpoints };