144 lines
4.2 KiB
TypeScript
144 lines
4.2 KiB
TypeScript
import request from '@/config/axios'
|
||
import axios from 'axios'
|
||
import * as FileApi from '@/api/infra/file'
|
||
|
||
// ============================================================
|
||
// 类型定义
|
||
// ============================================================
|
||
|
||
export interface ReviewMeetingProjectRespVO {
|
||
id: number
|
||
reviewMeetingId: number
|
||
seqNo: number
|
||
startTime: string
|
||
endTime: string
|
||
agendaCategory: string
|
||
projectTitle: string
|
||
reporter: string
|
||
reporterUnit: string
|
||
host: string
|
||
}
|
||
|
||
export interface ReviewMeetingProjectPageReqVO {
|
||
pageNo?: number
|
||
pageSize?: number
|
||
reviewMeetingId: number
|
||
projectTitle?: string
|
||
agendaCategory?: string
|
||
reporter?: string
|
||
}
|
||
|
||
/** 独立项目列表查询(meetingId 可选,用于独立菜单页) */
|
||
export interface ReviewProjectPageReqVO {
|
||
pageNo?: number
|
||
pageSize?: number
|
||
reviewMeetingId?: number
|
||
projectTitle?: string
|
||
agendaCategory?: string
|
||
reporter?: string
|
||
reporterUnit?: string
|
||
}
|
||
|
||
export interface ReviewMeetingFileRespVO {
|
||
id: number
|
||
reviewMeetingProjectId: number
|
||
fileName: string
|
||
fileUrl: string
|
||
fileSize: number
|
||
fileType: string
|
||
creator: string
|
||
createTime: string
|
||
}
|
||
|
||
export interface ReviewMeetingFileRegisterReqVO {
|
||
reviewMeetingId: number
|
||
reviewMeetingProjectId: number
|
||
fileName: string
|
||
fileUrl: string
|
||
fileSize: number
|
||
fileType?: string
|
||
}
|
||
|
||
// ============================================================
|
||
// API 调用
|
||
// ============================================================
|
||
|
||
/** 分页查询评审项目列表(需要 meetingId) */
|
||
export const getReviewProjectPage = (params: ReviewMeetingProjectPageReqVO) =>
|
||
request.get({ url: '/project/review-project/page', params })
|
||
|
||
/** 独立分页查询评审项目列表(meetingId 可选) */
|
||
export const getReviewProjectPageStandalone = (params: ReviewProjectPageReqVO) =>
|
||
request.get({ url: '/project/review-project/page', params })
|
||
|
||
/** 创建评审项目 */
|
||
export const createReviewProject = (data: Partial<ReviewMeetingProjectRespVO>) =>
|
||
request.post({ url: '/project/review-project/create', data })
|
||
|
||
/** 更新评审项目信息 */
|
||
export const updateReviewProject = (data: Partial<ReviewMeetingProjectRespVO>) =>
|
||
request.put({ url: '/project/review-project/update', data })
|
||
|
||
/** 删除评审项目 */
|
||
export const deleteReviewProject = (ids: number[]) =>
|
||
request.delete({ url: '/project/review-project/delete', params: { ids: ids.join(',') } })
|
||
|
||
/** 更新评审项目主持人 */
|
||
export const updateProjectHost = (projectId: number, host: string) =>
|
||
request.put({ url: '/project/review-project/update-host', params: { projectId, host } })
|
||
|
||
/** 上传会议文件 */
|
||
export const uploadMeetingFile = (
|
||
reviewMeetingId: number,
|
||
reviewMeetingProjectId: number,
|
||
file: File
|
||
) => {
|
||
return uploadMeetingFileByPresignedUrl(reviewMeetingId, reviewMeetingProjectId, file)
|
||
}
|
||
|
||
/** 登记会议文件 */
|
||
export const registerMeetingFile = (data: ReviewMeetingFileRegisterReqVO) =>
|
||
request.post<ReviewMeetingFileRespVO>({ url: '/project/review-project/register-file', data })
|
||
|
||
/** 获取项目文件列表 */
|
||
export const getMeetingFileList = (reviewMeetingProjectId: number) =>
|
||
request.get({
|
||
url: '/project/review-project/file-list',
|
||
params: { reviewMeetingProjectId }
|
||
})
|
||
|
||
/** 删除会议文件 */
|
||
export const deleteMeetingFile = (id: number) =>
|
||
request.delete({ url: '/project/review-project/delete-file', params: { id } })
|
||
|
||
const uploadMeetingFileByPresignedUrl = async (
|
||
reviewMeetingId: number,
|
||
reviewMeetingProjectId: number,
|
||
file: File
|
||
) => {
|
||
const presignedInfo = await FileApi.getFilePresignedUrl(file.name, 'review-meeting')
|
||
await axios.put(presignedInfo.uploadUrl, file, {
|
||
headers: {
|
||
'Content-Type': file.type || 'application/octet-stream'
|
||
}
|
||
})
|
||
|
||
await FileApi.createFile({
|
||
configId: presignedInfo.configId,
|
||
url: presignedInfo.url,
|
||
path: presignedInfo.path,
|
||
name: file.name,
|
||
type: file.type || 'application/octet-stream',
|
||
size: file.size
|
||
})
|
||
|
||
return registerMeetingFile({
|
||
reviewMeetingId,
|
||
reviewMeetingProjectId,
|
||
fileName: file.name,
|
||
fileUrl: presignedInfo.url,
|
||
fileSize: file.size,
|
||
fileType: file.name.includes('.') ? file.name.split('.').pop()?.toLowerCase() : ''
|
||
})
|
||
}
|