import React, { useCallback, useEffect, useState } from 'react'; import { history, useAccess } from '@umijs/max'; import { Button, Card, Descriptions, Divider, Image, Tag, message } from 'antd'; import { FormOutlined } from '@ant-design/icons'; import type { OutdoorFairDictForm, OutdoorFairItem } from '@/services/jobportal/outdoorFair'; import { addOutdoorFairDictOption, updateOutdoorFair } from '@/services/jobportal/outdoorFair'; import { getVenueInfo, getVenueInfoList } from '@/services/jobportal/venueInfo'; import type { VenueInfoItem } from '@/services/jobportal/venueInfo'; import { getDictSelectOption, getDictValueEnum } from '@/services/system/dict'; import EditModal from '@/pages/Jobfair/Outdoorfair/components/EditModal'; const OUTDOOR_FAIR_TYPE_DICT = 'outdoor_fair_type'; const OUTDOOR_FAIR_REGION_DICT = 'outdoor_fair_region'; const VENUE_INFO_TYPE_DICT = 'venue_info_type'; interface Props { fairId: number; fairInfo: OutdoorFairItem; onFairUpdate: () => void; } const FairInfoTab: React.FC = ({ fairInfo, onFairUpdate }) => { const access = useAccess(); const [editModalOpen, setEditModalOpen] = useState(false); const [fairTypeOptions, setFairTypeOptions] = useState([]); const [regionOptions, setRegionOptions] = useState([]); const [venueOptions, setVenueOptions] = useState([]); const [venueDetail, setVenueDetail] = useState(); const [venueTypeValueEnum, setVenueTypeValueEnum] = useState>({}); const refreshEditModalOptions = useCallback(async () => { const [typeOptions, regionSelectOptions, venueRes, venueTypeValueEnum] = await Promise.all([ getDictSelectOption(OUTDOOR_FAIR_TYPE_DICT), getDictSelectOption(OUTDOOR_FAIR_REGION_DICT), getVenueInfoList({ current: 1, pageSize: 999 }), getDictValueEnum(VENUE_INFO_TYPE_DICT), ]); setFairTypeOptions(typeOptions); setRegionOptions(regionSelectOptions); setVenueTypeValueEnum(venueTypeValueEnum); if (venueRes.code === 200) { setVenueOptions( (venueRes.rows || []).map((item) => ({ label: item.venueName, value: item.id, venueAddress: item.venueAddress, floorCount: item.floorCount, })), ); } }, []); useEffect(() => { refreshEditModalOptions(); }, [refreshEditModalOptions]); // 拉取绑定场地的详细信息 useEffect(() => { const fetchVenueDetail = async () => { if (!fairInfo.venueId) { setVenueDetail(undefined); return; } try { const res = await getVenueInfo(fairInfo.venueId); if (res.code === 200 && res.data) { setVenueDetail(res.data); } else { setVenueDetail(undefined); } } catch { setVenueDetail(undefined); } }; fetchVenueDetail(); }, [fairInfo.venueId]); const handleCreateDictOption = async (values: OutdoorFairDictForm) => { const res = await addOutdoorFairDictOption(values); if (res.code === 200) { await refreshEditModalOptions(); message.success('字典项新增成功'); return true; } message.error(res.msg || '字典项新增失败'); return false; }; const fairTypeColors: Record = { 综合类: 'blue', 校园招聘: 'green', 行业专场: 'orange', 高新技术专场: 'purple', 智能制造专场: 'cyan', 文旅专场: 'magenta', 其他: 'default', }; return ( <> } hidden={!access.hasPerms('cms:outdoorFair:edit')} onClick={() => setEditModalOpen(true)} > 编辑信息 } > {fairInfo.title} {fairInfo.hostUnit} {fairInfo.fairType} {fairInfo.region} {fairInfo.venueId && fairInfo.venueName ? ( ) : ( '--' )} {fairInfo.address} {fairInfo.boothCount} {fairInfo.holdTime} {fairInfo.endTime} {fairInfo.applyStartTime} {fairInfo.applyEndTime} {fairInfo.onlineApply ? '是' : '否'} {fairInfo.photoUrl ? ( {fairInfo.title} ) : ( '--' )}
{fairInfo.fairIntroduction || '--'}
{fairInfo.fairProcess || '--'}
企业参会专属信息(仅报名企业可见)
{fairInfo.requiredMaterials || '--'}
{fairInfo.attendanceNotes || '--'}
{venueDetail ? ( {venueDetail.venueName || '--'} {venueTypeValueEnum[venueDetail.venueType]?.text || venueTypeValueEnum[venueDetail.venueType]?.label || venueDetail.venueType || '--'} {venueDetail.venueArea != null ? `${venueDetail.venueArea} ㎡` : '--'} {venueDetail.floorCount ?? '--'} {venueDetail.venueAddress || '--'} {venueDetail.contactPhone || '--'} {venueDetail.routeLineNames || '--'} {venueDetail.handleDate || '--'} {venueDetail.handleOrg || '--'} {venueDetail.handler || '--'} {venueDetail.remark || '--'} ) : (
该招聘会未绑定场地信息
)}
setEditModalOpen(false)} onSubmit={async (values) => { const res = await updateOutdoorFair(values as any); if (res.code === 200) { message.success('修改成功'); setEditModalOpen(false); onFairUpdate(); } else { message.error(res.msg || '操作失败'); } }} /> ); }; export default FairInfoTab;