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; } } }