2 lines
35 KiB
JavaScript
2 lines
35 KiB
JavaScript
import{_ as e,r as t,w as a,c as n,o as l,a as o,b as i,t as s,d as u,v as r,e as d,f as p,g as c,h as v,n as f,i as m,j as x,k as y,l as g,P as b,m as h,p as w,q as S,s as z,u as k,x as A}from"./styles-BZJ2tAi6.js";import"./pdfjs-DXqArq6h.js";import"./pdf-lib-AfLQbX6n.js";const P={key:0,class:"annotation-detail-panel"},F={class:"panel-header"},C={class:"detail-content"},V={class:"detail-row"},D={class:"label-preview"},U={class:"detail-row"},I={class:"detail-row"},N={class:"detail-row"},E={class:"detail-row"},R={class:"detail-row"},j={key:0,class:"detail-row"},O={key:1,class:"detail-row"},$={class:"detail-row"},T={class:"detail-row readonly"},_={class:"detail-row readonly"},L={style:{"margin-top":"16px","padding-top":"12px","border-top":"1px solid #e5e7eb"}},B={style:{display:"flex","flex-direction":"column",gap:"8px"}},J={style:{display:"flex","flex-direction":"column",gap:"6px"}},M={style:{background:"#f8fafc",border:"1px solid #e2e8f0","border-radius":"8px",padding:"10px 12px","margin-bottom":"12px"}},X={style:{display:"grid","grid-template-columns":"max-content 1fr","align-items":"center",gap:"6px 10px"}},Y={style:{display:"flex",gap:"12px"}},W={style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",color:"#334155",cursor:"pointer"}},q={style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",color:"#334155",cursor:"pointer"}},Z={style:{display:"flex","align-items":"center",gap:"6px","font-size":"12px",color:"#334155",cursor:"pointer"}},G={style:{display:"flex","flex-direction":"column",gap:"4px"}},H={style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",color:"#334155",cursor:"pointer"}},K={style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",color:"#334155",cursor:"pointer"}},Q={style:{display:"flex","align-items":"center",gap:"4px","font-size":"12px",color:"#334155",cursor:"pointer"}},ee={style:{display:"none","flex-direction":"column","margin-top":"24px","padding-top":"16px","border-top":"1px solid #e5e7eb"}},te={style:{"margin-bottom":"12px"}},ae={style:{"margin-bottom":"12px"}},ne=e({__name:"LeftPanel",props:{autoAnnotating:{type:Boolean,default:!1},selectedAnnotation:{type:Object,default:null},selectedAnnotationPage:{type:Number,default:null},selectedAnnotationIndex:{type:Number,default:null},annotationsJson:{type:String,default:"{}"},initialCsvData:{type:String,default:""}},emits:["file-selected","open-pdf","save-pdf-editable","saveas-pdf-editable","export-pdf-embedded","save-pdf-final","export-csv","export-json","import-annotations","import-csv","import-image","undo-annotation","clear-page-annotations","delete-selected-annotation","apply-settings","update-annotation","delete-annotation","deselect-annotation","load-pdf-url","renumber-page-annotations","auto-annotate-page"],setup(e,{emit:x}){const y=e,g=x,b=t(0),h=t(""),w=t(""),S=t(10),z=t(!1),k=t(""),A=t(""),ne=t("");function le(){if(!y.selectedAnnotation)return;const e={...y.selectedAnnotation,displayValue:b.value,settings:{...y.selectedAnnotation.settings,prefix:h.value,suffix:w.value,fontSize:S.value},completed:z.value,completedTime:z.value?k.value:"",completedBy:z.value?A.value:"",note:ne.value};g("update-annotation",e)}function oe(){confirm("确定要删除这个标注吗?")&&g("delete-annotation")}a(()=>y.selectedAnnotation,e=>{e&&(b.value=e.displayValue||0,h.value=e.settings?.prefix??"",w.value=e.settings?.suffix??"",S.value=e.settings?.fontSize??10,z.value=e.completed||!1,k.value=e.completedTime||"",A.value=e.completedBy||"",ne.value=e.note||"")},{immediate:!0,deep:!0});const ie=t(null),se=t(null),ue=t(null),re=t(null),de=t(1),pe=t(1),ce=t(""),ve=t("");t("hexagon");const fe=t(10),me=t("none"),xe=t("circle-outline"),ye=t(!0),ge=t(!0),be=t(80),he=t("测试数据A,测试数据B,测试数据C,测试数据D,测试数据E\n13213213,13213213,13213213,13213213,13213213\n312321312,312321312,312321312,312321312,312321312\n611429411,611429411,611429411,611429411,611429411\n910537510,910537510,910537510,910537510,910537510\n1209645609,1209645609,1209645609,1209645609,1209645609\n1508753708,1508753708,1508753708,1508753708,1508753708\n1807861807,1807861807,1807861807,1807861807,1807861807\n2106969906,2106969906,2106969906,2106969906,2106969906\n2406078005,2406078005,2406078005,2406078005,2406078005\n2705186104,2705186104,2705186104,2705186104,2705186104\n3004294203,3004294203,3004294203,3004294203,3004294203\n3303402302,3303402302,3303402302,3303402302,3303402302\n3602510401,3602510401,3602510401,3602510401,3602510401\n3901618500,3901618500,3901618500,3901618500,3901618500\n4200726599,4200726599,4200726599,4200726599,4200726599\n4499834698,4499834698,4499834698,4499834698,4499834698\n4798942797,4798942797,4798942797,4798942797,4798942797\n5098050896,5098050896,5098050896,5098050896,5098050896\n5397158995,5397158995,5397158995,5397158995,5397158995\n5696267094,5696267094,5696267094,5696267094,5696267094\n5995375193,5995375193,5995375193,5995375193,5995375193\n6294483292,6294483292,6294483292,6294483292,6294483292\n6593591391,6593591391,6593591391,6593591391,6593591391"),we=t(""),Se=t("{}"),ze=t(!1),ke=t(""),Ae=t("");a(()=>y.annotationsJson,e=>{e&&(Se.value=e)},{immediate:!0}),a(()=>y.initialCsvData,e=>{e&&e.trim()&&(he.value=e,console.log("CSV table data updated from props:",e.substring(0,100)+"..."))},{immediate:!0}),a(Se,e=>{try{const t=document.getElementById("hdworkRecord");t&&(t.value=e||"{}",console.log("Synced JSON data to workRecord-inputEl:",e?.substring(0,100)+"..."))}catch(t){console.warn("Error syncing to workRecord-inputEl:",t)}},{immediate:!0});let Pe=null;function Fe(e){const t=e.target.files&&e.target.files[0];t&&g("file-selected",t)}async function Ce(){if(we.value&&Se.value.trim()){ze.value=!0,ke.value="";try{let t;try{t=JSON.parse(Se.value)}catch(e){throw new Error("JSON 格式错误: "+e.message)}const a=await async function(e,t){try{const a=await fetch("http://localhost:8000/api/pdf/process",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:e,pdfPath:t,timestamp:(new Date).toISOString()})});if(!a.ok)throw new Error(`API Error: ${a.status} ${a.statusText}`);return await a.json()}catch(a){throw console.error("API call failed:",a),a}}(t,we.value);ke.value="提交成功!",Ae.value="success",console.log("API Response:",a)}catch(t){ke.value="错误: "+(t.message||"网络请求失败"),Ae.value="error",console.error("Submit failed:",t)}finally{ze.value=!1}}}function Ve(){confirm("确定要清除本页所有标注吗?此操作不可撤销。")&&g("clear-page-annotations")}function De(e){const t=e.target.files&&e.target.files[0];t&&g("import-annotations",t)}function Ue(e){const t=e.target.files&&e.target.files[0];t&&g("import-csv",t)}function Ie(e){const t=e.target.files&&e.target.files[0];t&&g("import-image",{file:t,size:be.value})}return a(we,(e,t)=>{Pe&&clearTimeout(Pe),e&&e.trim()&&(Pe=setTimeout(()=>{const t=e.trim();(t.startsWith("http://")||t.startsWith("https://"))&&g("load-pdf-url",t)},500))},{immediate:!0}),a([de,pe,ce,ve,fe,me,xe,ye],()=>{g("apply-settings",{startNumber:de.value,increment:pe.value,prefix:ce.value,suffix:ve.value,fontSize:fe.value,borderStyle:me.value,annotationStyle:xe.value,highDpi:!!ge.value,singleClickMode:ye.value})}),(t,a)=>(l(),n("div",null,[e.selectedAnnotation?(l(),n("div",P,[i("div",F,[a[30]||(a[30]=i("h3",{style:{margin:"0","font-size":"14px"}},"标注详情",-1)),i("div",{class:"btn close-btn",onClick:a[0]||(a[0]=e=>g("deselect-annotation")),title:"关闭"},"×")]),i("div",C,[i("div",V,[a[31]||(a[31]=i("label",null,"标签内容:",-1)),i("div",D,s(h.value)+s(b.value)+s(w.value),1)]),i("div",U,[a[32]||(a[32]=i("label",null,"编号:",-1)),u(i("input",{"onUpdate:modelValue":a[1]||(a[1]=e=>b.value=e),type:"number",min:"0",class:"detail-input"},null,512),[[r,b.value,void 0,{number:!0}]])]),i("div",I,[a[33]||(a[33]=i("label",null,"前缀:",-1)),u(i("input",{"onUpdate:modelValue":a[2]||(a[2]=e=>h.value=e),type:"text",class:"detail-input"},null,512),[[r,h.value]])]),i("div",N,[a[34]||(a[34]=i("label",null,"后缀:",-1)),u(i("input",{"onUpdate:modelValue":a[3]||(a[3]=e=>w.value=e),type:"text",class:"detail-input"},null,512),[[r,w.value]])]),i("div",E,[a[35]||(a[35]=i("label",null,"字体大小:",-1)),u(i("input",{"onUpdate:modelValue":a[4]||(a[4]=e=>S.value=e),type:"number",min:"6",max:"72",class:"detail-input"},null,512),[[r,S.value,void 0,{number:!0}]])]),a[43]||(a[43]=i("div",{class:"detail-divider"},null,-1)),i("div",R,[a[37]||(a[37]=i("label",null,"状态:",-1)),u(i("select",{"onUpdate:modelValue":a[5]||(a[5]=e=>z.value=e),class:"detail-input"},[...a[36]||(a[36]=[i("option",{value:!1},"未完成",-1),i("option",{value:!0},"已完成",-1)])],512),[[d,z.value]])]),z.value?(l(),n("div",j,[a[38]||(a[38]=i("label",null,"完成时间:",-1)),u(i("input",{"onUpdate:modelValue":a[6]||(a[6]=e=>k.value=e),type:"datetime-local",class:"detail-input"},null,512),[[r,k.value]])])):o("",!0),z.value?(l(),n("div",O,[a[39]||(a[39]=i("label",null,"完成人:",-1)),u(i("input",{"onUpdate:modelValue":a[7]||(a[7]=e=>A.value=e),type:"text",placeholder:"输入完成人姓名",class:"detail-input"},null,512),[[r,A.value]])])):o("",!0),i("div",$,[a[40]||(a[40]=i("label",null,"备注:",-1)),u(i("textarea",{"onUpdate:modelValue":a[8]||(a[8]=e=>ne.value=e),placeholder:"添加备注...",class:"detail-textarea"},null,512),[[r,ne.value]])]),i("div",T,[a[41]||(a[41]=i("label",null,"页码:",-1)),i("span",null,"第 "+s(e.selectedAnnotationPage)+" 页",1)]),i("div",_,[a[42]||(a[42]=i("label",null,"位置:",-1)),i("span",null,"X: "+s(Math.round(e.selectedAnnotation.x))+", Y: "+s(Math.round(e.selectedAnnotation.y)),1)]),i("div",{class:"detail-actions"},[i("div",{class:"btn btn-primary",onClick:le},"保存修改"),i("div",{class:"btn btn-danger",onClick:oe},"删除标注")])])])):o("",!0),i("div",L,[a[52]||(a[52]=i("h3",{style:{margin:"0 0 12px 0"}},"设置",-1)),i("div",B,[i("input",{ref_key:"fileInput",ref:ie,type:"file",accept:"application/pdf",onChange:Fe,style:{display:"none"}},null,544),i("input",{ref_key:"jsonInput",ref:se,type:"file",accept:"application/json,.json",onChange:De,style:{display:"none"}},null,544),i("input",{ref_key:"csvInput",ref:ue,type:"file",accept:"text/csv,.csv",onChange:Ue,style:{display:"none"}},null,544),i("input",{ref_key:"imageInput",ref:re,type:"file",accept:"image/*",onChange:Ie,style:{display:"none"}},null,544),i("div",J,[o("",!0),o("",!0),o("",!0),i("div",{class:"btn btn-primary",onClick:a[11]||(a[11]=e=>g("undo-annotation")),style:{width:"100%"}},"撤销上一标注")]),o("",!0),i("div",{class:"btn btn-primary",onClick:a[16]||(a[16]=e=>g("renumber-page-annotations")),style:{width:"100%"}},"按设置重新标注"),i("div",{class:"btn btn-primary",onClick:Ve,style:{width:"100%"}},"清除本页标注")])]),i("div",M,[a[67]||(a[67]=i("div",{style:{"font-size":"11px","font-weight":"600",color:"#94a3b8","letter-spacing":"0.06em","text-transform":"uppercase","margin-bottom":"10px"}},"标注设置",-1)),i("div",X,[a[59]||(a[59]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"起始编号",-1)),u(i("input",{"onUpdate:modelValue":a[17]||(a[17]=e=>de.value=e),type:"number",min:"0",style:{width:"100%","box-sizing":"border-box",padding:"4px 6px",border:"1px solid #cbd5e1","border-radius":"4px","font-size":"12px"}},null,512),[[r,de.value,void 0,{number:!0}]]),a[60]||(a[60]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"增量",-1)),u(i("input",{"onUpdate:modelValue":a[18]||(a[18]=e=>pe.value=e),type:"number",min:"1",style:{width:"100%","box-sizing":"border-box",padding:"4px 6px",border:"1px solid #cbd5e1","border-radius":"4px","font-size":"12px"}},null,512),[[r,pe.value,void 0,{number:!0}]]),a[61]||(a[61]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"前缀",-1)),u(i("input",{"onUpdate:modelValue":a[19]||(a[19]=e=>ce.value=e),type:"text",style:{width:"100%","box-sizing":"border-box",padding:"4px 6px",border:"1px solid #cbd5e1","border-radius":"4px","font-size":"12px"}},null,512),[[r,ce.value]]),a[62]||(a[62]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"后缀",-1)),u(i("input",{"onUpdate:modelValue":a[20]||(a[20]=e=>ve.value=e),type:"text",style:{width:"100%","box-sizing":"border-box",padding:"4px 6px",border:"1px solid #cbd5e1","border-radius":"4px","font-size":"12px"}},null,512),[[r,ve.value]]),a[63]||(a[63]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"字体大小",-1)),u(i("input",{"onUpdate:modelValue":a[21]||(a[21]=e=>fe.value=e),type:"number",min:"6",max:"72",step:"1",style:{width:"100%","box-sizing":"border-box",padding:"4px 6px",border:"1px solid #cbd5e1","border-radius":"4px","font-size":"12px"}},null,512),[[r,fe.value,void 0,{number:!0}]]),a[64]||(a[64]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap"}},"边框样式",-1)),i("div",Y,[i("label",W,[u(i("input",{type:"radio",value:"none","onUpdate:modelValue":a[22]||(a[22]=e=>me.value=e),style:{"accent-color":"#0ea5e9"}},null,512),[[c,me.value]]),a[53]||(a[53]=p(" 无 ",-1))]),i("label",q,[u(i("input",{type:"radio",value:"rect","onUpdate:modelValue":a[23]||(a[23]=e=>me.value=e),style:{"accent-color":"#0ea5e9"}},null,512),[[c,me.value]]),a[54]||(a[54]=p(" 矩形 ",-1))])]),a[65]||(a[65]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap","align-self":"start","padding-top":"2px"}},"点击模式",-1)),i("label",Z,[u(i("input",{type:"checkbox","onUpdate:modelValue":a[24]||(a[24]=e=>ye.value=e),style:{"accent-color":"#0ea5e9",width:"14px",height:"14px"}},null,512),[[v,ye.value]]),a[55]||(a[55]=p(" 单击模式 ",-1))]),a[66]||(a[66]=i("span",{style:{"font-size":"12px",color:"#475569","white-space":"nowrap","align-self":"start","padding-top":"2px"}},"标注样式",-1)),i("div",G,[i("label",H,[u(i("input",{type:"radio",value:"circle-outline","onUpdate:modelValue":a[25]||(a[25]=e=>xe.value=e),style:{"accent-color":"#0ea5e9"}},null,512),[[c,xe.value]]),a[56]||(a[56]=p(" 圆圈 ",-1))]),i("label",K,[u(i("input",{type:"radio",value:"arrow","onUpdate:modelValue":a[26]||(a[26]=e=>xe.value=e),style:{"accent-color":"#0ea5e9"}},null,512),[[c,xe.value]]),a[57]||(a[57]=p(" 箭头 ",-1))]),i("label",Q,[u(i("input",{type:"radio",value:"dot","onUpdate:modelValue":a[27]||(a[27]=e=>xe.value=e),style:{"accent-color":"#0ea5e9"}},null,512),[[c,xe.value]]),a[58]||(a[58]=p(" 圆点 ",-1))])])])]),i("div",ee,[a[70]||(a[70]=i("h4",{style:{margin:"0 0 12px 0"}},"网络接口",-1)),i("div",te,[a[68]||(a[68]=i("label",{style:{display:"block","font-size":"12px","margin-bottom":"4px",color:"#6b7280"}},"PDF 目录路径",-1)),u(i("input",{"onUpdate:modelValue":a[28]||(a[28]=e=>we.value=e),type:"text",placeholder:"/path/to/pdf",style:{width:"100%",padding:"6px",border:"1px solid #d1d5db","border-radius":"4px","font-size":"12px"}},null,512),[[r,we.value]])]),i("div",ae,[a[69]||(a[69]=i("label",{style:{display:"block","font-size":"12px","margin-bottom":"4px",color:"#6b7280"}},"数据 (JSON)",-1)),u(i("textarea",{"onUpdate:modelValue":a[29]||(a[29]=e=>Se.value=e),placeholder:'{"key":"value"}',style:{width:"100%",height:"100px",padding:"6px",border:"1px solid #d1d5db","border-radius":"4px","font-size":"12px","font-family":"monospace",resize:"vertical"}},null,512),[[r,Se.value]])]),i("div",{class:f(["btn",{disabled:!we.value||!Se.value}]),onClick:Ce,style:{width:"100%",padding:"8px",background:"#3b82f6",color:"white",border:"none","border-radius":"4px",cursor:"pointer","font-size":"14px"}},s(ze.value?"提交中...":"提交数据"),3),ke.value?(l(),n("div",{key:0,style:m({marginTop:"8px",padding:"8px",borderRadius:"4px",fontSize:"12px",color:"success"===Ae.value?"#10b981":"#ef4444",background:"success"===Ae.value?"#d1fae5":"#fee2e2"})},s(ke.value),5)):o("",!0)])]))}},[["__scopeId","data-v-2bf4f503"]]);function le(e){const t=[];let a="",n=!1;for(let l=0;l<e.length;l++){const o=e[l],i=e[l+1];'"'===o?n&&'"'===i?(a+='"',l++):n=!n:","!==o||n?a+=o:(t.push(a.trim()),a="")}return t.push(a.trim()),t}const oe={class:"container"},ie={class:"left"},se={class:"right"},ue={class:"controls"},re=["disabled"],de={style:{"min-width":"38px","text-align":"center","font-size":"13px"}},pe=["max"],ce={style:{"margin-left":"4px","font-size":"13px","white-space":"nowrap"}},ve={key:0,style:{display:"flex","align-items":"center",gap:"8px","margin-left":"4px","font-size":"13px",color:"#6b7280","white-space":"nowrap",overflow:"hidden"}},fe={style:{overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap","max-width":"200px"}},me={style:{"white-space":"nowrap"}},xe={class:"viewer"},ye="http://localhost:8000/api/weld";A({__name:"App",setup(e){const d=t(null),c=t(null),v=t(0),A=t(1),P=t(1),F=t(!1),C=t(null),V=t(""),D=t(""),U=t({}),I=t("{}"),N=t(""),E=t(null),R=t(null),j=t(null);function O(e){e?(E.value={...e.annotation},R.value=e.page,j.value=e.index):(E.value=null,R.value=null,j.value=null),H()}function $(e){C.value&&null!==R.value&&null!==j.value&&(C.value.updateAnnotation(R.value,j.value,e),E.value={...e},J("标注已更新"),H())}function T(){C.value&&null!==R.value&&null!==j.value&&(C.value.deleteAnnotation(R.value,j.value),E.value=null,R.value=null,j.value=null,J("标注已删除"),H())}function _(){E.value=null,R.value=null,j.value=null,C.value&&C.value.clearSelection()}const L=t({show:!1,message:"",type:"success"});let B=null;function J(e,t="success"){L.value={show:!0,message:e,type:t},clearTimeout(B),B=setTimeout(()=>{L.value.show=!1},2500)}let M=null;const X=t(null),Y=t(null),W=t(100),q=t(1),Z=x(()=>{const e=null!==Y.value?Y.value:q.value;return Math.round(100*e)}),G=x(()=>{if(!C.value)return 0;const e=C.value.getAnnotations();let t=0;for(const a in e)t+=e[a].length;return t});function H(){if(C.value&&V.value)try{const e=C.value.getAnnotations();I.value=function(e,t,a){const n={version:"1.0",exportDate:(new Date).toISOString(),sourceFile:a,globalSettings:t,annotations:{}};for(const l in e){const a=e[l];Array.isArray(a)&&a.length>0&&(n.annotations[l]=a.map(e=>{const a=e.settings?.prefix??t.prefix??"",n=e.settings?.suffix??t.suffix??"",l=a+e.displayValue+n;return{x:e.x,y:e.y,x2:e.x2,y2:e.y2,displayValue:e.displayValue,label:l,style:e.style,annotationStyle:e.annotationStyle}}))}return JSON.stringify(n,null,2)}(e,{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,fontSize:Ae.value,borderStyle:ge.value,annotationStyle:be.value},V.value)}catch(e){console.error("Failed to generate annotations JSON:",e)}else I.value="{}"}function K(e){d.value=e,V.value=e.name,A.value=1,P.value=1,Y.value=1,W.value=100,X.value=null;const t=new FileReader;t.onload=async e=>{M=e.target.result;const t=await z(M);t&&(X.value=t,c.value&&C.value&&k(()=>ee()))},t.readAsArrayBuffer(e),async function(e){Ue.value="vector";try{const t=new FormData;t.append("pdf",e);const a=await fetch(`${ye}/pdf-type`,{method:"POST",body:t});if(a.ok){const e=await a.json();Ue.value=e.type||"vector"}}catch(t){console.warn("PDF类型检测失败,使用默认矢量模式:",t)}}(e)}function Q(e){c.value=e.pdf,v.value=e.numPages,A.value=1,P.value=1,X.value&&k(()=>ee())}function ee(){const e=X.value;e&&C.value&&(X.value=null,C.value.setAnnotations(e.annotations),e.settings&&(we.value=e.settings.startNumber||1,Se.value=e.settings.increment||1,ze.value=e.settings.prefix||"",ke.value=e.settings.suffix||"",Ae.value=e.settings.fontSize||10,ge.value=e.settings.borderStyle||"none",be.value=e.settings.annotationStyle||"circle-outline"),H(),J("已自动恢复PDF中的标注数据"))}function te(e){q.value=e}function ae(e){Y.value=e,W.value=Math.round(100*e)}const ge=t("none"),be=t("circle-outline"),he=t(!0),we=t(1),Se=t(1),ze=t(""),ke=t(""),Ae=t(10);function Pe(e){ge.value=e.borderStyle,be.value=e.annotationStyle,he.value=e.singleClickMode??!0,we.value=e.startNumber,Se.value=e.increment,ze.value=e.prefix,ke.value=e.suffix,Ae.value=e.fontSize,J("设置已应用")}function Fe(){Y.value=+W.value/100}function Ce(){C.value&&(C.value.clearCurrentPageAnnotations(),H())}function Ve(){C.value&&(C.value.renumberCurrentPageAnnotations(we.value,Se.value,ze.value,ke.value,Ae.value),H(),J("本页焊口编号已重新标注"))}const De=t(!1),Ue=t("vector");async function Ie(e){if(d.value){De.value=!0;try{let t;t="hexagon"===e?"vector"===Ue.value?"detect-vector-hexagon-2":"detect-solid-hexagon":"hexagon-outline"===e?"detect-vector":"circle"===e?"detect-vector-circle":"detect-vector-hexagon-2";const a=new FormData;a.append("pdf",d.value),a.append("page",String(A.value)),"detect"===t&&(a.append("sensitivity","70"),a.append("min_size","20"),a.append("dpi","100"));const n=await fetch(`${ye}/${t}`,{method:"POST",body:a});if(!n.ok){const e=await n.json().catch(()=>({detail:n.statusText}));throw new Error(e.detail||n.statusText)}const{welds:l}=await n.json();if(!l||0===l.length)return void J("未检测到焊口","error");let o=we.value-Se.value;if(C.value){const e=C.value.getAnnotations();for(const t in e)for(const a of e[t])a.displayValue>o&&(o=a.displayValue)}const i=l.map((e,t)=>{const a=e.r||8,n=Math.max(2*a,20),l=o+(t+1)*Se.value;return{x:e.x+n,y:e.y-n,x2:e.x,y2:e.y,displayValue:l,text:ze.value+l+ke.value,style:ge.value,annotationStyle:be.value,settings:{prefix:ze.value,suffix:ke.value,startNumber:we.value,increment:Se.value,fontSize:Ae.value}}});C.value&&(C.value.addAnnotationsToPage(A.value,i),H(),J(`已自动标注 ${l.length} 个焊口`))}catch(t){console.error("自动标注失败:",t),J("自动标注失败: "+t.message,"error")}finally{De.value=!1}}else J("请先打开PDF文件","error")}function Ne(){C.value&&(C.value.undoLastAnnotation(),H())}async function Ee(){if(M&&C.value)try{const e=C.value.getAnnotations(),t=C.value.getPageRotations(),a=await h(M,e,U.value,{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,fontSize:Ae.value,borderStyle:ge.value,annotationStyle:be.value},t);w(a,`annotated_${V.value||Date.now()}.pdf`),J("PDF已生成并下载")}catch(e){console.error("Failed to generate PDF:",e),J("生成PDF失败: "+e.message,"error")}else J("请先打开PDF文件","error")}async function Re(){if(M&&C.value)try{const e=C.value.getAnnotations(),t=await S(M,e,{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,fontSize:Ae.value,borderStyle:ge.value,annotationStyle:be.value});w(t,`weld_data_${V.value||Date.now()}.pdf`),J("已导出带焊口数据的PDF(无可视标注)")}catch(e){console.error("Failed to export embedded PDF:",e),J("导出失败: "+e.message,"error")}else J("请先打开PDF文件","error")}async function je(){if(M&&C.value)try{const e=C.value.getAnnotations(),t=C.value.getPageRotations(),a=await h(M,e,U.value,{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,fontSize:Ae.value,borderStyle:ge.value,annotationStyle:be.value},t);w(a,`final_${V.value||Date.now()}.pdf`),J("PDF已生成并下载")}catch(e){console.error("Failed to generate PDF:",e),J("生成PDF失败: "+e.message,"error")}else J("请先打开PDF文件","error")}function Oe(){if(C.value&&V.value)try{!function(e,t,a){const{startNumber:n,increment:l,prefix:o,suffix:i}=t,s=[];s.push(["页码","标签","显示值","标签X坐标","标签Y坐标","指向X坐标","指向Y坐标","边框样式","标注样式","字体大小","前缀","后缀","起始值","增量"]);for(const c in e){const t=e[c];Array.isArray(t)&&t.forEach(e=>{const t=e.settings?.prefix??o,a=e.settings?.suffix??i,u=e.settings?.startNumber??n,r=e.settings?.increment??l,d=e.settings?.fontSize??10,p=t+e.displayValue+a;s.push([c,p,e.displayValue,Math.round(1e3*e.x)/1e3,Math.round(1e3*e.y)/1e3,void 0!==e.x2?Math.round(1e3*e.x2)/1e3:"",void 0!==e.y2?Math.round(1e3*e.y2)/1e3:"",e.style||"none",e.annotationStyle||"arrow",d,t,a,u,r])})}const u=s.map(e=>e.map(e=>{const t=String(e);return t.includes(",")||t.includes('"')||t.includes("\n")?`"${t.replace(/"/g,'""')}"`:t}).join(",")).join("\n"),r=new Blob(["\ufeff"+u],{type:"text/csv;charset=utf-8;"}),d=document.createElement("a"),p=URL.createObjectURL(r);d.href=p,d.download=`${a.replace(/\.[^.]+$/,"")}_annotations.csv`,document.body.appendChild(d),d.click(),document.body.removeChild(d),URL.revokeObjectURL(p)}(C.value.getAnnotations(),{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value},V.value),J("CSV数据已导出")}catch(e){J("导出CSV失败: "+e.message,"error")}else J("请先打开PDF文件","error")}function $e(){if(C.value&&V.value)try{!function(e,t,a){const n={version:"1.0",exportDate:(new Date).toISOString(),sourceFile:a,globalSettings:t,annotations:{}};for(const u in e){const a=e[u];Array.isArray(a)&&a.length>0&&(n.annotations[u]=a.map(e=>{const a=e.settings?.prefix??t.prefix??"",n=e.settings?.suffix??t.suffix??"",l=a+e.displayValue+n;return{x:e.x,y:e.y,x2:e.x2,y2:e.y2,displayValue:e.displayValue,label:l,style:e.style,annotationStyle:e.annotationStyle}}))}const l=JSON.stringify(n,null,2),o=new Blob([l],{type:"application/json;charset=utf-8;"}),i=document.createElement("a"),s=URL.createObjectURL(o);i.href=s,i.download=`${a.replace(/\.[^.]+$/,"")}_annotations.json`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(s)}(C.value.getAnnotations(),{startNumber:we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,fontSize:Ae.value,borderStyle:ge.value,annotationStyle:be.value},V.value),J("JSON数据已导出(可用于还原标注)")}catch(e){J("导出JSON失败: "+e.message,"error")}else J("请先打开PDF文件","error")}async function Te(e){if(e)try{const t=await async function(e){return new Promise((t,a)=>{const n=new FileReader;n.onload=e=>{try{const a=JSON.parse(e.target.result);if(!a.annotations||!a.globalSettings)throw new Error("无效的标注数据格式");t({annotations:a.annotations,settings:a.globalSettings,sourceFile:a.sourceFile,version:a.version})}catch(n){a(new Error("解析JSON文件失败: "+n.message))}},n.onerror=()=>{a(new Error("读取文件失败"))},n.readAsText(e)})}(e);if(!window.confirm(`确定要导入标注数据吗?\n来源文件: ${t.sourceFile||"未知"}\n版本: ${t.version||"未知"}\n当前标注将被覆盖。`))return;C.value&&(C.value.setAnnotations(t.annotations),t.settings&&(we.value=t.settings.startNumber||1,Se.value=t.settings.increment||1,ze.value=t.settings.prefix||"",ke.value=t.settings.suffix||"",Ae.value=t.settings.fontSize||10,ge.value=t.settings.borderStyle||"none",be.value=t.settings.annotationStyle||"circle-outline"),J("标注数据导入成功"),H())}catch(t){J("导入失败: "+t.message,"error")}}async function _e(e){if(e)try{const t=await async function(e){return new Promise((t,a)=>{const n=new FileReader;n.onload=n=>{try{const a=n.target.result.trim().split("\n");if(a.length<2)throw new Error("CSV文件内容不足,至少需要标题行和数据行");const l=le(a[0]),o=["页码","标签X坐标","标签Y坐标"];for(const e of o)if(!l.includes(e))throw new Error(`缺少必要的列: ${e}`);const i={};let s={startNumber:1,increment:1,prefix:"",suffix:"",fontSize:10,borderStyle:"none",annotationStyle:"arrow"};for(let e=1;e<a.length;e++){const t=le(a[e]);if(0===t.length||t.every(e=>!e))continue;const n={};for(let e=0;e<l.length;e++)n[l[e]]=t[e]||"";const o=n["页码"]?.trim();if(!o)continue;const u=parseFloat(n["标签X坐标"]),r=parseFloat(n["标签Y坐标"]),d=n["指向X坐标"]?parseFloat(n["指向X坐标"]):void 0,p=n["指向Y坐标"]?parseFloat(n["指向Y坐标"]):void 0;if(isNaN(u)||isNaN(r))throw new Error(`第${e+1}行: 坐标格式错误`);const c=n["显示值"]?parseInt(n["显示值"]):0,v=n["边框样式"]?.trim()||"none",f=n["标注样式"]?.trim()||"arrow",m=n["字体大小"]?parseInt(n["字体大小"]):10,x=n["前缀"]?.trim()||"",y=n["后缀"]?.trim()||"",g=n["起始值"]?parseInt(n["起始值"]):1,b=n["增量"]?parseInt(n["增量"]):1;1===e&&(s={startNumber:g,increment:b,prefix:x,suffix:y,fontSize:m,borderStyle:v,annotationStyle:f});const h={x:u,y:r,displayValue:c,style:v,annotationStyle:f,settings:{prefix:x,suffix:y,fontSize:m,startNumber:g,increment:b}};void 0===d||void 0===p||isNaN(d)||isNaN(p)||(h.x2=d,h.y2=p),i[o]||(i[o]=[]),i[o].push(h)}if(0===Object.keys(i).length)throw new Error("CSV文件中没有有效的标注数据");t({annotations:i,settings:s,sourceFile:e.name,version:"1.0"})}catch(l){a(new Error("解析CSV文件失败: "+l.message))}},n.onerror=()=>{a(new Error("读取文件失败"))},n.readAsText(e,"utf-8")})}(e);if(!window.confirm(`确定要导入CSV标注数据吗?\n来源文件: ${t.sourceFile||"未知"}\n当前标注将被覆盖。`))return;C.value&&(C.value.setAnnotations(t.annotations),t.settings&&(we.value=t.settings.startNumber||1,Se.value=t.settings.increment||1,ze.value=t.settings.prefix||"",ke.value=t.settings.suffix||"",Ae.value=t.settings.fontSize||10,ge.value=t.settings.borderStyle||"none",be.value=t.settings.annotationStyle||"circle-outline"),J("CSV标注数据导入成功"),H())}catch(t){J("导入CSV失败: "+t.message,"error")}}function Le(e){const t=A.value;U.value[t]||(U.value[t]=[]),U.value[t].push(e),C.value&&C.value.setImages(U.value),J("图片已放置")}function Be(){J("已取消图片放置")}function Je(e){U.value[e.page]=e.images,J("图片已删除")}async function Me(e){const t=e?.file,a=e?.size||80,n=e?.imageData;try{if(n)return C.value?(C.value.setTemporaryImage(n,a),void J("点击PDF上要放置表格的位置,按ESC取消")):void J("请先加载PDF","error");if(!t)return void J("请先选择图片文件","error");const e=new FileReader;e.onload=e=>{C.value?(C.value.setTemporaryImage(e.target.result,a),J("点击PDF上要放置图片的位置,按ESC取消")):J("请先加载PDF","error")},e.readAsDataURL(t)}catch(l){J("导入图片失败: "+l.message,"error")}}function Xe(){let e=D.value;if(!e){const t=document.getElementById("hdpdfurl");t&&t.value&&(e=t.value.trim())}if(!e&&d.value&&(e=URL.createObjectURL(d.value)),e){let t=`/viewer.html?url=${encodeURIComponent(e)}`;const a=document.getElementById("imgurl1"),n=document.getElementById("imgurl2");a?.value?.trim()&&(t+=`&imgurl1=${encodeURIComponent(a.value.trim())}`),n?.value?.trim()&&(t+=`&imgurl2=${encodeURIComponent(n.value.trim())}`),window.open(t,"_blank")}else J("未找到PDF地址","error")}async function Ye(e){if(e){D.value=e,J("正在加载在线PDF...");try{const a=await fetch(e);if(!a.ok)throw new Error(`加载失败: ${a.status} ${a.statusText}`);const n=await a.arrayBuffer(),l=new Blob([n],{type:"application/pdf"});let o="online.pdf";try{const t=new URL(e).pathname.split("/"),a=t[t.length-1];a&&a.includes(".pdf")&&(o=decodeURIComponent(a))}catch(t){}const i=new File([l],o,{type:"application/pdf"});M=n,d.value=i,V.value=o,A.value=1,P.value=1,Y.value=1,W.value=100,J("PDF加载成功")}catch(a){J("加载PDF失败: "+a.message,"error")}}}return y(()=>{try{const e=document.getElementById("hdpdfurl");if(e&&"string"==typeof e.value&&e.value.trim()){const t=e.value.trim();D.value=t,Ye(t)}const t=document.getElementById("hdjoinInfo");t&&"string"==typeof t.value&&t.value.trim()&&(N.value=t.value.trim())}catch(e){console.warn("Error checking for elements:",e)}}),a(A,e=>{}),(e,t)=>(l(),n("div",oe,[L.value.show?(l(),n("div",{key:0,style:m({position:"fixed",top:"20px",right:"20px",padding:"12px 16px",background:"success"===L.value.type?"#d1fae5":"#fee2e2",color:"success"===L.value.type?"#065f46":"#991b1b",borderRadius:"4px",boxShadow:"0 4px 12px rgba(0,0,0,0.15)",zIndex:9999,animation:"slideIn 0.3s ease-out",fontSize:"14px",fontWeight:"500"})},s(L.value.message),5)):o("",!0),i("div",ie,[g(ne,{"selected-annotation":E.value,"selected-annotation-page":R.value,"selected-annotation-index":j.value,"annotations-json":I.value,"initial-csv-data":N.value,"auto-annotating":De.value,onFileSelected:K,onApplySettings:Pe,onClearPageAnnotations:Ce,onRenumberPageAnnotations:Ve,onAutoAnnotatePage:Ie,onUndoAnnotation:Ne,onSavePdfEditable:Ee,onExportPdfEmbedded:Re,onSavePdfFinal:je,onExportCsv:Oe,onExportJson:$e,onImportAnnotations:Te,onImportCsv:_e,onImportImage:Me,onUpdateAnnotation:$,onDeleteAnnotation:T,onDeselectAnnotation:_,onLoadPdfUrl:Ye},null,8,["selected-annotation","selected-annotation-page","selected-annotation-index","annotations-json","initial-csv-data","auto-annotating"])]),i("div",se,[i("div",ue,[i("div",{onClick:t[0]||(t[0]=e=>F.value=!F.value),style:m({background:F.value?"#334155":"#e2e8f0",color:F.value?"white":"#475569",padding:"4px 8px",borderRadius:"4px",cursor:"pointer",userSelect:"none",fontSize:"11px",whiteSpace:"nowrap"})},"标注模式"+s(F.value?":开":":关"),5),t[10]||(t[10]=i("div",{style:{width:"1px",background:"#e5e7eb",height:"26px",margin:"0 6px"}},null,-1)),i("div",{class:f(["btn",{disabled:!c.value||A.value<=1}]),onClick:t[1]||(t[1]=e=>!(!c.value||A.value<=1)&&void(A.value>1&&(A.value--,P.value=A.value))),style:{"font-size":"13px",padding:"6px 10px"}},"上一页",2),i("div",{class:f(["btn",{disabled:!c.value||A.value>=v.value}]),onClick:t[2]||(t[2]=e=>!(!c.value||A.value>=v.value)&&void(A.value<v.value&&(A.value++,P.value=A.value))),style:{"font-size":"13px",padding:"6px 10px"}},"下一页",2),t[11]||(t[11]=i("div",{style:{width:"1px",background:"#e5e7eb",height:"26px",margin:"0 6px"}},null,-1)),i("div",{class:f(["btn",{disabled:!c.value}]),onClick:t[3]||(t[3]=e=>!c.value||(null===Y.value&&(Y.value=q.value),Y.value=Math.max(.5,+(Y.value/1.2).toFixed(2)),void(W.value=Math.round(100*Y.value)))),style:{"font-size":"13px",padding:"6px 8px"}},"-",2),i("div",{class:f(["btn",{disabled:!c.value}]),onClick:t[4]||(t[4]=e=>!c.value||(null===Y.value&&(Y.value=q.value),Y.value=Math.min(3,+(1.2*Y.value).toFixed(2)),void(W.value=Math.round(100*Y.value)))),style:{"font-size":"13px",padding:"6px 8px"}},"+",2),u(i("input",{"onUpdate:modelValue":t[5]||(t[5]=e=>W.value=e),onInput:Fe,type:"range",min:"50",max:"300",style:{width:"90px"},disabled:!c.value},null,40,re),[[r,W.value,void 0,{number:!0}]]),i("div",de,s(Z.value)+"%",1),t[12]||(t[12]=i("div",{style:{width:"1px",background:"#e5e7eb",height:"26px",margin:"0 6px"}},null,-1)),t[13]||(t[13]=i("div",{style:{"margin-left":"4px","font-size":"13px"}},"第",-1)),u(i("input",{type:"number","onUpdate:modelValue":t[6]||(t[6]=e=>P.value=e),min:1,max:v.value,style:{width:"50px","margin-left":"4px","font-size":"13px",padding:"2px 4px"}},null,8,pe),[[r,P.value,void 0,{number:!0}]]),i("div",{class:f(["btn",{disabled:!c.value}]),onClick:t[7]||(t[7]=e=>!c.value||void(P.value>=1&&P.value<=v.value&&(A.value=P.value))),style:{"font-size":"13px",padding:"6px 10px"}},"跳转",2),i("div",ce,"/ "+s(v.value||0)+" 页",1),t[14]||(t[14]=i("div",{style:{width:"1px",background:"#e5e7eb",height:"26px",margin:"0 6px"}},null,-1)),V.value?(l(),n("div",ve,[i("div",fe,[t[8]||(t[8]=i("strong",null,"文件:",-1)),p(" "+s(V.value),1)]),i("div",me,[t[9]||(t[9]=i("strong",null,"标签:",-1)),p(" "+s(G.value),1)])])):o("",!0),t[15]||(t[15]=i("div",{style:{flex:"1"}},null,-1)),i("div",{class:"btn",onClick:Xe,title:"在新窗口中打开纯PDF预览",style:{"font-size":"13px",padding:"6px 10px","white-space":"nowrap"}},"PDF预览")]),i("div",xe,[g(b,{file:d.value,page:A.value,scale:Y.value,"annotation-mode":F.value,"border-style":ge.value,"annotation-style":be.value,"single-click-mode":he.value,"start-number":we.value,increment:Se.value,prefix:ze.value,suffix:ke.value,"font-size":Ae.value,ref_key:"pdfViewerRef",ref:C,onLoaded:Q,onScaleChanged:te,onWheelZoom:ae,onPlaceImage:Le,onAnnotationSelected:O,onImagePlacingCancelled:Be,onImageDeleted:Je,onAnnotationChanged:H},null,8,["file","page","scale","annotation-mode","border-style","annotation-style","single-click-mode","start-number","increment","prefix","suffix","font-size"])])])]))}}).mount("#app");
|