admin-vue3/src/api/review/meeting.ts

195 lines
5.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<ReviewProjectItemVO[]> => {
const formData = new FormData()
formData.append('file', file)
const res = await request.upload<any>({ url: '/project/review-meeting/import-projects', data: formData })
return res?.data || []
}
/** 上传固定议程附件(图片/PDF */
export const uploadAgendaAttachment = (file: File): Promise<ReviewMeetingAgendaAttachmentRespVO> => {
const formData = new FormData()
formData.append('file', file)
return request
.upload<any>({ 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<ReviewMeetingAgendaAttachmentRespVO> => {
const formData = new FormData()
formData.append('id', String(id))
formData.append('file', file)
return request
.upload<any>({ 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' })