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.

192 lines
5.7 KiB

10 months ago
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. // 获取部门树状结构
  23. app.get(
  24. "/dept/tree",
  25. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  26. async (_request, response) => {
  27. try {
  28. const deptTree = await Dept.getDeptTree();
  29. response.status(200).json({ deptTree });
  30. } catch (e) {
  31. console.error(e);
  32. response.sendStatus(500).end();
  33. }
  34. }
  35. );
  36. // 懒加载子部门列表
  37. app.get(
  38. "/dept/children",
  39. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  40. async (request, response) => {
  41. try {
  42. const parentId = request.query.parentId
  43. ? parseInt(request.query.parentId)
  44. : null;
  45. const children = await Dept.getChildrenByParentId(parentId);
  46. response.status(200).json({ children });
  47. } catch (e) {
  48. console.error(e);
  49. response.sendStatus(500).end();
  50. }
  51. }
  52. );
  53. app.post("/dept/add",
  54. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  55. async (request, response) => {
  56. try {
  57. const dept = request.body; // 获取请求体中的部门数据
  58. // 检查部门名称是否唯一
  59. const isUnique = await Dept.checkDeptNameUnique(dept);
  60. if (!isUnique) {
  61. return response.status(400).json({
  62. success: false,
  63. message: `新增部门 '${dept.deptName}' 失败,部门名称已存在`,
  64. });
  65. };
  66. // 按照deptId查询父部门
  67. const parentDept = await Dept.get({ deptId: dept.parentId });
  68. dept.ancestors = parentDept.dept.ancestors + ',' + dept.parentId;
  69. // 插入部门数据
  70. const insertedDept = await Dept.insertDept(dept);
  71. // 返回成功响应
  72. response.status(200).json({
  73. success: true,
  74. data: insertedDept,
  75. });
  76. } catch (error) {
  77. // 处理错误
  78. console.error("添加部门失败:", error);
  79. response.status(500).json({
  80. success: false,
  81. message: "添加部门失败,服务器内部错误",
  82. });
  83. }
  84. });
  85. app.post("/dept/edit",
  86. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  87. async (request, response) => {
  88. try {
  89. const dept = request.body; // 获取请求体中的部门数据
  90. // 检查部门名称是否唯一
  91. const isUnique = await Dept.checkDeptNameUnique(dept);
  92. if (!isUnique) {
  93. return response.status(400).json({
  94. success: false,
  95. message: `修改部门 '${dept.deptName}' 失败,部门名称已存在`,
  96. });
  97. }
  98. // 检查上级部门是否是自己
  99. if (dept.parentId === dept.deptId) {
  100. return response.status(400).json({
  101. success: false,
  102. message: `修改部门 '${dept.deptName}' 失败,上级部门不能是自己`,
  103. });
  104. }
  105. // 检查部门是否包含未停用的子部门
  106. if (dept.status === 1) {
  107. const normalChildrenCount = await Dept.selectNormalChildrenDeptById(dept.deptId);
  108. if (normalChildrenCount > 0) {
  109. return response.status(400).json({
  110. success: false,
  111. message: "该部门包含未停用的子部门!",
  112. });
  113. }
  114. }
  115. // 更新部门数据
  116. const updatedDept = await Dept.update(dept);
  117. // 返回成功响应
  118. response.status(200).json({
  119. success: true,
  120. data: updatedDept,
  121. });
  122. } catch (error) {
  123. // 处理错误
  124. console.error("修改部门失败:", error);
  125. response.status(500).json({
  126. success: false,
  127. message: "修改部门失败,服务器内部错误",
  128. });
  129. }
  130. });
  131. // 删除部门的接口
  132. app.delete("/dept/:deptId",
  133. [validatedRequest, strictMultiUserRoleValid([ROLES.admin])],
  134. async (request, response) => {
  135. try {
  136. const deptId = parseInt(request.params.deptId); // 获取部门 ID
  137. // 检查部门是否有子部门
  138. const hasChild = await Dept.hasChildByDeptId(deptId);
  139. if (hasChild) {
  140. return response.status(400).json({
  141. success: false,
  142. message: "存在下级部门,不允许删除",
  143. });
  144. }
  145. // 检查部门是否存在用户
  146. const hasUser = await Dept.checkDeptExistUser(deptId);
  147. if (hasUser) {
  148. return response.status(400).json({
  149. success: false,
  150. message: "部门存在用户,不允许删除",
  151. });
  152. }
  153. // // 检查部门数据权限
  154. // const hasDataScope = await Dept.checkDeptDataScope(deptId);
  155. // if (!hasDataScope) {
  156. // return response.status(403).json({
  157. // success: false,
  158. // message: "无权限删除该部门",
  159. // });
  160. // }
  161. // 删除部门
  162. const deletedDept = await Dept.deleteDeptById(deptId);
  163. // 返回成功响应
  164. response.status(200).json({
  165. success: true,
  166. data: deletedDept,
  167. });
  168. } catch (error) {
  169. // 处理错误
  170. console.error("删除部门失败:", error);
  171. response.status(500).json({
  172. success: false,
  173. message: "删除部门失败,服务器内部错误",
  174. });
  175. }
  176. });
  177. }
  178. module.exports = { deptEndpoints };