SFT/mock-server/routes/organization.js

91 lines
3.2 KiB
JavaScript

import express from 'express'
import { organizations } from '../db/seedAuth.js'
import { nextId } from '../utils/id.js'
import { sendOk, sendFail } from '../utils/response.js'
import { requireAuth } from '../middleware/requireAuth.js'
const router = express.Router()
router.use(requireAuth)
function toDetailVo(org) {
return {
id: org.id,
organizationId: org.organizationId,
organizationName: org.organizationName,
parentId: org.parentId,
isBuiltIn: org.isBuiltIn,
remark: org.remark
}
}
function buildTree(list) {
const nodeMap = new Map(list.map((o) => [o.id, { ...toDetailVo(o), children: [] }]))
const roots = []
nodeMap.forEach((node) => {
if (node.parentId && nodeMap.has(node.parentId)) {
nodeMap.get(node.parentId).children.push(node)
} else {
roots.push(node)
}
})
return roots
}
// 查询机构树(支持按名称模糊/按organizationId精确过滤后仍返回完整树形结构)
router.get('/query-tree', (req, res) => {
const { organizationName, organizationId } = req.query || {}
let list = organizations
if (organizationName) list = list.filter((o) => o.organizationName.includes(organizationName))
if (organizationId) list = list.filter((o) => o.organizationId === organizationId)
sendOk(res, buildTree(list))
})
// 平铺列表(供下拉选择器使用)
router.get('/list-all', (req, res) => {
const { organizationName } = req.query || {}
let list = organizations
if (organizationName) list = list.filter((o) => o.organizationName.includes(organizationName))
sendOk(res, list.map(toDetailVo))
})
router.post('/create', (req, res) => {
const { organizationName, parentId, remark } = req.body || {}
if (!organizationName) return sendFail(res, '机构名称不能为空', 400)
const id = nextId('organization')
const org = {
id,
organizationId: `ORG${String(id).padStart(4, '0')}`,
organizationName,
parentId: parentId || null,
isBuiltIn: false,
remark: remark || ''
}
organizations.push(org)
sendOk(res, toDetailVo(org), '创建成功')
})
router.post('/update', (req, res) => {
const { organizationId, organizationName, parentId, remark } = req.body || {}
if (!organizationId) return sendFail(res, '机构ID不能为空', 400)
const org = organizations.find((o) => o.organizationId === organizationId)
if (!org) return sendFail(res, '机构不存在', 404)
if (organizationName !== undefined) org.organizationName = organizationName
if (parentId !== undefined) org.parentId = parentId
if (remark !== undefined) org.remark = remark
sendOk(res, toDetailVo(org), '更新成功')
})
router.post('/delete', (req, res) => {
const { organizationId } = req.body || {}
const org = organizations.find((o) => o.organizationId === organizationId)
if (!org) return sendFail(res, '机构不存在', 404)
if (org.isBuiltIn) return sendFail(res, '内置机构不可删除', 400)
const hasChildren = organizations.some((o) => o.parentId === org.id)
if (hasChildren) return sendFail(res, '该机构下存在子机构,不可删除', 400)
const index = organizations.findIndex((o) => o.organizationId === organizationId)
organizations.splice(index, 1)
sendOk(res, true, '删除成功')
})
export default router