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

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