2025-07-30 09:13:52 +08:00
|
|
|
|
import type * as T from './type'
|
|
|
|
|
import http from '@/utils/http'
|
|
|
|
|
|
|
|
|
|
export type * from './type'
|
|
|
|
|
export * from './defect'
|
|
|
|
|
|
|
|
|
|
/** @desc 获取项目列表(分页) */
|
|
|
|
|
export const getProjectList = (params: T.ProjectQuery) => {
|
|
|
|
|
return http.get<T.ProjectInfo[] | T.PageResult<T.ProjectInfo>>('/project/list', params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取项目详情 */
|
|
|
|
|
export const getProjectDetail = (projectId: string) => {
|
|
|
|
|
return http.get<T.ProjectInfo>(`/project/detail/${projectId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取机组列表 */
|
|
|
|
|
export const getTurbineList = (params?: T.TurbineQuery) => {
|
|
|
|
|
return http.get<T.TurbineInfo[]>('/turbine/list', params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取机组详情 */
|
|
|
|
|
export const getTurbineDetail = (turbineId: string) => {
|
|
|
|
|
return http.get<T.TurbineInfo>(`/turbine/info/${turbineId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取部件列表 */
|
|
|
|
|
export const getPartList = (params?: T.PartQuery) => {
|
|
|
|
|
return http.get<T.PartInfo[]>('/part/list', params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取部件详情 */
|
|
|
|
|
export const getPartDetail = (partId: string) => {
|
|
|
|
|
return http.get<T.PartInfo>(`/part/detail/${partId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取项目树 */
|
|
|
|
|
export const getProjectTree = () => {
|
|
|
|
|
return http.get<T.ProjectTreeNode[]>(`/industrial-image/project-tree`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取图像列表 */
|
|
|
|
|
export const getImageList = (params?: {
|
|
|
|
|
imageTypes?: string[]
|
|
|
|
|
keyword?: string
|
|
|
|
|
partId?: string
|
|
|
|
|
turbineId?: string
|
|
|
|
|
}) => {
|
|
|
|
|
return http.get<{
|
|
|
|
|
code: number
|
|
|
|
|
data: Array<{
|
|
|
|
|
imageId: string
|
|
|
|
|
imageName: string
|
|
|
|
|
audioList?: any[]
|
|
|
|
|
cameraManufacturer?: string
|
|
|
|
|
cameraModel?: string
|
|
|
|
|
collectorName?: string
|
|
|
|
|
focalDistance?: string
|
|
|
|
|
gps?: string
|
|
|
|
|
humidness?: number
|
|
|
|
|
imageResolution?: string
|
|
|
|
|
imageType?: string
|
|
|
|
|
imageTypeLabel?: string
|
|
|
|
|
partId?: string
|
|
|
|
|
partName?: string
|
|
|
|
|
shootingDistance?: number
|
|
|
|
|
shootingMethod?: string
|
|
|
|
|
shootingMethodLabel?: string
|
|
|
|
|
shootingTime?: string
|
|
|
|
|
temperature?: string
|
|
|
|
|
weather?: string
|
|
|
|
|
weatherLabel?: string
|
|
|
|
|
windLevel?: number
|
|
|
|
|
filePath?: string
|
|
|
|
|
imagePath?: string
|
|
|
|
|
}>
|
|
|
|
|
msg: string
|
|
|
|
|
status: number
|
|
|
|
|
success: boolean
|
|
|
|
|
}>('/image/list', params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取图像详情 */
|
|
|
|
|
export function getImageDetail(imageId: string) {
|
|
|
|
|
return http.get<T.IndustrialImage>(`/industrial-image/image/${imageId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 搜索图像 */
|
|
|
|
|
export function searchImages(query: T.ImageQuery) {
|
|
|
|
|
return http.get<T.IndustrialImage[]>(`/industrial-image/images/search`, query)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 查询通用图片来源 */
|
|
|
|
|
export const getImageSources = () => {
|
|
|
|
|
return http.get<Array<{
|
|
|
|
|
code: number
|
|
|
|
|
data: Array<{
|
|
|
|
|
id: string
|
|
|
|
|
name: string
|
|
|
|
|
code: string
|
|
|
|
|
}>
|
|
|
|
|
msg: string
|
|
|
|
|
status: number
|
|
|
|
|
}>>('/common/list/common-image-source')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 上传单张图片 */
|
|
|
|
|
export const uploadSingleImage = (imageSource: string, file: File, params?: {
|
|
|
|
|
altitude?: string
|
|
|
|
|
latitude?: string
|
|
|
|
|
longitude?: string
|
|
|
|
|
partId?: string
|
|
|
|
|
uploadUser?: string
|
|
|
|
|
}) => {
|
|
|
|
|
const formData = new FormData()
|
|
|
|
|
formData.append('file', file)
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 构建查询参数
|
|
|
|
|
const queryParams = new URLSearchParams()
|
|
|
|
|
if (params?.altitude) queryParams.append('altitude', params.altitude)
|
|
|
|
|
if (params?.latitude) queryParams.append('latitude', params.latitude)
|
|
|
|
|
if (params?.longitude) queryParams.append('longitude', params.longitude)
|
|
|
|
|
if (params?.partId) queryParams.append('partId', params.partId)
|
|
|
|
|
if (params?.uploadUser) queryParams.append('uploadUser', params.uploadUser)
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
|
|
|
|
const url = `/common/upload-image/${imageSource}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
|
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
return http.post(url, formData, {
|
|
|
|
|
headers: {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
'Content-Type': 'multipart/form-data',
|
|
|
|
|
},
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 批量上传图片 */
|
|
|
|
|
export const batchUploadImages = (imageSource: string, files: File[], params?: {
|
|
|
|
|
altitude?: string
|
|
|
|
|
latitude?: string
|
|
|
|
|
longitude?: string
|
|
|
|
|
partId?: string
|
|
|
|
|
uploadUser?: string
|
|
|
|
|
}) => {
|
|
|
|
|
const formData = new FormData()
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 添加文件
|
2025-07-31 17:32:21 +08:00
|
|
|
|
files.forEach((file) => {
|
2025-07-30 09:13:52 +08:00
|
|
|
|
formData.append('files', file)
|
|
|
|
|
})
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 构建查询参数
|
|
|
|
|
const queryParams = new URLSearchParams()
|
|
|
|
|
if (params?.altitude) queryParams.append('altitude', params.altitude)
|
|
|
|
|
if (params?.latitude) queryParams.append('latitude', params.latitude)
|
|
|
|
|
if (params?.longitude) queryParams.append('longitude', params.longitude)
|
|
|
|
|
if (params?.partId) queryParams.append('partId', params.partId)
|
|
|
|
|
if (params?.uploadUser) queryParams.append('uploadUser', params.uploadUser)
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
|
|
|
|
const url = `/common/batch-upload-image/${imageSource}${queryParams.toString() ? `?${queryParams.toString()}` : ''}`
|
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
return http.post(url, formData, {
|
|
|
|
|
headers: {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
'Content-Type': 'multipart/form-data',
|
|
|
|
|
},
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 单图自动标注缺陷 */
|
|
|
|
|
export const detectDefects = (params: {
|
|
|
|
|
confThreshold: number
|
|
|
|
|
defectTypeList: string[]
|
|
|
|
|
imageId: string
|
|
|
|
|
modelId: string
|
|
|
|
|
}) => {
|
|
|
|
|
return http.post('/defect/detect', params, {
|
|
|
|
|
headers: {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
},
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 图像导入接口(使用新的API规范) */
|
|
|
|
|
export const uploadImageToPartV2 = (
|
|
|
|
|
imageSource: string,
|
|
|
|
|
partId: string,
|
|
|
|
|
files: File[],
|
2025-07-31 17:32:21 +08:00
|
|
|
|
params: Partial<T.ImageUploadParams>,
|
2025-07-30 09:13:52 +08:00
|
|
|
|
) => {
|
|
|
|
|
const formData = new FormData()
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 添加文件
|
2025-07-31 17:32:21 +08:00
|
|
|
|
files.forEach((file) => {
|
2025-07-30 09:13:52 +08:00
|
|
|
|
formData.append('files', file)
|
|
|
|
|
})
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 添加其他参数
|
|
|
|
|
if (params.collectorId) formData.append('collectorId', params.collectorId)
|
|
|
|
|
if (params.collectorName) formData.append('collectorName', params.collectorName)
|
|
|
|
|
if (params.humidness !== undefined) formData.append('humidness', params.humidness.toString())
|
|
|
|
|
if (params.gps) formData.append('imageList[0].GPS', params.gps)
|
|
|
|
|
if (params.xResolution) formData.append('imageList[0].XResolution', params.xResolution)
|
|
|
|
|
if (params.yResolution) formData.append('imageList[0].YResolution', params.yResolution)
|
|
|
|
|
if (params.altitude) formData.append('imageList[0].altitude', params.altitude)
|
|
|
|
|
if (params.cameraManufacturer) formData.append('imageList[0].cameraManufacturer', params.cameraManufacturer)
|
|
|
|
|
if (params.cameraModel) formData.append('imageList[0].cameraModel', params.cameraModel)
|
|
|
|
|
if (params.focalDistance) formData.append('imageList[0].focalDistance', params.focalDistance)
|
|
|
|
|
if (params.focalDistance35) formData.append('imageList[0].focalDistance35', params.focalDistance35)
|
|
|
|
|
if (params.imageHeight) formData.append('imageList[0].imageHeight', params.imageHeight)
|
|
|
|
|
if (params.imageId) formData.append('imageList[0].imageId', params.imageId)
|
|
|
|
|
if (params.imageName) formData.append('imageList[0].imageName', params.imageName)
|
|
|
|
|
if (params.imagePath) formData.append('imageList[0].imagePath', params.imagePath)
|
|
|
|
|
if (params.imageResolution) formData.append('imageList[0].imageResolution', params.imageResolution)
|
|
|
|
|
if (params.imageSize) formData.append('imageList[0].imageSize', params.imageSize)
|
|
|
|
|
if (params.imageWidth) formData.append('imageList[0].imageWidth', params.imageWidth)
|
|
|
|
|
if (params.latitude) formData.append('imageList[0].latitude', params.latitude)
|
|
|
|
|
if (params.longitude) formData.append('imageList[0].longitude', params.longitude)
|
|
|
|
|
if (params.resolutionUnits) formData.append('imageList[0].resolutionUnits', params.resolutionUnits)
|
|
|
|
|
if (params.shootingTime) formData.append('imageList[0].shootingTime', params.shootingTime)
|
|
|
|
|
if (params.shootingDistance !== undefined) formData.append('shootingDistance', params.shootingDistance.toString())
|
|
|
|
|
if (params.shootingMethod) formData.append('shootingMethod', params.shootingMethod)
|
|
|
|
|
if (params.shootingTimeBegin) formData.append('shootingTimeBegin', params.shootingTimeBegin)
|
|
|
|
|
if (params.shootingTimeEnd) formData.append('shootingTimeEnd', params.shootingTimeEnd)
|
|
|
|
|
if (params.temperatureMax !== undefined) formData.append('temperatureMax', params.temperatureMax.toString())
|
|
|
|
|
if (params.temperatureMin !== undefined) formData.append('temperatureMin', params.temperatureMin.toString())
|
|
|
|
|
if (params.weather) formData.append('weather', params.weather)
|
|
|
|
|
if (params.windLevel !== undefined) formData.append('windLevel', params.windLevel.toString())
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
return http.post(`/image/${imageSource}/upload/${partId}`, formData, {
|
|
|
|
|
headers: {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
'Content-Type': 'multipart/form-data',
|
|
|
|
|
},
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 图像导入接口(更新为使用真实接口) */
|
|
|
|
|
export const importImages = (files: FileList | File[], params: T.ImageImportParams) => {
|
|
|
|
|
const fileArray = Array.from(files)
|
2025-07-31 17:32:21 +08:00
|
|
|
|
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 使用批量上传接口
|
|
|
|
|
return batchUploadImages(params.imageSource || 'default', fileArray, {
|
|
|
|
|
partId: params.componentId,
|
2025-07-31 17:32:21 +08:00
|
|
|
|
uploadUser: params.uploadUser,
|
|
|
|
|
}).then((response) => {
|
2025-07-30 09:13:52 +08:00
|
|
|
|
// 如果需要自动标注
|
|
|
|
|
if (params.autoAnnotate && params.annotationTypes && params.annotationTypes.length > 0) {
|
|
|
|
|
// 这里可以添加自动标注逻辑
|
|
|
|
|
return response
|
|
|
|
|
}
|
|
|
|
|
return response
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 自动标注接口(更新为使用真实接口) */
|
|
|
|
|
export const autoAnnotateImage = (params: T.AutoAnnotationParams) => {
|
|
|
|
|
return detectDefects({
|
|
|
|
|
confThreshold: params.confidenceThreshold || 0.5,
|
|
|
|
|
defectTypeList: params.annotationTypes,
|
|
|
|
|
imageId: params.imageId,
|
2025-07-31 17:32:21 +08:00
|
|
|
|
modelId: params.params?.modelId || 'default',
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取图像标注信息 */
|
|
|
|
|
export const getImageAnnotations = (imageId: string) => {
|
|
|
|
|
return http.get<T.AnnotationResult>(`/industrial-image/annotations/${imageId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 删除标注 */
|
|
|
|
|
export const deleteAnnotation = (imageId: string, annotationId: string) => {
|
|
|
|
|
return http.del(`/industrial-image/annotations/${imageId}/${annotationId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 确认标注 */
|
|
|
|
|
export const confirmAnnotation = (imageId: string, annotationId: string) => {
|
|
|
|
|
return http.post(`/industrial-image/annotations/${imageId}/${annotationId}/confirm`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 上传图像(保留旧接口兼容性) */
|
2025-07-31 17:32:21 +08:00
|
|
|
|
export const uploadImage = (file: File, params: { projectId: string, componentId?: string }) => {
|
2025-07-30 09:13:52 +08:00
|
|
|
|
return uploadSingleImage('default', file, {
|
|
|
|
|
partId: params.componentId,
|
2025-07-31 17:32:21 +08:00
|
|
|
|
uploadUser: 'current-user',
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 删除图像 */
|
|
|
|
|
export const deleteImage = (imageId: string) => {
|
|
|
|
|
return http.del(`/industrial-image/images/${imageId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 批量删除图像 */
|
|
|
|
|
export function batchDeleteImages(imageIds: string[]) {
|
|
|
|
|
return http.del(`/industrial-image/images`, { ids: imageIds })
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 开始图像处理 */
|
|
|
|
|
export const processImage = (params: T.ImageProcessParams) => {
|
|
|
|
|
return http.post<T.ImageProcessResult>(`/industrial-image/process`, params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取处理结果 */
|
|
|
|
|
export const getProcessResult = (processId: string) => {
|
|
|
|
|
return http.get<T.ImageProcessResult>(`/industrial-image/process/${processId}`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 获取图像的所有处理结果 */
|
|
|
|
|
export function getImageProcessResults(imageId: string) {
|
|
|
|
|
return http.get<T.ImageProcessResult[]>(`/industrial-image/image/${imageId}/results`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 取消图像处理 */
|
|
|
|
|
export function cancelImageProcess(processId: string) {
|
|
|
|
|
return http.post(`/industrial-image/process/${processId}/cancel`)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 重新处理图像 */
|
|
|
|
|
export function reprocessImage(params: T.ImageProcessParams) {
|
|
|
|
|
return http.post<T.ImageProcessResult>(`/industrial-image/process/reprocess`, params)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 批量处理 */
|
|
|
|
|
export const batchProcessImages = (imageIds: string[], processType: string) => {
|
|
|
|
|
return http.post<T.ImageProcessResult[]>(`/industrial-image/batch-process`, {
|
|
|
|
|
imageIds,
|
2025-07-31 17:32:21 +08:00
|
|
|
|
processType,
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 导出处理结果 */
|
|
|
|
|
export function exportProcessResults(query: T.ImageQuery) {
|
|
|
|
|
return http.get(`/industrial-image/export/results`, query, {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
responseType: 'blob',
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** @desc 生成检测报告 */
|
|
|
|
|
export function generateReport(projectId: string) {
|
|
|
|
|
return http.post(`/industrial-image/report/generate`, { projectId }, {
|
2025-07-31 17:32:21 +08:00
|
|
|
|
responseType: 'blob',
|
2025-07-30 09:13:52 +08:00
|
|
|
|
})
|
|
|
|
|
}
|