import SearchForm from '@/components/SearchForm' import useAccountStore, { fetchRoleList, fetchTravelAgencyByName, genRandomPassword } from '@/stores/Account' import useFormStore from '@/stores/Form' import { isEmpty, debounce } from '@/utils/commons' import { ExclamationCircleFilled } from '@ant-design/icons' import { App, Button, Col, Form, Input, Modal, Row, Select, Space, Table, Typography, Switch } from 'antd' import dayjs from 'dayjs' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' const { Title } = Typography function Management() { const { t } = useTranslation() const accountListColumns = [ { title: t('account:username'), dataIndex: 'username', render: accountRender }, { title: t('account:realname'), dataIndex: 'realname', }, { title: t('account:email'), dataIndex: 'email', }, { title: t('account:travelAgency'), dataIndex: 'travelAgencyName', }, { title: t('account:roleName'), dataIndex: 'role' }, { title: t('account:lastLogin'), dataIndex: 'lastLogin', render: (text) => (isEmpty(text) ? '' : dayjs(text).format('YYYY-MM-DD HH:mm:ss')) }, { title: t('account:action'), dataIndex: 'account:action', render: actionRender }, ] function accountRender(text, account) { return ( ) } function actionRender(_, account) { return ( { showDisableConfirm(account, checked) }} /> ) } const [isAccountModalOpen, setAccountModalOpen] = useState(false) const [dataLoading, setDataLoading] = useState(false) const [roleAllList, setRoleAllList] = useState([]) const [travelAgencyList, setTravelAgencyList] = useState([]) const [currentTravelAgency, setCurrentTravelAgency] = useState(null) const [accountForm] = Form.useForm() const [searchAccountByCriteria, accountList, toggleAccountStatus, saveOrUpdateAccount, resetAccountPassword, newEmptyAccount] = useAccountStore((state) => [state.searchAccountByCriteria, state.accountList, state.toggleAccountStatus, state.saveOrUpdateAccount, state.resetAccountPassword, state.newEmptyAccount]) const formValues = useFormStore(state => state.formValues) const { notification, modal } = App.useApp() useEffect(() => { fetchRoleList() .then((roleList) => { const roleListMap = roleList.map(r => { return { value: r.role_id, label: r.role_name, disabled: r.role_id === 1 } }) roleListMap.unshift({ value: 0, label: '未设置', disabled: true }); setRoleAllList(roleListMap) }) }, []) const handelAccountSearch = () => { setDataLoading(true) searchAccountByCriteria(formValues) .catch(ex => { notification.error({ message: 'Notification', description: ex.message, placement: 'top', duration: 4, }) }) .finally(() => { setDataLoading(false) }) } const onAccountSeleted = async (account) => { setTravelAgencyList([{ label: account.travelAgencyName, value: account.travelAgencyId }]) accountForm.setFieldsValue(account) setCurrentTravelAgency(account.travelAgencyId) setAccountModalOpen(true) } const onNewAccount = () => { const emptyAccount = newEmptyAccount() accountForm.setFieldsValue(emptyAccount) setAccountModalOpen(true) } const onAccountFinish = (values) => { saveOrUpdateAccount(values) .then(() => { notification.info({ message: 'Notification', description: '账号保存成功', placement: 'top', }) setAccountModalOpen(false) handelAccountSearch() }) .catch(ex => { notification.error({ message: 'Notification', description: ex.message, placement: 'top', duration: 4, }) }) } const onAccountFailed = (error) => { console.log('Failed:', error) // form.resetFields() } const handleTravelAgencySearch = (newValue) => { setDataLoading(true) fetchTravelAgencyByName(newValue) .then(result => { setTravelAgencyList(result.map(r => { return { label: r.travel_agency_name, value: r.travel_agency_id } })) }) .finally(() => { setDataLoading(false) }) } const handleTravelAgencyChange = (newValue) => { setCurrentTravelAgency(newValue) } const showDisableConfirm = (account, status) => { const confirmTitle = status ? t('account:action.enable.title') : t('account:action.disable.title') modal.confirm({ title: confirmTitle, icon: , content: t('account:username') + ': ' + account.username + ', ' + t('account:realname') + ': ' + account.realname, onOk() { toggleAccountStatus(account.userId, status) .then(() => { handelAccountSearch() }) .catch(ex => { notification.error({ message: 'Notification', description: ex.message, placement: 'top', duration: 4, }) }) }, onCancel() { }, }) } const showResetPasswordConfirm = (account) => { const confirmTitle = t('account:action.resetPassword.tile') const randomPassword = genRandomPassword() modal.confirm({ title: confirmTitle, icon: , content: t('account:username') + ': ' + account.username + ', ' + t('account:realname') + ': ' + account.realname, onOk() { resetAccountPassword(account.userId, randomPassword) .then(() => { notification.info({ message: `请复制新密码给 [${account.realname}]`, description: '新密码:' + randomPassword, placement: 'top', duration: 60, }) }) }, onCancel() { }, }) } return ( <> setAccountModalOpen(false)} destroyOnClose forceRender modalRender={(dom) => (
{dom}
)} >
{t('account:accountList')} { handelAccountSearch() }} /> { return t('Total') + `:${total}` } }} columns={accountListColumns} dataSource={accountList} /> ) } export default Management