import { useEffect, useMemo, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { message } from 'antd' import { createUser, listUsers, updateUser } from '@/api/usr' import { BizError } from '@/api/request' import { useAppDispatch } from '@/store' import { closeTab } from '@/store/tabs' import type { UserListItem } from '@/api/types' import { IconCancel, IconDelete, IconEdit, IconGrid, IconPlus, IconSave } from '@/components/icons' interface Props { mode: 'new' | 'edit' } const PERMS = [ '默认显示(必选)', '禁止查看价格', '客服跟单', '报价组员工', '物控部员工', '供应链PMC', '允许查看订单价格', '储运部员工', '外部供应商', '品质部员工', '技术中心员工', '机修组员工', '生产部计划员工', '外发组员工', '模烫车间', '装订车间', '后加工车间', '品质部管理', '精品车间', '人事组', '统计组', '机修主管', '样品开发部员工', '设计开发', '总经办', '审核组', '结算组', '打样车间', '制版组', '文控组', '行政组', '成本组', '采购组', 'OA管理员', '开发组', 'API对接', 'MES管理员', '报表组', ] const TABS = ['权限组', '客户查看权限', '供应商查看权限', '人员查看权限', '工序查看权限', '司机查看权限'] const USER_TYPES = ['超级管理员', '普通用户'] const LANGS = [{ v: 'zh', t: '中文' }, { v: 'en', t: '英文' }] interface FormState { sUserNo: string sUserName: string sUserType: string sLanguage: string bCanModifyDocs: boolean perms: Set tCreateDate: string sCreatedBy: string sStaffName: string } const empty: FormState = { sUserNo: '', sUserName: '', sUserType: '超级管理员', sLanguage: 'zh', bCanModifyDocs: false, perms: new Set([0]), tCreateDate: '', sCreatedBy: '', sStaffName: '', } export default function UserDetail({ mode }: Props) { const navigate = useNavigate() const dispatch = useAppDispatch() const params = useParams() const userId = mode === 'edit' ? Number(params.id) : null const [form, setForm] = useState(empty) const [tab, setTab] = useState(0) const [submitting, setSubmitting] = useState(false) const [editing, setEditing] = useState(mode === 'new') const [loaded, setLoaded] = useState(mode === 'new') useEffect(() => { if (mode !== 'edit' || !userId) return let cancelled = false ;(async () => { try { const res = await listUsers({ pageNum: 1, pageSize: 100, queryField: 'username', matchType: 'contains', queryValue: '' }) if (cancelled) return const found = res.list.find((u: UserListItem) => u.iIncrement === userId) if (!found) { message.warning('用户不存在或已删除') return } setForm({ sUserNo: found.sUserNo, sUserName: found.sUserName, sUserType: found.sUserType, sLanguage: found.sLanguage, bCanModifyDocs: false, perms: new Set([0]), tCreateDate: found.tCreateDate ?? '', sCreatedBy: found.sCreatedBy ?? '', sStaffName: found.sStaffName ?? '', }) setLoaded(true) } catch (err) { const msg = err instanceof BizError ? err.message : '加载用户信息失败' message.error(msg) } })() return () => { cancelled = true } }, [mode, userId]) const togglePerm = (i: number) => { if (!editing) return setForm(f => { const next = new Set(f.perms) if (next.has(i)) next.delete(i); else next.add(i) next.add(0) return { ...f, perms: next } }) } const handleSave = async () => { if (!form.sUserNo.trim() || !form.sUserName.trim()) { message.warning('请填写必填字段:用户号、用户名') return } setSubmitting(true) try { const permIds = [...form.perms].map(i => i + 1) if (mode === 'new') { await createUser({ sUserNo: form.sUserNo.trim(), sUserName: form.sUserName.trim(), sUserType: form.sUserType, sLanguage: form.sLanguage, bCanModifyDocs: form.bCanModifyDocs, permissionCategoryIds: permIds, }) message.success('用户创建成功,初始密码 666666') closeAndBack() } else if (userId) { await updateUser(userId, { sUserType: form.sUserType, sLanguage: form.sLanguage, bCanModifyDocs: form.bCanModifyDocs, permissionCategoryIds: permIds, }) message.success('保存成功') setEditing(false) } } catch (err) { const msg = err instanceof BizError ? err.message : '保存失败' message.error(msg) } finally { setSubmitting(false) } } const closeAndBack = () => { dispatch(closeTab('userdetail')) navigate('/users') } const isNew = mode === 'new' const langText = useMemo( () => LANGS.find(l => l.v === form.sLanguage)?.t ?? form.sLanguage, [form.sLanguage], ) return (
!editing && navigate('/users/new')}> 新增 !isNew && setEditing(true)}> 修改 删除 保存 editing && !isNew && setEditing(false)}> 取消 功能 作废 重置密码 取消作废
创建时间:
{isNew ? '' : form.tCreateDate}
制单人:
{isNew ? '保存后自动生成' : form.sCreatedBy}
员工名: setForm(f => ({ ...f, sStaffName: e.target.value }))} disabled={!editing} placeholder="(暂不绑定员工档案)" />
用户名: setForm(f => ({ ...f, sUserName: e.target.value }))} disabled={!editing || !isNew} />
类型: {editing ? ( ) : (
{form.sUserType}
)}
语言: {editing ? ( ) : (
{langText}
)}
用户号: setForm(f => ({ ...f, sUserNo: e.target.value }))} disabled={!editing || !isNew} />
单据修改权限: editing && setForm(f => ({ ...f, bCanModifyDocs: !f.bCanModifyDocs }))} />
{TABS.map((t, i) => (
setTab(i)}> {t}
))}
权限分类
{tab === 0 ? ( loaded && PERMS.map((p, i) => (
togglePerm(i)}> {p}
)) ) : (
该 tab 后端暂未实现
)}
) }