195 lines
5.9 KiB
TypeScript
195 lines
5.9 KiB
TypeScript
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' })
|