Files
geMoldInsight/static/assets/MoldInsightView-O2BZ6fre.js
T
2026-06-01 13:40:53 +08:00

1 line
10 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{A as e,D as t,E as n,M as r,N as ee,O as i,P as a,S as o,_ as s,b as c,d as te,f as ne,h as l,i as re,j as u,k as ie,l as ae,m as d,n as f,o as p,r as m,s as oe,v as h,w as se,y as g}from"./index-B1sOGpZZ.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=o({__name:`MoldInsightView`,setup(o){let K=ae(),q=oe(),J=e(null),Y=ie({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 p(`/api/history`)}catch(e){console.error(`加载历史记录失败:`,e)}},Z=async e=>{if(Y.expandedFiles[e])Y.expandedFiles[e]=null;else try{let t=await p(`/api/history/${encodeURIComponent(e)}`);Y.expandedFiles[e]=t}catch(e){m(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,f(`已选择文件: ${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=`请先登录后再上传文件`,f(`请先登录`,`warning`),K.push(`/login`);return}if(q.token===`demo`){Y.error=`演示模式不支持文件上传,请使用完整账户登录`,f(`演示模式不支持上传`,`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){re(),Y.error=`登录已过期,请重新登录`,f(`登录已过期,请重新登录`,`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},f(`文件上传成功,开始分析...`,`success`),Se(n.task_id)}catch(e){Y.error=m(e,`文件上传`)}finally{Y.uploading=!1}},Se=async e=>{console.log(`[Polling] 开始轮询任务:`,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 p(`/api/status/${e}`,{method:`POST`});if(Y.currentTask=r,Y.task=r,r.status===`completed`){Y.polling=!1,Y.progress=100,f(`分析完成`,`success`),X(),K.push(`/moldinsight/result/${e}`);return}if(r.status===`failed`){Y.polling=!1,Y.error=r.error||`分析失败`,f(`分析失败`,`error`);return}t<300&&setTimeout(n,2e3)}catch(e){Y.polling=!1,Y.error=m(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 se(()=>{if(!q.user){K.push(`/login`);return}X()}),(e,o)=>(n(),g(`div`,b,[o[15]||=c(`<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),s(`div`,x,[s(`div`,S,[o[7]||=s(`h2`,{class:`section-title`},`1. 上传产品件`,-1),s(`div`,{class:r([`upload-zone`,{"drag-over":Y.dragOver}]),onDragover:o[0]||=d(e=>Y.dragOver=!0,[`prevent`]),onDragleave:o[1]||=d(e=>Y.dragOver=!1,[`prevent`]),onDrop:be,onClick:o[2]||=e=>J.value?.click()},[s(`input`,{ref_key:`fileInput`,ref:J,type:`file`,accept:`.stp,.step`,onChange:ye,hidden:``},null,544),o[5]||=s(`div`,{class:`upload-icon`},`📁`,-1),o[6]||=s(`div`,{class:`upload-text`},[s(`span`,{class:`upload-title`},`点击选择或拖拽 STP/STEP 文件`),s(`span`,{class:`upload-hint`},`支持注塑模产品件分析,最大 100MB`)],-1)],34),Y.selectedFile?(n(),g(`div`,C,[s(`span`,w,a(Y.selectedFile.name),1),s(`span`,T,a(u(v)(Y.selectedFile.size)),1),s(`button`,{class:`btn-clear`,onClick:o[3]||=e=>Y.selectedFile=null,title:`清除文件`},`×`)])):h(``,!0),Y.error?(n(),g(`div`,E,a(Y.error),1)):h(``,!0),Y.polling?(n(),g(`div`,D,[s(`div`,{class:`progress-fill`,style:ee({width:Y.progress+`%`})},null,4)])):h(``,!0)]),s(`div`,O,[o[12]||=s(`h2`,{class:`section-title`},`2. 注塑模参数`,-1),s(`div`,k,[s(`div`,A,[o[9]||=s(`label`,{class:`form-label`},`产品材料`,-1),i(s(`select`,{"onUpdate:modelValue":o[4]||=e=>Y.selectedMaterial=e,class:`form-select`},[...o[8]||=[c(`<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),[[te,Y.selectedMaterial]])]),s(`details`,j,[o[11]||=s(`summary`,null,`高级工艺参数`,-1),s(`div`,M,[o[10]||=s(`div`,{class:`inline-note`},`默认值适用于多数注塑件;仅在已知工艺约束时再调整。`,-1),s(`div`,N,[(n(),g(l,null,t(Ce,e=>s(`div`,{class:`param-input-card`,key:e.key},[s(`label`,P,a(e.label),1),s(`div`,F,[i(s(`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),[[ne,Y.moldParams[e.key],void 0,{number:!0}]]),s(`span`,L,a(e.unit),1)]),s(`div`,R,[s(`span`,z,`默认 `+a(e.defaultValue)+a(e.unit),1),s(`span`,B,`范围 `+a(e.min)+` - `+a(e.max)+a(e.unit),1)]),s(`div`,V,a(e.hint),1)])),64))])])])]),Y.selectedFile?(n(),g(`button`,{key:0,class:`btn-primary upload-submit-btn`,onClick:xe,disabled:Y.uploading||Y.polling},a(Y.uploading?`上传中...`:Y.polling?`分析中...`:`3. 开始注塑模分析`),9,H)):(n(),g(`div`,U,`先选择 STP 文件,再填写材料并开始分析。`))])]),Y.history?.files?.length?(n(),g(`details`,ce,[s(`summary`,W,`分析历史(`+a(Y.history.files.length)+` 个文件)`,1),s(`div`,G,[s(`table`,le,[o[14]||=s(`thead`,null,[s(`tr`,null,[s(`th`,null,`文件名`),s(`th`,null,`上传次数`),s(`th`,null,`文件大小`),s(`th`,null,`最新状态`),s(`th`,null,`最新分析时间`),s(`th`,null,`操作`)])],-1),s(`tbody`,null,[(n(!0),g(l,null,t(Y.history.files,e=>(n(),g(l,{key:e.filename},[s(`tr`,null,[s(`td`,null,a(e.filename),1),s(`td`,null,[s(`span`,ue,a(e.upload_count)+` 次`,1)]),s(`td`,null,a(u(v)(e.file_size)),1),s(`td`,null,[s(`span`,{class:r([`badge`,e.latest_status===`completed`?`badge-success`:e.latest_status===`failed`?`badge-error`:`badge-warning`])},a(e.latest_status),3)]),s(`td`,null,a(u(y)(e.latest_upload_time)),1),s(`td`,null,[s(`div`,de,[e.latest_status===`completed`?(n(),g(`button`,{key:0,class:`btn-sm btn-primary`,onClick:t=>Q({task_id:e.latest_task_id})},` 查看最新 `,8,fe)):h(``,!0),s(`button`,{class:`btn-sm btn-icon`,onClick:t=>Z(e.filename),title:Y.expandedFiles[e.filename]?`收起`:`展开历史记录`},[s(`span`,{class:r([`dropdown-icon`,{expanded:Y.expandedFiles[e.filename]}])},`▼`,2)],8,pe)])])]),Y.expandedFiles[e.filename]?(n(),g(`tr`,me,[s(`td`,he,[s(`div`,ge,[s(`table`,_e,[o[13]||=s(`thead`,null,[s(`tr`,null,[s(`th`,null,`上传时间`),s(`th`,null,`文件大小`),s(`th`,null,`状态`),s(`th`,null,`体积 (mm³)`),s(`th`,null,`表面积 (mm²)`),s(`th`,null,`重量 (g)`),s(`th`,null,`操作`)])],-1),s(`tbody`,null,[(n(!0),g(l,null,t(Y.expandedFiles[e.filename],e=>(n(),g(`tr`,{key:e.id},[s(`td`,null,a(u(y)(e.upload_time)),1),s(`td`,null,a(u(v)(e.file_size)),1),s(`td`,null,[s(`span`,{class:r([`badge`,e.status===`completed`?`badge-success`:e.status===`failed`?`badge-error`:`badge-warning`])},a(e.status),3)]),s(`td`,null,a(e.volume?u(_)(e.volume):`-`),1),s(`td`,null,a(e.surface_area?u(_)(e.surface_area):`-`),1),s(`td`,null,a(e.product_weight?e.product_weight.toFixed(2):`-`),1),s(`td`,null,[e.has_analysis?(n(),g(`button`,{key:0,class:`btn-sm btn-primary`,onClick:t=>Q(e)},` 查看详情 `,8,ve)):h(``,!0)])]))),128))])])])])])):h(``,!0)],64))),128))])])])])):h(``,!0)]))}});export{K as default};