import request from '@/config/axios' // ============================================================ // 类型定义 // ============================================================ // 评审项目条目(Excel 导入 & 保存时使用) export interface ReviewProjectItemVO { seqNo: number startTime: string endTime: string agendaCategory: string projectTitle: string reporter: string reporterUnit: string } // 会议保存 VO(新增/编辑) export interface ReviewMeetingSaveReqVO { id?: number name: string organizationUnit?: string startTime?: string | number endTime?: string | number materialViewStartTime?: string | number materialViewEndTime?: string | number materialViewRemark?: string location: string host?: string agendaAttachmentName?: string agendaAttachmentUrl?: string agendaAttachmentType?: string agendaAttachmentSize?: number minutesAttachmentName?: string minutesAttachmentUrl?: string minutesAttachmentType?: string minutesAttachmentSize?: number expertIds: number[] projects?: ReviewProjectItemVO[] } // 会议列表分页查询 VO export interface ReviewMeetingPageReqVO { pageNo?: number pageSize?: number name?: string status?: number startTime?: string[] } // 会议响应 VO export interface ReviewMeetingRespVO { id: number name: string organizationUnit?: string startTime: string endTime: string materialViewStartTime?: string materialViewEndTime?: string materialViewRemark?: string location: string host?: string agendaAttachmentName?: string agendaAttachmentUrl?: string agendaAttachmentType?: string agendaAttachmentSize?: number minutesAttachmentName?: string minutesAttachmentUrl?: string minutesAttachmentType?: string minutesAttachmentSize?: number status: number // 0-草稿 1-已邀约 2-已结束 3-已取消 expertIds: number[] expertCount: number projectCount: number mailSent?: boolean createTime: string } export interface ReviewMeetingAgendaAttachmentRespVO { name: string url: string type: string size: number } // 短信发送状态 VO export interface ReviewMeetingSmsLogRespVO { id: number expertId: number expertName: string mobile: string status: number // 0-待发送 1-成功 2-失败 errorMsg: string retryCount: number sendTime: string } // 邮件发送状态 VO export interface ReviewMeetingMailLogRespVO { id: number expertId: number expertName: string mail: string status: number // 0-待发送 1-成功 2-失败 3-已忽略 errorMsg: string retryCount: number sendTime: string } // ============================================================ // API 调用 // ============================================================ /** 创建会议(保存草稿) */ export const createReviewMeeting = (data: ReviewMeetingSaveReqVO) => request.post({ url: '/project/review-meeting/create', data }) /** 更新会议 */ export const updateReviewMeeting = (data: ReviewMeetingSaveReqVO) => request.put({ url: '/project/review-meeting/update', data }) /** 取消会议 */ export const cancelReviewMeeting = (id: number) => request.put({ url: '/project/review-meeting/cancel', params: { id } }) /** 结束会议 */ export const finishReviewMeeting = (id: number) => request.put({ url: '/project/review-meeting/finish', params: { id } }) /** 复制会议(仅已结束/已取消) */ export const copyReviewMeeting = (id: number) => request.post({ url: '/project/review-meeting/copy', params: { id } }) /** 获取会议详情 */ export const getReviewMeeting = (id: number) => request.get({ url: '/project/review-meeting/get', params: { id } }) /** 分页查询会议列表 */ export const getReviewMeetingPage = (params: ReviewMeetingPageReqVO) => request.get({ url: '/project/review-meeting/page', params }) /** 发送短信邀约 */ export const sendSmsInvitation = (id: number) => request.post({ url: '/project/review-meeting/send-sms', params: { id } }) /** 手动发送邮件邀请函 */ export const sendMailInvitation = (id: number) => request.post({ url: '/project/review-meeting/send-mail', params: { id } }) /** 手动重发失败短信 */ export const retrySmsLog = (smsLogId: number) => request.post({ url: '/project/review-meeting/retry-sms', params: { smsLogId } }) /** 获取短信发送状态列表 */ export const getSmsLogList = (reviewMeetingId: number) => request.get({ url: '/project/review-meeting/sms-log-list', params: { reviewMeetingId } }) /** 获取邮件发送状态列表 */ export const getMailLogList = (reviewMeetingId: number) => request.get({ url: '/project/review-meeting/mail-log-list', params: { reviewMeetingId } }) /** 解析 Excel 导入评审项目(返回项目列表,不落库) */ export const importProjectsFromExcel = async (file: File): Promise => { const formData = new FormData() formData.append('file', file) const res = await request.upload({ url: '/project/review-meeting/import-projects', data: formData }) return res?.data || [] } /** 上传固定议程附件(图片/PDF) */ export const uploadAgendaAttachment = (file: File): Promise => { const formData = new FormData() formData.append('file', file) return request .upload({ url: '/project/review-meeting/upload-agenda-attachment', data: formData }) .then((res) => res?.data as ReviewMeetingAgendaAttachmentRespVO) } /** 上传会议纪要附件(Word/PDF/图片) */ export const uploadMinutesAttachment = ( id: number, file: File ): Promise => { const formData = new FormData() formData.append('id', String(id)) formData.append('file', file) return request .upload({ url: '/project/review-meeting/upload-minutes-attachment', data: formData }) .then((res) => res?.data as ReviewMeetingAgendaAttachmentRespVO) } /** 下载导入模板 */ export const getImportTemplate = () => request.download({ url: '/project/review-meeting/get-import-template' })