import React, { useCallback, useEffect, useRef, useState } from 'react'; import { useAccess, history } from '@umijs/max'; import { Button, message, Modal } from 'antd'; import { ActionType, PageContainer, ProColumns, ProTable } from '@ant-design/pro-components'; import { PlusOutlined, DeleteOutlined, FormOutlined, EyeOutlined } from '@ant-design/icons'; import { getOutdoorFairList, addOutdoorFair, updateOutdoorFair, deleteOutdoorFair, addOutdoorFairDictOption, } from '@/services/jobportal/outdoorFair'; import type { OutdoorFairItem, OutdoorFairListParams, OutdoorFairForm, OutdoorFairDictForm, } from '@/services/jobportal/outdoorFair'; import { getDictSelectOption, getDictValueEnum } from '@/services/system/dict'; import { getVenueInfoList } from '@/services/jobportal/venueInfo'; import EditModal from './components/EditModal'; const OUTDOOR_FAIR_TYPE_DICT = 'outdoor_fair_type'; const OUTDOOR_FAIR_REGION_DICT = 'outdoor_fair_region'; const OutdoorFairList: React.FC = () => { const access = useAccess(); const actionRef = useRef(); const [modalVisible, setModalVisible] = useState(false); const [currentRow, setCurrentRow] = useState(); const [fairTypeValueEnum, setFairTypeValueEnum] = useState>({}); const [fairTypeOptions, setFairTypeOptions] = useState([]); const [regionValueEnum, setRegionValueEnum] = useState>({}); const [regionOptions, setRegionOptions] = useState([]); const [venueOptions, setVenueOptions] = useState([]); const refreshDictOptions = useCallback(async () => { const [typeValueEnum, typeOptions, regionEnum, regionSelectOptions] = await Promise.all([ getDictValueEnum(OUTDOOR_FAIR_TYPE_DICT), getDictSelectOption(OUTDOOR_FAIR_TYPE_DICT), getDictValueEnum(OUTDOOR_FAIR_REGION_DICT), getDictSelectOption(OUTDOOR_FAIR_REGION_DICT), ]); setFairTypeValueEnum(typeValueEnum); setFairTypeOptions(typeOptions); setRegionValueEnum(regionEnum); setRegionOptions(regionSelectOptions); }, []); useEffect(() => { refreshDictOptions(); }, [refreshDictOptions]); const refreshVenueOptions = useCallback(async () => { const res = await getVenueInfoList({ current: 1, pageSize: 999 }); if (res.code === 200) { setVenueOptions( (res.rows || []).map((item) => ({ label: item.venueName, value: item.id, venueAddress: item.venueAddress, floorCount: item.floorCount, })), ); } }, []); useEffect(() => { refreshVenueOptions(); }, [refreshVenueOptions]); const handleCreateDictOption = async (values: OutdoorFairDictForm) => { const res = await addOutdoorFairDictOption(values); if (res.code === 200) { await refreshDictOptions(); message.success('字典项新增成功'); return true; } message.error(res.msg || '字典项新增失败'); return false; }; const handleDelete = async (id: number) => { Modal.confirm({ title: '确认删除', content: '确定要删除该户外招聘会吗?', onOk: async () => { const res = await deleteOutdoorFair(id); if (res.code === 200) { message.success('删除成功'); actionRef.current?.reload(); } else { message.error(res.msg || '删除失败'); } }, }); }; const columns: ProColumns[] = [ { title: '招聘会标题', dataIndex: 'title', ellipsis: true, }, { title: '举办单位', dataIndex: 'hostUnit', ellipsis: true, }, { title: '招聘会类型', dataIndex: 'fairType', ellipsis: true, valueType: 'select', valueEnum: fairTypeValueEnum, }, { title: '举办区域', dataIndex: 'region', ellipsis: true, valueType: 'select', valueEnum: regionValueEnum, }, { title: '绑定场地', dataIndex: 'venueName', ellipsis: true, hideInSearch: true, render: (_, record) => record.venueId && record.venueName ? ( ) : ( '--' ), }, { title: '举办地址', dataIndex: 'address', ellipsis: true, hideInSearch: true, }, { title: '展位数量', dataIndex: 'boothCount', hideInSearch: true, }, { title: '举办时间', dataIndex: 'holdTime', valueType: 'dateTime', hideInSearch: true, }, { title: '截止时间', dataIndex: 'endTime', valueType: 'dateTime', hideInSearch: true, }, { title: '开放申请', dataIndex: 'applyStartTime', valueType: 'dateTime', hideInSearch: true, }, { title: '截止申请', dataIndex: 'applyEndTime', valueType: 'dateTime', hideInSearch: true, }, { title: '线上申请', dataIndex: 'onlineApply', hideInSearch: true, render: (_, record) => (record.onlineApply ? '是' : '否'), }, { title: '招聘会照片', dataIndex: 'photoUrl', hideInSearch: true, render: (_, record) => record.photoUrl ? ( {record.title} ) : ( '--' ), }, { title: '操作', valueType: 'option', width: 160, fixed: 'right', render: (_, record) => [ , , , ], }, ]; return ( headerTitle="户外招聘会管理列表" actionRef={actionRef} rowKey="id" columns={columns} scroll={{ x: 'max-content' }} request={async (params) => { const res = await getOutdoorFairList({ current: params.current, pageSize: params.pageSize, title: params.title, hostUnit: params.hostUnit, fairType: params.fairType, region: params.region, venueId: params.venueId, } as OutdoorFairListParams); return { data: res.rows, total: res.total, success: true }; }} toolBarRender={() => [ , ]} /> { setModalVisible(false); setCurrentRow(undefined); }} onSubmit={async (values: OutdoorFairForm) => { const res = values.id ? await updateOutdoorFair(values) : await addOutdoorFair(values); if (res.code === 200) { message.success(values.id ? '修改成功' : '新增成功'); setModalVisible(false); setCurrentRow(undefined); actionRef.current?.reload(); } else { message.error(res.msg || '操作失败'); } }} /> ); }; export default OutdoorFairList;