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