138 lines
4.8 KiB
JavaScript
138 lines
4.8 KiB
JavaScript
import { request as requestUtils } from '../utils/request.js'
|
|
import * as clientApi from '../api/frontend/index.js'
|
|
import * as adminApi from '../api/FrontendDesigner'
|
|
import { FileServer } from './fileserver.js';
|
|
// 获取环境变量中的
|
|
const getPorjectType = () => {
|
|
// 浏览器环境
|
|
if (typeof window !== 'undefined') {
|
|
// Vite 环境变量
|
|
return import.meta.env.VITE_PROJECTTYPE;
|
|
}
|
|
// Node.js 环境
|
|
if (typeof process !== 'undefined') {
|
|
return process.env.VITE_PROJECTTYPE ;
|
|
}
|
|
};
|
|
export class MeshyServer extends FileServer {
|
|
RULE = getPorjectType();
|
|
// 任务并发队列
|
|
static taskQueue = new Map();
|
|
//最高并发限制
|
|
static MAX_CONCURRENT_TASKS = 10;
|
|
static pollingEnabled = true;
|
|
constructor() {
|
|
super();
|
|
}
|
|
//提交模型任务返回id
|
|
async createModelTask(item={},callback,errorCallback,config={}) {
|
|
// 检查当前并发任务数
|
|
if(MeshyServer.taskQueue.size >= MeshyServer.MAX_CONCURRENT_TASKS){
|
|
window.setElMessage({
|
|
type:'warning',
|
|
message:'Concurrent limit reached'
|
|
})
|
|
errorCallback&&errorCallback('Concurrent limit reached');
|
|
return Promise.reject('Concurrent limit reached');
|
|
}
|
|
const taskId = new Date().getTime();
|
|
MeshyServer.taskQueue.set(taskId, taskId);
|
|
try {
|
|
let params = {
|
|
project_id: item.project_id,
|
|
"payload": {
|
|
image_url:'',
|
|
ai_model: 'latest',
|
|
enable_pbr: false,
|
|
should_remesh: false,
|
|
should_texture: false,
|
|
save_pre_remeshed_model: true,
|
|
...config
|
|
}
|
|
}
|
|
let imgurl = item.image_url.indexOf('https://api.deotaland.ai') !== -1
|
|
? item.image_url
|
|
: await this.uploadFile(item.image_url);
|
|
// let imgurl = 'https://api.deotaland.ai/upload/aabf8b4a8df447fa8c3e3f7978c523cc.png';
|
|
params.payload.image_url = imgurl;
|
|
const requestUrl = this.RULE=='admin'?adminApi.default.IMAGE_TO_3DADMIN:clientApi.default.IMAGE_TO_3D;
|
|
const response = await requestUtils.common(requestUrl, params);
|
|
// const response = {"code":0,"message":"","success":true,"data":{"id":2215,"message":"任务已提交,正在处理"}}
|
|
console.log('创建模型任务响应:', response);
|
|
if(response.code==0){
|
|
callback&&callback(response?.data?.id,taskId);
|
|
}
|
|
} catch (error) {
|
|
console.error('创建模型任务失败:', error);
|
|
errorCallback&&errorCallback(error);
|
|
throw error;
|
|
}
|
|
}
|
|
static demoNum = 0;
|
|
//查询任务状态
|
|
async getModelTaskStatus(resultItem,callback,errorCallback,progressCallback){
|
|
const result = resultItem.result;
|
|
const resultTask = resultItem.resultTask;
|
|
if(!MeshyServer.taskQueue.has(resultTask)){//用户刷新了页面清除了任务队列重新添加进任务队列
|
|
MeshyServer.taskQueue.set(resultTask, resultTask);
|
|
}
|
|
try {
|
|
const requestUrl = {
|
|
url:this.RULE=='admin'?adminApi.default.FIND_TASK_IDADMIN.url.replace('TASKID', result):clientApi.default.FIND_TASK_ID.url.replace('TASKID', result),
|
|
method:this.RULE=='admin'?adminApi.default.FIND_TASK_IDADMIN.method:clientApi.default.FIND_TASK_ID.method,
|
|
};
|
|
let response = await requestUtils.common(requestUrl, {});
|
|
// let response = {
|
|
// "code": 0,
|
|
// "message": "",
|
|
// "success": true,
|
|
// "data": {
|
|
// "id": 2175,
|
|
// "status": 0,
|
|
// "result": null,
|
|
// "response_data": {},
|
|
// "provider": "meshy",
|
|
// "project_id": 57,
|
|
// "created_at": "2025-12-10T04:26:40.148194+00:00"
|
|
// }
|
|
// }
|
|
if(response.code==0){
|
|
let data = response?.data?.result||{};
|
|
let status = response?.data.status;
|
|
switch (status) {
|
|
case 1:
|
|
// let modelurl = data.model_url.replace("https://assets.meshy.ai", "https://api.deotaland.ai/model");
|
|
let modelurl = data.s3_glb_url;
|
|
resultTask&&MeshyServer.taskQueue.delete(resultTask);
|
|
callback&&callback(modelurl);
|
|
break;
|
|
case 2:
|
|
errorCallback&&errorCallback();
|
|
resultTask&&MeshyServer.taskQueue.delete(resultTask);
|
|
break;
|
|
case 3:
|
|
errorCallback&&errorCallback();
|
|
resultTask&&MeshyServer.taskQueue.delete(resultTask);
|
|
break;
|
|
default:
|
|
if(!MeshyServer.pollingEnabled){//如果禁用轮询,直接返回
|
|
return
|
|
}
|
|
// 等待三秒
|
|
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
progressCallback&&progressCallback(data.progress||0);
|
|
this.getModelTaskStatus({
|
|
result:result,
|
|
resultTask:resultTask,
|
|
},callback,errorCallback,progressCallback);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
catch (error) {
|
|
resultTask&&MeshyServer.taskQueue.delete(resultTask);
|
|
errorCallback&&errorCallback(error);
|
|
throw error;
|
|
}
|
|
}
|
|
} |