91 lines
3.2 KiB
JavaScript
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
|