1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
import{C as e,D as t,F as n,I as r,L as i,N as a,O as o,P as ee,R as te,T as ne,b as s,d as re,f as ie,g as c,i as ae,l as oe,m as l,n as u,o as d,p as f,r as p,s as se,v as m,y as h,z as g}from"./index-BZsdwppN.js";import{a as _,i as v,r as y}from"./utils-COFIQvWo.js";var b={class:`page-container`},x={class:`upload-layout`},S={class:`upload-main-card`},C={key:0,class:`file-info`},w={class:`file-name`},T={class:`file-size`},E={key:1,class:`error-message`},D={key:2,class:`progress-bar`},O={class:`upload-side-card`},k={class:`material-panel compact-panel`},A={class:`form-group`},j={class:`advanced-params`},M={class:`advanced-params-body`},N={class:`advanced-param-grid`},P={class:`form-label`},F={class:`param-input-row`},I=[`onUpdate:modelValue`,`min`,`max`,`step`],L={class:`param-unit`},R={class:`param-meta-row`},z={class:`range-value`},B={class:`range-value`},V={class:`param-hint`},H=[`disabled`],U={key:1,class:`inline-note`},ce={key:0,class:`history-collapsible section`},W={class:`history-summary`},G={class:`table-container`},le={class:`data-table`},ue={class:`badge badge-info`},de={class:`action-buttons`},fe=[`onClick`],pe=[`onClick`,`title`],me={key:0,class:`history-detail-row`},he={colspan:`6`},ge={class:`history-dropdown`},_e={class:`data-table inner-table`},ve=[`onClick`],K=e({__name:`MoldInsightView`,setup(e){let K=oe(),q=se(),J=n(null),Y=ee({selectedFile:null,selectedMaterial:`ABS`,moldParams:{draftAngle:2,shrinkageRate:.5,partingPrecision:.1,cavityMatch:95},uploading:!1,error:``,currentTask:null,task:null,polling:!1,dragOver:!1,progress:0,history:null,expandedFiles:{}}),X=async()=>{try{Y.history=await d(`/api/history`)}catch(e){console.error(`加载历史记录失败:`,e)}},Z=async e=>{if(Y.expandedFiles[e])Y.expandedFiles[e]=null;else try{let t=await d(`/api/history/${encodeURIComponent(e)}`);Y.expandedFiles[e]=t}catch(e){p(e,`加载文件历史`)}},Q=e=>{K.push(`/moldinsight/result/${e.task_id}`)},ye=e=>{let t=e.target.files?.[0];t&&$(t)},$=e=>{let t=e.name.toLowerCase();if(!t.endsWith(`.stp`)&&!t.endsWith(`.step`)){Y.error=`请选择 STP 或 STEP 格式文件`,Y.selectedFile=null;return}if(e.size>100*1024*1024){Y.error=`文件大小不能超过 100MB`,Y.selectedFile=null;return}Y.error=``,Y.selectedFile=e,u(`已选择文件: ${e.name}`,`success`)},be=e=>{e.preventDefault(),Y.dragOver=!1;let t=e.dataTransfer?.files;t&&t.length>0&&$(t[0])},xe=async()=>{if(!Y.selectedFile)return;if(!q.token){Y.error=`请先登录后再上传文件`,u(`请先登录`,`warning`),K.push(`/login`);return}if(q.token===`demo`){Y.error=`演示模式不支持文件上传,请使用完整账户登录`,u(`演示模式不支持上传`,`warning`);return}Y.uploading=!0,Y.error=``,Y.progress=0;let e=new FormData;e.append(`file`,Y.selectedFile),e.append(`material`,Y.selectedMaterial),e.append(`draft_angle`,String(Y.moldParams.draftAngle)),e.append(`shrinkage_rate`,String(Y.moldParams.shrinkageRate)),e.append(`parting_precision`,String(Y.moldParams.partingPrecision)),e.append(`cavity_match`,String(Y.moldParams.cavityMatch));try{let t=await fetch(`/api/upload`,{method:`POST`,headers:{Authorization:`Bearer ${q.token}`},body:e});if(t.status===401){ae(),Y.error=`登录已过期,请重新登录`,u(`登录已过期,请重新登录`,`warning`),K.push(`/login`);return}if(!t.ok)throw Error(`上传失败: ${t.status}`);let n=await t.json();Y.currentTask={task_id:n.task_id,status:`processing`,filename:n.file_info?.filename},u(`文件上传成功,开始分析...`,`success`),Se(n.task_id)}catch(e){Y.error=p(e,`文件上传`)}finally{Y.uploading=!1}},Se=async e=>{Y.polling=!0,Y.progress=10;let t=0,n=async()=>{try{t++,Y.progress=Math.min(90,10+t*.5);let r=await d(`/api/status/${e}`,{method:`POST`});if(Y.currentTask=r,Y.task=r,r.status===`completed`){Y.polling=!1,Y.progress=100,u(`分析完成`,`success`),X(),K.push(`/moldinsight/result/${e}`);return}if(r.status===`failed`){Y.polling=!1,Y.error=r.error||`分析失败`,u(`分析失败`,`error`);return}t<300&&setTimeout(n,2e3)}catch(e){Y.polling=!1,Y.error=p(e,`轮询状态`)}};n()},Ce=[{key:`draftAngle`,label:`拔模角`,unit:`°`,min:1,max:10,step:.5,defaultValue:2,hint:`常规注塑件建议从 1.5° 到 3° 起步`},{key:`shrinkageRate`,label:`收缩率`,unit:`%`,min:.5,max:3,step:.1,defaultValue:.5,hint:`按材料牌号校核,默认值用于首轮方案评估`},{key:`partingPrecision`,label:`分型精度`,unit:`mm`,min:.01,max:1,step:.01,defaultValue:.1,hint:`用于控制分型面拟合与边界容差`},{key:`cavityMatch`,label:`型腔匹配度`,unit:`%`,min:80,max:100,step:1,defaultValue:95,hint:`数值越高越偏向紧配合与严格封合`}];return ne(()=>{if(!q.user){K.push(`/login`);return}X()}),(e,n)=>(t(),h(`div`,b,[n[15]||=s(`<div class="page-header"><h1>注塑模 STP 分析</h1><p>上传 STEP/STP 产品件,完成自动分模、工程建议与导出</p></div><div class="moldinsight-intro-grid"><div class="intro-card"><div class="intro-card-title">输入</div><div class="intro-card-text">STEP/STP 产品件,面向注塑模主流程</div></div><div class="intro-card"><div class="intro-card-title">输出</div><div class="intro-card-text">分模方案、DFM 风险、注塑模系统摘要与 CAD 导出</div></div><div class="intro-card"><div class="intro-card-title">目标</div><div class="intro-card-text">先确认推荐方案,再进入导出与 CAM 准备</div></div></div>`,2),c(`div`,x,[c(`div`,S,[n[7]||=c(`h2`,{class:`section-title`},`1. 上传产品件`,-1),c(`div`,{class:i([`upload-zone`,{"drag-over":Y.dragOver}]),onDragover:n[0]||=f(e=>Y.dragOver=!0,[`prevent`]),onDragleave:n[1]||=f(e=>Y.dragOver=!1,[`prevent`]),onDrop:be,onClick:n[2]||=e=>J.value?.click()},[c(`input`,{ref_key:`fileInput`,ref:J,type:`file`,accept:`.stp,.step`,onChange:ye,hidden:``},null,544),n[5]||=c(`div`,{class:`upload-icon`},`📁`,-1),n[6]||=c(`div`,{class:`upload-text`},[c(`span`,{class:`upload-title`},`点击选择或拖拽 STP/STEP 文件`),c(`span`,{class:`upload-hint`},`支持注塑模产品件分析,最大 100MB`)],-1)],34),Y.selectedFile?(t(),h(`div`,C,[c(`span`,w,g(Y.selectedFile.name),1),c(`span`,T,g(r(v)(Y.selectedFile.size)),1),c(`button`,{class:`btn-clear`,onClick:n[3]||=e=>Y.selectedFile=null,title:`清除文件`},`×`)])):m(``,!0),Y.error?(t(),h(`div`,E,g(Y.error),1)):m(``,!0),Y.polling?(t(),h(`div`,D,[c(`div`,{class:`progress-fill`,style:te({width:Y.progress+`%`})},null,4)])):m(``,!0)]),c(`div`,O,[n[12]||=c(`h2`,{class:`section-title`},`2. 注塑模参数`,-1),c(`div`,k,[c(`div`,A,[n[9]||=c(`label`,{class:`form-label`},`产品材料`,-1),a(c(`select`,{"onUpdate:modelValue":n[4]||=e=>Y.selectedMaterial=e,class:`form-select`},[...n[8]||=[s(`<option value="ABS">ABS (1.05 g/cm³)</option><option value="PP">PP (0.90 g/cm³)</option><option value="PE">PE (0.95 g/cm³)</option><option value="PC">PC (1.20 g/cm³)</option><option value="PA">PA (1.14 g/cm³)</option><option value="POM">POM (1.41 g/cm³)</option><option value="PMMA">PMMA (1.18 g/cm³)</option><option value="PBT">PBT (1.31 g/cm³)</option>`,8)]],512),[[re,Y.selectedMaterial]])]),c(`details`,j,[n[11]||=c(`summary`,null,`高级工艺参数`,-1),c(`div`,M,[n[10]||=c(`div`,{class:`inline-note`},`默认值适用于多数注塑件;仅在已知工艺约束时再调整。`,-1),c(`div`,N,[(t(),h(l,null,o(Ce,e=>c(`div`,{class:`param-input-card`,key:e.key},[c(`label`,P,g(e.label),1),c(`div`,F,[a(c(`input`,{type:`number`,class:`form-input param-number-input`,"onUpdate:modelValue":t=>Y.moldParams[e.key]=t,min:e.min,max:e.max,step:e.step},null,8,I),[[ie,Y.moldParams[e.key],void 0,{number:!0}]]),c(`span`,L,g(e.unit),1)]),c(`div`,R,[c(`span`,z,`默认 `+g(e.defaultValue)+g(e.unit),1),c(`span`,B,`范围 `+g(e.min)+` - `+g(e.max)+g(e.unit),1)]),c(`div`,V,g(e.hint),1)])),64))])])])]),Y.selectedFile?(t(),h(`button`,{key:0,class:`btn-primary upload-submit-btn`,onClick:xe,disabled:Y.uploading||Y.polling},g(Y.uploading?`上传中...`:Y.polling?`分析中...`:`3. 开始注塑模分析`),9,H)):(t(),h(`div`,U,`先选择 STP 文件,再填写材料并开始分析。`))])]),Y.history?.files?.length?(t(),h(`details`,ce,[c(`summary`,W,`分析历史(`+g(Y.history.files.length)+` 个文件)`,1),c(`div`,G,[c(`table`,le,[n[14]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`文件名`),c(`th`,null,`上传次数`),c(`th`,null,`文件大小`),c(`th`,null,`最新状态`),c(`th`,null,`最新分析时间`),c(`th`,null,`操作`)])],-1),c(`tbody`,null,[(t(!0),h(l,null,o(Y.history.files,e=>(t(),h(l,{key:e.filename},[c(`tr`,null,[c(`td`,null,g(e.filename),1),c(`td`,null,[c(`span`,ue,g(e.upload_count)+` 次`,1)]),c(`td`,null,g(r(v)(e.file_size)),1),c(`td`,null,[c(`span`,{class:i([`badge`,e.latest_status===`completed`?`badge-success`:e.latest_status===`failed`?`badge-error`:`badge-warning`])},g(e.latest_status),3)]),c(`td`,null,g(r(y)(e.latest_upload_time)),1),c(`td`,null,[c(`div`,de,[e.latest_status===`completed`?(t(),h(`button`,{key:0,class:`btn-sm btn-primary`,onClick:t=>Q({task_id:e.latest_task_id})},` 查看最新 `,8,fe)):m(``,!0),c(`button`,{class:`btn-sm btn-icon`,onClick:t=>Z(e.filename),title:Y.expandedFiles[e.filename]?`收起`:`展开历史记录`},[c(`span`,{class:i([`dropdown-icon`,{expanded:Y.expandedFiles[e.filename]}])},`▼`,2)],8,pe)])])]),Y.expandedFiles[e.filename]?(t(),h(`tr`,me,[c(`td`,he,[c(`div`,ge,[c(`table`,_e,[n[13]||=c(`thead`,null,[c(`tr`,null,[c(`th`,null,`上传时间`),c(`th`,null,`文件大小`),c(`th`,null,`状态`),c(`th`,null,`体积 (mm³)`),c(`th`,null,`表面积 (mm²)`),c(`th`,null,`重量 (g)`),c(`th`,null,`操作`)])],-1),c(`tbody`,null,[(t(!0),h(l,null,o(Y.expandedFiles[e.filename],e=>(t(),h(`tr`,{key:e.id},[c(`td`,null,g(r(y)(e.upload_time)),1),c(`td`,null,g(r(v)(e.file_size)),1),c(`td`,null,[c(`span`,{class:i([`badge`,e.status===`completed`?`badge-success`:e.status===`failed`?`badge-error`:`badge-warning`])},g(e.status),3)]),c(`td`,null,g(e.volume?r(_)(e.volume):`-`),1),c(`td`,null,g(e.surface_area?r(_)(e.surface_area):`-`),1),c(`td`,null,g(e.product_weight?e.product_weight.toFixed(2):`-`),1),c(`td`,null,[e.has_analysis?(t(),h(`button`,{key:0,class:`btn-sm btn-primary`,onClick:t=>Q(e)},` 查看详情 `,8,ve)):m(``,!0)])]))),128))])])])])])):m(``,!0)],64))),128))])])])])):m(``,!0)]))}});export{K as default}; |