'use client'; import { useEffect, useState } from 'react'; import { Download, Plus, RefreshCcw, Trash2, Upload } from 'lucide-react'; import { RouteGuard } from '@/components/auth/Guard'; import { api } from '@/lib/api'; import { useAuthStore } from '@/stores/useAuthStore'; import { useMemberStore } from '@/stores/useMemberStore'; type GovernanceKind = 'task_category' | 'requirement_type' | 'requirement_platform' | 'requirement_source'; interface GovernanceItem { id: string; kind?: string; name: string; code?: string | null; group?: string | null; isSystem?: boolean; } const KIND_LABEL: Record = { task_category: '任务类型', requirement_type: '需求类型', requirement_platform: '支持端', requirement_source: '需求来源', }; function GovernancePageInner() { const user = useAuthStore((s) => s.user); const role = useMemberStore((s) => s.roles.find((item) => item.id === user?.roleId)); const [kind, setKind] = useState('task_category'); const [items, setItems] = useState([]); const [name, setName] = useState(''); const [group, setGroup] = useState('other'); const [exportText, setExportText] = useState(''); const actorId = user?.id ?? ''; const permissions = role?.permissions ?? []; const reload = async () => { const rows = await api.get(`/governance/dictionaries?kind=${kind}`); setItems(rows); }; useEffect(() => { void reload().catch(() => setItems([])); }, [kind]); const create = async () => { if (!actorId || !name.trim()) return; await api.post('/governance/dictionaries', { actorId, permissions, kind, name: name.trim(), group }); setName(''); await reload(); }; const remove = async (item: GovernanceItem) => { if (!actorId) return; await api.deleteWithBody(`/governance/dictionaries/${kind}/${item.id}`, { actorId, permissions }); await reload(); }; const exportAll = async () => { const data = await api.get('/governance/export'); setExportText(JSON.stringify(data, null, 2)); }; const importAll = async () => { if (!actorId || !exportText.trim()) return; const parsed = JSON.parse(exportText); const sourceItems = Array.isArray(parsed.items) ? parsed.items : [...(parsed.dictionaries ?? []), ...(parsed.taskCategories ?? []).map((item: GovernanceItem) => ({ ...item, kind: 'task_category' }))]; await api.post('/governance/import', { actorId, permissions, items: sourceItems }); await reload(); }; return (

治理设置

统一维护任务类型、需求类型、支持端与来源字典。

{Object.entries(KIND_LABEL).map(([key, label]) => ( ))}
setName(event.target.value)} placeholder={`新增${KIND_LABEL[kind]}`} className="h-8 rounded-md border border-[var(--line)] bg-[var(--bg)] px-3 text-[12px] focus:border-[var(--accent)] focus:outline-none" /> setGroup(event.target.value)} placeholder="分组" className="h-8 rounded-md border border-[var(--line)] bg-[var(--bg)] px-3 text-[12px] focus:border-[var(--accent)] focus:outline-none" />
{items.map((item) => (
{item.name} {item.code ?? '-'} {item.group ?? '-'}
))} {items.length === 0 &&
暂无字典项
}