Files
Document_Translator/frontend/dist/js/JobDetailView-fcd3745d.js
2025-09-02 10:31:35 +08:00

2 lines
12 KiB
JavaScript

import{_ as ss}from"./_plugin-vue_export-helper-af00840d.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{r as T,A as ts,o as es,b as os,c,e as a,d as s,f as l,K as m,h as v,C as B,t as r,F as j,B as N,D as as,i as ls,R as z,E as ns,z as is,I as ds,V as rs,a5 as cs,k as us,aA as _s,l as n,m as _,aB as vs,s as u,aC as fs,Y as ps,aj as G,ay as ms,L as gs,n as ys,as as hs,aD as bs,aE as ws,ac as ks,aF as Es,ap as Ds,a4 as Cs,S as Ts,U as Is,aG as Ss}from"./index-cb898b04.js";import{u as Ms}from"./jobs-6be64b92.js";import{w as I}from"./websocket-9a0b24f7.js";const Fs={class:"job-detail-view"},Rs={key:0,class:"loading-wrapper"},$s={key:1,class:"not-found"},js={class:"not-found-content"},Ns={key:2,class:"job-detail-content"},zs={class:"page-header"},Ls={class:"header-left"},Ps={class:"page-actions"},As={class:"content-card"},Bs={class:"card-header"},Gs={class:"job-status-badge"},Js={class:"card-body"},xs={class:"job-info-grid"},Os={class:"info-section"},Vs={class:"info-items"},Us={class:"info-item"},Ys={class:"info-icon"},Ws={class:"info-content"},Ks={class:"info-value"},Zs={class:"info-item"},qs={class:"info-icon"},Hs={class:"info-content"},Qs={class:"info-value"},Xs={class:"info-item"},st={class:"info-icon"},tt={class:"info-content"},et={class:"info-value job-uuid"},ot={class:"info-section"},at={class:"info-items"},lt={class:"info-item"},nt={class:"info-icon"},it={class:"info-content"},dt={class:"info-value"},rt={class:"info-item"},ct={class:"info-icon"},ut={class:"info-content"},_t={class:"info-value"},vt={class:"language-tags"},ft={key:0,class:"content-card"},pt={class:"card-body"},mt={class:"progress-section"},gt={class:"progress-info"},yt={key:1,class:"content-card"},ht={class:"card-header"},bt={class:"card-actions"},wt={class:"card-body"},kt={class:"error-details"},Et={key:0,class:"retry-info"},Dt={class:"content-card"},Ct={class:"card-body"},Tt={key:0,class:"processing-time"},It={key:2,class:"content-card"},St={class:"card-body"},Mt={class:"cost-stats"},Ft={key:0,class:"cost-item"},Rt={class:"cost-icon"},$t={class:"cost-info"},jt={class:"cost-value"},Nt={key:1,class:"cost-item"},zt={class:"cost-icon"},Lt={class:"cost-info"},Pt={class:"cost-value"},At={key:3,class:"content-card"},Bt={class:"card-body"},Gt={class:"files-list"},Jt={class:"file-info"},xt={class:"file-name"},Ot={class:"file-details"},Vt={class:"file-size"},Ut={class:"file-type"},Yt={class:"file-actions"},Wt={__name:"JobDetailView",setup(Kt){const J=as();ls();const k=Ms(),E=T(!1),S=T(!1),e=T(null),M=T([]),x={auto:"自動偵測","zh-TW":"繁體中文","zh-CN":"簡體中文",en:"英文",ja:"日文",ko:"韓文",vi:"越南文"},g=ts(()=>J.params.uuid),F=async()=>{E.value=!0;try{const o=await k.fetchJobDetail(g.value);e.value=o.job,M.value=o.files||[],["PENDING","PROCESSING","RETRY"].includes(e.value.status)&&I.subscribeToJob(g.value)}catch(o){console.error("載入任務詳情失敗:",o),z.error("載入任務詳情失敗")}finally{E.value=!1}},O=async()=>{await F(),z.success("任務資訊已刷新")},V=async()=>{S.value=!0;try{await k.retryJob(g.value),await F(),z.success("任務已重新提交處理")}catch(o){console.error("重試任務失敗:",o)}finally{S.value=!1}},U=async o=>{if(o.startsWith("download_")){const t=o.replace("download_","");t==="all"?await Y():await L(t)}},L=async(o,t=null)=>{try{const p=y(e.value.original_filename),i=t||`${e.value.original_filename.replace(/\.[^/.]+$/,"")}_${o}_translated.${p}`;await k.downloadFile(g.value,o,i)}catch(p){console.error("下載檔案失敗:",p)}},Y=async()=>{try{const o=`${e.value.original_filename.replace(/\.[^/.]+$/,"")}_translated.zip`;await k.downloadAllFiles(g.value,o)}catch(o){console.error("批量下載失敗:",o)}},y=o=>o.split(".").pop().toLowerCase(),P=o=>{if(o===0)return"0 B";const t=1024,p=["B","KB","MB","GB"],i=Math.floor(Math.log(o)/Math.log(t));return parseFloat((o/Math.pow(t,i)).toFixed(1))+" "+p[i]},R=o=>o?new Date(o).toLocaleString("zh-TW",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}):"",W=(o,t)=>{const p=new Date(o),f=new Date(t)-p,h=Math.floor(f/36e5),b=Math.floor(f%36e5/6e4),w=Math.floor(f%6e4/1e3);return h>0?`${h}${b}${w}`:b>0?`${b}${w}`:`${w}`},D=o=>x[o]||o,K=o=>({PENDING:"等待處理",PROCESSING:"處理中",COMPLETED:"已完成",FAILED:"處理失敗",RETRY:"重試中"})[o]||o,Z=o=>({PENDING:"info",PROCESSING:"warning",COMPLETED:"success",FAILED:"danger",RETRY:"warning"})[o]||"info",q=o=>({PENDING:"Clock",PROCESSING:"Loading",COMPLETED:"SuccessFilled",FAILED:"CircleCloseFilled",RETRY:"RefreshRight"})[o]||"InfoFilled",A=o=>{e.value&&o.job_uuid===e.value.job_uuid&&Object.assign(e.value,o)};return es(async()=>{await F(),I.on("job_status",A)}),os(()=>{e.value&&I.unsubscribeFromJob(e.value.job_uuid),I.off("job_status",A)}),(o,t)=>{const p=Cs,i=ns,f=is,h=Ts,b=Is,w=ds,$=rs,H=cs,Q=us,C=Ss,X=_s;return n(),c("div",Fs,[E.value?(n(),c("div",Rs,[a(p,{rows:8,animated:""})])):e.value?(n(),c("div",Ns,[s("div",zs,[s("div",Ls,[a(f,{type:"text",onClick:t[1]||(t[1]=d=>o.$router.back()),class:"back-button"},{default:l(()=>[a(i,null,{default:l(()=>[a(_(fs))]),_:1}),t[5]||(t[5]=u(" 返回 ",-1))]),_:1}),t[6]||(t[6]=s("h1",{class:"page-title"},"任務詳情",-1))]),s("div",Ps,[a(f,{onClick:O,loading:E.value},{default:l(()=>[a(i,null,{default:l(()=>[a(_(ps))]),_:1}),t[7]||(t[7]=u(" 刷新 ",-1))]),_:1},8,["loading"]),e.value.status==="COMPLETED"?(n(),m(w,{key:0,onCommand:U},{dropdown:l(()=>[a(b,null,{default:l(()=>[(n(!0),c(j,null,N(e.value.target_languages,d=>(n(),m(h,{key:d,command:`download_${d}`},{default:l(()=>[u(" 下載 "+r(D(d))+" 版本 ",1)]),_:2},1032,["command"]))),128)),a(h,{command:"download_all",divided:""},{default:l(()=>[...t[9]||(t[9]=[u(" 下載全部檔案 (ZIP) ",-1)])]),_:1})]),_:1})]),default:l(()=>[a(f,{type:"primary"},{default:l(()=>[a(i,null,{default:l(()=>[a(_(G))]),_:1}),t[8]||(t[8]=u(" 下載 ",-1)),a(i,{class:"el-icon--right"},{default:l(()=>[a(_(ms))]),_:1})]),_:1})]),_:1})):v("",!0)])]),s("div",As,[s("div",Bs,[t[10]||(t[10]=s("h3",{class:"card-title"},"基本資訊",-1)),s("div",Gs,[a($,{type:Z(e.value.status),size:"large",effect:"dark"},{default:l(()=>[a(i,null,{default:l(()=>[(n(),m(gs(q(e.value.status))))]),_:1}),u(" "+r(K(e.value.status)),1)]),_:1},8,["type"])])]),s("div",Js,[s("div",xs,[s("div",Os,[t[14]||(t[14]=s("div",{class:"section-title"},"檔案資訊",-1)),s("div",Vs,[s("div",Us,[s("div",Ys,[s("div",{class:B(["file-icon",y(e.value.original_filename)])},r(y(e.value.original_filename).toUpperCase()),3)]),s("div",Ws,[t[11]||(t[11]=s("div",{class:"info-label"},"檔案名稱",-1)),s("div",Ks,r(e.value.original_filename),1)])]),s("div",Zs,[s("div",qs,[a(i,null,{default:l(()=>[a(_(ys))]),_:1})]),s("div",Hs,[t[12]||(t[12]=s("div",{class:"info-label"},"檔案大小",-1)),s("div",Qs,r(P(e.value.file_size)),1)])]),s("div",Xs,[s("div",st,[a(i,null,{default:l(()=>[a(_(hs))]),_:1})]),s("div",tt,[t[13]||(t[13]=s("div",{class:"info-label"},"任務 ID",-1)),s("div",et,r(e.value.job_uuid),1)])])])]),s("div",ot,[t[17]||(t[17]=s("div",{class:"section-title"},"翻譯設定",-1)),s("div",at,[s("div",lt,[s("div",nt,[a(i,null,{default:l(()=>[a(_(bs))]),_:1})]),s("div",it,[t[15]||(t[15]=s("div",{class:"info-label"},"來源語言",-1)),s("div",dt,[a($,{size:"small",type:"info"},{default:l(()=>[u(r(D(e.value.source_language)),1)]),_:1})])])]),s("div",rt,[s("div",ct,[a(i,null,{default:l(()=>[a(_(ws))]),_:1})]),s("div",ut,[t[16]||(t[16]=s("div",{class:"info-label"},"目標語言",-1)),s("div",_t,[s("div",vt,[(n(!0),c(j,null,N(e.value.target_languages,d=>(n(),m($,{key:d,size:"small",type:"primary"},{default:l(()=>[u(r(D(d)),1)]),_:2},1024))),128))])])])])])])])])]),e.value.status==="PROCESSING"||e.value.status==="RETRY"?(n(),c("div",ft,[t[20]||(t[20]=s("div",{class:"card-header"},[s("h3",{class:"card-title"},"處理進度")],-1)),s("div",pt,[s("div",mt,[s("div",gt,[t[18]||(t[18]=s("span",null,"翻譯進度",-1)),s("span",null,r(Math.round(e.value.progress||0))+"%",1)]),a(H,{percentage:e.value.progress||0,"stroke-width":12,status:"success"},null,8,["percentage"]),t[19]||(t[19]=s("div",{class:"progress-description"}," 系統正在處理您的檔案,請耐心等待... ",-1))])])])):v("",!0),e.value.status==="FAILED"&&e.value.error_message?(n(),c("div",yt,[s("div",ht,[t[22]||(t[22]=s("h3",{class:"card-title"},"錯誤資訊",-1)),s("div",bt,[a(f,{type:"primary",onClick:V,loading:S.value},{default:l(()=>[a(i,null,{default:l(()=>[a(_(ks))]),_:1}),t[21]||(t[21]=u(" 重新翻譯 ",-1))]),_:1},8,["loading"])])]),s("div",wt,[a(Q,{title:e.value.error_message,type:"error","show-icon":"",closable:!1},{default:l(()=>[s("div",kt,[s("p",null,r(e.value.error_message),1),e.value.retry_count>0?(n(),c("p",Et," 已重試 "+r(e.value.retry_count)+" 次 ",1)):v("",!0)])]),_:1},8,["title"])])])):v("",!0),s("div",Dt,[t[27]||(t[27]=s("div",{class:"card-header"},[s("h3",{class:"card-title"},"處理時間軸")],-1)),s("div",Ct,[a(X,null,{default:l(()=>[a(C,{timestamp:"建立任務",time:R(e.value.created_at),type:"primary",size:"large",icon:"Plus"},{default:l(()=>[...t[23]||(t[23]=[u(" 任務建立成功,檔案已上傳至系統 ",-1)])]),_:1},8,["time"]),e.value.processing_started_at?(n(),m(C,{key:0,timestamp:"開始處理",time:R(e.value.processing_started_at),type:"warning",size:"large",icon:"Loading"},{default:l(()=>[...t[24]||(t[24]=[u(" 系統開始處理翻譯任務 ",-1)])]),_:1},8,["time"])):v("",!0),e.value.completed_at?(n(),m(C,{key:1,timestamp:"處理完成",time:R(e.value.completed_at),type:"success",size:"large",icon:"Check"},{default:l(()=>[t[25]||(t[25]=u(" 翻譯完成,檔案可供下載 ",-1)),e.value.processing_started_at?(n(),c("div",Tt," 處理耗時: "+r(W(e.value.processing_started_at,e.value.completed_at)),1)):v("",!0)]),_:1},8,["time"])):e.value.status==="FAILED"?(n(),m(C,{key:2,timestamp:"處理失敗",time:"發生錯誤",type:"danger",size:"large",icon:"Close"},{default:l(()=>[...t[26]||(t[26]=[u(" 翻譯過程中發生錯誤 ",-1)])]),_:1})):v("",!0)]),_:1})])]),e.value.total_cost>0||e.value.total_tokens>0?(n(),c("div",It,[t[30]||(t[30]=s("div",{class:"card-header"},[s("h3",{class:"card-title"},"成本統計")],-1)),s("div",St,[s("div",Mt,[e.value.total_tokens>0?(n(),c("div",Ft,[s("div",Rt,[a(i,null,{default:l(()=>[a(_(Es))]),_:1})]),s("div",$t,[t[28]||(t[28]=s("div",{class:"cost-label"},"使用 Token",-1)),s("div",jt,r(e.value.total_tokens.toLocaleString()),1)])])):v("",!0),e.value.total_cost>0?(n(),c("div",Nt,[s("div",zt,[a(i,null,{default:l(()=>[a(_(Ds))]),_:1})]),s("div",Lt,[t[29]||(t[29]=s("div",{class:"cost-label"},"總成本",-1)),s("div",Pt,"$"+r(e.value.total_cost.toFixed(6)),1)])])):v("",!0)])])])):v("",!0),M.value.length>0?(n(),c("div",At,[t[32]||(t[32]=s("div",{class:"card-header"},[s("h3",{class:"card-title"},"相關檔案")],-1)),s("div",Bt,[s("div",Gt,[(n(!0),c(j,null,N(M.value,d=>(n(),c("div",{key:`${d.file_type}_${d.language_code||"original"}`,class:"file-item"},[s("div",{class:B(["file-icon",y(d.filename)])},r(y(d.filename).toUpperCase()),3),s("div",Jt,[s("div",xt,r(d.filename),1),s("div",Ot,[s("span",Vt,r(P(d.file_size)),1),s("span",Ut,r(d.file_type==="ORIGINAL"?"原始檔案":`翻譯檔案 (${D(d.language_code)})`),1)])]),s("div",Yt,[d.file_type==="TRANSLATED"?(n(),m(f,{key:0,type:"primary",size:"small",onClick:Zt=>L(d.language_code,d.filename)},{default:l(()=>[a(i,null,{default:l(()=>[a(_(G))]),_:1}),t[31]||(t[31]=u(" 下載 ",-1))]),_:2},1032,["onClick"])):v("",!0)])]))),128))])])])):v("",!0)])):(n(),c("div",$s,[s("div",js,[a(i,{class:"not-found-icon"},{default:l(()=>[a(_(vs))]),_:1}),t[3]||(t[3]=s("h2",null,"任務不存在",-1)),t[4]||(t[4]=s("p",null,"抱歉,無法找到指定的翻譯任務。",-1)),a(f,{type:"primary",onClick:t[0]||(t[0]=d=>o.$router.push("/jobs"))},{default:l(()=>[...t[2]||(t[2]=[u(" 返回任務列表 ",-1)])]),_:1})])]))])}}},ne=ss(Wt,[["__scopeId","data-v-2ac716f2"]]);export{ne as default};