import { useCallback, useEffect, useState } from 'react' import { useNavigate } from 'react-router-dom' import { message } from 'antd' import { listUsers } from '@/api/usr' import { BizError } from '@/api/request' import type { MatchType, QueryField, UserListItem } from '@/api/types' import { useAppDispatch } from '@/store' import { openTab } from '@/store/tabs' import { IconExport, IconPlus, IconRefresh, IconSearch } from '@/components/icons' const QUERY_FIELDS: { value: QueryField; label: string }[] = [ { value: 'username', label: '用户名' }, { value: 'staff', label: '员工名' }, { value: 'userno', label: '用户号' }, { value: 'department', label: '部门' }, { value: 'usertype', label: '用户类型' }, { value: 'language', label: '语言' }, { value: 'deleted', label: '是否作废' }, ] const MATCH_TYPES: { value: MatchType; label: string }[] = [ { value: 'contains', label: '包含' }, { value: 'equals', label: '等于' }, { value: 'startsWith', label: '开头是' }, { value: 'endsWith', label: '结尾是' }, ] const fmt = (s: string | null | undefined) => s ?? '' export default function UserList() { const navigate = useNavigate() const dispatch = useAppDispatch() const [data, setData] = useState([]) const [total, setTotal] = useState(0) const [pageNum, setPageNum] = useState(1) const [pageSize] = useState(20) const [loading, setLoading] = useState(false) const [selectedId, setSelectedId] = useState(null) const [scopeAll] = useState(true) const [queryField, setQueryField] = useState('username') const [matchType, setMatchType] = useState('contains') const [queryValue, setQueryValue] = useState('') const load = useCallback(async (page: number) => { setLoading(true) try { const params: Parameters[0] = { pageNum: page, pageSize } if (queryValue.trim()) { params.queryField = queryField params.matchType = matchType params.queryValue = queryValue.trim() } const res = await listUsers(params) setData(res.list) setTotal(res.total) setPageNum(res.pageNum) } catch (err) { const msg = err instanceof BizError ? err.message : '加载用户列表失败' message.error(msg) } finally { setLoading(false) } }, [pageSize, queryField, matchType, queryValue]) // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional reload when filter callback identity changes useEffect(() => { load(1) }, [load]) const handleAdd = () => { dispatch(openTab({ key: 'userdetail', title: '用户信息单据', path: '/users/new' })) navigate('/users/new') } const handleRowDouble = (u: UserListItem) => { dispatch(openTab({ key: 'userdetail', title: '用户信息单据', path: `/users/${u.iIncrement}` })) navigate(`/users/${u.iIncrement}`) } const handleClear = () => { setQueryValue('') setQueryField('username') setMatchType('contains') } const totalPages = Math.max(1, Math.ceil(total / pageSize)) return (
load(pageNum)}>刷新 新增 message.info('导出 Excel - 未实现')}>导出Excel
setQueryValue(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') load(1) }} />
{data.length === 0 && !loading && ( )} {data.map((u, i) => ( setSelectedId(u.iIncrement)} onDoubleClick={() => handleRowDouble(u)} > ))}
序号 用户名 员工名 用户号 部门 用户类型 语言 登录日期 制单人 制单日期
无数据
{(pageNum - 1) * pageSize + i + 1} {u.sUserName} {fmt(u.sStaffName)} {u.sUserNo} {fmt(u.sDepartment)} {u.sUserType} {u.sLanguage === 'zh' ? '中文' : u.sLanguage === 'en' ? '英文' : u.sLanguage} {fmt(u.tLastLoginDate)} {fmt(u.sCreatedBy)} {fmt(u.tCreateDate)}
当前显示 共 {total} 条记录 pageNum > 1 && load(pageNum - 1)} >‹ {pageNum} = totalPages ? 'disabled' : ''}`} onClick={() => pageNum < totalPages && load(pageNum + 1)} >›
) }