aiflowui 1.0.10 → 1.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (function(re,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(re=typeof globalThis<"u"?globalThis:re||self,e(re.AIFlowUI={},re.Vue,re.ElementPlusIconsVue,re.ElementPlus,re.Pinia,re.VueFlowCore,re.VueFlowBackground,re.VueFlowControls,re.VueFlowNodeResizer))})(this,(function(re,e,X,Z,Qe,v,Ke,Ze,ve){"use strict";const k={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},et={[k.DETECTION_TARGET]:"检测目标",[k.CLASSIFICATION_MODEL]:"分类模型",[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时",[k.FACE_RECOGNITION]:"人脸识别",[k.SMALL_MODEL]:"小模型"},tt={cls:k.CLASSIFICATION_MODEL,ocr:k.OCR,license_plate:k.LICENSE_PLATE,target_count:k.TARGET_COUNT,timer_target:k.TIMER_TARGET,face:k.FACE_RECOGNITION,face_recognition:k.FACE_RECOGNITION},ee={ALGORITHM:"algorithm",TASK:"task"},ye={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ve=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),be=a=>({id:me("end"),type:"end",position:a,data:{label:"结束",input_schema:{properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]},arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80}}}),xe=a=>({id:me("dataSource"),type:"dataSource",position:a,data:{label:"数据源",enableImageSequence:!1,input_schema:{properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",description:"开启协同检测后,该数据源下的多个摄像机画面会按协同条件检测。使用此算法的任务将不支持轮巡",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",description:"开启后将区分首帧检测和后续帧检测",default:!1}},required:[]},arguments:{needCooperativeDetection:!1,windowSeconds:5,enableImageSequence:!1,deviceType:"camera"},enableBranch:!0,branchLogic:"and"}}),Be=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Ae=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),De=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Le=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Oe=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Me=a=>({id:me("targetCount"),type:"targetCount",position:a,data:{label:"目标计数",description:"",arguments:{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"},input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}}}),Ie=a=>({id:me("timerTarget"),type:"timerTarget",position:a,data:{label:"目标计时",description:"",arguments:{duration:30,similarity_enabled:!1,similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gte",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:90}},input_schema:{}}}),ot=(a,o={width:300,height:160},t="and",m=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:m},selectable:!0,deletable:!1,zIndex:-1}),Re=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ge=new Map,$e=()=>{const a=Ve({x:80,y:300}),o=xe({x:320,y:300}),t=be({x:1e3,y:300}),m={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[m]}},nt=a=>Qe.defineStore(`aiflow-workflow-${a}`,()=>{const o=$e(),t=e.ref(o.nodes),m=e.ref(o.edges),y=e.ref(null),l=e.ref(null),x=e.ref(new Set),S=e.ref(new Set),L=e.ref({}),H=(p,B,I,U)=>{L.value[p]||(L.value[p]={}),L.value[p][B]||(L.value[p][B]={}),L.value[p][B][I]={...U}},R=(p,B,I,U,J)=>{L.value[p]||(L.value[p]={}),L.value[p][B]||(L.value[p][B]={}),L.value[p][B][I]||(L.value[p][B][I]={}),L.value[p][B][I][U]=J},f=(p,B,I)=>L.value[p]?.[B]?.[I]??null,E=()=>{L.value={}},C=e.computed(()=>y.value?t.value.find(p=>p.id===y.value):null),d=e.computed(()=>l.value?m.value.find(p=>p.id===l.value):null),c=p=>t.value.filter(B=>B.type===p).length,n=()=>{const p=t.value.filter(B=>B.type===k.DATA_SOURCE);p.length!==0&&(p.length===1?p[0].data.label="数据源":p.forEach((B,I)=>{B.data.label=`数据源 ${I+1}`}))},b=()=>t.value.filter(p=>p.type===k.DATA_SOURCE).length,j=()=>t.value.filter(B=>B.type===k.DATA_SOURCE).some(B=>B.data.arguments?.needCooperativeDetection===!0),g=()=>{const p=b(),B=j();return!(p>1||B)},G=p=>{t.value.push(p),p.type===k.DATA_SOURCE&&n()},w=p=>{const B=t.value.find(U=>U.id===p),I=B?.type===k.DATA_SOURCE;if(B?.type==="group"){T(p),m.value=m.value.filter(U=>U.source!==p&&U.target!==p),y.value===p&&(y.value=null);return}t.value=t.value.filter(U=>U.id!==p),m.value=m.value.filter(U=>U.source!==p&&U.target!==p),y.value===p&&(y.value=null),I&&n()},A=(p,B)=>{const I=t.value.find(U=>U.id===p);I&&(I.data={...I.data,...B})},_=(p,B)=>{const I=t.value.find(U=>U.id===p);I&&(I.position=B)},V=p=>{const B=t.value.find(I=>I.id===p.source);if(B&&(B.type===k.START||B.type===k.DATA_SOURCE)&&B.data?.enableBranch===!0){const U=m.value.filter(J=>J.source===p.source).length+1;p={...p,data:{...p.data,branchOrder:U}}}m.value=v.addEdge(p,m.value)},i=p=>{const B=m.value.find(I=>I.id===p);if(m.value=m.value.filter(I=>I.id!==p),l.value===p&&(l.value=null),B&&B.data?.branchOrder!==void 0){const I=t.value.find(U=>U.id===B.source);I&&(I.type===k.START||I.type===k.DATA_SOURCE)&&m.value.filter(J=>J.source===B.source).sort((J,Q)=>(J.data?.branchOrder||0)-(Q.data?.branchOrder||0)).forEach((J,Q)=>{J.data?J.data.branchOrder=Q+1:J.data={branchOrder:Q+1}})}},r=(p,B="and",I=null)=>{const U=ot(p,{width:300,height:160},B,I);return t.value.unshift(U),U.id},N=(p,B)=>{const I=t.value.find(Q=>Q.id===p),U=t.value.find(Q=>Q.id===B);if(!I||!U||I.parentNode===B)return;I.parentNode&&u(p);const J=t.value.find(Q=>Q.id===p);J&&(t.value=t.value.map(Q=>Q.id!==p?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:B,extent:"parent"}))},u=p=>{const B=t.value.find(Q=>Q.id===p);if(!B||!B.parentNode)return;const I=t.value.find(Q=>Q.id===B.parentNode),U=I?B.position.x+I.position.x:B.position.x,J=I?B.position.y+I.position.y:B.position.y;t.value=t.value.map(Q=>{if(Q.id!==p)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},T=p=>{const B=t.value.find(I=>I.id===p);B&&(t.value=t.value.filter(I=>I.id!==p).map(I=>{if(I.parentNode!==p)return I;const U={...I,position:{x:I.position.x+B.position.x,y:I.position.y+B.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:m,selectedNodeId:y,selectedEdgeId:l,invalidNodeIds:x,invalidEdgeIds:S,selectedNode:C,selectedEdge:d,getNodeCountByType:c,getDataSourceCount:b,hasCooperativeDetection:j,supportPatrol:g,addNode:G,removeNode:w,updateNodeData:A,updateNodePosition:_,addConnection:V,removeEdge:i,updateEdgeData:(p,B)=>{const I=m.value.find(U=>U.id===p);if(I){if(B.branchOrder!==void 0){const U=t.value.find(J=>J.id===I.source);if(U&&(U.type===k.START||U.type===k.DATA_SOURCE)){const J=I.data?.branchOrder,Q=B.branchOrder;if(J!==Q&&Q!==null){const se=m.value.filter(ce=>ce.source===I.source&&ce.id!==p).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}I.data={...I.data,...B}}},selectNode:p=>{y.value=p,l.value=null},selectEdge:p=>{l.value=p,y.value=null},clearSelection:()=>{y.value=null,l.value=null},resetWorkflow:()=>{const p=$e();t.value=p.nodes,m.value=p.edges,y.value=null,l.value=null,E()},loadWorkflow:(p,B)=>{t.value=p,m.value=B,y.value=null,l.value=null,E()},refreshDataSourceLabels:n,createEmptyGroup:r,addNodeToGroup:N,removeNodeFromGroup:u,dissolveParallelGroup:T,initializeSubsequentFrames:p=>{t.value.find(I=>I.id===p)&&A(p,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(p,B)=>{const I=t.value.find(U=>U.id===p);!I||I.type!=="dataSource"||(I.data.subsequentFrames||(I.data.subsequentFrames=[]),I.data.subsequentFrames.push(B),A(p,{subsequentFrames:[...I.data.subsequentFrames]}))},removeSubsequentFrame:(p,B)=>{const I=t.value.find(Q=>Q.id===p);if(!I||I.type!=="dataSource")return;const U=I.data.subsequentFrames.find(Q=>Q.id===B);U&&m.value.filter(te=>te.source===p&&te.sourceHandle===U.handleId).forEach(te=>i(te.id));const J=I.data.subsequentFrames.filter(Q=>Q.id!==B);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),A(p,{subsequentFrames:J})},setInvalidIds:(p,B)=>{x.value=new Set(p),S.value=new Set(B)},clearInvalidIds:()=>{x.value=new Set,S.value=new Set},taskSources:L,setTaskSourceArguments:H,updateTaskSourceArgument:R,getTaskSourceArguments:f,clearTaskSources:E}}),ae=(a=null)=>{const o=a??e.inject("workflowInstanceId","default");return ge.has(o)||ge.set(o,nt(o)),ge.get(o)()},at=a=>{if(ge.has(a)){try{ge.get(a)().$dispose()}catch{}ge.delete(a)}},Fe=(a,o,t)=>{const m=[],y=[],l=a.filter(n=>n.type!=="group"),x=l.filter(n=>n.type===k.START);x.length===0?m.push("工作流必须包含一个开始节点"):x.length>1&&m.push("工作流只能包含一个开始节点");const S=l.filter(n=>n.type===k.END);S.length===0?m.push("工作流必须包含一个结束节点"):S.length>1&&m.push("工作流只能包含一个结束节点");const L=l.filter(n=>n.type===k.DATA_SOURCE);L.length===0&&m.push("工作流必须至少包含一个数据源节点"),l.filter(n=>n.type===k.DETECTION_TARGET||n.type===k.SMALL_MODEL||n.type===k.CLASSIFICATION_MODEL).length===0&&m.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(n=>n.type===k.SMALL_MODEL),L.some(n=>n.data.arguments?.needCooperativeDetection===!0),L.length>1,l.forEach(n=>{const b=o.filter(g=>g.target===n.id),j=o.filter(g=>g.source===n.id);if(n.type===k.START&&b.length>0&&y.push("开始节点不应有输入连接"),n.type===k.END&&j.length>0&&y.push("结束节点不应有输出连接"),n.type===k.START&&j.length===0&&m.push("开始节点必须有输出连接"),n.type===k.END&&b.length===0&&m.push("结束节点必须有输入连接"),n.type===k.DATA_SOURCE&&n.data.enableImageSequence)if(j.length===0)m.push({nodeId:n.id,message:`数据源节点"${n.data.label}"开启了图片时序但未连接到任何处理节点`});else{const g=j.filter(_=>_.sourceHandle==="first-frame"),G=n.data.subsequentFrames||[],w=new Set(j.map(_=>_.sourceHandle)),A=G.filter(_=>!w.has(_.handleId));g.length===0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"的首帧检测未连接`}),A.length>0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"有${A.length}个后续帧未连接`})}n.type!==k.START&&n.type!==k.END&&!n.parentNode&&(b.length===0||j.length===0)&&y.push(`节点 "${n.data.label}" 可能未正确连接`)});const R=new Set;o.forEach(n=>{const b=a.find(j=>j.id===n.source);b?.type==="dataSource"&&b.data?.enableImageSequence===!0&&n.sourceHandle!=="first-frame"&&(!n.data?.timeWindowSeconds||n.data.timeWindowSeconds<1)&&m.push({edgeId:n.id,message:`分支"${n.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),R.add(n.source),R.add(n.target)}),l.forEach(n=>{n.parentNode||!R.has(n.id)&&l.length>1&&y.push(`节点 "${n.data.label}" 未连接到工作流`)});const f=lt(l,o);m.push(...f);const E=st(l,o);m.push(...E);const C=rt(l);m.push(...C);const d=it(l,o);m.push(...d);const c=ct(l,o);return m.push(...c),t==="task"&&l.filter(b=>b.type===k.FACE_RECOGNITION).forEach(b=>{(!b.data.arguments?.repositoryId||Array.isArray(b.data.arguments.repositoryId)&&b.data.arguments.repositoryId.length===0)&&m.push({nodeId:b.id,message:`人脸识别节点"${b.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:m.length===0,errors:m,warnings:y}},lt=(a,o)=>{const t=[],m=a.find(x=>x.type===k.START);if(!m)return t;const y=new Set,l=(x,S,L,H)=>{if(S.includes(x))return;const R=a.find(c=>c.id===x);if(!R)return;const f=[...S,x];let E=[...L],C=[...H];if(R.type===k.TARGET_COUNT&&E.push(R),R.type===k.TIMER_TARGET&&C.push(R),R.type===k.END){const c=f.join("->");y.has(c)||(y.add(c),E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),C.length>1&&t.push(`工作流分支中存在多个目标计时节点(${C.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const d=o.filter(c=>c.source===x);d.length===0?(E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(c=>`"${c.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),C.length>1&&t.push(`工作流分支中存在多个目标计时节点(${C.map(c=>`"${c.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):d.forEach(c=>{l(c.target,f,E,C)})};return l(m.id,[],[],[]),t},rt=a=>{const o=[],t=a.filter(y=>y.type===k.DATA_SOURCE),m=a.filter(y=>y.type===k.SMALL_MODEL);return m.length>0&&t.length>1&&m.forEach(y=>{o.push({nodeId:y.id,message:`小模型节点"${y.data.label||y.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},st=(a,o)=>{const t=[];return a.filter(y=>y.type===k.DATA_SOURCE).forEach(y=>{const l=o.filter(x=>x.source===y.id);if(l.length>1){const x=l.map(H=>H.target),L=a.filter(H=>x.includes(H.id)).filter(H=>H.type===k.SMALL_MODEL);if(L.length>0){const H=L.map(R=>`"${R.data.label||R.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${H})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},it=(a,o)=>{const t=[],m=[k.TARGET_COUNT,k.TIMER_TARGET],y={[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时"};return a.filter(x=>x.type===k.SMALL_MODEL).forEach(x=>{o.filter(L=>L.source===x.id).forEach(L=>{const H=a.find(R=>R.id===L.target);if(H&&m.includes(H.type)){const R=y[H.type]||H.type;t.push(`小模型节点"${x.data.label||x.data.modelName}"不能直接连接${R}节点"${H.data.label}",请先连接检测目标节点`)}})}),t},ct=(a,o)=>{const t=[],m=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION],y={[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.FACE_RECOGNITION]:"人脸识别"};return a.filter(x=>m.includes(x.type)).forEach(x=>{const S=o.filter(R=>R.source===x.id),L=m.filter(R=>R!==x.type).concat(k.END),H=x.data.label||y[x.type];S.forEach(R=>{const f=a.find(E=>E.id===R.target);f&&!L.includes(f.type)&&t.push(`${H}节点"${H}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${f.data.label||f.type}"节点`)}),S.length===0&&t.push(`${H}节点"${H}"必须连接到其他辅助节点或结束节点`)}),t},qe=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(m=>t.get(m)).filter(Boolean),Ge=(a,o)=>{const t={},m=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,x)=>{const S=l.data?.branchOrder??1/0,L=x.data?.branchOrder??1/0;return S-L}).forEach(l=>{if(m.has(l.source)&&m.has(l.target))return;let x=l.source,S=l.target;if(m.has(x)){const L=o.find(H=>H.target===x&&!m.has(H.source));if(!L)return;x=L.source}if(m.has(S)){const L=o.find(H=>H.source===S&&!m.has(H.target));if(!L)return;S=L.target}t[x]||(t[x]=[]),t[x].includes(S)||t[x].push(S)}),t},He=(a,o)=>{const t=[...o.values()].find(x=>x.type===k.START);if(!t)return[];const m=new Set,y=[],l=x=>{if(m.has(x))return;m.add(x);const S=o.get(x);if(!S)return;S.type!==k.START&&S.type!==k.END&&S.type!=="group"&&y.push(S),(a[x]||[]).forEach(H=>l(H))};return l(t.id),y},dt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ce=(a,o,t,m)=>{const y=a.nodes.findIndex(x=>x.toolTitle===o);if(y===-1)return;const l=a.nodes[y];l.arguments?.[t]&&(a[m]=l.arguments[t]),a.nodes=a.nodes.filter((x,S)=>S!==y),a.nodes.forEach((x,S)=>{x.sortOrder=S+1})},mt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(m=>({op:m.operator,value:m.value}))}}},pt=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const m={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:m[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const m=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[m]||">",value:t.threshold,matchFrames:3}}return a.similarity_enabled&&a.similarity_threshold!==void 0&&(o.similarity={op:">",value:a.similarity_threshold,matchFrames:3}),{duration:o}},ut={[k.TARGET_COUNT]:mt,[k.TIMER_TARGET]:pt},_e=(a,o)=>{if(!a)return{};const t=ut[o];if(t)return t(a);const m={...a};return dt.forEach(y=>{delete m[y]}),Object.keys(m).forEach(y=>{const l=m[y];(l==null||l==="")&&delete m[y]}),o===k.FACE_RECOGNITION&&m.repositoryId!==void 0&&(Array.isArray(m.repositoryId)||(m.repositoryId=[m.repositoryId]),m.repositoryId.length===0&&delete m.repositoryId),m},ft=a=>{switch(a.type){case k.DETECTION_TARGET:return a.data.targetId||"";case k.CLASSIFICATION_MODEL:return"cls";case k.OCR:return"ocr";case k.LICENSE_PLATE:return"license_plate";case k.SMALL_MODEL:return a.data.title||a.data.modelName||"";case k.TARGET_COUNT:return"target_count";case k.TIMER_TARGET:return"timer_target";case k.FACE_RECOGNITION:return"face";default:return a.data.label||""}},gt=(a,o,t,m,y=null)=>{const l={toolTitle:ft(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:_e(y??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const x=m.find(S=>S.source===t&&S.target===a.id);x?.data?.branchOrder!==void 0&&x?.data?.branchOrder!==null&&(l.branchOrder=x.data.branchOrder)}return l},Pe=(a,o,t,m,y,l=null,x=[])=>{const S=[],L=Array.isArray(a)?[...a]:[a],H=new Set;let R=1;for(;L.length>0;){const f=[...L];L.length=0;const E=[];f.forEach(C=>{if(H.has(C))return;H.add(C);const d=m.get(C);!d||d.type===k.END||d.type===k.START||d.type===k.DATA_SOURCE||((t[C]||[]).forEach(n=>{const b=m.get(n);b&&b.type!==k.END&&L.push(n)}),x.includes(d.type))||E.push(d)}),E.length>0&&(E.forEach(C=>{const d=l?.(C.id)??null,c=gt(C,R,o,y,d);E.length>1&&(c.nodeLogic="or"),S.push(c)}),R++)}return S},ht=(a=null)=>{const o=a??ae(),t=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",ye.CREATE);const m=e.inject("editorConfig",null),y=e.computed(()=>Fe(o.nodes,o.edges,t)),l=(i,r,N,u)=>{if(N){const T=pe(i,N.id,r).find(F=>F.type===k.SMALL_MODEL);if(T)return T}return u.find(T=>T.type===k.SMALL_MODEL)||null},x=(i,r,N)=>{const T=pe(r,i.id,N).find($=>$.type===k.SMALL_MODEL);return T?pe(r,T.id,N).filter($=>$.type!==k.END&&$.type!==k.START&&$.type!==k.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},S=(i,r,N,u,T)=>{if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){const $=l(u,T,N,i);return $?{toolTitle:$.data.title||$.data.modelName||"",toolType:"small",arguments:_e($.data.arguments,k.SMALL_MODEL)}:null}const F=i.find($=>$.type===k.DETECTION_TARGET);return F?{toolTitle:F.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:_e(F.data.arguments,k.DETECTION_TARGET)}:null},L=()=>{const i=o.nodes.find(u=>u.type===k.END);if(!i||!i.data.arguments)return{};const r=i.data.arguments,N={};return r.reportFrequency==="interval"&&r.reportInterval&&(N.interval={value:r.reportInterval}),r.enableDeduplication&&r.similarityThreshold!==void 0&&(N.dedup={value:r.similarityThreshold}),N},H=i=>{if(i.length<=1)return;const r=i.map(u=>u.sortOrder);if(new Set(r).size!==r.length){const u=r.filter((T,F)=>r.indexOf(T)!==F);throw new Error(`分支执行顺序存在重复:${[...new Set(u)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},R=(i,r,N,u,T)=>{let F=[],$;if(i===de.IMAGE_BRANCH)r&&(F=pe(u,r.id,T).filter(M=>M.type!==k.END)),$=r?.id||N.find(M=>M.type===k.DATA_SOURCE)?.id;else if(i===de.SMALL_MODEL_BRANCH){const M=l(u,T,r,N);M&&(F=pe(u,M.id,T).filter(P=>P.type!==k.END),$=M.id)}return{branchStartNodes:F,sourceNodeId:$}},f=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]),E=(i,r,N)=>{const u=new Set,T=[],F=$=>{if(u.has($))return;u.add($);const M=N.get($);if(!M||M.type===k.END)return;f.has(M.type)&&T.push(M),(r[$]||[]).forEach(z=>F(z))};return F(i),T.length>0?T[T.length-1]:null},C=(i,r,N,u,T)=>{const F=`分支${T+1}`,$=E(r,N,u);if(!$)return i?.data?.nodeName||F;if($.type===k.DETECTION_TARGET&&$.data?.targetId==="other"){const P=$.data?.arguments?.object;if(Array.isArray(P)&&P.length>0){const z=P.join(",");return z.length>32?z.slice(0,32):z}}if($.type===k.CLASSIFICATION_MODEL){const P=$.data?.arguments?.modelName||$.data?.label;if(!P)return F;const z=$.data?.arguments?.resultNegate?"(取反)":"";return P+z}return $.data?.label||$.data?.targetName||F},d=(i,r,N,u,T,F)=>{const{branchStartNodes:$,sourceNodeId:M}=R(r,N,i,u,T);if($.length===0)return[];const P=[];return $.forEach((z,Y)=>{const h=Pe([z.id],M,u,T,F);if(h.length===0)return;const D=M?F.find(p=>p.source===M&&p.target===z.id):null,q=D?.data||{},W=q.branchOrder!==void 0&&q.branchOrder!==null?q.branchOrder:Y+1,s={branchName:q.branchName||C(z,z.id,u,T,Y),sortOrder:W,nodes:h};D?.sourceHandle&&(s.sourceHandle=D.sourceHandle),Ce(s,"target_count","targetCount","targetCount"),Ce(s,"timer_target","duration","duration"),q.timeWindowSeconds!==void 0&&q.timeWindowSeconds!==null&&(s.timeWindowSeconds=q.timeWindowSeconds),q.branchDescription&&(s.description=q.branchDescription),P.push(s)}),H(P),P},c=()=>{const i=y.value;if(i.errors.length>0){const r=i.errors.map(N=>typeof N=="object"?N.message:N);return Z.ElMessage.error(`验证失败: ${r.join(", ")}`),!1}return i.warnings.length>0&&Z.ElMessage.warning(`警告: ${i.warnings.join(", ")}`),!0},n=()=>{const i=o.nodes,r=o.edges,N=qe(i),u=Ge(i,r),T=He(u,N),F=[...N.values()].find($=>$.type===k.START);return{allNodes:i,edges:r,nodeMap:N,adj:u,orderedNodes:T,startNode:F}},b=i=>{const r={ruleName:i?.data?.algorithmName||"",description:"",webhookUrl:""},N=L();Object.keys(N).length>0&&(r.extraConfig=N);const T=(m?.value??m)?.platform;return r.attach=T?{platform:T}:{},r},j=(i,r)=>{const N=i.filter(u=>u.type===k.DATA_SOURCE);if(N.length===0){const u=r.find(T=>T.type===k.DATA_SOURCE);u&&N.push(u)}return N},g=i=>i?.data?.enableImageSequence||i?.data?.arguments?.enableImageSequence||!1?"order":i?.data?.enableBranch&&i.data.branchLogic||"and",G=(i,r,N,u)=>{const{orderedNodes:T,adj:F,nodeMap:$,edges:M}=r,P=x(i,F,$),z=!!i.data.arguments?.needCooperativeDetection,Y=M.find(s=>s.target===i.id),h=Y?.data?.branchOrder!==void 0&&Y?.data?.branchOrder!==null?Y.data.branchOrder:u+1,D={sourceGroupId:null,name:i.data.label||"数据源",sort:h,synEnabled:z};if(z&&(D.windowSeconds=i.data.arguments?.windowSeconds||5),P===de.SMALL_MODEL){const s=S(T,P,i,F,$);return s&&(D.streamConfig=s),D.logic="and",D.children=[],D}if(P===de.SMALL_MODEL_BRANCH){const s=S(T,P,i,F,$);s&&(D.streamConfig=s)}D.logic=g(i);const q=d(T,P,i,F,$,M),W=N.length;return D.children=q.map((s,p)=>({name:s.branchName,branchRefs:[W+p]})),N.push(...q),D},w=(i,r)=>{const u={groupLogic:i?.data?.enableBranch&&i.data.branchLogic||"and",sourceGroups:r};return r.length>=2&&(u.groupWindowSeconds=i.data.groupWindowSeconds),u},A=()=>{if(!c())return null;try{const i=n(),r=b(i.startNode),N=j(i.orderedNodes,i.allNodes),u=[],T=N.map((F,$)=>G(F,i,u,$));return r.ruleSchema=w(i.startNode,T),u.length>0&&(r.branches=u),r}catch(i){return Z.ElMessage.error(i.message||"导出失败"),null}};return{validation:y,exportToJSON:A,copyToClipboard:()=>{try{const i=A();if(!i)return;const r=JSON.stringify(i,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(r).then(()=>{Z.ElMessage.success("已复制到剪贴板")}).catch(()=>{Z.ElMessage.error("复制失败")});else{const N=document.createElement("textarea");N.value=r,N.style.position="fixed",N.style.opacity="0",document.body.appendChild(N),N.select(),document.execCommand("copy"),document.body.removeChild(N),Z.ElMessage.success("已复制到剪贴板")}}catch(i){console.error("复制JSON失败:",i),Z.ElMessage.error(`复制失败: ${i.message}`)}},downloadJSON:()=>{const i=A();if(!i)return;const r=JSON.stringify(i,null,2),N=new Blob([r],{type:"application/json"}),u=URL.createObjectURL(N),T=document.createElement("a");T.href=u,T.download=`workflow_${Date.now()}.json`,T.click(),URL.revokeObjectURL(u),Z.ElMessage.success("导出成功")}}},yt=(a=null)=>{const o=a??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",ye.CREATE);const t=e.inject("editorConfig",null),m=e.inject("taskModeConfig",null),y=e.inject("echoTaskData",null),l=e.computed(()=>({errors:[],warnings:[]})),x=(c,n)=>{const b={},j=n?.data?.arguments??{};j.reportFrequency==="interval"&&j.reportInterval&&(b.interval={value:j.reportInterval}),j.enableDeduplication&&j.similarityThreshold!==void 0&&(b.dedup={value:j.similarityThreshold}),o.nodes.filter(w=>w.type===k.DATA_SOURCE).length>=2&&c?.data?.groupWindowSeconds!==void 0&&(b.groupWindowSeconds=c.data.groupWindowSeconds),b.enableVideo=!!c?.data?.enableAlertVideo;const G=c?.data?.schedule;return Array.isArray(G)&&G.length>0?b.schedule=G:b.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],b},S=(c,n,b,j,g="image")=>{const G=pe(n,c.id,b).find(w=>w.type===k.SMALL_MODEL);if(G){const w=c.data?.arguments??{};return{toolTitle:G.data.title||G.data.modelName||"",toolType:"small",arguments:_e(G.data.arguments,k.SMALL_MODEL),decoder:L(w,!0)}}if(g==="stream"){const w=j.find(_=>_.type===k.DETECTION_TARGET);if(!w)return null;const A=c.data?.arguments??{};return{toolTitle:w.data.targetId||"",toolType:"stream",arguments:_e(w.data.arguments,k.DETECTION_TARGET),decoder:L(A,!1)}}return null},L=(c,n)=>{const b=c.mode??(n?3:0),j=c.interval??0,g=c.sw_decoding??(n?"CPU":"GPU");let G=0,w=0;return n?b===3?(G=0,w=0):b===2?(G=1,w=0):b===1&&(G=0,w=j):b===0?(G=0,w=j*25):b===1?(G=0,w=j):b===2&&(G=1,w=0),{sw_decoding:g==="CPU",mode:G,interval:w}},H=(c,n,b,j,g=null)=>{let G=c.id,w=pe(n,c.id,b).filter(V=>V.type!==k.END&&V.type!==k.START);w.length===1&&w[0].type===k.SMALL_MODEL&&(G=w[0].id,w=pe(n,G,b).filter(V=>V.type!==k.END&&V.type!==k.START));const A=w;if(A.length===0)return[];const _=g?V=>o.getTaskSourceArguments(c.id,g,V):null;return A.map((V,i)=>{const r=Pe([V.id],G,n,b,j,_,[k.SMALL_MODEL]),N=j.find(M=>M.source===G&&M.target===V.id),u=N?.data??{},T=u.branchOrder??i+1,F=u.branchId??null,$={branchId:F,id:F,branchName:u.branchName||V.data?.label||`分支${i+1}`,sortOrder:T,nodes:r};return N?.sourceHandle&&($.sourceHandle=N.sourceHandle),u.timeWindowSeconds!==void 0&&u.timeWindowSeconds!==null&&($.timeWindowSeconds=u.timeWindowSeconds),u.branchDescription&&($.description=u.branchDescription),Ce($,"target_count","targetCount","targetCount"),Ce($,"timer_target","duration","duration"),$})},R=(c,n,b,j,g=null,G=null,w=null,A=1,_=!1,V=!1)=>{const i=g??c.deviceType??"",r=i==="1400"||i==="2",N=r?"1400":"camera",u=n==="stream"?2:1,T=r&&G!==null?G==="device"?1:2:c.detectionType??2,$=(y?.value??y)?.graph?.sources??[],M=String(c.sourceId??c.id??""),z=$.find(h=>String(h.sourceId)===M)?.attach??{},Y={deviceType:N,detectionType:T,dataSourceType:u,sourceOrder:b,timeTemplateId:z.timeTemplateId??"",timeTemplateName:z.timeTemplateName??"",platform:j?.platform??"TAI"};if(!r){const h=w?.mode??0;h===3?(Y.frameExtractionType=0,Y.frameInterval=0):h===2?(Y.frameExtractionType=V?1:3,Y.frameInterval=0):(Y.frameExtractionType=h+1,Y.frameInterval=w?.interval??30);const D=w?.sw_decoding??"CPU";Y.frameExtractionSourceType=D==="GPU"?2:1,A===1&&n==="image"&&!_&&!!w?.enablePatrol?Y.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,w?.patrolGroupSize??1)),pollingInterval:"0"}:Y.pollingConfig={enablePolling:0},Y.thirdId=c.thirdId??""}return Y},f=(c,n,b,j,g,G,w)=>{const A=m?.value??m,_=A?.datasource?.getDevices?.(c.id)??[],V=c.data?.sourceGroupId??null,i=!!c.data?.arguments?.needCooperativeDetection,r=i?c.data?.arguments?.windowSeconds??5:void 0,N=n?.data?.streamType??"image",u=pe(b,c.id,j).some(D=>D.type===k.SMALL_MODEL),T=u?"small":N,F=S(c,b,j,w,N),$=c.data?.arguments?.deviceType??null,M=c.data?.arguments?.detectionMode??null,P=c.data?.arguments??null,z=o.getDataSourceCount();if(_.length>0)return _.map((D,q)=>{const W=String(D.sourceId??D.id??""),s=H(c,b,j,g,W),p={sourceId:D.sourceId??D.id??"",sourceName:D.sourceName??D.name??"",sourceType:T,sourceGroupId:V,areas:D.area??D.areas??[],branches:s,attach:R(D,N,q,A,$,M,P,z,i,u),synEnabled:i,...r!==void 0&&{windowSeconds:r}};return F&&(p.streamConfig=F,p.streamUrl="rtsp"),p});const Y=H(c,b,j,g),h={sourceId:"",sourceName:c.data?.label??"数据源",sourceType:T,sourceGroupId:V,areas:[],branches:Y,attach:R({},N,0,A,$,M,P,z,i,u),synEnabled:i};return F&&(h.streamConfig=F,h.streamUrl="rtsp"),[h]},E=()=>{try{const c=o.nodes,n=o.edges,b=qe(c),j=Ge(c,n),g=[...b.values()].find(r=>r.type===k.START),G=[...b.values()].find(r=>r.type===k.END),w=t?.value??t,A=He(j,b);let _=A.filter(r=>r.type===k.DATA_SOURCE);_.length===0&&(_=c.filter(r=>r.type===k.DATA_SOURCE));const V=_.flatMap((r,N)=>f(r,g,j,b,n,N,A)),i={workflowName:g?.data?.taskName??"",ruleId:w?.ruleId??"",sources:V,extraConfig:x(g,G),description:""};if((w?.platform??"TAI")==="THIRD"){const N=_[0]?.data?.arguments??{},u=N.mode??0,T=N.interval??0;let F,$,M;return u===0?(F="time",$=T,M=0):(F="frame",$=0,u===3?M=0:u===2?M=-1:M=T),{name:i.workflowName,type:"simple",plan:i.extraConfig.schedule??[],inferStrategy:F,timeInterval:$,frameInterval:M,mps:i.extraConfig.enableVideo??!1,graph:i}}return i}catch(c){return Z.ElMessage.error(c.message||"导出失败"),null}};return{validation:l,exportToJSON:E,copyToClipboard:()=>{const c=E();if(!c)return;const n=JSON.stringify(c,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(n).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const b=document.createElement("textarea");b.value=n,b.style.position="fixed",b.style.opacity="0",document.body.appendChild(b),b.select(),document.execCommand("copy"),document.body.removeChild(b),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const c=E();if(!c)return;const n=JSON.stringify(c,null,2),b=new Blob([n],{type:"application/json"}),j=URL.createObjectURL(b),g=document.createElement("a");g.href=j,g.download=`task_workflow_${Date.now()}.json`,g.click(),URL.revokeObjectURL(j),Z.ElMessage.success("导出成功")}}},_t=(a=null,o=null)=>{const t=e.inject("editorMode",ee.ALGORITHM);return(a??t)===ee.TASK?yt(o):ht(o)},Nt=a=>{if(!a)return null;const o=a.indexOf("{");if(o===-1)return null;try{return JSON.parse(a.slice(o))}catch{return null}};function Ct(a=null,o=null,t=null){const m=o??ae(),y=e.inject("editorMode",ee.ALGORITHM),l=a??y,x=e.inject("taskModeConfig",null),S=t??x,L=f=>{const{type:E,data:C}=f,d=C.arguments||{},c=[];switch(E){case k.START:if(l===ee.TASK)if(C.taskName?.trim()||c.push("任务名称"),!C.executionTime?.trim())c.push("任务执行时间");else{const n=Nt(C.executionTime);(!n||!Array.isArray(n.plan)||n.plan.length===0)&&c.push("任务执行时间(计划为空)")}else C.algorithmName?.trim()||c.push("算法名称");break;case k.SMALL_MODEL:C.modelId||c.push("模型选择");break;case k.DETECTION_TARGET:C.targetId||c.push("检测目标选择");break;case k.CLASSIFICATION_MODEL:d.modelId||c.push("分类模型选择");break;case k.DATA_SOURCE:l===ee.TASK&&((S?.value??S)?.datasource?.getDevices?.(f.id)??[]).length===0&&c.push("设备选择");break;case k.TARGET_COUNT:break;case k.TIMER_TARGET:(!d.duration||d.duration<1)&&c.push("持续时间");break}return c},H=f=>{const E=m.nodes.find(d=>d.id===f.source);if(!E)return[];const C=[];return E.type===k.DATA_SOURCE&&E.data?.enableImageSequence===!0&&f.sourceHandle!=="first-frame"&&(!f.data?.timeWindowSeconds||f.data.timeWindowSeconds<1)&&C.push("后续检测帧的持续时间"),C};return{runValidation:()=>{const{nodes:f,edges:E}=m;m.clearInvalidIds();const C=Fe(f,E,l),d=C.errors,c=[],n=[],b=[];f.filter(_=>_.type!=="group").forEach(_=>{const V=L(_);V.length>0&&(c.push(_.id),b.push(`节点"${_.data.label}"缺少必填参数:${V.join("、")}`))}),E.forEach(_=>{const V=H(_);V.length>0&&(n.push(_.id),b.push(`分支"${_.data?.branchName||"未命名"}"缺少:${V.join("、")}`))}),d.forEach(_=>{typeof _=="object"&&(_.nodeId&&c.push(_.nodeId),_.edgeId&&n.push(_.edgeId))}),(c.length>0||n.length>0)&&(m.setInvalidIds(c,n),setTimeout(()=>{m.clearInvalidIds()},5e3));const g=d.map(_=>typeof _=="object"?_.message:_),G=C.warnings.map(_=>typeof _=="object"?_.message:_),w=[...g.map(_=>({msg:_,type:"error"})),...b.map(_=>({msg:_,type:"warning"})),...G.map(_=>({msg:_,type:"warning"}))],A=g.length===0&&b.length===0;if(A&&G.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(w.length>0){const _=w[0];Z.ElMessage[_.type](_.msg)}return A}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[m,y]of o)t[m]=y;return t},kt={key:0},bt={class:"node-list"},xt={class:"node-list"},Et={class:"node-list"},wt={class:"node-list"},Tt=oe({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),m=(y,l)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",l),y.dataTransfer.effectAllowed="move")};return(y,l)=>{const x=e.resolveComponent("el-icon"),S=e.resolveComponent("VideoPlay"),L=e.resolveComponent("CircleClose"),H=e.resolveComponent("el-collapse-item"),R=e.resolveComponent("FolderOpened"),f=e.resolveComponent("Cpu"),E=e.resolveComponent("View"),C=e.resolveComponent("el-collapse");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["node-toolbox",{collapsed:!o.value}])},[e.createElementVNode("div",{class:"toolbox-header",onClick:l[1]||(l[1]=d=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",kt,"节点工具箱")):(e.openBlock(),e.createBlock(x,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(x,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(d=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(C,{key:0,modelValue:t.value,"onUpdate:modelValue":l[13]||(l[13]=d=>t.value=d),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(H,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=d=>m(d,"start"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(S)]),_:1}),l[14]||(l[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[3]||(l[3]=d=>m(d,"end"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(L)]),_:1}),l[15]||(l[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(H,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",xt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=d=>m(d,"dataSource"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(R)]),_:1}),l[16]||(l[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[5]||(l[5]=d=>m(d,"smallModel"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),l[17]||(l[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[6]||(l[6]=d=>m(d,"detectionTarget"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),l[18]||(l[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[7]||(l[7]=d=>m(d,"classificationModel"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(H,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=d=>m(d,"targetCount"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),l[20]||(l[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[9]||(l[9]=d=>m(d,"timerTarget"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(H,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=d=>m(d,"ocr"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),l[22]||(l[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[11]||(l[11]=d=>m(d,"licensePlate"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),l[23]||(l[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[12]||(l[12]=d=>m(d,"faceRecognition"))},[e.createVNode(x,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),l[24]||(l[24]=e.createElementVNode("span",null,"人脸识别",-1))],32)])]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-fac9714d"]]);class Ee{static backendToFrontend(o){const{id:t,title:m,name:y,inputSchema:l,extraConfig:x}=o,S={id:t,title:m,label:y,type:"DETECTION_TARGET",inputSchema:l,extraConfig:x,data:{targetId:m,targetName:y,description:y,areas:l?.properties?.areas?.default||[],threshold:l?.properties?.threshold?.default||.5,targetWidth:l?.properties?.targetWidth?.default||20,targetHeight:l?.properties?.targetHeight?.default||20,postmodel:l?.properties?.postmodel?.default||"ClipVit",expandRect:l?.properties?.expandRect?.default!==void 0?l.properties.expandRect.default:!1,topScale:l?.properties?.topScale?.default||1.6,bottomScale:l?.properties?.bottomScale?.default||1.6,leftScale:l?.properties?.leftScale?.default||1.6,rightScale:l?.properties?.rightScale?.default||1.6,enableStructure:x?.showStruct!==void 0?!1:void 0}};return Object.keys(S.data).forEach(L=>{S.data[L]===void 0&&delete S.data[L]}),S}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},je=a=>et[a]||a,fe=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||je(a),...t}}),Ne=(a,o,t={})=>{const{sourceHandle:m,...y}=t,l={id:`e_${a}_${o}`,source:a,target:o};return m&&(l.sourceHandle=m),Object.keys(y).length>0&&(l.data=y),l},St=a=>{if(!a)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=a.rules||[],t=a.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(m=>({operator:m.op,value:m.value}))}},Vt=a=>{if(!a)return{duration:30,condition_type:"similarity",similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gt",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1};const o={">":"gt",">=":"gte","=":"eq","<=":"lte","<":"lt"};return{duration:a.value??30,condition_type:a.similarity?"similarity":"hit_rate",similarity_enabled:!!a.similarity,similarity_threshold:a.similarity?.value??90,hit_rate_enabled:!!a.hitCount,hit_rate_operator:o[a.hitCount?.op]||"gt",hit_rate_threshold:a.hitCount?.value??2,overlap_detection:a.overlap?{enabled:!0,operator:o[a.overlap.op]||"gt",threshold:a.overlap.value}:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1}},Bt=a=>{if(!a)return{};const o={};return a.interval&&(o.reportFrequency="interval",o.reportInterval=a.interval.value),a.dedup&&(o.enableDeduplication=!0,o.similarityThreshold=a.dedup.value),o},At=()=>({properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]}),Dt=()=>({properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",default:!1}},required:[]}),Lt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),ze=()=>{const a=ae(),o=e.inject("editorConfig",null),t=g=>tt[g]||k.DETECTION_TARGET,m=(g,G)=>g?.find(w=>w.id===String(G))??g?.[G],y=(g,G)=>g.streamConfig?(g.children||[]).some(_=>(_.branchRefs||[]).some(V=>m(G.branches,V)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=g=>!g||typeof g!="object"?"无效的JSON格式":!g.ruleName&&g.ruleName!==""?"缺少 ruleName 字段":g.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",x=g=>{const G=o?.value??o;return g==="small"?G?.smallModels||[]:g==="detection"?G?.detection||[]:g==="classification"?G?.classification?.models||[]:[]},S=()=>{},L=(g,G)=>{g.modelName=G||"",g.title=G||"",g.modelId=G||null;const A=x("small").find(_=>_.title===G);A&&(g.input_schema=A.inputSchema||A.input_schema||{},g.modelId=A.id||A.title,g.modelName=A.name||G,g.modelType=A.type,g.supportDirectAlert=A.supportDirectAlert||!1,g.extraConfig=A.extraConfig)},H=async(g,G)=>{const w=t(g.toolTitle),A={label:g.nodeName||je(w),arguments:g.arguments||{},input_schema:{}};switch(w){case k.DETECTION_TARGET:A.targetId=g.toolTitle,A.targetName=g.nodeName||"检测目标";{const V=x("detection").find(i=>i.title===g.toolTitle);if(V){let r=Ee.backendToFrontend(V).inputSchema||{};if(g.toolTitle==="other"){const N={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};r={...r,properties:{...r.properties,...N.properties}}}A.input_schema=r}}break;case k.CLASSIFICATION_MODEL:A.modelName=g.nodeName||"分类模型";break;case k.SMALL_MODEL:L(A,g.toolTitle);break}return g.branchLogic&&(A.enableBranch=!0,A.branchLogic=g.branchLogic),fe(w,G,A)},R=(g,G,w,A)=>{const _={label:"小模型",input_schema:{},arguments:g.arguments||{}};return L(_,g.toolTitle),G===de.SMALL_MODEL_BRANCH&&(_.enableBranch=!0,_.branchLogic=w.logic||"and"),fe("smallModel",A,_)},f=async(g,G,w,A,_,V)=>{let i=G,r=A;const N={branchOrder:g.sortOrder??1,branchName:g.branchName||"",branchId:g.id??null};g.sourceHandle&&(N.sourceHandle=g.sourceHandle);const u=g.timeWindowSeconds??g.extraConfig?.timeWindowSeconds;u!==void 0&&(N.timeWindowSeconds=u),g.description&&(N.branchDescription=g.description);const T=[...g.nodes||[]].sort((h,D)=>(h.sortOrder??0)-(D.sortOrder??0)),F=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]);let $=-1;T.forEach((h,D)=>{F.has(t(h.toolTitle))&&($=D)});const M=T.map(h=>({kind:"regular",data:h})),P=g.targetCount??g.extraConfig?.targetCount,z=g.duration??g.extraConfig?.duration,Y=[];P&&Y.push({kind:"targetCount",data:P}),z&&Y.push({kind:"timerTarget",data:z}),Y.length>0&&M.splice($+1,0,...Y);for(let h=0;h<M.length;h++){const D=M[h];let q;if(D.kind==="regular")q=await H(D.data,{x:r,y:w});else if(D.kind==="targetCount"){const W=St(D.data);q=fe("targetCount",{x:r,y:w},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=Vt(D.data);q=fe("timerTarget",{x:r,y:w},{label:"目标计时",arguments:W,input_schema:{duration:{required:!0,type:"integer",min:1,max:3600},condition_type:{required:!0,type:"string",enum:["similarity","hit_rate"]},similarity_threshold:{required:!1,type:"integer",min:0,max:100},hit_rate_threshold:{required:!1,type:"integer",min:0,max:100},reset_timer:{required:!0,type:"boolean"}}})}_.push(q),V.push(Ne(i,q.id,h===0?N:void 0)),i=q.id,r+=ie.H_GAP}return{lastNodeId:i,endX:r}},E=g=>{const G=g.ruleSchema.sourceGroups||[],w=g.ruleSchema.groupLogic||"and",A=G.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:g.ruleName||"",enableBranch:A?!0:w!=="and",branchLogic:w,groupWindowSeconds:g.ruleSchema.groupWindowSeconds??null})},C=g=>{const G=Bt(g.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:At(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...G}})},d=(g,G)=>[...g||[]].sort((w,A)=>(w.sort??0)-(A.sort??0)).map(w=>{const A=y(w,G),_=[];return(w.children||[]).forEach(V=>{(V.branchRefs||[]).forEach(i=>{const r=m(G.branches,i);r&&_.push(r)})}),_.sort((V,i)=>(V.sortOrder??0)-(i.sortOrder??0)),{sg:w,mode:A,refBranches:_}}),c=g=>{const w=(g.reduce((A,_)=>A+Math.max(_.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-w/2},n=async(g,G,w,A,_,V)=>{const{sg:i,mode:r,refBranches:N}=g,u=Math.max(N.length,1),T=w+(u-1)*ie.V_GAP/2;let F=ie.START_X+ie.H_GAP,$=ie.START_X;const M=i.logic==="order",P=fe("dataSource",{x:F,y:T},{label:i.name||"数据源",sourceGroupId:i.sourceGroupId??null,enableImageSequence:M,input_schema:Dt(),arguments:{needCooperativeDetection:!!i.synEnabled,windowSeconds:i.windowSeconds||5,enableImageSequence:M},enableBranch:!0,branchLogic:M?"order":i.logic||"and"});A.push(P),_.push(Ne(G.id,P.id,{branchOrder:i.sort??null,branchName:i.name||""})),M&&N.forEach((h,D)=>{h.sourceHandle||(h.sourceHandle=D===0?"first-frame":Lt())});const z=M?{dataSourceNode:P,refBranches:N}:null;let Y=P.id;if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){F+=ie.H_GAP;const h=R(i.streamConfig,r,i,{x:F,y:T});A.push(h),_.push(Ne(P.id,h.id)),Y=h.id}if(N.length>0)for(let h=0;h<N.length;h++){const D=w+h*ie.V_GAP,{lastNodeId:q,endX:W}=await f(N[h],Y,D,F+ie.H_GAP,A,_);_.push(Ne(q,V.id)),W>$&&($=W)}else{_.push(Ne(Y,V.id));const h=F+ie.H_GAP;h>$&&($=h)}return{branchY:w+u*ie.V_GAP,maxX:$,imageSequenceInfo:z}},b=g=>{for(const{dataSourceNode:G,refBranches:w}of g){const A=w.filter(_=>_.sourceHandle&&_.sourceHandle!=="first-frame");A.length>0&&(G.data.subsequentFrames=A.map((_,V)=>({id:V===0?"default-subsequent":`subsequent-${Date.now()}-${V}`,label:V===0?"后续帧检测":`后续帧检测${V+1}`,handleId:_.sourceHandle})))}};return{importFromJSON:async g=>{const G=l(g);if(G)return Z.ElMessage.error(G),!1;try{S();const w=[],A=[],_=E(g),V=C(g);w.push(_);const i=d(g.ruleSchema.sourceGroups,g);let r=c(i),N=ie.START_X;const u=[];for(const T of i){const F=await n(T,_,r,w,A,V);r=F.branchY,F.maxX>N&&(N=F.maxX),F.imageSequenceInfo&&u.push(F.imageSequenceInfo)}return V.position.x=N+ie.H_GAP,w.push(V),b(u),a.loadWorkflow(w,A),Z.ElMessage.success("导入成功"),!0}catch(w){return Z.ElMessage.error("导入失败: "+(w.message||"未知错误")),!1}},validateImportJSON:l}},Ot=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:m,validateImportJSON:y}=ze(),l=(C,d)=>{const c=C.mode??0,n=C.interval??0,b=C.sw_decoding===!1?"GPU":"CPU";let j,g;return d?c===1?(j=2,g=0):c===0&&n===0?(j=3,g=0):(j=1,g=n):c===1?(j=2,g=0):n===0?(j=0,g=30):(j=0,g=n),{mode:j,interval:g,sw_decoding:b}},x=(C,d)=>{const c=C.frameExtractionType??1,n=C.frameInterval??0,j=(C.frameExtractionSourceType??1)===2?"GPU":"CPU";let g,G;return c===0?(g=3,G=0):c===1&&n===0?(g=d?2:0,G=30):c===1?(g=0,G=n):c===2?(g=1,G=n):c===3?(g=2,G=0):(g=d?3:0,G=30),{mode:g,interval:G,sw_decoding:j}},S=C=>C===1?"device":"platform",L=C=>!C||C.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(C.pollingAmount??1)},H=(C,d,c)=>{if(d){const n=C.find(b=>b.sourceGroupId===d);if(n)return n}return C[c]??null},R=(C,d)=>{if(!C?.branches)return null;for(const c of C.branches){const n=c.nodes?.find(b=>b.toolTitle===d);if(n?.arguments)return{...n.arguments}}return null},f=C=>{if(!Array.isArray(C)||C.length===0)return{timeZone:"",planType:0};const d=C.map(n=>({dayType:Number(n.dayType??0),timePeriod:(n.timePeriod??[]).map(b=>({startTime:b.startTime,endTime:b.endTime}))})),c=d.some(n=>n.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:d}),planType:c}};return{importFromJSON:async C=>{const d=y(C);if(d)return Z.ElMessage.error(d),!1;if(!await m(C))return!1;const n=a?.value??a;if(!n||typeof n!="object"||Object.keys(n).length===0)return!0;const b=n.graph??{},j=b.sources??[],g=b.extraConfig??{},G=t.nodes.find(i=>i.type===k.START);if(G){const i=n.name??b.workflowName??"",r=!!g.enableVideo,N=g.schedule??[],{timeZone:u,planType:T}=f(N);t.updateNodeData(G.id,{taskName:i,enableAlertVideo:r,schedule:N,timeZone:u,planType:T,...u?{executionTime:u}:{}})}const w=t.nodes.filter(i=>i.type===k.DATA_SOURCE),A=t.nodes.some(i=>i.type===k.SMALL_MODEL);return w.forEach((i,r)=>{const N=i.data?.sourceGroupId??null,u=H(j,N,r);if(!u)return;const T=u.attach??{},F=u.streamConfig?.decoder??null,$=T.deviceType==="1400"?"1400":"camera",M=$==="camera"?F?l(F,A):x(T,A):{},P=$==="camera"?L(T.pollingConfig):{},z=$==="1400"?{detectionMode:S(T.detectionType)}:{},Y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...Y,deviceType:$,...M,...P,...z}});const h=o?.value??o;if(h?.datasource?.setDevices){const q=(N?j.filter(W=>W.sourceGroupId===N):[u]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));h.datasource.setDevices(i.id,q)}}),t.nodes.filter(i=>i.type===k.DETECTION_TARGET).forEach(i=>{const r=new Set,N=[i.id];let u=null;for(;N.length&&!u;){const h=N.shift();if(r.has(h))continue;r.add(h);const D=t.edges.filter(q=>q.target===h);for(const q of D){const W=t.nodes.find(s=>s.id===q.source);if(W){if(W.type===k.DATA_SOURCE){u=W.id;break}N.push(W.id)}}}if(!u)return;const F=(o?.value??o)?.datasource?.getDevices?.(u)??[];if(F.length<=1)return;const $=i.data?.targetId;if(!$)return;const M=F.map(h=>{const D=String(h.sourceId??h.id??""),q=j.find(W=>String(W.sourceId)===D);if(!q?.branches)return{deviceId:D,args:null};for(const W of q.branches){const s=W.nodes?.find(p=>p.toolTitle===$);if(s?.arguments)return{deviceId:D,args:{...s.arguments}}}return{deviceId:D,args:null}}),P=M.filter(h=>h.args!==null);if(P.length===0)return;const z=JSON.stringify(P[0].args);if(P.some(h=>JSON.stringify(h.args)!==z)){const h=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...h,configMode:"perDevice"}}),M.forEach(({deviceId:D,args:q})=>{q&&t.setTaskSourceArguments(u,D,i.id,q)})}}),t.nodes.filter(i=>i.type===k.FACE_RECOGNITION).forEach(i=>{const r=new Set,N=[i.id];let u=null;for(;N.length&&!u;){const Y=N.shift();if(r.has(Y))continue;r.add(Y);const h=t.edges.filter(D=>D.target===Y);for(const D of h){const q=t.nodes.find(W=>W.id===D.source);if(q){if(q.type===k.DATA_SOURCE){u=q.id;break}N.push(q.id)}}}const F=(u?t.nodes.find(Y=>Y.id===u):null)?.data?.sourceGroupId??null,$=w.findIndex(Y=>Y.id===u),M=H(j,F,$>=0?$:0);if(!M)return;const P=R(M,"face");if(!P?.repositoryId)return;const z=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...z,repositoryId:Array.isArray(P.repositoryId)?P.repositoryId:[P.repositoryId]}})}),!0},validateImportJSON:y}},Mt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Ot():ze(),It={class:"node-content"},Rt={class:"node-label"},$t=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("VideoPlay"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",It,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("span",Rt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Ft={class:"node-content"},qt={class:"node-label"},Gt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("CircleClose"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ft,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("span",qt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Ht={class:"node-content"},Pt={class:"node-info"},jt={class:"node-label"},zt={key:1,class:"sequence-handles"},Ut={class:"handle-item"},Wt={class:"handle-label"},Jt={key:0,class:"handle-item add-button-item"},Yt=oe({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,R=>{const f=Math.random()*16|0;return(R==="x"?f:f&3|8).toString(16)}),x=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let S=!1;const L=()=>{if(S)return;S=!0;const R=o.data.subsequentFrames||[],f={id:l(),label:`后续帧检测${R.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,f),setTimeout(()=>{S=!1},300)},H=async R=>{const f=o.data.subsequentFrames.find(C=>C.id===R);if(t.edges.some(C=>C.source===o.id&&C.sourceHandle===f.handleId))try{await Z.ElMessageBox.confirm(`删除"${f.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,R)};return(R,f)=>{const E=e.resolveComponent("FolderOpened"),C=e.resolveComponent("el-icon"),d=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["data-source-node",{"sequence-mode":a.data.enableImageSequence,selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ht,[e.createVNode(C,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",Pt,[e.createElementVNode("div",jt,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(v.Handle),{key:0,type:"source",position:e.unref(v.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",zt,[e.createElementVNode("div",Ut,[f[0]||(f[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,c=>(e.openBlock(),e.createElementBlock("div",{key:c.id,class:"handle-item"},[e.createElementVNode("span",Wt,e.toDisplayString(c.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:c.handleId,class:"handle-right"},null,8,["position","id"]),c.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(C,{key:0,class:"delete-icon",onClick:e.withModifiers(n=>H(c.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Jt,[e.createVNode(d,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(L,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Xt={class:"node-content"},Qt={class:"node-info"},Kt={class:"node-label"},Zt={key:0,class:"node-model"},vt={key:1,class:"node-placeholder"},eo={key:0,class:"direct-alert-badge"},to=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("Cpu"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Xt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("div",Qt,[e.createElementVNode("div",Kt,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",Zt,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",vt,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",eo,[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),oo={class:"node-content"},no={class:"node-info"},ao={class:"node-target"},lo={class:"node-params"},ro=oe({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=()=>o.data.targetName||o.data.label||"检测目标",m=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),y=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const l=o.data.arguments.object;if(Array.isArray(l))return l.filter(S=>S&&S.trim()!=="").length}return null});return(l,x)=>{const S=e.resolveComponent("View"),L=e.resolveComponent("el-icon"),H=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",oo,[e.createVNode(L,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(S)]),_:1}),e.createElementVNode("div",no,[x[1]||(x[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",ao,e.toDisplayString(t()),1),e.createElementVNode("div",lo,[y.value?(e.openBlock(),e.createBlock(H,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),m.value?(e.openBlock(),e.createBlock(H,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.targetHeight&&a.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(H,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(a.data.arguments.targetWidth)+"x"+e.toDisplayString(a.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(H,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...x[0]||(x[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),so={class:"node-content"},io={class:"node-info"},co={class:"node-label"},mo={key:0,class:"node-model"},po={key:1,class:"node-placeholder"},uo={key:2,class:"node-stats"},fo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("Grid"),y=e.resolveComponent("el-icon"),l=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["classification-model-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",so,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("div",io,[e.createElementVNode("div",co,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",mo,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",po,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",uo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(l,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.categories?.length>0?(e.openBlock(),e.createBlock(l,{key:1,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.data.arguments.categories.length)+" 类 ",1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.topK?(e.openBlock(),e.createBlock(l,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" Top-"+e.toDisplayString(a.data.arguments.topK),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),go={class:"node-content"},ho={class:"node-info"},yo={class:"node-label"},_o={class:"node-params"},No=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return ae(),(o,t)=>{const m=e.resolveComponent("el-icon"),y=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",go,[e.createVNode(m,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",ho,[e.createElementVNode("div",yo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",_o,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(y,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),Co={class:"node-content"},ko={class:"node-info"},bo={class:"node-label"},xo={class:"node-scope"},Eo={class:"node-params"},wo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(x=>x.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const x=e.resolveComponent("Document"),S=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Co,[e.createVNode(S,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",xo,e.toDisplayString(m()),1),e.createElementVNode("div",Eo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(L,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minPlateWidth!==void 0&&a.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(L,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minPlateWidth)+"×"+e.toDisplayString(a.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),To={class:"node-content"},So={class:"node-info"},Vo={class:"node-params"},Bo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},m=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const x=y[0];return`数量 ${t[x.operator]||x.operator} ${x.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${l})`});return(y,l)=>{const x=e.resolveComponent("el-icon"),S=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",To,[e.createVNode(x,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",So,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Vo,[m.value?(e.openBlock(),e.createBlock(S,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Ao={class:"node-content"},Do={class:"node-info"},Lo={class:"node-label"},Oo={class:"node-params"},Mo=oe({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=e.computed(()=>o.data.description||"目标计时"),m=e.computed(()=>`${o.data.arguments?.duration||30}秒`),y=e.computed(()=>{const l=o.data.arguments?.condition_type;return l==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:l==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(l,x)=>{const S=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ao,[e.createVNode(S,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Do,[e.createElementVNode("div",Lo,e.toDisplayString(t.value),1),e.createElementVNode("div",Oo,[e.createVNode(L,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1}),y.value?(e.openBlock(),e.createBlock(L,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Io={class:"group-label"},Ro=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},m=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),l={width:"8px",height:"8px",borderRadius:"2px"},x={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(S,L)=>{const H=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",Io,[e.createVNode(H,{type:y.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1},8,["type"]),L[0]||(L[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(ve.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":x})],2)}}},[["__scopeId","data-v-adf6607d"]]),$o={class:"node-content"},Fo={class:"node-info"},qo={class:"node-label"},Go={class:"node-scope"},Ho={class:"node-params"},Po=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(x=>x.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const x=e.resolveComponent("el-icon"),S=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",$o,[e.createVNode(x,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",Fo,[e.createElementVNode("div",qo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",Go,e.toDisplayString(m()),1),e.createElementVNode("div",Ho,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(S,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minFaceWidth!==void 0&&a.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(S,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minFaceWidth)+"×"+e.toDisplayString(a.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),jo={class:"quick-add-menu__list"},zo=["onClick"],Uo={class:"quick-add-menu__icon"},Wo={class:"quick-add-menu__label"},Jo={key:0,class:"quick-add-menu__empty"},ue=8,Yo=oe({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(a){const o=a,t=e.ref(null),m=e.ref({x:0,y:0});e.watch(()=>o.visible,async S=>{if(!S||(m.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const L=t.value.getBoundingClientRect(),H=window.innerWidth,R=window.innerHeight;let{x:f,y:E}=o.position;f+L.width>H-ue&&(f=H-L.width-ue),E+L.height>R-ue&&(E=R-L.height-ue),f<ue&&(f=ue),E<ue&&(E=ue),m.value={x:f,y:E}});const y=e.computed(()=>({left:m.value.x+"px",top:m.value.y+"px"})),l=[{type:"dataSource",label:"数据源",icon:"📦"},{type:"smallModel",label:"小模型",icon:"🤖"},{type:"detectionTarget",label:"检测目标",icon:"🎯"},{type:"classificationModel",label:"分类模型",icon:"🏷️"},{type:"ocr",label:"OCR识别",icon:"📝"},{type:"licensePlate",label:"车牌识别",icon:"🚗"},{type:"faceRecognition",label:"人脸识别",icon:"👤"},{type:"targetCount",label:"目标计数",icon:"📊"},{type:"timerTarget",label:"目标计时",icon:"⏱️"},{type:"end",label:"结束节点",icon:"🏁"}],x=e.computed(()=>{switch(o.sourceNodeType){case"start":return l.filter(S=>S.type==="dataSource");case"dataSource":return l.filter(S=>S.type==="smallModel"||S.type==="detectionTarget"||S.type==="classificationModel");case"smallModel":return l.filter(S=>S.type!=="dataSource"&&S.type!=="smallModel"&&S.type!=="targetCount"&&S.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(S=>S.type!=="dataSource"&&S.type!=="smallModel");case"timerTarget":return l.filter(S=>["ocr","faceRecognition","licensePlate","end"].includes(S.type));case"targetCount":return l.filter(S=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(S.type));case"ocr":return l.filter(S=>["licensePlate","faceRecognition","end"].includes(S.type));case"licensePlate":return l.filter(S=>["ocr","faceRecognition","end"].includes(S.type));case"faceRecognition":return l.filter(S=>["ocr","licensePlate","end"].includes(S.type));default:return[]}});return(S,L)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[a.visible?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRef",ref:t,class:"quick-add-menu",style:e.normalizeStyle(y.value)},[L[1]||(L[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",jo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,H=>(e.openBlock(),e.createElementBlock("li",{key:H.type,class:"quick-add-menu__item",onClick:R=>S.$emit("select",H.type)},[e.createElementVNode("span",Uo,e.toDisplayString(H.icon),1),e.createElementVNode("span",Wo,e.toDisplayString(H.label),1)],8,zo))),128)),x.value.length===0?(e.openBlock(),e.createElementBlock("li",Jo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),a.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:L[0]||(L[0]=H=>S.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Xo={class:"workflow-canvas"},Ue=5,Qo=oe({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:m,onConnectStart:y,onConnectEnd:l}=v.useVueFlow(),x=e.inject("editorConfig",null),S=e.inject("editorMode",ee.ALGORITHM),L=e.computed(()=>S===ee.TASK),H=e.inject("echoAlgodata",null),{importFromJSON:R}=Mt();e.watch(H,async s=>{if(s&&Object.keys(s).length>0&&(await e.nextTick(),await R(s),L.value)){const p=s?.ruleSchema?.sourceGroups??[];let B=null;if(p.some(I=>I.streamConfig)?B="stream":(p.length>1||p.some(I=>(I.children??[]).length>1))&&(B="image"),B){const I=o.nodes.find(U=>U.type===k.START);I&&o.updateNodeData(I.id,{streamType:B})}}},{immediate:!0});const f=(s,p)=>{if(!p?.properties)return s;const B={};return Object.entries(p.properties).forEach(([I,U])=>{U.default!==void 0&&(B[I]=U.default)}),s.data.arguments={...B,...s.data.arguments},s},E=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),C=()=>{E.visible=!1,E.sourceNodeId=null,E.sourceNodeType=null,E.sourceHandleId=null,j=!1};let d=null,c=!1,n=null,b=null,j=!1;const g=()=>{n&&(document.removeEventListener("mousemove",n),n=null),b&&(document.removeEventListener("mouseup",b),b=null)};e.onUnmounted(()=>{g()}),y(({nodeId:s,handleId:p,handleType:B,event:I})=>{if(B!=="source")return;if(L.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const U=o.nodes.find(ne=>ne.id===s);if(!U||U.type==="end")return;if(U.type===k.DATA_SOURCE&&U.data?.enableImageSequence){if(p&&o.edges.filter(O=>O.source===s&&O.sourceHandle===p).length>=1)return}else if(U.type!==k.START&&U.type!==k.DATA_SOURCE&&o.edges.filter(O=>O.source===s).length>=1)return;const J=I?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}d={nodeId:s,sourceNodeType:U.type,handleId:p,menuX:Q,menuY:te,flowPos:{...U.position}},c=!1;const se=I?.clientX??0,ce=I?.clientY??0;g(),n=ne=>{(Math.abs(ne.clientX-se)>Ue||Math.abs(ne.clientY-ce)>Ue)&&(c=!0,g())},b=()=>{if(g(),!c&&d){j=!0;const ne=d;E.visible=!0,E.screenPos={x:ne.menuX,y:ne.menuY},E.sourceNodeId=ne.nodeId,E.sourceNodeType=ne.sourceNodeType,E.sourceHandleId=ne.handleId,E.flowPos=ne.flowPos}d=null},document.addEventListener("mousemove",n),document.addEventListener("mouseup",b)});const G=s=>{const p=E.sourceNodeId,B=o.nodes.find(K=>K.id===p);if(!B){C();return}if(L.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),C();return}const I=B.position.x+250,U=B.position.y;let J={x:I,y:U};const Q=60,te=80;let se=0,ce=!0;for(;ce;){ce=!1;const K=U+se;for(const le of o.nodes)if(Math.abs(le.position.x-I)<100&&Math.abs(le.position.y-K)<Q+20){ce=!0,se+=te;break}}if(J.y=U+se,s==="end"){const K=o.nodes.find(le=>le.type==="end");if(K){if(o.edges.some(ke=>ke.source===p&&ke.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),C();return}const he=A(B,K);if(!he.valid){Z.ElMessage.warning(he.message),C();return}o.addConnection({source:p,target:K.id,sourceHandle:E.sourceHandleId||null,targetHandle:null}),$(),C(),Z.ElMessage.success("已连接到结束节点");return}}let ne;switch(s){case"end":ne=be(J);break;case"dataSource":ne=xe(J);break;case"smallModel":ne=Be(J);break;case"detectionTarget":ne=Ae(J);break;case"classificationModel":ne=De(J);break;case"ocr":{const K=x?.value??x;ne=f(Le(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=x?.value??x;ne=f(Oe(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=x?.value??x;ne=f(Re(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Me(J);break;case"timerTarget":ne=Ie(J);break;default:C();return}const O=A(B,ne);if(!O.valid){Z.ElMessage.warning(O.message),C();return}o.addNode(ne),o.addConnection({source:p,target:ne.id,sourceHandle:E.sourceHandleId||null,targetHandle:null}),$(),C(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},w=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],A=(s,p)=>{if(s?.parentNode&&p?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(p?.parentNode&&s?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(s?.type===k.START){if(p?.type!==k.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(U=>U.source===s.id).some(U=>o.nodes.find(Q=>Q.id===U.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(p?.type===k.SMALL_MODEL){if(s?.type!==k.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(J=>J.source===s.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type!==k.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(s?.type===k.DATA_SOURCE){if(p?.type!==k.SMALL_MODEL&&p?.type!==k.DETECTION_TARGET&&p?.type!==k.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(J=>J.source===s.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type===k.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(s?.type===k.SMALL_MODEL&&(p?.type===k.TARGET_COUNT||p?.type===k.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(s?.type===k.TARGET_COUNT&&![k.TIMER_TARGET,k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(p?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(s?.type===k.TIMER_TARGET&&![k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(p?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const B=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION];return B.includes(s?.type)&&!B.filter(U=>U!==s.type).concat(k.END).includes(p?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:p?.type!==k.END&&o.edges.filter(U=>U.target===p?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},_=e.markRaw({start:$t,end:Gt,dataSource:Yt,smallModel:to,detectionTarget:ro,classificationModel:fo,ocr:No,licensePlate:wo,targetCount:Bo,timerTarget:Mo,group:Ro,faceRecognition:Po}),V=e.computed({get:()=>o.nodes,set:s=>{o.nodes=s}}),i=e.computed({get:()=>o.edges,set:s=>{o.edges=s}}),r=s=>{s.forEach(p=>{if(p.type==="position"&&p.position)o.updateNodePosition(p.id,p.position);else if(p.type==="remove"){if(L.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const B=o.nodes.find(U=>U.id===p.id);if(B&&B.type===k.START){Z.ElMessage.warning("开始节点不可删除");return}if(B&&B.type===k.END){Z.ElMessage.warning("结束节点不可删除");return}if(B&&B.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const I=B?.parentNode;o.removeNode(p.id),I&&o.nodes.filter(J=>J.parentNode===I).length===0&&o.dissolveParallelGroup(I)}})},N=s=>{s.forEach(p=>{if(p.type==="remove"){if(L.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(p.id)}})},u=s=>{if(j)return;if(L.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),C();return}const p=o.nodes.find(U=>U.id===s.source),B=o.nodes.find(U=>U.id===s.target),I=A(p,B);if(!I.valid){Z.ElMessage.warning(I.message),C();return}if(p?.type===k.DATA_SOURCE&&p.data.enableImageSequence&&s.sourceHandle&&o.edges.filter(J=>J.source===s.source&&J.sourceHandle===s.sourceHandle).length>=1){const J=s.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";Z.ElMessage.warning(`${J}连接点只能连接一个节点`);return}if(w.includes(p?.type)&&!p.data.enableBranch&&o.edges.filter(J=>J.source===s.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(s),$(),C()},T=s=>({and:"ALL",or:"SOME"})[s]||"ALL",F=s=>{const p=o.nodes.find(B=>B.id===s.source);if(!p)return"";if(p.type===k.START){const B=p.data.branchLogic||"and",I=T(B),U=s.data?.branchOrder;return U!=null?`${I} - 执行顺序 ${U}`:I}if(p.type===k.DATA_SOURCE){if(p.data?.enableImageSequence){const J=s.sourceHandle==="first-frame"?"首帧":"后续帧",Q=s.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const B=p.data.branchLogic||"and",I=T(B),U=s.data?.branchOrder;return U!=null?`${I} - 执行顺序 ${U}`:I}return""},$=()=>{o.edges.forEach(s=>{const p=F(s);s.label!==p&&(s.label=p,s.labelStyle=p?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,s.labelBgStyle=p?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,s.labelBgPadding=p?[4,6]:void 0)})},M=()=>{o.nodes.forEach(s=>{if(s.type!=="group")return;const p=s.data.sourceNodeId;if(!p)return;const B=o.nodes.find(I=>I.id===p);B?.data?.enableBranch&&B.data.branchLogic!==s.data.branchLogic&&o.updateNodeData(s.id,{branchLogic:B.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(s=>w.includes(s.type)).map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic})),(s,p)=>{p&&s.forEach(B=>{const I=p.find(U=>U.id===B.id);if(I){if(B.enableBranch&&!I.enableBranch){const U=o.nodes.find(J=>J.id===B.id);if(!U)return;o.createEmptyGroup({x:U.position.x+200,y:U.position.y-30},U.data.branchLogic||"and",B.id)}else if(!B.enableBranch&&I.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===B.id);U&&o.dissolveParallelGroup(U.id)}if(B.enableBranch&&I.branchLogic!==B.branchLogic){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===B.id);U&&o.updateNodeData(U.id,{branchLogic:B.branchLogic})}}})}),e.watch(()=>o.nodes.filter(s=>s.type!=="group").map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic,branchOrder:s.data.branchOrder})),()=>{$(),M()},{deep:!0}),e.watch(()=>o.edges.map(s=>({id:s.id,branchOrder:s.data?.branchOrder})),(s,p)=>{$(),p&&s.forEach(B=>{const I=p.find(U=>U.id===B.id);if(I&&I.branchOrder!==B.branchOrder&&B.branchOrder!==void 0){const U=o.edges.find(J=>J.id===B.id);if(U){const J=o.nodes.find(Q=>Q.id===U.source);J&&J.type===k.DATA_SOURCE&&o.updateNodePosition(J.id,{x:J.position.x,y:J.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([s,p])=>{o.nodes.forEach(B=>{s.has(B.id)?B.class="invalid-node":B.class==="invalid-node"&&(B.class="")}),o.edges.forEach(B=>{p.has(B.id)?B.class="invalid-edge":B.class==="invalid-edge"&&(B.class="")})},{deep:!0});const P=s=>{s.event?.target?.closest(".vue-flow__handle")||o.selectNode(s.node.id)},z=s=>{o.selectEdge(s.edge.id)},Y=s=>{if(L.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(s.edge.id)},h=()=>{o.clearSelection()},D=({node:s})=>{if(s.type==="group"||!w.includes(s.type))return;const p=o.nodes.filter(I=>I.type==="group");let B=null;for(const I of p){const U=m(I.id);if(!U)continue;const J=U.dimensions?.width||parseInt(I.style?.width)||300,Q=U.dimensions?.height||parseInt(I.style?.height)||160;let te=s.position.x,se=s.position.y;if(s.parentNode){const he=o.nodes.find(ke=>ke.id===s.parentNode);he&&(te+=he.position.x,se+=he.position.y)}const ce=m(s.id),ne=ce?.dimensions?.width||160,O=ce?.dimensions?.height||60,K=te+ne/2,le=se+O/2;if(K>=I.position.x&&K<=I.position.x+J&&le>=I.position.y&&le<=I.position.y+Q){B=I.id;break}}B?s.parentNode!==B&&o.addNodeToGroup(s.id,B):s.parentNode&&o.removeNodeFromGroup(s.id)},q=s=>{s.preventDefault(),s.dataTransfer&&(s.dataTransfer.dropEffect="move")},W=s=>{s.preventDefault();const p=s.dataTransfer?.getData("application/vueflow");if(!p)return;if(L.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(p===k.START&&o.getNodeCountByType(k.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(p===k.END&&o.getNodeCountByType(k.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const B=160,I=60,U=t({x:s.clientX,y:s.clientY}),J={x:U.x-B/2,y:U.y-I/2};let Q;switch(p){case k.START:Q=Ve(J);break;case k.END:Q=be(J);break;case k.DATA_SOURCE:Q=xe(J);break;case k.SMALL_MODEL:Q=Be(J);break;case k.DETECTION_TARGET:Q=Ae(J);break;case k.CLASSIFICATION_MODEL:Q=De(J);break;case k.OCR:{const te=x?.value??x;Q=f(Le(J),te?.ocr?.[0]?.inputSchema);break}case k.LICENSE_PLATE:{const te=x?.value??x;Q=f(Oe(J),te?.license_plate?.[0]?.inputSchema);break}case k.TARGET_COUNT:Q=Me(J);break;case k.TIMER_TARGET:Q=Ie(J);break;case k.FACE_RECOGNITION:{const te=x?.value??x;Q=f(Re(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(s,p)=>(e.openBlock(),e.createElementBlock("div",Xo,[e.createVNode(e.unref(v.VueFlow),{nodes:V.value,"onUpdate:nodes":p[0]||(p[0]=B=>V.value=B),edges:i.value,"onUpdate:edges":p[1]||(p[1]=B=>i.value=B),"node-types":e.unref(_),onNodesChange:r,onEdgesChange:N,onConnect:u,onNodeClick:P,onEdgeClick:z,onEdgeDoubleClick:Y,onPaneClick:h,onDrop:W,onDragover:q,onNodeDragStop:D,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(Ke.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(Ze.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Yo,{visible:E.visible,position:E.screenPos,"source-node-type":E.sourceNodeType,onSelect:G,onClose:C},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-70847917"]]),Ko={class:"config-header"},Zo={key:0,class:"config-section"},vo={key:1,class:"config-section"},en=oe({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),m=e.computed(()=>t===ee.TASK),y=e.computed(()=>{const R=o.selectedEdge;return R&&o.nodes.find(E=>E.id===R.source)?.data?.enableBranch?R:null}),l=e.computed(()=>y.value&&o.nodes.find(f=>f.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),x=e.computed(()=>{if(!y.value)return!1;const R=o.nodes.find(f=>f.id===y.value.source);return(R?.type==="dataSource"||R?.type==="start")&&R?.data?.enableBranch}),S=e.computed(()=>{if(!y.value)return 1;const R=o.nodes.find(f=>f.id===y.value.source);return R?o.edges.filter(f=>f.source===R.id).length:1}),L=e.computed(()=>{if(!y.value)return!1;const R=o.nodes.find(f=>f.id===y.value.source);return R?R.type==="dataSource"&&R.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),H=R=>{y.value&&o.updateEdgeData(y.value.id,R)};return(R,f)=>{const E=e.resolveComponent("el-divider"),C=e.resolveComponent("el-input-number"),d=e.resolveComponent("el-text"),c=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form"),b=e.resolveComponent("el-option"),j=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ko,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(E),L.value?(e.openBlock(),e.createElementBlock("div",Zo,[f[3]||(f[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(c,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(C,{"model-value":y.value?.data?.timeWindowSeconds??null,onChange:f[0]||(f[0]=g=>H({timeWindowSeconds:g})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(d,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...f[2]||(f[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),x.value?(e.openBlock(),e.createElementBlock("div",vo,[f[5]||(f[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(c,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":y.value?.data?.branchOrder??null,disabled:m.value,onChange:f[1]||(f[1]=g=>H({branchOrder:g})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.value,g=>(e.openBlock(),e.createBlock(b,{key:g,label:`执行顺序 ${g}`,value:g},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(d,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...f[4]||(f[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),tn={class:"config-section"},on=oe({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const m=e.resolveComponent("el-divider"),y=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(m),e.createElementVNode("div",tn,[e.createVNode(y,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),nn={class:"time-init-container"},an={key:0,class:"time-header flex-x-start"},ln={class:"tab-type flex-x"},rn={class:"time-content"},sn={id:"time-content-table-body"},cn=["onClick"],dn=["onClick"],mn=["data-sort","data-value","data-day","data-type","onMousedown"],pn={key:1},un=["data-sort","data-value","data-type","onMousedown"],fn={class:"time-list"},gn={key:0,class:"time-list-title"},hn={key:1,style:{"margin-right":"10px"}},yn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,m=e.ref(0);let y,l,x,S,L;const H=e.ref(new Map),R=e.ref(new Map),f=e.computed(()=>m.value===0?H.value:R.value);e.onMounted(()=>{y=document.querySelector("#time-content-table-body"),l=y.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",n)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",n)});const E=u=>{m.value!==u&&(m.value=u,e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),l.forEach(F=>F.classList.remove("selected")),(u===0?H.value:R.value).forEach((F,$)=>{F.origin.forEach(M=>{Array.from(l).forEach(P=>{Number(P.dataset.sort)==M.sort&&Number(P.dataset.value)==M.value&&Number(P.dataset.day)==$&&P.classList.add("selected")})})})}))},C=e.ref([{name:"每日",value:0},{name:"一",value:1},{name:"二",value:2},{name:"三",value:3},{name:"四",value:4},{name:"五",value:5},{name:"六",value:6},{name:"日",value:7}]),d=(u,T,F)=>{t.operationType!=3&&F.which==1&&(S=u,x=Number(F.target.dataset.value),F.target.classList.contains("selected")?(F.target.classList.remove("selected"),L=""):(L="selected",F.target.classList.add("selected")),c(),w())},c=()=>{l.forEach(u=>{u.addEventListener("mouseover",b,!1,{once:!0})})},n=()=>{l.forEach(u=>{u.removeEventListener("mouseover",b)})},b=u=>{u.target.classList.remove("selected"),L&&u.target.classList.add(L);let T=Number(u.target.dataset.value),F=Number(u.target.dataset.day),$=F>S?F:S,M=F<S?F:S,P=T>x?T:x,z=T<x?T:x;for(let Y=M;Y<=$;Y++)for(let h=z;h<=P;h++){let D=document.querySelector(`td[data-value="${h}"][data-day="${Y}"]`);D.classList.remove("selected"),L&&D.classList.add(L)}w()},j=u=>{if(t.operationType==3)return;let T=[];l.forEach(F=>{Number(F.dataset.day)==u&&T.push(F)}),T.find(F=>!F.classList.contains("selected"))?T.forEach(F=>F.classList.add("selected")):T.forEach(F=>F.classList.remove("selected")),w()},g=u=>{if(t.operationType==3)return;let T=[];l.forEach(F=>{Number(F.dataset.sort)==u&&T.push(F)}),T.find(F=>!F.classList.contains("selected"))?T.forEach(F=>F.classList.add("selected")):T.forEach(F=>F.classList.remove("selected")),w()},G=()=>{l.forEach(T=>{T.classList.remove("selected")}),(m.value===0?H:R).value.clear()},w=()=>{const u=m.value===0?H:R;u.value.clear(),l.forEach(T=>{if(T.classList.contains("selected")){let F=T.dataset.day,$=T.dataset.sort,M=T.dataset.value;u.value.get(F)?u.value.get(F).origin.push({sort:Number($),value:Number(M)}):u.value.set(F,{origin:[{sort:Number($),value:Number(M)}],timeList:[]})}})},A=u=>{let $=f.value.get(u).origin.map(M=>M.value).reduce((M,P,z,Y)=>(z==0?M.push([P]):P==Y[z-1]+1?M[M.length-1].push(P):M.push([P]),M),[]);return $=$.map(M=>{let P=Math.max(...M)+1,z=Math.min(...M)+1,Y=z%2==0?30:0,h=P%2==0?0:30,D=_(Math.ceil(z/2)-1),q=_(Math.ceil(P/2)-(h==0?0:1));return{dayType:u,startTime:D+":"+(Y==0?"00":Y),endTime:q+":"+(h==0?"00":h)}}),f.value.get(u).timeList=$,$.map(M=>M.startTime+"-"+M.endTime).join()};function _(u){return u<10?"0"+u:u}const V=(u,T)=>{H.value.clear(),R.value.clear(),l.forEach(P=>P.classList.remove("selected")),m.value=T;const F=T===0?H:R,$=JSON.parse(u);let M=[];$.plan.forEach(P=>{P.timePeriod.forEach(z=>{M.push({...z,dayType:P.dayType})})}),e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),M.forEach(P=>{F.value.get(P.dayType)?F.value.get(P.dayType).timeList.push(P):F.value.set(P.dayType,{origin:[],timeList:[{...P}]})}),F.value.forEach((P,z)=>{P.timeList.forEach(Y=>{let h=Number(Y.startTime.split(":")[1]),D=Number(Y.endTime.split(":")[1]),q=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if(q==W){P.origin.push({sort:q,value:2*q});return}for(let s=q;s<=W;s++)if(s==q)h==0?(P.origin.push({sort:s,value:2*s}),P.origin.push({sort:s,value:2*s+1})):P.origin.push({sort:s,value:2*s+1});else if(s>q&&s<W)P.origin.push({sort:s,value:2*s}),P.origin.push({sort:s,value:2*s+1});else if(D==0){if(s==W)return;P.origin.push({sort:s,value:2*s}),P.origin.push({sort:s,value:2*s+1})}else P.origin.push({sort:s,value:2*s})}),P.origin.forEach(Y=>{Array.from(l).find(h=>{Number(h.dataset.sort)==Y.sort&&Number(h.dataset.value)==Y.value&&Number(h.dataset.day)==z&&h.classList.add("selected")})})})})},i=(u,T)=>u.map(M=>M.value).sort((M,P)=>M-P).reduce((M,P,z,Y)=>(z==0?M.push([P]):P==Y[z-1]+1?M[M.length-1].push(P):M.push([P]),M),[]).map(M=>{let P=Math.max(...M)+1,z=Math.min(...M)+1,Y=z%2==0?30:0,h=P%2==0?0:30,D=_(Math.ceil(z/2)-1),q=_(Math.ceil(P/2)-(h==0?0:1));return{dayType:T,startTime:D+":"+(Y==0?"00":Y),endTime:q+":"+(h==0?"00":h)}});return o({getTimeData:()=>{(m.value===0?R:H).value.clear();let T=[];f.value.forEach((M,P)=>{const z=i(M.origin,P);T=T.concat(z)});let F={plan:[]},$=T.map(M=>M.dayType).filter((M,P,z)=>z.indexOf(M)===P);return $.length?($.forEach(M=>{F.plan.push({dayType:M,timePeriod:T.filter(P=>P.dayType===M).map(P=>({startTime:P.startTime,endTime:P.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(F),planType:m.value}):{validTime:!1}},revertByTime:V,resetFn:()=>{m.value=0,H.value.clear(),R.value.clear(),e.nextTick(()=>{l.forEach(u=>{u.classList.remove("selected")}),l=y.querySelectorAll("td.sel-able[data-type]")})}}),(u,T)=>{const F=e.resolveComponent("el-icon"),$=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",nn,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",an,[e.createElementVNode("div",ln,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:m.value==0}]),onClick:T[0]||(T[0]=M=>E(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:m.value==1}]),onClick:T[1]||(T[1]=M=>E(1))}," 日计划 ",2)]),e.createVNode($,{class:"rm-icon",link:"",type:"danger",onClick:G},{default:e.withCtx(()=>[e.createVNode(F,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",rn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:T[3]||(T[3]=M=>M.preventDefault())},[T[5]||(T[5]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th"),e.createElementVNode("th",{colspan:"24"},"上午"),e.createElementVNode("th",{colspan:"24"},"下午")])],-1)),e.createElementVNode("tbody",sn,[e.createElementVNode("tr",null,[T[4]||(T[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,M=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:P=>g(M-1)},e.toDisplayString(M-1),9,cn)),64))]),m.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(C.value.filter(M=>M.value!=0),M=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:P=>j(M.value)},e.toDisplayString(M.name),9,dn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,P=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((P-1)/2),"data-value":P-1,"data-day":M.value,"data-type":m.value,onMousedown:z=>d(M.value,P,z)},null,40,mn)),64))]))),256)):e.createCommentVNode("",!0),m.value==1?(e.openBlock(),e.createElementBlock("tr",pn,[e.createElementVNode("th",{onClick:T[2]||(T[2]=M=>j(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,M=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((M-1)/2),"data-value":M-1,"data-day":0,"data-type":m.value,onMousedown:P=>d(0,M,P)},null,40,un)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",fn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value.keys(),M=>(e.openBlock(),e.createElementBlock("div",null,[m.value==0?(e.openBlock(),e.createElementBlock("span",gn,[T[6]||(T[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(C.value.find(P=>P.value==M).name),1)])):(e.openBlock(),e.createElementBlock("span",hn,e.toDisplayString(C.value.find(P=>P.value==M).name),1)),e.createTextVNode(" ("+e.toDisplayString(A(M))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),_n={class:"time-template-dialog"},Nn={class:"time-editor-panel"},Cn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const m=a,y=t,l=e.ref(null),x=e.ref(""),S=e.ref(""),L=e.ref(m.modelValue?.timeTemplateName||""),H=e.ref([]);return e.computed(()=>x.value?H.value.filter(E=>E.name.toLowerCase().includes(x.value.toLowerCase())):H.value),e.watch(L,E=>{y("update:modelValue",{...m.modelValue,timeTemplateName:E})}),o({getFormData:()=>{const E=l.value?.getTimeData();return{timeTemplateId:S.value,timeTemplateName:L.value,...E}},revertByTime:(E,C)=>{l.value?.revertByTime(E,C)}}),(E,C)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",_n,[e.createCommentVNode("",!0),e.createElementVNode("div",Nn,[e.createCommentVNode("",!0),e.createVNode(yn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),kn={class:"config-section"},bn={key:0,class:"config-section"},xn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},En={class:"config-section"},wn=oe({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("echoAlgodata",null),x=e.computed(()=>{const d=(l?.value??l)?.ruleSchema?.sourceGroups??[];if(d.some(b=>b.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const c=d.length>1,n=d.some(b=>(b.children??[]).length>1);return c||n?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(x,C=>{C.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:C.value})},{immediate:!0});const S=e.ref(!1),L=e.ref(null),H=()=>{const C=L.value?.getFormData();if(C?.validTime){const c=(JSON.parse(C.timeZone)?.plan??[]).map(n=>({dayType:String(n.dayType),timePeriod:n.timePeriod.map(b=>({startTime:b.startTime,endTime:b.endTime}))}));o.updateNodeData(t.value.id,{executionTime:C.timeZone,schedule:c,timeZone:C.timeZone,planType:C.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});S.value=!1},R=()=>{const C=t.value?.data;C?.timeZone&&L.value?.revertByTime(C.timeZone,C.planType??0)},f=e.computed(()=>t.value?o.edges.filter(d=>d.source===t.value.id).length>=2:!1),E=C=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:C})};return(C,d)=>{const c=e.resolveComponent("el-divider"),n=e.resolveComponent("el-input"),b=e.resolveComponent("el-form-item"),j=e.resolveComponent("el-form"),g=e.resolveComponent("el-option"),G=e.resolveComponent("el-select"),w=e.resolveComponent("el-switch"),A=e.resolveComponent("el-button"),_=e.resolveComponent("el-dialog"),V=e.resolveComponent("el-icon"),i=e.resolveComponent("el-tooltip"),r=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[d[15]||(d[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(c),e.createElementVNode("div",kn,[d[9]||(d[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(b,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:d[0]||(d[0]=N=>E(N)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",bn,[d[10]||(d[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(b,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.taskName,onInput:d[1]||(d[1]=N=>e.unref(o).updateNodeData(t.value.id,{taskName:N})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(b,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":x.value.locked?x.value.value:t.value?.data.streamType||"image",disabled:x.value.locked,onChange:d[2]||(d[2]=N=>e.unref(o).updateNodeData(t.value.id,{streamType:N})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"图片流",value:"image"}),e.createVNode(g,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),x.value.locked?(e.openBlock(),e.createElementBlock("div",xn,e.toDisplayString(x.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(b,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(w,{"model-value":t.value?.data.enableAlertVideo,onChange:d[3]||(d[3]=N=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:N}))},null,8,["model-value"])]),_:1}),e.createVNode(b,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:d[4]||(d[4]=N=>S.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(_,{modelValue:S.value,"onUpdate:modelValue":d[6]||(d[6]=N=>S.value=N),title:"执行时段",width:"1200px","append-to-body":"",onOpened:R},{footer:e.withCtx(()=>[e.createVNode(A,{onClick:d[5]||(d[5]=N=>S.value=!1)},{default:e.withCtx(()=>[...d[11]||(d[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(A,{type:"primary",onClick:H},{default:e.withCtx(()=>[...d[12]||(d[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(Cn,{ref_key:"timeTemplateRef",ref:L},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",En,[d[14]||(d[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(b,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:d[7]||(d[7]=N=>e.unref(o).updateNodeData(t.value.id,{branchLogic:N})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(g,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),f.value?(e.openBlock(),e.createBlock(b,{key:0},{label:e.withCtx(()=>[d[13]||(d[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(i,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(V,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:d[8]||(d[8]=N=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:N})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),Tn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Sn=["smallModel","detectionTarget"],we=()=>({schemaLoading:e.ref(!1),getToolType:l=>Tn[l]||null,needsToolSelection:l=>Sn.includes(l),fetchToolSchema:async(l,x="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(l,x="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Vn={key:0,class:"config-section"},Bn={key:3,class:"array-input"},An={key:1,class:"config-section"},Dn=oe({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:m,fetchSchemaForNodeType:y}=we(),l=e.computed(()=>{if(!t.value)return[];const f=t.value.data.input_schema||t.value.data.inputSchema;if(!f||!f.properties)return[];const E=f.required||[];return Object.entries(f.properties).map(([C,d])=>({key:C,type:d.type,label:d.title||d.label||d.description||C,description:d.description||"",default:d.default,required:E.includes(C)||d.required||!1,min:d.minimum!==void 0?d.minimum:d.min,max:d.maximum!==void 0?d.maximum:d.max,step:d.step,maxLength:d.maxLength,options:d.enum,optionLabels:d.enumLabels||d.enum,dependsOn:d.dependsOn}))}),x=f=>{if(t.value)return t.value.data.arguments?.[f]},S=(f,E)=>{if(!t.value)return;const d={...t.value.data.arguments||{},[f]:E};o.updateNodeData(t.value.id,{arguments:d})},L=f=>{if(!f.dependsOn||!t.value)return!0;const{field:E,value:C}=f.dependsOn,d=x(E);if(typeof C=="string"&&C.startsWith("!")){const c=C.substring(1);return d!==c}return Array.isArray(C)?C.includes(d):d===C},H=f=>{const E=x(f);return Array.isArray(E)?JSON.stringify(E):""},R=(f,E)=>{try{const C=JSON.parse(E);Array.isArray(C)&&S(f,C)}catch{}};return e.watch(()=>t.value?.id,async f=>{if(!f||!t.value)return;const E=t.value.type,C=t.value.data,d=C.input_schema||C.inputSchema;if(d&&d.properties&&Object.keys(d.properties).length>0)return;const c=await y(E);if(!c)return;const n=t.value?.data;n&&o.updateNodeData(t.value.id,{...n,input_schema:c.inputSchema,extraConfig:c.extraConfig,arguments:{...c.arguments,...n.arguments}})},{immediate:!0}),(f,E)=>{const C=e.resolveComponent("el-divider"),d=e.resolveComponent("el-icon"),c=e.resolveComponent("el-tooltip"),n=e.resolveComponent("el-option"),b=e.resolveComponent("el-select"),j=e.resolveComponent("el-switch"),g=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input"),w=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[E[2]||(E[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(C),l.value.length>0?(e.openBlock(),e.createElementBlock("div",Vn,[E[0]||(E[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,_=>e.withDirectives((e.openBlock(),e.createBlock(w,{key:_.key,required:_.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(_.label),1),_.description?(e.openBlock(),e.createBlock(c,{key:0,content:_.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(d,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[_.options&&_.type==="string"?(e.openBlock(),e.createBlock(b,{key:0,"model-value":x(_.key),onChange:V=>S(_.key,V),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(V,i)=>(e.openBlock(),e.createBlock(n,{key:V,label:_.optionLabels?_.optionLabels[i]:V,value:V},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):_.type==="boolean"?(e.openBlock(),e.createBlock(j,{key:1,"model-value":x(_.key),onChange:V=>S(_.key,V)},null,8,["model-value","onChange"])):_.type==="number"||_.type==="integer"?(e.openBlock(),e.createBlock(g,{key:2,"model-value":x(_.key),onChange:V=>S(_.key,V),min:_.min,max:_.max,step:_.step||(_.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):_.type==="array"&&!_.options?(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(G,{"model-value":H(_.key),onChange:V=>R(_.key,V),type:"textarea",rows:3,placeholder:_.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):_.type==="array"&&_.options?(e.openBlock(),e.createBlock(b,{key:4,"model-value":x(_.key),onChange:V=>S(_.key,V),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(V,i)=>(e.openBlock(),e.createBlock(n,{key:V,label:_.optionLabels?_.optionLabels[i]:V,value:V},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":x(_.key),onInput:V=>S(_.key,V),maxlength:_.maxLength,"show-word-limit":!!_.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!_.dependsOn||L(_)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(m)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",An,[...E[1]||(E[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),Ln={class:"config-header"},On={class:"config-section"},Mn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},In={key:0,class:"config-section"},Rn={key:3,class:"array-input"},$n={key:1,class:"config-section"},Fn={key:2,class:"config-section"},qn=oe({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),x=e.computed(()=>(l?.value??l)?.classification?.models??[]),S=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),L=e.ref([]),H=e.ref(!1),R=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:w=>{t.value&&w&&n("modelId",w)}}),f=()=>{L.value=x.value},E=async w=>{if(!t.value||!w)return;const A=L.value.find(r=>r.id===w);if(!A)return;const _=t.value?.data;if(!_)return;const V=A.inputSchema||A.input_schema||S.value?.inputSchema||{},i={};V.properties&&Object.entries(V.properties).forEach(([r,N])=>{N.default!==void 0&&(i[r]=N.default)}),o.updateNodeData(t.value.id,{..._,input_schema:V,extraConfig:A.extraConfig||null,arguments:{...i,modelId:A.id,modelName:A.name}})},C=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},d=e.computed(()=>{if(!t.value)return[];const w=t.value.data.input_schema||t.value.data.inputSchema;if(!w||!w.properties)return[];const A=w.required||[];return Object.entries(w.properties).map(([_,V])=>({key:_,type:V.type,label:V.title||V.label||V.description||_,description:V.description||"",default:V.default,required:A.includes(_)||V.required||!1,min:V.minimum!==void 0?V.minimum:V.min,max:V.maximum!==void 0?V.maximum:V.max,step:V.step,maxLength:V.maxLength,options:V.enum,optionLabels:V.enumLabels||V.enum,dependsOn:V.dependsOn,sort:V.sort,hidden:V["x-hidden"]||!1})).filter(_=>!_.hidden).sort((_,V)=>(_.sort??1/0)-(V.sort??1/0))}),c=w=>{if(t.value)return t.value.data.arguments?.[w]},n=(w,A)=>{if(!t.value)return;const V={...t.value.data.arguments||{},[w]:A};o.updateNodeData(t.value.id,{arguments:V})},b=w=>{if(!w.dependsOn||!t.value)return!0;const{field:A,value:_}=w.dependsOn,V=c(A);if(typeof _=="string"&&_.startsWith("!")){const i=_.substring(1);return V!==i}return Array.isArray(_)?_.includes(V):V===_},j=w=>{const A=c(w);return Array.isArray(A)?JSON.stringify(A):""},g=(w,A)=>{try{const _=JSON.parse(A);Array.isArray(_)&&n(w,_)}catch{}},G=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async w=>{if(!w||!t.value)return;L.value.length===0&&f();const A=t.value.data,_=A.input_schema||A.inputSchema,V=A.arguments?.modelId;if(V&&_&&_.properties&&Object.keys(_.properties).length>0||!V)return;const i=L.value.find(T=>T.id===V);if(!i)return;const r=i.inputSchema||i.input_schema||S.value?.inputSchema||{},N={};r.properties&&Object.entries(r.properties).forEach(([T,F])=>{F.default!==void 0&&(N[T]=F.default)});const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:r,extraConfig:i.extraConfig||null,arguments:{...N,...u.arguments}})},{immediate:!0}),(w,A)=>{const _=e.resolveComponent("el-button"),V=e.resolveComponent("el-divider"),i=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),N=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form"),T=e.resolveComponent("el-icon"),F=e.resolveComponent("el-tooltip"),$=e.resolveComponent("el-switch"),M=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ln,[A[1]||(A[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(_,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:G},null,8,["icon"]))]),e.createVNode(V),e.createElementVNode("div",On,[A[2]||(A[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(r,{modelValue:R.value,"onUpdate:modelValue":A[0]||(A[0]=z=>R.value=z),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:H.value,disabled:y.value,onChange:E,onClear:C},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(L.value,z=>(e.openBlock(),e.createBlock(i,{key:z.id,label:z.name,value:z.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),L.value.length===0&&!H.value?(e.openBlock(),e.createElementBlock("div",Mn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),R.value&&d.value.length>0?(e.openBlock(),e.createElementBlock("div",In,[A[3]||(A[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,z=>e.withDirectives((e.openBlock(),e.createBlock(N,{key:z.key,required:z.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(z.label),1),z.description?(e.openBlock(),e.createBlock(F,{key:0,content:z.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[z.options&&z.type==="string"?(e.openBlock(),e.createBlock(r,{key:0,"model-value":c(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z.options,(Y,h)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):z.type==="boolean"?(e.openBlock(),e.createBlock($,{key:1,"model-value":c(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y)},null,8,["model-value","disabled","onChange"])):z.type==="number"||z.type==="integer"?(e.openBlock(),e.createBlock(M,{key:2,"model-value":c(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),min:z.min,max:z.max,step:z.step||(z.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):z.type==="array"&&!z.options?(e.openBlock(),e.createElementBlock("div",Rn,[e.createVNode(P,{"model-value":j(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>g(z.key,Y),type:"textarea",rows:3,placeholder:z.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):z.type==="array"&&z.options?(e.openBlock(),e.createBlock(r,{key:4,"model-value":c(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z.options,(Y,h)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(P,{key:5,"model-value":c(z.key),disabled:y.value&&z.key!=="threshold",onInput:Y=>n(z.key,Y),maxlength:z.maxLength,"show-word-limit":!!z.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!z.dependsOn||b(z)]])),128))]),_:1})])):e.createCommentVNode("",!0),R.value&&H.value&&d.value.length===0?(e.openBlock(),e.createElementBlock("div",$n,[...A[4]||(A[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!R.value&&!H.value?(e.openBlock(),e.createElementBlock("div",Fn,[...A[5]||(A[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),Gn={class:"config-header"},Hn={class:"config-section"},Pn=oe({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),x=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),S=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(R,f)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[R]:f}})},H=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,R=>{if(!R||!t.value)return;const f=x.value,E=t.value.data.arguments||{},C={};f?.properties&&Object.entries(f.properties).forEach(([d,c])=>{c.default!==void 0&&(C[d]=c.default)}),o.updateNodeData(t.value.id,{arguments:{...C,...E}})},{immediate:!0}),(R,f)=>{const E=e.resolveComponent("el-button"),C=e.resolveComponent("el-divider"),d=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Gn,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(C),e.createElementVNode("div",Hn,[f[2]||(f[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(c,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(d,{"model-value":S.value,onChange:f[0]||(f[0]=b=>L("threshold",b)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),jn={class:"config-header"},zn={class:"config-section"},Un=oe({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),x=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),S=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(R,f)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[R]:f}})},H=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,R=>{if(!R||!t.value)return;const f=x.value,E=t.value.data.arguments||{},C={};f?.properties&&Object.entries(f.properties).forEach(([d,c])=>{c.default!==void 0&&(C[d]=c.default)}),o.updateNodeData(t.value.id,{arguments:{...C,...E}})},{immediate:!0}),(R,f)=>{const E=e.resolveComponent("el-button"),C=e.resolveComponent("el-divider"),d=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(C),e.createElementVNode("div",zn,[f[2]||(f[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(c,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(d,{"model-value":S.value,onChange:f[0]||(f[0]=b=>L("threshold",b)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Wn={class:"config-header"},Jn={class:"config-section"},Yn={key:0,class:"config-section"},We=oe({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),x=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),S=e.ref(null),L=e.computed(()=>({repositoryId:E.value})),H={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},R=e.computed(()=>t.value?.data.arguments?.threshold??.5),f=c=>t.value?.data.arguments?.[c],E=e.computed(()=>{const c=f("repositoryId");return c?Array.isArray(c)?c:[c]:[]}),C=(c,n)=>{if(!t.value)return;const b=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...b,[c]:n}})},d=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,c=>{if(!c||!t.value)return;const b=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,j=t.value.data.arguments||{},g={};b?.properties&&Object.entries(b.properties).forEach(([G,w])=>{w.default!==void 0&&(g[G]=w.default)}),o.updateNodeData(t.value.id,{arguments:{...g,...j}})},{immediate:!0}),(c,n)=>{const b=e.resolveComponent("el-button"),j=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-form"),A=e.resolveComponent("el-option"),_=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Wn,[n[2]||(n[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(b,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:d},null,8,["icon"]))]),e.createVNode(j),e.createElementVNode("div",Jn,[n[3]||(n[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(w,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":R.value,onChange:n[0]||(n[0]=V=>C("threshold",V)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(m)==="task"?(e.openBlock(),e.createElementBlock("div",Yn,[n[4]||(n[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(w,{model:L.value,rules:H,ref_key:"faceFormRef",ref:S,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(_,{"model-value":E.value,onChange:n[1]||(n[1]=V=>C("repositoryId",V)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,V=>(e.openBlock(),e.createBlock(A,{key:V.id,label:V.name,value:V.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Xn={class:"config-header"},Qn={key:0,class:"config-section"},Kn={key:3,class:"array-input"},Zn={key:1,class:"config-section"},vn=oe({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),{schemaLoading:l,fetchSchemaForNodeType:x}=we(),S=e.computed(()=>{if(!t.value)return[];const d=t.value.data.input_schema||t.value.data.inputSchema;if(!d||!d.properties)return[];const c=d.required||[];return Object.entries(d.properties).map(([n,b])=>({key:n,type:b.type,label:b.title||b.label||b.description||n,description:b.description||"",default:b.default,required:c.includes(n)||b.required||!1,min:b.minimum!==void 0?b.minimum:b.min,max:b.maximum!==void 0?b.maximum:b.max,step:b.step,maxLength:b.maxLength,options:b.enum,optionLabels:b.enumLabels||b.enum,dependsOn:b.dependsOn,sort:b.sort})).sort((n,b)=>(n.sort??1/0)-(b.sort??1/0))}),L=d=>{if(t.value)return t.value.data.arguments?.[d]},H=(d,c)=>{if(!t.value)return;const b={...t.value.data.arguments||{},[d]:c};o.updateNodeData(t.value.id,{arguments:b})},R=d=>{if(!d.dependsOn||!t.value)return!0;const{field:c,value:n}=d.dependsOn,b=L(c);if(typeof n=="string"&&n.startsWith("!")){const j=n.substring(1);return b!==j}return Array.isArray(n)?n.includes(b):b===n},f=d=>{const c=L(d);return Array.isArray(c)?JSON.stringify(c):""},E=(d,c)=>{try{const n=JSON.parse(c);Array.isArray(n)&&H(d,n)}catch{}},C=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async d=>{if(!d||!t.value)return;const c=t.value.type,n=t.value.data,b=n.input_schema||n.inputSchema;if(b&&b.properties&&Object.keys(b.properties).length>0)return;const j=await x(c);if(!j)return;const g=t.value?.data;g&&o.updateNodeData(t.value.id,{...g,input_schema:j.inputSchema,extraConfig:j.extraConfig,arguments:{...j.arguments,...g.arguments}})},{immediate:!0}),(d,c)=>{const n=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),j=e.resolveComponent("el-icon"),g=e.resolveComponent("el-tooltip"),G=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),A=e.resolveComponent("el-switch"),_=e.resolveComponent("el-input-number"),V=e.resolveComponent("el-input"),i=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Xn,[c[0]||(c[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(n,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:C},null,8,["icon"]))]),e.createVNode(b),S.value.length>0?(e.openBlock(),e.createElementBlock("div",Qn,[c[1]||(c[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.value,N=>e.withDirectives((e.openBlock(),e.createBlock(i,{key:N.key,required:N.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(N.label),1),N.description?(e.openBlock(),e.createBlock(g,{key:0,content:N.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(j,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[N.options&&N.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":L(N.key),onChange:u=>H(N.key,u),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(u,T)=>(e.openBlock(),e.createBlock(G,{key:u,label:N.optionLabels?N.optionLabels[T]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):N.type==="boolean"?(e.openBlock(),e.createBlock(A,{key:1,"model-value":L(N.key),onChange:u=>H(N.key,u)},null,8,["model-value","onChange"])):N.type==="number"||N.type==="integer"?(e.openBlock(),e.createBlock(_,{key:2,"model-value":L(N.key),onChange:u=>H(N.key,u),min:N.min,max:N.max,step:N.step||(N.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):N.type==="array"&&!N.options?(e.openBlock(),e.createElementBlock("div",Kn,[e.createVNode(V,{"model-value":f(N.key),onChange:u=>E(N.key,u),type:"textarea",rows:3,placeholder:N.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):N.type==="array"&&N.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":L(N.key),onChange:u=>H(N.key,u),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(u,T)=>(e.openBlock(),e.createBlock(G,{key:u,label:N.optionLabels?N.optionLabels[T]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(V,{key:5,"model-value":L(N.key),onInput:u=>H(N.key,u),maxlength:N.maxLength,"show-word-limit":!!N.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!N.dependsOn||R(N)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&S.value.length===0?(e.openBlock(),e.createElementBlock("div",Zn,[...c[2]||(c[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),ea={class:"config-header"},ta={class:"config-section"},oa={key:0,class:"config-section"},na={key:1,class:"config-section"},aa={key:0,class:"el-form-item__error"},la={key:2,class:"config-section"},ra={key:3,class:"config-section"},sa={key:4,class:"config-section"},ia=oe({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.inject("taskModeConfig",null),l=e.computed(()=>m==="task"),x=e.computed(()=>n("deviceType")??"camera"),S=e.computed(()=>{const i=o.nodes.find(N=>N.type===k.START);return i?.data?.streamType?i.data.streamType:(y?.value??y)?.streamType??"image"}),L=e.computed(()=>{const i=y?.value??y,r=t.value?.id;return i?.datasource?.getDevices?.(r)?.length??0}),H=()=>{const i=y?.value??y,r=t.value?.id,N=t.value?.data?.label??"",u=i?.datasource?.getDevices?.(r)??[],T=o.nodes.filter($=>$.type===k.DATA_SOURCE).findIndex($=>$.id===r),F=t.value?.data?.sourceGroupId??i?.datasource?.getSourceGroupIdByIndex?.(T)??r;i?.datasource?.onDeviceClick?.(r,N,F,u,x.value)},{fetchSchemaForNodeType:R}=we(),f=e.computed(()=>o.nodes.some(i=>i.type===k.SMALL_MODEL)),E=e.computed(()=>o.getDataSourceCount()>=2),C=e.computed(()=>!o.supportPatrol()),d=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),c=e.computed(()=>{if(!t.value)return[];const i=t.value.data.input_schema||t.value.data.inputSchema;if(!i||!i.properties)return[];const r=i.required||[];return Object.entries(i.properties).map(([N,u])=>({key:N,type:u.type,label:u.title||u.label||u.description||N,description:u.description||"",default:u.default,required:r.includes(N)||u.required||!1,min:u.minimum!==void 0?u.minimum:u.min,max:u.maximum!==void 0?u.maximum:u.max,step:u.step,maxLength:u.maxLength,options:u.enum,optionLabels:u.enumLabels||u.enum,dependsOn:u.dependsOn}))}),n=i=>{if(t.value)return t.value.data.arguments?.[i]},b=e.computed(()=>!!n("enableImageSequence")),j=e.computed(()=>!!n("needCooperativeDetection")),g=(i,r)=>{if(!t.value)return;const u={...t.value.data.arguments||{},[i]:r};o.updateNodeData(t.value.id,{arguments:u})},G=async i=>{if(!t.value)return;if(o.edges.some(N=>N.source===t.value.id))try{await Z.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(u=>u.source===t.value.id).forEach(u=>{o.removeEdge(u.id)}),i&&g("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),g("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)}catch{return}else i&&g("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),g("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)},w=i=>{t.value&&(i&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),g("enableImageSequence",!1),g("enablePatrol",!1)),g("needCooperativeDetection",i))};e.watch(S,i=>{i==="stream"&&t.value&&n("deviceType")==="1400"&&g("deviceType","camera")},{immediate:!0});const A=e.computed(()=>l.value&&x.value==="camera"&&S.value!=="stream"&&o.supportPatrol());e.watch(A,i=>{!i&&t.value&&n("enablePatrol")&&g("enablePatrol",!1)}),e.watch(L,i=>{i>0&&n("enablePatrol")&&(n("patrolGroupSize")??1)>i&&g("patrolGroupSize",i)});const _=i=>{if(!i.dependsOn||!t.value)return!0;const{field:r,value:N}=i.dependsOn,u=n(r);if(typeof N=="string"&&N.startsWith("!")){const T=N.substring(1);return u!==T}return Array.isArray(N)?N.includes(u):u===N},V=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async i=>{if(!i||!t.value)return;const r=t.value.type,N=t.value.data;if(r==="dataSource"&&l.value){const $=N.arguments||{},M={},P=o.nodes.some(z=>z.type===k.SMALL_MODEL);$.mode===void 0&&(M.mode=P?3:0),$.interval===void 0&&(M.interval=30),S.value==="stream"&&$.sw_decoding===void 0&&(M.sw_decoding="CPU"),Object.keys(M).length>0&&o.updateNodeData(i,{arguments:{...$,...M}})}const u=N.input_schema||N.inputSchema;if(r==="dataSource"&&u&&u.properties&&!u.properties.windowSeconds){u.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},N.arguments.windowSeconds||o.updateNodeData(t.value.id,{...N,input_schema:u,arguments:{...N.arguments,windowSeconds:5}});return}if(u&&u.properties&&Object.keys(u.properties).length>0)return;const T=await R(r);if(!T)return;const F=t.value?.data;F&&o.updateNodeData(t.value.id,{...F,input_schema:T.inputSchema,extraConfig:T.extraConfig,arguments:{...T.arguments,...F.arguments}})},{immediate:!0}),(i,r)=>{const N=e.resolveComponent("el-button"),u=e.resolveComponent("el-divider"),T=e.resolveComponent("el-icon"),F=e.resolveComponent("el-tooltip"),$=e.resolveComponent("el-option"),M=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),h=e.resolveComponent("el-form-item"),D=e.resolveComponent("el-form"),q=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ea,[r[11]||(r[11]=e.createElementVNode("h3",null,"节点配置",-1)),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(N,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:V},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",ta,[r[12]||(r[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,s=>e.withDirectives((e.openBlock(),e.createBlock(h,{key:s.key,required:s.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(s.label),1),s.description?(e.openBlock(),e.createBlock(F,{key:0,content:s.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[s.options&&s.type==="string"?(e.openBlock(),e.createBlock(M,{key:0,"model-value":n(s.key),onChange:p=>g(s.key,p),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.options,(p,B)=>(e.openBlock(),e.createBlock($,{key:p,label:s.optionLabels?s.optionLabels[B]:p,value:p},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):s.type==="boolean"?(e.openBlock(),e.createBlock(F,{key:1,content:l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":s.key==="needCooperativeDetection"&&b.value?"已开启图片时序,无法同时开启协同检测":s.key==="enableImageSequence"&&j.value?"已开启协同检测,无法同时开启图片时序":s.key==="enableImageSequence"&&E.value?"多数据源场景下不允许开启图片时序":"",disabled:!(l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence"))&&!(s.key==="needCooperativeDetection"&&b.value)&&!(s.key==="enableImageSequence"&&j.value)&&!(s.key==="enableImageSequence"&&E.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":n(s.key),disabled:l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")||s.key==="needCooperativeDetection"&&b.value||s.key==="enableImageSequence"&&j.value||s.key==="enableImageSequence"&&E.value,onChange:p=>s.key==="enableImageSequence"?G(p):s.key==="needCooperativeDetection"?w(p):g(s.key,p)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):s.type==="number"||s.type==="integer"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":n(s.key),onChange:p=>g(s.key,p),min:s.min,max:s.max,step:s.step||(s.type==="integer"?1:.1),precision:s.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(Y,{key:3,"model-value":n(s.key),onInput:p=>g(s.key,p),maxlength:s.maxLength,"show-word-limit":!!s.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!s.dependsOn||_(s)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",oa,[r[13]||(r[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(M,{"model-value":t.value?.data.branchLogic||"and",disabled:l.value,onChange:r[0]||(r[0]=s=>e.unref(o).updateNodeData(t.value.id,{branchLogic:s})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode($,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode($,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),l.value?(e.openBlock(),e.createElementBlock("div",na,[r[16]||(r[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("deviceType")??"camera",onChange:r[1]||(r[1]=s=>g("deviceType",s))},{default:e.withCtx(()=>[e.createVNode(q,{value:"camera"},{default:e.withCtx(()=>[...r[14]||(r[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(q,{value:"1400",disabled:S.value==="stream"},{default:e.withCtx(()=>[...r[15]||(r[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(h,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${L.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":L.value===0}),onClick:H},null,8,["model-value","class"]),L.value===0?(e.openBlock(),e.createElementBlock("div",aa,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&x.value==="1400"?(e.openBlock(),e.createElementBlock("div",la,[r[19]||(r[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("detectionMode")??"platform",onChange:r[2]||(r[2]=s=>g("detectionMode",s))},{default:e.withCtx(()=>[e.createVNode(q,{value:"platform"},{default:e.withCtx(()=>[...r[17]||(r[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(q,{value:"device"},{default:e.withCtx(()=>[...r[18]||(r[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&x.value==="camera"&&S.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ra,[r[21]||(r[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(F,{disabled:!C.value,content:d.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":C.value?!1:n("enablePatrol"),disabled:C.value,onChange:r[3]||(r[3]=s=>g("enablePatrol",s))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),n("enablePatrol")?(e.openBlock(),e.createBlock(h,{key:0},{label:e.withCtx(()=>[r[20]||(r[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(F,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("patrolGroupSize")??1,onChange:r[4]||(r[4]=s=>g("patrolGroupSize",s)),min:1,max:L.value>0?L.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),l.value&&x.value==="camera"?(e.openBlock(),e.createElementBlock("div",sa,[r[22]||(r[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"抽帧策略"},{default:e.withCtx(()=>[S.value==="image"?(e.openBlock(),e.createBlock(M,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:"按时间间隔抽帧",value:0})]),_:1})):f.value?(e.openBlock(),e.createBlock(M,{key:1,"model-value":n("mode")??3,onChange:r[5]||(r[5]=s=>{g("mode",s),s===1&&g("interval",f.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:"每一帧都检测",value:3}),e.createVNode($,{label:"跳帧检测",value:1}),e.createVNode($,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(M,{key:2,"model-value":n("mode")??0,onChange:r[6]||(r[6]=s=>{g("mode",s),s===0&&g("interval",30),s===1&&g("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:"按时间间隔抽帧",value:0}),e.createVNode($,{label:"跳帧检测",value:1}),e.createVNode($,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),S.value==="image"||S.value==="stream"&&(n("mode")??0)===0?(e.openBlock(),e.createBlock(h,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("interval")??30,onChange:r[7]||(r[7]=s=>g("interval",s)),min:1,max:S.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),S.value==="stream"&&(n("mode")??0)===1?(e.openBlock(),e.createBlock(h,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[f.value?(e.openBlock(),e.createBlock(z,{key:0,"model-value":n("interval")??5,onChange:r[8]||(r[8]=s=>g("interval",s)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(M,{key:1,"model-value":n("interval")??25,onChange:r[9]||(r[9]=s=>g("interval",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:25,value:25}),e.createVNode($,{label:50,value:50}),e.createVNode($,{label:75,value:75}),e.createVNode($,{label:125,value:125}),e.createVNode($,{label:250,value:250}),e.createVNode($,{label:375,value:375}),e.createVNode($,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),S.value==="stream"?(e.openBlock(),e.createBlock(h,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(M,{"model-value":n("sw_decoding")??"CPU",onChange:r[10]||(r[10]=s=>g("sw_decoding",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode($,{label:"GPU",value:"GPU"}),e.createVNode($,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),ca={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Je=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),m=e.ref(null),y=e.ref(""),l=async(C=!1)=>{if(a){o.value=a;return}},x=async()=>{o.value=[],await l(!0)},S=C=>o.value.find(d=>d.id===C||d.title===C),L=C=>{const d=S(C);if(!d)return{};const c=d.inputSchema||d.input_schema;if(!c||!c.properties)return{};const n={};return Object.entries(c.properties).forEach(([b,j])=>{j.default!==void 0&&(n[b]=j.default)}),n},H=C=>{const d=S(C);if(!d)return[];const c=d.inputSchema||d.input_schema;if(!c||!c.properties)return[];const n=c.required||[];return Object.entries(c.properties).map(([b,j])=>({key:b,type:j.type,label:j.title||j.description||b,description:j.description||"",default:j.default,required:n.includes(b)||j.required||!1,min:j.minimum,max:j.maximum,step:j.step,options:j.enum,optionLabels:j.enumLabels||j.enum,dependsOn:j.dependsOn}))},R=e.computed(()=>{if(!y.value)return o.value;const C=y.value.toLowerCase();return o.value.filter(d=>d.name?.toLowerCase().includes(C)||d.type?.toLowerCase().includes(C)||d.title?.toLowerCase().includes(C)||d.description&&d.description.toLowerCase().includes(C)||f(d.type).toLowerCase().includes(C))}),f=C=>ca[C]||C;return{models:o,loading:t,error:m,searchKeyword:y,filteredModels:R,loadSmallModels:l,reloadSmallModels:x,getModelConfig:S,getTypeLabel:f,getDefaultArguments:L,getSchemaFields:H,validateArguments:(C,d)=>{const c=S(C);if(!c)return{valid:!1,errors:["模型不存在"]};const n=[],b=c.inputSchema||c.input_schema;return!b||!b.properties?{valid:!0,errors:[]}:(Object.entries(b.properties).forEach(([j,g])=>{const G=d[j];if(g.required&&(G==null||G==="")){n.push(`${g.title||j} 为必填项`);return}if(G!=null&&(g.type==="number"||g.type==="integer")){if(typeof G!="number"){n.push(`${g.title||j} 必须是数字`);return}g.minimum!==void 0&&G<g.minimum&&n.push(`${g.title||j} 不能小于 ${g.minimum}`),g.maximum!==void 0&&G>g.maximum&&n.push(`${g.title||j} 不能大于 ${g.maximum}`)}}),{valid:n.length===0,errors:n})}}},da={class:"small-model-selector"},ma={key:0,class:"loading-state"},pa={key:1,class:"error-state"},ua={key:2,class:"model-list"},fa=["onClick"],ga={class:"model-header"},ha={class:"model-name"},ya={class:"model-description"},_a={class:"model-meta"},Na={key:3,class:"empty-state"},Ca=oe({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(a,{emit:o}){const t=a,m=o,{loading:y,error:l,searchKeyword:x,filteredModels:S,loadSmallModels:L,reloadSmallModels:H,getTypeLabel:R}=Je(t.externalModels),f=d=>{m("update:modelValue",d.id),m("select",d)},E=()=>{H()},C=d=>({safety:"warning",security:"danger",traffic:"info"})[d]||"info";return e.onMounted(()=>{t.externalModels||L()}),(d,c)=>{const n=e.resolveComponent("el-input"),b=e.resolveComponent("el-icon"),j=e.resolveComponent("el-button"),g=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",da,[e.createVNode(n,{modelValue:e.unref(x),"onUpdate:modelValue":c[0]||(c[0]=G=>e.isRef(x)?x.value=G:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(X.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(y)?(e.openBlock(),e.createElementBlock("div",ma,[e.createVNode(b,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),c[2]||(c[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(b,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(l)),1),e.createVNode(j,{type:"primary",onClick:E},{default:e.withCtx(()=>[...c[3]||(c[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(S).length>0?(e.openBlock(),e.createElementBlock("div",ua,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(S),G=>(e.openBlock(),e.createElementBlock("div",{key:G.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===G.id}]),onClick:w=>f(G)},[e.createElementVNode("div",ga,[e.createElementVNode("div",ha,[e.createVNode(b,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(G.name),1)]),e.createVNode(g,{type:C(G.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(R)(G.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ya,e.toDisplayString(G.description),1),e.createElementVNode("div",_a,[G.supportDirectAlert?(e.openBlock(),e.createBlock(g,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...c[4]||(c[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,fa))),128))])):(e.openBlock(),e.createElementBlock("div",Na,[e.createVNode(b,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),c[6]||(c[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(j,{text:"",onClick:c[1]||(c[1]=G=>x.value="")},{default:e.withCtx(()=>[...c[5]||(c[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),ka={class:"position-tooltip"},Te=oe({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",ka,[...t[0]||(t[0]=[e.createStaticVNode('<div class="tooltip-title" data-v-6ac23ee8>提示说明</div><div class="tooltip-desc" data-v-6ac23ee8> 目标点为点位代表目标位置的点,系统默认使用目标框的中心点表示目标的位置。只有当目标的重心点满足检测框完整落在检测区域时,才表示目标进入检测框或者离开检测区域。 </div><div class="tooltip-examples" data-v-6ac23ee8><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例1:以目标框的中心点代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="60" cy="90" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0.5   Y轴: 0.5</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例2:以目标框的最左上角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="5" cy="5" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0   Y轴: 0</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例3:以目标框的最右下角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="115" cy="175" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 1   Y轴: 1</div></div></div>',3)])]))}},[["__scopeId","data-v-6ac23ee8"]]),ba={class:"config-header"},xa={class:"config-section"},Ea={key:0,class:"model-selector-wrapper"},wa={key:1,class:"selected-model-info"},Ta={class:"model-info-header"},Sa={class:"model-info-name"},Va={class:"model-info-description"},Ba={key:0,class:"config-section"},Aa={key:3,class:"array-input"},Da="检测到事件后,连续两次告警上报的时间间隔",La=oe({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),x=e.computed(()=>(l?.value??l)?.smallModels??null),{models:S}=Je(x.value),L=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),H={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},R=e.computed(()=>{if(!t.value)return[];const w=t.value.data.input_schema||t.value.data.inputSchema;if(!w||!w.properties)return[];const A=w.required||[],_=t.value.data.title||"";return Object.entries(w.properties).filter(([V])=>L.has(V)).map(([V,i])=>{const r={key:V,type:i.type,label:i.title||i.label||i.description||V,description:i.description||"",default:i.default,required:A.includes(V)||i.required||!1,min:i.minimum!==void 0?i.minimum:i.min,max:i.maximum!==void 0?i.maximum:i.max,step:i.step,maxLength:i.maxLength,options:i.enum,optionLabels:i.enumLabels||i.enum,dependsOn:i.dependsOn,sort:i.sort};return V==="interval"&&(r.label="告警间隔(秒)",r.description=H[_]||Da,r.isInterval=!0,r.default=r.default!=null?r.default/1e3:10,r.min=r.min!=null?r.min/1e3:1,r.max=r.max!=null?r.max/1e3:void 0,r.step=1,r.precision=0),V==="threshold"&&(r.label="小模型阈值",r.step=.01,r.precision=2),V==="targetWidth"&&(r.label="最小目标宽度",r.default=60,r.min=20,r.max=1920,r.step=1,r.precision=0),V==="targetHeight"&&(r.label="最小目标高度",r.default=60,r.min=20,r.max=1080,r.step=1,r.precision=0),V==="topScale"&&(r.label="调整目标框高度比例 (上)",r.max=10,r.step=.1,r.precision=1),V==="bottomScale"&&(r.label="调整目标框高度比例 (下)",r.max=10,r.step=.1,r.precision=1),V==="leftScale"&&(r.label="调整目标框宽度比例 (左)",r.max=10,r.step=.1,r.precision=1),V==="rightScale"&&(r.label="调整目标框宽度比例 (右)",r.max=10,r.step=.1,r.precision=1),V==="x_ratio"&&(r.label="X轴位置信息",r.step=.01,r.precision=2),V==="y_ratio"&&(r.label="Y轴位置信息",r.step=.01,r.precision=2),V==="targetDuration"&&(r.label="目标持续时间(秒)",r.default=r.default!=null?r.default/1e3:1,r.min=r.min!=null?r.min/1e3:1,r.max=r.max!=null?r.max/1e3:void 0,r.step=.01,r.precision=2),V==="overloadNumber"&&(r.precision=0),V==="targetNumber"&&(r.precision=0),r}).filter(V=>!["areas","darwin","direction","lines"].includes(V.key)).filter(V=>!(V.key==="targetDuration"&&_==="NonMotorCounter")).sort((V,i)=>(V.sort??1/0)-(i.sort??1/0))}),f=["interval","targetDuration"],E=w=>{if(!t.value)return;const A=t.value.data.arguments?.[w];return f.includes(w)&&A!=null?A/1e3:A},C=(w,A)=>{if(!t.value)return;let _=A;f.includes(w)&&A!=null&&(_=A*1e3);const i={...t.value.data.arguments||{},[w]:_};o.updateNodeData(t.value.id,{arguments:i})},d=w=>{if(!w.dependsOn||!t.value)return!0;const{field:A,value:_}=w.dependsOn,V=E(A);if(typeof _=="string"&&_.startsWith("!")){const i=_.substring(1);return V!==i}return Array.isArray(_)?_.includes(V):V===_},c=w=>{const A=E(w);return Array.isArray(A)?JSON.stringify(A):""},n=(w,A)=>{try{const _=JSON.parse(A);Array.isArray(_)&&C(w,_)}catch{}},b=async w=>{if(!t.value)return;const A=w.inputSchema||w.input_schema||{},_={};A.properties&&Object.entries(A.properties).forEach(([V,i])=>{i.default!==void 0&&(_[V]=i.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:w.id||w.title,title:w.title,modelName:w.name,modelType:w.type,input_schema:A,extraConfig:w.extraConfig,supportDirectAlert:w.supportDirectAlert||!1,arguments:_})},j=()=>{t.value&&Z.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},g=()=>t.value?.data.modelId?S.value.find(A=>A.id===t.value.data.modelId)?.description||"暂无描述":"",G=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(w,A)=>{const _=e.resolveComponent("el-button"),V=e.resolveComponent("el-divider"),i=e.resolveComponent("el-icon"),r=e.resolveComponent("el-tag"),N=e.resolveComponent("el-tooltip"),u=e.resolveComponent("el-option"),T=e.resolveComponent("el-select"),F=e.resolveComponent("el-switch"),$=e.resolveComponent("el-input-number"),M=e.resolveComponent("el-input"),P=e.resolveComponent("el-text"),z=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ba,[A[0]||(A[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(_,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:G},null,8,["icon"]))]),e.createVNode(V),e.createElementVNode("div",xa,[A[3]||(A[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!y.value?(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(Ca,{"model-value":t.value?.data.modelId,"external-models":x.value,onSelect:b},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",wa,[e.createElementVNode("div",Ta,[e.createElementVNode("div",Sa,[e.createVNode(i,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(_,{key:0,type:"text",text:"",size:"small",onClick:j},{default:e.withCtx(()=>[...A[1]||(A[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Va,e.toDisplayString(g()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(r,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...A[2]||(A[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ba,[A[4]||(A[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(Y,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(R.value,h=>e.withDirectives((e.openBlock(),e.createBlock(z,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.key==="x_ratio"||h.key==="y_ratio"?(e.openBlock(),e.createBlock(N,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):h.description?(e.openBlock(),e.createBlock(N,{key:1,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(T,{key:0,"model-value":E(h.key),onChange:D=>C(h.key,D),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(D,q)=>(e.openBlock(),e.createBlock(u,{key:D,label:h.optionLabels?h.optionLabels[q]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(F,{key:1,"model-value":E(h.key),onChange:D=>C(h.key,D)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"||h.type==="float"?(e.openBlock(),e.createBlock($,{key:2,"model-value":E(h.key),onChange:D=>C(h.key,D),min:h.min,max:h.max,step:h.step||(h.type==="integer"||h.type==="number"?1:.01),precision:h.precision??(h.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",Aa,[e.createVNode(M,{"model-value":c(h.key),onChange:D=>n(h.key,D),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(P,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(T,{key:4,"model-value":E(h.key),onChange:D=>C(h.key,D),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(D,q)=>(e.openBlock(),e.createBlock(u,{key:D,label:h.optionLabels?h.optionLabels[q]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(M,{key:5,"model-value":E(h.key),onInput:D=>C(h.key,D)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||d(h)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Oa=(a=null)=>{const o=ae(),t=e.ref(a?a.map(f=>Ee.backendToFrontend(f)):[]),m=e.ref(!1),y=e.ref(null),l=async(f=!1)=>{if(a){t.value=a.map(E=>Ee.backendToFrontend(E));return}},x=f=>t.value.find(E=>E.title===f)||null,S=f=>{const E=x(f);return E?{targetId:E.title,targetName:E.label,threshold:E.data.threshold||.5,targetWidth:E.data.targetWidth||20,targetHeight:E.data.targetHeight||20,postmodel:E.data.postmodel||"ClipVit",areas:E.data.areas||[],expandRect:E.data.expandRect!==void 0?E.data.expandRect:!1,topScale:E.data.topScale||1.6,bottomScale:E.data.bottomScale||1.6,leftScale:E.data.leftScale||1.6,rightScale:E.data.rightScale||1.6,enableStructure:E.data.enableStructure}:{}},L=(f=null)=>o.nodes.filter(E=>E.type==="detectionTarget"&&E.id!==f).map(E=>({value:E.id,label:E.data.targetName||E.data.label})),H=(f=null)=>{const E=[{value:"original",label:"原图"}],C=L(f);return[...E,...C]},R=e.computed(()=>t.value.map(f=>({value:f.title,label:f.label,...f})));return{detectionTargets:t,loading:m,error:y,loadDetectionTargets:l,getTargetById:x,getDefaultConfig:S,getDetectionTargetNodes:L,getDetectionScopeOptions:H,getTargetOptions:R}},Ma={class:"paired-array-input"},Se=oe({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(a,{emit:o}){const t=(R,f)=>{let E;return(...C)=>{clearTimeout(E),E=setTimeout(()=>R(...C),f)}},m=a,y=o,l=e.ref([]),x=()=>{const R=m.primaryValue||[],f=m.pairedValue||[],E=Math.max(R.length,f.length,1);l.value=Array.from({length:E},(C,d)=>({primary:R[d]||"",paired:f[d]!==void 0?f[d]:m.pairedField.default?.[0]||.5}))};e.watch(()=>[m.primaryValue,m.pairedValue],()=>{x()},{immediate:!0,deep:!0});const S=t((R,f)=>{y("update",R,f)},300);e.watch(l,R=>{const f=R.map(C=>C.primary),E=R.map(C=>C.paired);S(f,E)},{deep:!0});const L=()=>{l.value.length>=10||l.value.push({primary:"",paired:m.pairedField.default?.[0]||.5})},H=R=>{l.value.length>1&&l.value.splice(R,1)};return(R,f)=>{const E=e.resolveComponent("el-input"),C=e.resolveComponent("el-input-number"),d=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Ma,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(c,n)=>(e.openBlock(),e.createElementBlock("div",{key:n,class:"input-row"},[e.createVNode(E,{modelValue:l.value[n].primary,"onUpdate:modelValue":b=>l.value[n].primary=b,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!l.value[n].primary||l.value[n].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(C,{modelValue:l.value[n].paired,"onUpdate:modelValue":b=>l.value[n].paired=b,min:a.pairedField.min||0,max:a.pairedField.max||1,step:a.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(d,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:b=>H(n)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(d,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:l.value.length>=10,onClick:L},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(a.primaryField.label)+e.toDisplayString(l.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),Ia={class:"config-header"},Ra={class:"config-section"},$a={class:"flex items-center justify-between"},Fa={key:0,class:"config-section"},qa={key:1,class:"config-section"},Ga={key:2,class:"config-section"},Ha={class:"device-list"},Pa=["onClick"],ja={class:"device-name"},za={key:0,class:"device-list-empty"},Ua={key:4,class:"array-input"},Wa={key:4,class:"array-input"},Ja=oe({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m==="task"),l=e.inject("taskModeConfig",null),x=e.inject("echoAlgodata",null),S=e.inject("echoTaskData",null),L=e.computed(()=>{if(!t.value)return null;const h=new Set,D=[t.value.id];for(;D.length;){const q=D.shift();if(h.has(q))continue;h.add(q);const W=o.edges.filter(s=>s.target===q);for(const s of W){const p=o.nodes.find(B=>B.id===s.source);if(p){if(p.type==="dataSource")return p.id;D.push(p.id)}}}return null}),H=e.computed(()=>{const h=L.value;return h?(l?.value??l)?.datasource?.getDevices?.(h)??[]:[]}),R=e.computed(()=>y.value&&H.value.length>0),f=e.ref(""),E=e.ref(""),C=e.computed(()=>{const h=E.value.trim().toLowerCase();return h?H.value.filter(D=>(D.sourceName??D.name??String(D.sourceId??D.id??D)).toLowerCase().includes(h)):H.value}),d=e.computed(()=>{const h={},D=L.value,q=t.value?.id;if(!D||!q)return h;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const s of H.value){const p=String(s.sourceId??s.id??s),B=o.getTaskSourceArguments(D,p,q);if(B===null){h[p]=!1;continue}const I=new Set([...Object.keys(B),...Object.keys(W)]);let U=!1;for(const J of I)if(JSON.stringify(B[J])!==JSON.stringify(W[J])){U=!0;break}h[p]=U}return h});e.watch([H,()=>t.value?.data?.arguments?.configMode],([h])=>{h.length>0?f.value=String(h[0]?.sourceId??h[0]?.id??h[0]):f.value=""},{immediate:!0});const c=(h,D=null)=>{if(D){const p=((S?.value??S)?.graph?.sources??[]).find(B=>String(B.sourceId)===String(D));if(p?.branches)for(const B of p.branches){const I=B.nodes?.find(U=>U.toolTitle===h);if(I?.arguments)return{...I.arguments}}return null}const q=x?.value??x;if(!q?.branches)return null;for(const W of q.branches){const s=W.nodes?.find(p=>p.toolTitle===h);if(s?.arguments)return{...s.arguments}}return null},n=h=>{const D=L.value,q=t.value?.id;if(!D||!q||!h||o.getTaskSourceArguments(D,h,q)!==null)return;const W=t.value?.data?.targetId,s=W?c(W,h):null,p=t.value?.data?.arguments??{},B={...s??p};delete B.configMode,o.setTaskSourceArguments(D,h,q,B)};e.watch(f,h=>{h&&t.value?.data?.arguments?.configMode==="perDevice"&&n(h)}),e.watch(()=>t.value?.data?.arguments?.configMode,h=>{h==="perDevice"&&f.value&&n(f.value)});const b=e.inject("editorConfig",null),j=e.computed(()=>(b?.value??b)?.detection??null),{detectionTargets:g,loading:G}=Oa(j.value),w=e.computed(()=>{if(!t.value)return[];const h=t.value.data.input_schema||t.value.data.inputSchema;if(!h||!h.properties)return[];const D=h.required||[];return Object.entries(h.properties).map(([q,W])=>({key:q,type:W.type,label:W.title||W.label||W.description||q,description:W.description||"",default:W.default,required:D.includes(q)||W.required||!1,min:W.minimum!==void 0?W.minimum:W.min,max:W.maximum!==void 0?W.maximum:W.max,step:W.step,maxLength:W.maxLength,options:W.enum,optionLabels:W.enumLabels||W.enum,dependsOn:W.dependsOn,"x-component":W["x-component"],"x-paired-with":W["x-paired-with"],sort:W.sort})).sort((q,W)=>(q.sort??1/0)-(W.sort??1/0))}),A=h=>h.type==="array"&&h["x-component"]==="paired-array"&&h["x-paired-with"],_=h=>{const D=h["x-paired-with"];return w.value.find(q=>q.key===D)},V={targetWidth:{label:"最小目标宽度",min:20,max:1920,step:1,precision:0,default:60},targetHeight:{label:"最小目标高度",min:20,max:1080,step:1,precision:0,default:60},threshold:{label:"检测阈值",step:.01,precision:2},topScale:{label:"调整目标框高度比例 (上)",description:"按照目标框中心点坐标,向上缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},bottomScale:{label:"调整目标框高度比例 (下)",description:"按照目标框中心点坐标,向下缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},rightScale:{label:"调整目标框宽度比例 (右)",description:"按照目标框中心点坐标,向右缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},leftScale:{label:"调整目标框宽度比例 (左)",description:"按照目标框中心点坐标,向左缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},enableStruct:{label:"属性检测"},x_ratio:{label:"X轴位置信息",step:.01,precision:2},y_ratio:{label:"Y轴位置信息",step:.01,precision:2}},i=new Set(Object.keys(V)),r=e.computed(()=>{const h=t.value?.data.targetId,D=new Set;return w.value.forEach(q=>{q["x-paired-with"]&&D.add(q["x-paired-with"])}),w.value.filter(q=>h==="traffic_accident"?q.key==="threshold":i.has(q.key)&&!D.has(q.key)&&!A(q)).map(q=>{const W=V[q.key]||{};return{...q,label:W.label||q.label,description:W.description||q.description,min:W.min??q.min,max:W.max??q.max,step:W.step??q.step,precision:W.precision,default:W.default??q.default}})}),N=e.computed(()=>w.value.filter(h=>A(h))),u=h=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&f.value){const q=L.value,W=o.getTaskSourceArguments(q,f.value,t.value.id);if(W!==null)return W[h]}return t.value.data.arguments?.[h]},T=(h,D)=>{if(!t.value)return;const q=t.value.data.arguments?.configMode;if(h!=="configMode"&&q==="perDevice"&&f.value){const p=L.value;o.updateTaskSourceArgument(p,f.value,t.value.id,h,D);return}const s={...t.value.data.arguments||{},[h]:D};o.updateNodeData(t.value.id,{arguments:s})},F=h=>{if(!h.dependsOn||!t.value)return!0;const{field:D,value:q}=h.dependsOn,W=u(D);if(typeof q=="string"&&q.startsWith("!")){const s=q.substring(1);return W!==s}return Array.isArray(q)?q.includes(W):W===q},$=h=>{const D=u(h);return Array.isArray(D)?JSON.stringify(D):""},M=(h,D)=>{try{const q=JSON.parse(D);Array.isArray(q)&&T(h,q)}catch{}},P=(h,D,q,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&f.value){const I=L.value;o.updateTaskSourceArgument(I,f.value,t.value.id,h,D),o.updateTaskSourceArgument(I,f.value,t.value.id,q,W);return}const B={...t.value.data.arguments||{},[h]:D,[q]:W};o.updateNodeData(t.value.id,{arguments:B})},z=async h=>{if(!t.value||!h)return;const D=g.value.find(B=>B.title===h);if(!D)return;let q=D.inputSchema||D.input_schema||{};if(h==="other"){const B={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};q={...q,properties:{...q.properties,...B.properties}}}const W={};q.properties&&Object.entries(q.properties).forEach(([B,I])=>{I.default!==void 0&&(W[B]=I.default)});const s=t.value.data,p={...W,target_class:D.title};o.updateNodeData(t.value.id,{...s,targetId:D.title,targetName:D.label,label:D.label,input_schema:q,inputSchema:q,extraConfig:D.extraConfig,arguments:p})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,h=>{if(!h||!t.value)return;const D=g.value.find(s=>s.title===h);if(!D)return;const q=t.value.data;if(q.input_schema&&Object.keys(q.input_schema).length>0)return;const W={...D.defaultArguments,...q.arguments,target_class:D.title};o.updateNodeData(t.value.id,{...q,input_schema:D.inputSchema,arguments:W})}),(h,D)=>{const q=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),s=e.resolveComponent("el-option"),p=e.resolveComponent("el-select"),B=e.resolveComponent("el-form-item"),I=e.resolveComponent("el-form"),U=e.resolveComponent("el-radio"),J=e.resolveComponent("el-radio-group"),Q=e.resolveComponent("el-icon"),te=e.resolveComponent("el-tooltip"),se=e.resolveComponent("el-input"),ce=e.resolveComponent("el-switch"),ne=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ia,[D[2]||(D[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(q,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",Ra,[D[3]||(D[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(B,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:z,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(G),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(g),O=>(e.openBlock(),e.createBlock(s,{key:O.title,label:O.label,value:O.title},{default:e.withCtx(()=>[e.createElementVNode("div",$a,[e.createElementVNode("span",null,e.toDisplayString(O.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),R.value?(e.openBlock(),e.createElementBlock("div",Fa,[D[6]||(D[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(B,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:D[0]||(D[0]=O=>T("configMode",O))},{default:e.withCtx(()=>[e.createVNode(U,{value:"unified"},{default:e.withCtx(()=>[...D[4]||(D[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(U,{value:"perDevice"},{default:e.withCtx(()=>[...D[5]||(D[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),N.value.length>0?(e.openBlock(),e.createElementBlock("div",qa,[D[7]||(D[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,O=>(e.openBlock(),e.createBlock(B,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.description?(e.openBlock(),e.createBlock(te,{key:0,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Se,{"primary-field":O,"paired-field":_(O),"primary-value":u(O.key),"paired-value":u(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",Ga,[D[9]||(D[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&H.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(se,{modelValue:E.value,"onUpdate:modelValue":D[1]||(D[1]=O=>E.value=O),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(Q,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Ha,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.value,O=>(e.openBlock(),e.createElementBlock("div",{key:String(O.sourceId??O.id??O),class:e.normalizeClass(["device-list-item",{"is-active":f.value===String(O.sourceId??O.id??O),"has-custom":d.value[String(O.sourceId??O.id??O)]}]),onClick:K=>f.value=String(O.sourceId??O.id??O)},[e.createElementVNode("span",ja,e.toDisplayString(O.sourceName??O.name??String(O.sourceId??O.id??O)),1),d.value[String(O.sourceId??O.id??O)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...D[8]||(D[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Pa))),128)),C.value.length===0?(e.openBlock(),e.createElementBlock("div",za," 无匹配设备 ")):e.createCommentVNode("",!0)]),f.value?(e.openBlock(),e.createBlock(I,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,O=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(te,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(p,{key:0,"model-value":u(O.key),onChange:K=>T(O.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":u(O.key),onChange:K=>T(O.key,K)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":u(O.key),onChange:K=>T(O.key,K),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):A(O)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":O,"paired-field":_(O),"primary-value":u(O.key),"paired-value":u(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Ua,[e.createVNode(se,{"model-value":$(O.key),onChange:K=>M(O.key,K),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(p,{key:5,"model-value":u(O.key),onChange:K=>T(O.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":u(O.key),onInput:K=>T(O.key,K),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||F(O)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(I,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,O=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(te,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(p,{key:0,"model-value":u(O.key),onChange:K=>T(O.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":u(O.key),onChange:K=>T(O.key,K)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":u(O.key),onChange:K=>T(O.key,K),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):A(O)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":O,"paired-field":_(O),"primary-value":u(O.key),"paired-value":u(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Wa,[e.createVNode(se,{"model-value":$(O.key),onChange:K=>M(O.key,K),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(p,{key:5,"model-value":u(O.key),onChange:K=>T(O.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":u(O.key),onInput:K=>T(O.key,K),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||F(O)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ya={class:"config-header"},Xa={class:"config-section"},Qa={key:0,style:{"margin-bottom":"8px"}},Ka=oe({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=R=>{if(!t.value)return;const f={...t.value.data.arguments,conditionRelation:R};o.updateNodeData(t.value.id,{arguments:f})},x=()=>{if(!t.value)return;const f=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],E={...t.value.data.arguments,alertConditions:f};o.updateNodeData(t.value.id,{arguments:E})},S=(R,f,E)=>{if(!t.value)return;const C=[...t.value.data.arguments?.alertConditions||[]];C[R]={...C[R],[f]:E};const d={...t.value.data.arguments,alertConditions:C};o.updateNodeData(t.value.id,{arguments:d})},L=R=>{if(!t.value)return;const f=[...t.value.data.arguments?.alertConditions||[]];f.splice(R,1);const E={...t.value.data.arguments,alertConditions:f};o.updateNodeData(t.value.id,{arguments:E})},H=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(R,f)=>{const E=e.resolveComponent("el-button"),C=e.resolveComponent("el-divider"),d=e.resolveComponent("el-text"),c=e.resolveComponent("el-option"),n=e.resolveComponent("el-select"),b=e.resolveComponent("el-input-number"),j=e.resolveComponent("el-radio"),g=e.resolveComponent("el-radio-group"),G=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ya,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(C),e.createElementVNode("div",Xa,[f[9]||(f[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(w,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,null,{label:e.withCtx(()=>[f[3]||(f[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(d,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...f[2]||(f[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(d,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...f[4]||(f[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(A,_)=>(e.openBlock(),e.createElementBlock("div",{key:_,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(n,{"model-value":A.operator,onChange:V=>S(_,"operator",V),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(c,{label:"等于 =",value:"="}),e.createVNode(c,{label:"大于 >",value:">"}),e.createVNode(c,{label:"小于 <",value:"<"}),e.createVNode(c,{label:"大于等于 ≥",value:">="}),e.createVNode(c,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(b,{"model-value":A.value,onChange:V=>S(_,"value",V),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(E,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:V=>L(_)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Qa,[e.createVNode(d,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...f[5]||(f[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(g,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:f[0]||(f[0]=A=>l(A))},{default:e.withCtx(()=>[e.createVNode(j,{value:"OR"},{default:e.withCtx(()=>[...f[6]||(f[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(j,{value:"AND"},{default:e.withCtx(()=>[...f[7]||(f[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(E,{type:"text",link:"",icon:e.unref(X.Plus),onClick:x},{default:e.withCtx(()=>[...f[8]||(f[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Za={class:"config-header"},va={class:"config-section"},el={style:{display:"flex","align-items":"center",gap:"8px"}},tl={style:{display:"flex","align-items":"center",gap:"8px"}},ol={style:{display:"flex","align-items":"center",gap:"8px"}},nl=oe({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=c=>{if(!t.value)return;const n={...t.value.data.arguments,duration:c};o.updateNodeData(t.value.id,{arguments:n})},x=c=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_enabled:c};o.updateNodeData(t.value.id,{arguments:n})},S=c=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_threshold:c};o.updateNodeData(t.value.id,{arguments:n})},L=c=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_enabled:c};o.updateNodeData(t.value.id,{arguments:n})},H=c=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_operator:c};o.updateNodeData(t.value.id,{arguments:n})},R=c=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_threshold:c};o.updateNodeData(t.value.id,{arguments:n})},f=c=>{if(!t.value)return;const n=t.value.data.arguments?.overlap_detection||{},b={...t.value.data.arguments,overlap_detection:{operator:n.operator??"gt",threshold:n.threshold??90,...n,enabled:c}};o.updateNodeData(t.value.id,{arguments:b})},E=c=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:c}};o.updateNodeData(t.value.id,{arguments:n})},C=c=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:c}};o.updateNodeData(t.value.id,{arguments:n})},d=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(c,n)=>{const b=e.resolveComponent("el-button"),j=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-text"),w=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-switch"),_=e.resolveComponent("el-icon"),V=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-slider"),r=e.resolveComponent("el-option"),N=e.resolveComponent("el-select"),u=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Za,[n[9]||(n[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(b,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:d},null,8,["icon"]))]),e.createVNode(j),e.createElementVNode("div",va,[n[13]||(n[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.duration??30,onChange:n[0]||(n[0]=T=>l(T)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(G,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...n[10]||(n[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(w,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(A,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:n[1]||(n[1]=T=>x(T))},null,8,["model-value"]),e.createVNode(V,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(_,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(w,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:n[2]||(n[2]=T=>S(T)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(G,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...n[11]||(n[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(w,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(A,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:n[3]||(n[3]=T=>L(T))},null,8,["model-value"]),e.createVNode(V,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(_,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(w,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:n[4]||(n[4]=T=>H(T)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(r,{label:"大于 >",value:"gt"}),e.createVNode(r,{label:"大于等于 >=",value:"gte"}),e.createVNode(r,{label:"等于 =",value:"eq"}),e.createVNode(r,{label:"小于等于 <=",value:"lte"}),e.createVNode(r,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(w,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:n[5]||(n[5]=T=>R(T)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(G,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...n[12]||(n[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(w,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(A,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:n[6]||(n[6]=T=>f(T))},null,8,["model-value"]),e.createVNode(V,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(_,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(w,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:n[7]||(n[7]=T=>E(T)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(r,{label:"大于 >",value:"gt"}),e.createVNode(r,{label:"等于 =",value:"eq"}),e.createVNode(r,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(w,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:n[8]||(n[8]=T=>C(T)),min:0,max:100,precision:2,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-2969d123"]]),al={class:"node-config-panel"},ll={class:"config-content"},rl=oe({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:en,group:on,start:wn,end:Dn,classificationModel:qn,ocr:Pn,licensePlate:Un,face:We,stream:vn,dataSource:ia,smallModel:La,detectionTarget:Ja,targetCount:Ka,timerTarget:nl,faceRecognition:We},m=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(S=>S.id===y.source)?.data?.enableBranch&&t.edge||null;const l=o.selectedNode;return l&&t[l.type]||null});return(y,l)=>(e.openBlock(),e.createElementBlock("div",al,[e.createElementVNode("div",ll,[m.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(m.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),sl={class:"workflow-editor",id:"workflow-editor"},il={class:"editor-content"},cl={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:a=>Object.values(ee).includes(a)},pageMode:{type:String,default:ye.CREATE,validator:a=>Object.values(ye).includes(a)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(a,{expose:o}){const t=a,m=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",m),e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig)),e.provide("editorConfig",e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig)),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const y=ae(m),{copyToClipboard:l,downloadJSON:x,exportToJSON:S}=_t(t.mode,y),{runValidation:L}=Ct(t.mode,y,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{at(m)});const H=e.computed(()=>{if(y.selectedNodeId)return!0;const f=y.selectedEdge;return f?!!y.nodes.find(C=>C.id===f.source)?.data?.enableBranch:!1});return o({reset:()=>{y.resetWorkflow()},runTest:L,copyJSON:l,exportJSON:S}),(f,E)=>(e.openBlock(),e.createElementBlock("div",sl,[e.createElementVNode("div",il,[e.createVNode(Tt),e.createVNode(Qo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[H.value?(e.openBlock(),e.createBlock(rl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ye=oe(cl,[["__scopeId","data-v-98c61777"]]),dl={Box:X.Box,CircleCheck:X.CircleCheck,CircleClose:X.CircleClose,Close:X.Close,CopyDocument:X.CopyDocument,Cpu:X.Cpu,DArrowLeft:X.DArrowLeft,DataAnalysis:X.DataAnalysis,Delete:X.Delete,Document:X.Document,Download:X.Download,FolderOpened:X.FolderOpened,Grid:X.Grid,Loading:X.Loading,Plus:X.Plus,QuestionFilled:X.QuestionFilled,RefreshLeft:X.RefreshLeft,Search:X.Search,Timer:X.Timer,Upload:X.Upload,User:X.User,View:X.View,VideoPlay:X.VideoPlay,Warning:X.Warning},Xe=a=>{Object.entries(dl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Ye)},ml={install:Xe};re.EditorMode=ee,re.NodeType=k,re.PageMode=ye,re.WorkflowEditor=Ye,re.default=ml,re.install=Xe,Object.defineProperties(re,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
1
+ (function(re,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(re=typeof globalThis<"u"?globalThis:re||self,e(re.AIFlowUI={},re.Vue,re.ElementPlusIconsVue,re.ElementPlus,re.Pinia,re.VueFlowCore,re.VueFlowBackground,re.VueFlowControls,re.VueFlowNodeResizer))})(this,(function(re,e,X,Z,Qe,v,Ke,Ze,ve){"use strict";const k={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},et={[k.DETECTION_TARGET]:"检测目标",[k.CLASSIFICATION_MODEL]:"分类模型",[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时",[k.FACE_RECOGNITION]:"人脸识别",[k.SMALL_MODEL]:"小模型"},tt={cls:k.CLASSIFICATION_MODEL,ocr:k.OCR,license_plate:k.LICENSE_PLATE,target_count:k.TARGET_COUNT,timer_target:k.TIMER_TARGET,face:k.FACE_RECOGNITION,face_recognition:k.FACE_RECOGNITION},ee={ALGORITHM:"algorithm",TASK:"task"},ye={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=n=>`${n}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ve=n=>({id:me("start"),type:"start",position:n,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),be=n=>({id:me("end"),type:"end",position:n,data:{label:"结束",input_schema:{properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]},arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80}}}),xe=n=>({id:me("dataSource"),type:"dataSource",position:n,data:{label:"数据源",enableImageSequence:!1,input_schema:{properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",description:"开启协同检测后,该数据源下的多个摄像机画面会按协同条件检测。使用此算法的任务将不支持轮巡",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",description:"开启后将区分首帧检测和后续帧检测",default:!1}},required:[]},arguments:{needCooperativeDetection:!1,windowSeconds:5,enableImageSequence:!1,deviceType:"camera"},enableBranch:!0,branchLogic:"and"}}),Be=(n,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:n,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Ae=(n,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:n,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),De=(n,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:n,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Le=n=>({id:me("ocr"),type:"ocr",position:n,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Oe=n=>({id:me("licensePlate"),type:"licensePlate",position:n,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Me=n=>({id:me("targetCount"),type:"targetCount",position:n,data:{label:"目标计数",description:"",arguments:{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"},input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}}}),Ie=n=>({id:me("timerTarget"),type:"timerTarget",position:n,data:{label:"目标计时",description:"",arguments:{duration:30,similarity_enabled:!1,similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gte",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:90}},input_schema:{}}}),ot=(n,o={width:300,height:160},t="and",d=null)=>({id:me("group"),type:"group",position:n,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:d},selectable:!0,deletable:!1,zIndex:-1}),Re=n=>({id:me("faceRecognition"),type:"faceRecognition",position:n,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ge=new Map,$e=()=>{const n=Ve({x:80,y:300}),o=xe({x:320,y:300}),t=be({x:1e3,y:300}),d={id:`e_${n.id}_${o.id}`,source:n.id,target:o.id,data:{branchOrder:1}};return{nodes:[n,o,t],edges:[d]}},nt=n=>Qe.defineStore(`aiflow-workflow-${n}`,()=>{const o=$e(),t=e.ref(o.nodes),d=e.ref(o.edges),h=e.ref(null),a=e.ref(null),b=e.ref(new Set),T=e.ref(new Set),D=e.ref({}),z=(m,V,I,U)=>{D.value[m]||(D.value[m]={}),D.value[m][V]||(D.value[m][V]={}),D.value[m][V][I]={...U}},q=(m,V,I,U,J)=>{D.value[m]||(D.value[m]={}),D.value[m][V]||(D.value[m][V]={}),D.value[m][V][I]||(D.value[m][V][I]={}),D.value[m][V][I][U]=J},u=(m,V,I)=>D.value[m]?.[V]?.[I]??null,x=()=>{D.value={}},_=e.computed(()=>h.value?t.value.find(m=>m.id===h.value):null),c=e.computed(()=>a.value?d.value.find(m=>m.id===a.value):null),C=m=>t.value.filter(V=>V.type===m).length,l=()=>{const m=t.value.filter(V=>V.type===k.DATA_SOURCE);m.length!==0&&(m.length===1?m[0].data.label="数据源":m.forEach((V,I)=>{V.data.label=`数据源 ${I+1}`}))},L=()=>t.value.filter(m=>m.type===k.DATA_SOURCE).length,$=()=>t.value.filter(V=>V.type===k.DATA_SOURCE).some(V=>V.data.arguments?.needCooperativeDetection===!0),f=()=>{const m=L(),V=$();return!(m>1||V)},M=m=>{t.value.push(m),m.type===k.DATA_SOURCE&&l()},B=m=>{const V=t.value.find(U=>U.id===m),I=V?.type===k.DATA_SOURCE;if(V?.type==="group"){w(m),d.value=d.value.filter(U=>U.source!==m&&U.target!==m),h.value===m&&(h.value=null);return}t.value=t.value.filter(U=>U.id!==m),d.value=d.value.filter(U=>U.source!==m&&U.target!==m),h.value===m&&(h.value=null),I&&l()},S=(m,V)=>{const I=t.value.find(U=>U.id===m);I&&(I.data={...I.data,...V})},g=(m,V)=>{const I=t.value.find(U=>U.id===m);I&&(I.position=V)},E=m=>{const V=t.value.find(I=>I.id===m.source);if(V&&(V.type===k.START||V.type===k.DATA_SOURCE)&&V.data?.enableBranch===!0){const U=d.value.filter(J=>J.source===m.source).length+1;m={...m,data:{...m.data,branchOrder:U}}}d.value=v.addEdge(m,d.value)},i=m=>{const V=d.value.find(I=>I.id===m);if(d.value=d.value.filter(I=>I.id!==m),a.value===m&&(a.value=null),V&&V.data?.branchOrder!==void 0){const I=t.value.find(U=>U.id===V.source);I&&(I.type===k.START||I.type===k.DATA_SOURCE)&&d.value.filter(J=>J.source===V.source).sort((J,Q)=>(J.data?.branchOrder||0)-(Q.data?.branchOrder||0)).forEach((J,Q)=>{J.data?J.data.branchOrder=Q+1:J.data={branchOrder:Q+1}})}},s=(m,V="and",I=null)=>{const U=ot(m,{width:300,height:160},V,I);return t.value.unshift(U),U.id},y=(m,V)=>{const I=t.value.find(Q=>Q.id===m),U=t.value.find(Q=>Q.id===V);if(!I||!U||I.parentNode===V)return;I.parentNode&&p(m);const J=t.value.find(Q=>Q.id===m);J&&(t.value=t.value.map(Q=>Q.id!==m?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:V,extent:"parent"}))},p=m=>{const V=t.value.find(Q=>Q.id===m);if(!V||!V.parentNode)return;const I=t.value.find(Q=>Q.id===V.parentNode),U=I?V.position.x+I.position.x:V.position.x,J=I?V.position.y+I.position.y:V.position.y;t.value=t.value.map(Q=>{if(Q.id!==m)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},w=m=>{const V=t.value.find(I=>I.id===m);V&&(t.value=t.value.filter(I=>I.id!==m).map(I=>{if(I.parentNode!==m)return I;const U={...I,position:{x:I.position.x+V.position.x,y:I.position.y+V.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:d,selectedNodeId:h,selectedEdgeId:a,invalidNodeIds:b,invalidEdgeIds:T,selectedNode:_,selectedEdge:c,getNodeCountByType:C,getDataSourceCount:L,hasCooperativeDetection:$,supportPatrol:f,addNode:M,removeNode:B,updateNodeData:S,updateNodePosition:g,addConnection:E,removeEdge:i,updateEdgeData:(m,V)=>{const I=d.value.find(U=>U.id===m);if(I){if(V.branchOrder!==void 0){const U=t.value.find(J=>J.id===I.source);if(U&&(U.type===k.START||U.type===k.DATA_SOURCE)){const J=I.data?.branchOrder,Q=V.branchOrder;if(J!==Q&&Q!==null){const se=d.value.filter(ce=>ce.source===I.source&&ce.id!==m).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}I.data={...I.data,...V}}},selectNode:m=>{h.value=m,a.value=null},selectEdge:m=>{a.value=m,h.value=null},clearSelection:()=>{h.value=null,a.value=null},resetWorkflow:()=>{const m=$e();t.value=m.nodes,d.value=m.edges,h.value=null,a.value=null,x()},loadWorkflow:(m,V)=>{t.value=m,d.value=V,h.value=null,a.value=null,x()},refreshDataSourceLabels:l,createEmptyGroup:s,addNodeToGroup:y,removeNodeFromGroup:p,dissolveParallelGroup:w,initializeSubsequentFrames:m=>{t.value.find(I=>I.id===m)&&S(m,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(m,V)=>{const I=t.value.find(U=>U.id===m);!I||I.type!=="dataSource"||(I.data.subsequentFrames||(I.data.subsequentFrames=[]),I.data.subsequentFrames.push(V),S(m,{subsequentFrames:[...I.data.subsequentFrames]}))},removeSubsequentFrame:(m,V)=>{const I=t.value.find(Q=>Q.id===m);if(!I||I.type!=="dataSource")return;const U=I.data.subsequentFrames.find(Q=>Q.id===V);U&&d.value.filter(te=>te.source===m&&te.sourceHandle===U.handleId).forEach(te=>i(te.id));const J=I.data.subsequentFrames.filter(Q=>Q.id!==V);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),S(m,{subsequentFrames:J})},setInvalidIds:(m,V)=>{b.value=new Set(m),T.value=new Set(V)},clearInvalidIds:()=>{b.value=new Set,T.value=new Set},taskSources:D,setTaskSourceArguments:z,updateTaskSourceArgument:q,getTaskSourceArguments:u,clearTaskSources:x}}),ae=(n=null)=>{const o=n??e.inject("workflowInstanceId","default");return ge.has(o)||ge.set(o,nt(o)),ge.get(o)()},at=n=>{if(ge.has(n)){try{ge.get(n)().$dispose()}catch{}ge.delete(n)}},Fe=(n,o,t)=>{const d=[],h=[],a=n.filter(l=>l.type!=="group"),b=a.filter(l=>l.type===k.START);b.length===0?d.push("工作流必须包含一个开始节点"):b.length>1&&d.push("工作流只能包含一个开始节点");const T=a.filter(l=>l.type===k.END);T.length===0?d.push("工作流必须包含一个结束节点"):T.length>1&&d.push("工作流只能包含一个结束节点");const D=a.filter(l=>l.type===k.DATA_SOURCE);D.length===0&&d.push("工作流必须至少包含一个数据源节点"),a.filter(l=>l.type===k.DETECTION_TARGET||l.type===k.SMALL_MODEL||l.type===k.CLASSIFICATION_MODEL).length===0&&d.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),a.some(l=>l.type===k.SMALL_MODEL),D.some(l=>l.data.arguments?.needCooperativeDetection===!0),D.length>1,a.forEach(l=>{const L=o.filter(f=>f.target===l.id),$=o.filter(f=>f.source===l.id);if(l.type===k.START&&L.length>0&&h.push("开始节点不应有输入连接"),l.type===k.END&&$.length>0&&h.push("结束节点不应有输出连接"),l.type===k.START&&$.length===0&&d.push("开始节点必须有输出连接"),l.type===k.END&&L.length===0&&d.push("结束节点必须有输入连接"),l.type===k.DATA_SOURCE&&l.data.enableImageSequence)if($.length===0)d.push({nodeId:l.id,message:`数据源节点"${l.data.label}"开启了图片时序但未连接到任何处理节点`});else{const f=$.filter(g=>g.sourceHandle==="first-frame"),M=l.data.subsequentFrames||[],B=new Set($.map(g=>g.sourceHandle)),S=M.filter(g=>!B.has(g.handleId));f.length===0&&h.push({nodeId:l.id,message:`数据源节点"${l.data.label}"的首帧检测未连接`}),S.length>0&&h.push({nodeId:l.id,message:`数据源节点"${l.data.label}"有${S.length}个后续帧未连接`})}l.type!==k.START&&l.type!==k.END&&!l.parentNode&&(L.length===0||$.length===0)&&h.push(`节点 "${l.data.label}" 可能未正确连接`)});const q=new Set;o.forEach(l=>{const L=n.find($=>$.id===l.source);L?.type==="dataSource"&&L.data?.enableImageSequence===!0&&l.sourceHandle!=="first-frame"&&(!l.data?.timeWindowSeconds||l.data.timeWindowSeconds<1)&&d.push({edgeId:l.id,message:`分支"${l.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),q.add(l.source),q.add(l.target)}),a.forEach(l=>{l.parentNode||!q.has(l.id)&&a.length>1&&h.push(`节点 "${l.data.label}" 未连接到工作流`)});const u=lt(a,o);d.push(...u);const x=st(a,o);d.push(...x);const _=rt(a);d.push(..._);const c=it(a,o);d.push(...c);const C=ct(a,o);return d.push(...C),t==="task"&&a.filter(L=>L.type===k.FACE_RECOGNITION).forEach(L=>{(!L.data.arguments?.repositoryId||Array.isArray(L.data.arguments.repositoryId)&&L.data.arguments.repositoryId.length===0)&&d.push({nodeId:L.id,message:`人脸识别节点"${L.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:d.length===0,errors:d,warnings:h}},lt=(n,o)=>{const t=[],d=n.find(b=>b.type===k.START);if(!d)return t;const h=new Set,a=(b,T,D,z)=>{if(T.includes(b))return;const q=n.find(C=>C.id===b);if(!q)return;const u=[...T,b];let x=[...D],_=[...z];if(q.type===k.TARGET_COUNT&&x.push(q),q.type===k.TIMER_TARGET&&_.push(q),q.type===k.END){const C=u.join("->");h.has(C)||(h.add(C),x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),_.length>1&&t.push(`工作流分支中存在多个目标计时节点(${_.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const c=o.filter(C=>C.source===b);c.length===0?(x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(C=>`"${C.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),_.length>1&&t.push(`工作流分支中存在多个目标计时节点(${_.map(C=>`"${C.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):c.forEach(C=>{a(C.target,u,x,_)})};return a(d.id,[],[],[]),t},rt=n=>{const o=[],t=n.filter(h=>h.type===k.DATA_SOURCE),d=n.filter(h=>h.type===k.SMALL_MODEL);return d.length>0&&t.length>1&&d.forEach(h=>{o.push({nodeId:h.id,message:`小模型节点"${h.data.label||h.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},st=(n,o)=>{const t=[];return n.filter(h=>h.type===k.DATA_SOURCE).forEach(h=>{const a=o.filter(b=>b.source===h.id);if(a.length>1){const b=a.map(z=>z.target),D=n.filter(z=>b.includes(z.id)).filter(z=>z.type===k.SMALL_MODEL);if(D.length>0){const z=D.map(q=>`"${q.data.label||q.data.modelName}"`).join("、");t.push(`数据源节点"${h.data.label}"开启了多分支,不能包含小模型节点(${z})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},it=(n,o)=>{const t=[],d=[k.TARGET_COUNT,k.TIMER_TARGET],h={[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时"};return n.filter(b=>b.type===k.SMALL_MODEL).forEach(b=>{o.filter(D=>D.source===b.id).forEach(D=>{const z=n.find(q=>q.id===D.target);if(z&&d.includes(z.type)){const q=h[z.type]||z.type;t.push(`小模型节点"${b.data.label||b.data.modelName}"不能直接连接${q}节点"${z.data.label}",请先连接检测目标节点`)}})}),t},ct=(n,o)=>{const t=[],d=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION],h={[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.FACE_RECOGNITION]:"人脸识别"};return n.filter(b=>d.includes(b.type)).forEach(b=>{const T=o.filter(q=>q.source===b.id),D=d.filter(q=>q!==b.type).concat(k.END),z=b.data.label||h[b.type];T.forEach(q=>{const u=n.find(x=>x.id===q.target);u&&!D.includes(u.type)&&t.push(`${z}节点"${z}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${u.data.label||u.type}"节点`)}),T.length===0&&t.push(`${z}节点"${z}"必须连接到其他辅助节点或结束节点`)}),t},qe=n=>{const o=new Map;return n.forEach(t=>o.set(t.id,t)),o},pe=(n,o,t)=>(n[o]||[]).map(d=>t.get(d)).filter(Boolean),Ge=(n,o)=>{const t={},d=new Set(n.filter(a=>a.type==="group").map(a=>a.id));return[...o].sort((a,b)=>{const T=a.data?.branchOrder??1/0,D=b.data?.branchOrder??1/0;return T-D}).forEach(a=>{if(d.has(a.source)&&d.has(a.target))return;let b=a.source,T=a.target;if(d.has(b)){const D=o.find(z=>z.target===b&&!d.has(z.source));if(!D)return;b=D.source}if(d.has(T)){const D=o.find(z=>z.source===T&&!d.has(z.target));if(!D)return;T=D.target}t[b]||(t[b]=[]),t[b].includes(T)||t[b].push(T)}),t},He=(n,o)=>{const t=[...o.values()].find(b=>b.type===k.START);if(!t)return[];const d=new Set,h=[],a=b=>{if(d.has(b))return;d.add(b);const T=o.get(b);if(!T)return;T.type!==k.START&&T.type!==k.END&&T.type!=="group"&&h.push(T),(n[b]||[]).forEach(z=>a(z))};return a(t.id),h},dt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ce=(n,o,t,d)=>{const h=n.nodes.findIndex(b=>b.toolTitle===o);if(h===-1)return;const a=n.nodes[h];a.arguments?.[t]&&(n[d]=a.arguments[t]),n.nodes=n.nodes.filter((b,T)=>T!==h),n.nodes.forEach((b,T)=>{b.sortOrder=T+1})},mt=n=>{const o=n.alertConditions||[];return{targetCount:{logic:n.conditionRelation||"AND",rules:o.map(d=>({op:d.operator,value:d.value}))}}},pt=n=>{const o={op:">",value:n.duration??30,unit:"seconds"};if(n.hit_rate_enabled&&n.hit_rate_threshold!==void 0){const d={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:d[n.hit_rate_operator||"gte"]||">=",value:n.hit_rate_threshold}}const t=n.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const d=t.operator||"gt",h={gt:">",eq:"=",lt:"<"};o.overlap={op:h[d]||">",value:t.threshold,matchFrames:3}}return n.similarity_enabled&&n.similarity_threshold!==void 0&&(o.similarity={op:">",value:n.similarity_threshold,matchFrames:3}),{duration:o}},ut={[k.TARGET_COUNT]:mt,[k.TIMER_TARGET]:pt},_e=(n,o)=>{if(!n)return{};const t=ut[o];if(t)return t(n);const d={...n};return dt.forEach(h=>{delete d[h]}),Object.keys(d).forEach(h=>{const a=d[h];(a==null||a==="")&&delete d[h]}),o===k.FACE_RECOGNITION&&d.repositoryId!==void 0&&(Array.isArray(d.repositoryId)||(d.repositoryId=[d.repositoryId]),d.repositoryId.length===0&&delete d.repositoryId),d},ft=n=>{switch(n.type){case k.DETECTION_TARGET:return n.data.targetId||"";case k.CLASSIFICATION_MODEL:return"cls";case k.OCR:return"ocr";case k.LICENSE_PLATE:return"license_plate";case k.SMALL_MODEL:return n.data.title||n.data.modelName||"";case k.TARGET_COUNT:return"target_count";case k.TIMER_TARGET:return"timer_target";case k.FACE_RECOGNITION:return"face";default:return n.data.label||""}},gt=(n,o,t,d,h=null)=>{const a={toolTitle:ft(n),nodeName:n.data.label||n.data.targetName||"",sortOrder:o,arguments:_e(h??n.data.arguments,n.type)};if(n.data.enableBranch&&n.data.branchLogic&&(a.branchLogic=n.data.branchLogic),t){const b=d.find(T=>T.source===t&&T.target===n.id);b?.data?.branchOrder!==void 0&&b?.data?.branchOrder!==null&&(a.branchOrder=b.data.branchOrder)}return a},Pe=(n,o,t,d,h,a=null,b=[])=>{const T=[],D=Array.isArray(n)?[...n]:[n],z=new Set;let q=1;for(;D.length>0;){const u=[...D];D.length=0;const x=[];u.forEach(_=>{if(z.has(_))return;z.add(_);const c=d.get(_);!c||c.type===k.END||c.type===k.START||c.type===k.DATA_SOURCE||((t[_]||[]).forEach(l=>{const L=d.get(l);L&&L.type!==k.END&&D.push(l)}),b.includes(c.type))||x.push(c)}),x.length>0&&(x.forEach(_=>{const c=a?.(_.id)??null,C=gt(_,q,o,h,c);x.length>1&&(C.nodeLogic="or"),T.push(C)}),q++)}return T},ht=(n=null)=>{const o=n??ae(),t=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",ye.CREATE);const d=e.inject("editorConfig",null),h=e.computed(()=>Fe(o.nodes,o.edges,t)),a=(i,s,y,p)=>{if(y){const w=pe(i,y.id,s).find(H=>H.type===k.SMALL_MODEL);if(w)return w}return p.find(w=>w.type===k.SMALL_MODEL)||null},b=(i,s,y)=>{const w=pe(s,i.id,y).find(F=>F.type===k.SMALL_MODEL);return w?pe(s,w.id,y).filter(F=>F.type!==k.END&&F.type!==k.START&&F.type!==k.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},T=(i,s,y,p,w)=>{if(s===de.SMALL_MODEL||s===de.SMALL_MODEL_BRANCH){const F=a(p,w,y,i);return F?{toolTitle:F.data.title||F.data.modelName||"",toolType:"small",arguments:_e(F.data.arguments,k.SMALL_MODEL)}:null}const H=i.find(F=>F.type===k.DETECTION_TARGET);return H?{toolTitle:H.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:_e(H.data.arguments,k.DETECTION_TARGET)}:null},D=()=>{const i=o.nodes.find(p=>p.type===k.END);if(!i||!i.data.arguments)return{};const s=i.data.arguments,y={};return s.reportFrequency==="interval"&&s.reportInterval&&(y.interval={value:s.reportInterval}),s.enableDeduplication&&s.similarityThreshold!==void 0&&(y.dedup={value:s.similarityThreshold}),y},z=i=>{if(i.length<=1)return;const s=i.map(p=>p.sortOrder);if(new Set(s).size!==s.length){const p=s.filter((w,H)=>s.indexOf(w)!==H);throw new Error(`分支执行顺序存在重复:${[...new Set(p)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},q=(i,s,y,p,w)=>{let H=[],F;if(i===de.IMAGE_BRANCH)s&&(H=pe(p,s.id,w).filter(G=>G.type!==k.END)),F=s?.id||y.find(G=>G.type===k.DATA_SOURCE)?.id;else if(i===de.SMALL_MODEL_BRANCH){const G=a(p,w,s,y);G&&(H=pe(p,G.id,w).filter(P=>P.type!==k.END),F=G.id)}return{branchStartNodes:H,sourceNodeId:F}},u=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]),x=(i,s,y)=>{const p=new Set,w=[],H=F=>{if(p.has(F))return;p.add(F);const G=y.get(F);if(!G||G.type===k.END)return;u.has(G.type)&&w.push(G),(s[F]||[]).forEach(j=>H(j))};return H(i),w.length>0?w[w.length-1]:null},_=(i,s,y,p,w)=>{const H=`分支${w+1}`,F=x(s,y,p);if(!F)return i?.data?.nodeName||H;if(F.type===k.DETECTION_TARGET&&F.data?.targetId==="other"){const P=F.data?.arguments?.object;if(Array.isArray(P)&&P.length>0){const j=P.join(",");return j.length>32?j.slice(0,32):j}}if(F.type===k.CLASSIFICATION_MODEL){const P=F.data?.arguments?.modelName||F.data?.label;if(!P)return H;const j=F.data?.arguments?.resultNegate?"(取反)":"";return P+j}return F.data?.label||F.data?.targetName||H},c=(i,s,y,p,w,H)=>{const{branchStartNodes:F,sourceNodeId:G}=q(s,y,i,p,w);if(F.length===0)return[];const P=[];return F.forEach((j,Y)=>{const N=Pe([j.id],G,p,w,H);if(N.length===0)return;const A=G?H.find(m=>m.source===G&&m.target===j.id):null,R=A?.data||{},W=R.branchOrder!==void 0&&R.branchOrder!==null?R.branchOrder:Y+1,r={branchName:R.branchName||_(j,j.id,p,w,Y),sortOrder:W,nodes:N};A?.sourceHandle&&(r.sourceHandle=A.sourceHandle),Ce(r,"target_count","targetCount","targetCount"),Ce(r,"timer_target","duration","duration"),R.timeWindowSeconds!==void 0&&R.timeWindowSeconds!==null&&(r.timeWindowSeconds=R.timeWindowSeconds),R.branchDescription&&(r.description=R.branchDescription),P.push(r)}),z(P),P},C=()=>{const i=h.value;if(i.errors.length>0){const s=i.errors.map(y=>typeof y=="object"?y.message:y);return Z.ElMessage.error(`验证失败: ${s.join(", ")}`),!1}return i.warnings.length>0&&Z.ElMessage.warning(`警告: ${i.warnings.join(", ")}`),!0},l=()=>{const i=o.nodes,s=o.edges,y=qe(i),p=Ge(i,s),w=He(p,y),H=[...y.values()].find(F=>F.type===k.START);return{allNodes:i,edges:s,nodeMap:y,adj:p,orderedNodes:w,startNode:H}},L=i=>{const s={ruleName:i?.data?.algorithmName||"",description:"",webhookUrl:""},y=D();Object.keys(y).length>0&&(s.extraConfig=y);const w=(d?.value??d)?.platform;return s.attach=w?{platform:w}:{},s},$=(i,s)=>{const y=i.filter(p=>p.type===k.DATA_SOURCE);if(y.length===0){const p=s.find(w=>w.type===k.DATA_SOURCE);p&&y.push(p)}return y},f=i=>i?.data?.enableImageSequence||i?.data?.arguments?.enableImageSequence||!1?"order":i?.data?.enableBranch&&i.data.branchLogic||"and",M=(i,s,y,p)=>{const{orderedNodes:w,adj:H,nodeMap:F,edges:G}=s,P=b(i,H,F),j=!!i.data.arguments?.needCooperativeDetection,Y=G.find(r=>r.target===i.id),N=Y?.data?.branchOrder!==void 0&&Y?.data?.branchOrder!==null?Y.data.branchOrder:p+1,A={sourceGroupId:null,name:i.data.label||"数据源",sort:N,synEnabled:j};if(j&&(A.windowSeconds=i.data.arguments?.windowSeconds||5),P===de.SMALL_MODEL){const r=T(w,P,i,H,F);return r&&(A.streamConfig=r),A.logic="and",A.children=[],A}if(P===de.SMALL_MODEL_BRANCH){const r=T(w,P,i,H,F);r&&(A.streamConfig=r)}A.logic=f(i);const R=c(w,P,i,H,F,G),W=y.length;return A.children=R.map((r,m)=>({name:r.branchName,branchRefs:[W+m]})),y.push(...R),A},B=(i,s)=>{const p={groupLogic:i?.data?.enableBranch&&i.data.branchLogic||"and",sourceGroups:s};return s.length>=2&&(p.groupWindowSeconds=i.data.groupWindowSeconds),p},S=()=>{if(!C())return null;try{const i=l(),s=L(i.startNode),y=$(i.orderedNodes,i.allNodes),p=[],w=y.map((H,F)=>M(H,i,p,F));return s.ruleSchema=B(i.startNode,w),p.length>0&&(s.branches=p),s}catch(i){return Z.ElMessage.error(i.message||"导出失败"),null}};return{validation:h,exportToJSON:S,copyToClipboard:()=>{try{const i=S();if(!i)return;const s=JSON.stringify(i,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(s).then(()=>{Z.ElMessage.success("已复制到剪贴板")}).catch(()=>{Z.ElMessage.error("复制失败")});else{const y=document.createElement("textarea");y.value=s,y.style.position="fixed",y.style.opacity="0",document.body.appendChild(y),y.select(),document.execCommand("copy"),document.body.removeChild(y),Z.ElMessage.success("已复制到剪贴板")}}catch(i){console.error("复制JSON失败:",i),Z.ElMessage.error(`复制失败: ${i.message}`)}},downloadJSON:()=>{const i=S();if(!i)return;const s=JSON.stringify(i,null,2),y=new Blob([s],{type:"application/json"}),p=URL.createObjectURL(y),w=document.createElement("a");w.href=p,w.download=`workflow_${Date.now()}.json`,w.click(),URL.revokeObjectURL(p),Z.ElMessage.success("导出成功")}}},yt=(n=null,o=null)=>{const t=n??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",ye.CREATE);const d=e.inject("editorConfig",null),h=e.inject("taskModeConfig",null),a=o??d,b=o??h,T=e.inject("echoTaskData",null),D=e.computed(()=>({errors:[],warnings:[]})),z=($,f)=>{const M={},B=f?.data?.arguments??{};B.reportFrequency==="interval"&&B.reportInterval&&(M.interval={value:B.reportInterval}),B.enableDeduplication&&B.similarityThreshold!==void 0&&(M.dedup={value:B.similarityThreshold}),t.nodes.filter(E=>E.type===k.DATA_SOURCE).length>=2&&$?.data?.groupWindowSeconds!==void 0&&(M.groupWindowSeconds=$.data.groupWindowSeconds),M.enableVideo=!!$?.data?.enableAlertVideo;const g=$?.data?.schedule;return Array.isArray(g)&&g.length>0?M.schedule=g:M.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],M},q=($,f,M,B,S="image")=>{const g=pe(f,$.id,M).find(E=>E.type===k.SMALL_MODEL);if(g){const E=$.data?.arguments??{};return{toolTitle:g.data.title||g.data.modelName||"",toolType:"small",arguments:_e(g.data.arguments,k.SMALL_MODEL),decoder:u(E,!0)}}if(S==="stream"){const E=B.find(s=>s.type===k.DETECTION_TARGET);if(!E)return null;const i=$.data?.arguments??{};return{toolTitle:E.data.targetId||"",toolType:"stream",arguments:_e(E.data.arguments,k.DETECTION_TARGET),decoder:u(i,!1)}}return null},u=($,f)=>{const M=$.mode??(f?3:0),B=$.interval??0,S=$.sw_decoding??(f?"CPU":"GPU");let g=0,E=0;return f?M===3?(g=0,E=0):M===2?(g=1,E=0):M===1&&(g=0,E=B):M===0?(g=0,E=B*25):M===1?(g=0,E=B):M===2&&(g=1,E=0),{sw_decoding:S==="CPU",mode:g,interval:E}},x=($,f,M,B,S=null)=>{let g=$.id,E=pe(f,$.id,M).filter(y=>y.type!==k.END&&y.type!==k.START);E.length===1&&E[0].type===k.SMALL_MODEL&&(g=E[0].id,E=pe(f,g,M).filter(y=>y.type!==k.END&&y.type!==k.START));const i=E;if(i.length===0)return[];const s=S?y=>t.getTaskSourceArguments($.id,S,y):null;return i.map((y,p)=>{const w=Pe([y.id],g,f,M,B,s,[k.SMALL_MODEL]),H=B.find(Y=>Y.source===g&&Y.target===y.id),F=H?.data??{},G=F.branchOrder??p+1,P=F.branchId??null,j={branchId:P,id:P,branchName:F.branchName||y.data?.label||`分支${p+1}`,sortOrder:G,nodes:w};return H?.sourceHandle&&(j.sourceHandle=H.sourceHandle),F.timeWindowSeconds!==void 0&&F.timeWindowSeconds!==null&&(j.timeWindowSeconds=F.timeWindowSeconds),F.branchDescription&&(j.description=F.branchDescription),Ce(j,"target_count","targetCount","targetCount"),Ce(j,"timer_target","duration","duration"),j})},_=($,f,M,B,S=null,g=null,E=null,i=1,s=!1,y=!1)=>{const p=S??$.deviceType??"",w=p==="1400"||p==="2",H=w?"1400":"camera",F=f==="stream"?2:1,G=w&&g!==null?g==="device"?1:2:$.detectionType??2,j=(T?.value??T)?.graph?.sources??[],Y=String($.sourceId??$.id??""),A=j.find(W=>String(W.sourceId)===Y)?.attach??{},R={deviceType:H,detectionType:G,dataSourceType:F,sourceOrder:M,timeTemplateId:A.timeTemplateId??"",timeTemplateName:A.timeTemplateName??"",platform:B?.platform??"TAI"};if(!w){const W=E?.mode??0;W===3?(R.frameExtractionType=0,R.frameInterval=0):W===2?(R.frameExtractionType=y?1:3,R.frameInterval=0):(R.frameExtractionType=W+1,R.frameInterval=E?.interval??30);const r=E?.sw_decoding??"CPU";R.frameExtractionSourceType=r==="GPU"?2:1,i===1&&f==="image"&&!s&&!!E?.enablePatrol?R.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,E?.patrolGroupSize??1)),pollingInterval:"0"}:R.pollingConfig={enablePolling:0},R.thirdId=$.thirdId??""}return R},c=($,f,M,B,S,g,E)=>{const i=b?.value??b,s=i?.datasource?.getDevices?.($.id)??[],y=$.data?.sourceGroupId??null,p=!!$.data?.arguments?.needCooperativeDetection,w=p?$.data?.arguments?.windowSeconds??5:void 0,H=f?.data?.streamType??"image",F=pe(M,$.id,B).some(r=>r.type===k.SMALL_MODEL),G=F?"small":H,P=q($,M,B,E,H),j=$.data?.arguments?.deviceType??null,Y=$.data?.arguments?.detectionMode??null,N=$.data?.arguments??null,A=t.getDataSourceCount();if(s.length>0)return s.map((r,m)=>{const V=String(r.sourceId??r.id??""),I=x($,M,B,S,V),U={sourceId:r.sourceId??r.id??"",sourceName:r.sourceName??r.name??"",sourceType:G,sourceGroupId:y,areas:r.area??r.areas??[],branches:I,attach:_(r,H,m,i,j,Y,N,A,p,F),synEnabled:p,...w!==void 0&&{windowSeconds:w}};return P&&(U.streamConfig=P,U.streamUrl="rtsp"),U});const R=x($,M,B,S),W={sourceId:"",sourceName:$.data?.label??"数据源",sourceType:G,sourceGroupId:y,areas:[],branches:R,attach:_({},H,0,i,j,Y,N,A,p,F),synEnabled:p};return P&&(W.streamConfig=P,W.streamUrl="rtsp"),[W]},C=()=>{try{const $=t.nodes,f=t.edges,M=qe($),B=Ge($,f),S=[...M.values()].find(w=>w.type===k.START),g=[...M.values()].find(w=>w.type===k.END),E=a?.value??a,i=He(B,M);let s=i.filter(w=>w.type===k.DATA_SOURCE);s.length===0&&(s=$.filter(w=>w.type===k.DATA_SOURCE));const y=s.flatMap((w,H)=>c(w,S,B,M,f,H,i)),p={workflowName:S?.data?.taskName??"",ruleId:E?.ruleId??"",sources:y,extraConfig:z(S,g),description:""};if((E?.platform??"TAI")==="THIRD"){const H=s[0]?.data?.arguments??{},F=H.mode??0,G=H.interval??0;let P,j,Y;return F===0?(P="time",j=G,Y=0):(P="frame",j=0,F===3?Y=0:F===2?Y=-1:Y=G),{name:p.workflowName,type:"simple",plan:p.extraConfig.schedule??[],inferStrategy:P,timeInterval:j,frameInterval:Y,mps:p.extraConfig.enableVideo??!1,graph:p}}return p}catch($){return Z.ElMessage.error($.message||"导出失败"),null}};return{validation:D,exportToJSON:C,copyToClipboard:()=>{const $=C();if(!$)return;const f=JSON.stringify($,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(f).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const M=document.createElement("textarea");M.value=f,M.style.position="fixed",M.style.opacity="0",document.body.appendChild(M),M.select(),document.execCommand("copy"),document.body.removeChild(M),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const $=C();if(!$)return;const f=JSON.stringify($,null,2),M=new Blob([f],{type:"application/json"}),B=URL.createObjectURL(M),S=document.createElement("a");S.href=B,S.download=`task_workflow_${Date.now()}.json`,S.click(),URL.revokeObjectURL(B),Z.ElMessage.success("导出成功")}}},_t=(n=null,o=null,t=null)=>{const d=e.inject("editorMode",ee.ALGORITHM);return(n??d)===ee.TASK?yt(o,t):ht(o)},Nt=n=>{if(!n)return null;const o=n.indexOf("{");if(o===-1)return null;try{return JSON.parse(n.slice(o))}catch{return null}};function Ct(n=null,o=null,t=null){const d=o??ae(),h=e.inject("editorMode",ee.ALGORITHM),a=n??h,b=e.inject("taskModeConfig",null),T=t??b,D=u=>{const{type:x,data:_}=u,c=_.arguments||{},C=[];switch(x){case k.START:if(a===ee.TASK)if(_.taskName?.trim()||C.push("任务名称"),!_.executionTime?.trim())C.push("任务执行时间");else{const l=Nt(_.executionTime);(!l||!Array.isArray(l.plan)||l.plan.length===0)&&C.push("任务执行时间(计划为空)")}else _.algorithmName?.trim()||C.push("算法名称");break;case k.SMALL_MODEL:_.modelId||C.push("模型选择");break;case k.DETECTION_TARGET:_.targetId||C.push("检测目标选择");break;case k.CLASSIFICATION_MODEL:c.modelId||C.push("分类模型选择");break;case k.DATA_SOURCE:a===ee.TASK&&((T?.value??T)?.datasource?.getDevices?.(u.id)??[]).length===0&&C.push("设备选择");break;case k.TARGET_COUNT:break;case k.TIMER_TARGET:(!c.duration||c.duration<1)&&C.push("持续时间");break}return C},z=u=>{const x=d.nodes.find(c=>c.id===u.source);if(!x)return[];const _=[];return x.type===k.DATA_SOURCE&&x.data?.enableImageSequence===!0&&u.sourceHandle!=="first-frame"&&(!u.data?.timeWindowSeconds||u.data.timeWindowSeconds<1)&&_.push("后续检测帧的持续时间"),_};return{runValidation:()=>{const{nodes:u,edges:x}=d;d.clearInvalidIds();const _=Fe(u,x,a),c=_.errors,C=[],l=[],L=[];u.filter(g=>g.type!=="group").forEach(g=>{const E=D(g);E.length>0&&(C.push(g.id),L.push(`节点"${g.data.label}"缺少必填参数:${E.join("、")}`))}),x.forEach(g=>{const E=z(g);E.length>0&&(l.push(g.id),L.push(`分支"${g.data?.branchName||"未命名"}"缺少:${E.join("、")}`))}),c.forEach(g=>{typeof g=="object"&&(g.nodeId&&C.push(g.nodeId),g.edgeId&&l.push(g.edgeId))}),(C.length>0||l.length>0)&&(d.setInvalidIds(C,l),setTimeout(()=>{d.clearInvalidIds()},5e3));const f=c.map(g=>typeof g=="object"?g.message:g),M=_.warnings.map(g=>typeof g=="object"?g.message:g),B=[...f.map(g=>({msg:g,type:"error"})),...L.map(g=>({msg:g,type:"warning"})),...M.map(g=>({msg:g,type:"warning"}))],S=f.length===0&&L.length===0;if(S&&M.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(B.length>0){const g=B[0];Z.ElMessage[g.type](g.msg)}return S}}}const oe=(n,o)=>{const t=n.__vccOpts||n;for(const[d,h]of o)t[d]=h;return t},kt={key:0},bt={class:"node-list"},xt={class:"node-list"},Et={class:"node-list"},wt={class:"node-list"},Tt=oe({__name:"NodeToolbox",setup(n){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),d=(h,a)=>{h.dataTransfer&&(h.dataTransfer.setData("application/vueflow",a),h.dataTransfer.effectAllowed="move")};return(h,a)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),z=e.resolveComponent("el-collapse-item"),q=e.resolveComponent("FolderOpened"),u=e.resolveComponent("Cpu"),x=e.resolveComponent("View"),_=e.resolveComponent("el-collapse");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["node-toolbox",{collapsed:!o.value}])},[e.createElementVNode("div",{class:"toolbox-header",onClick:a[1]||(a[1]=c=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",kt,"节点工具箱")):(e.openBlock(),e.createBlock(b,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(b,{key:2,class:"toggle-btn",onClick:a[0]||(a[0]=e.withModifiers(c=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(_,{key:0,modelValue:t.value,"onUpdate:modelValue":a[13]||(a[13]=c=>t.value=c),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(z,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[2]||(a[2]=c=>d(c,"start"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),a[14]||(a[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[3]||(a[3]=c=>d(c,"end"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),a[15]||(a[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(z,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",xt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[4]||(a[4]=c=>d(c,"dataSource"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(q)]),_:1}),a[16]||(a[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[5]||(a[5]=c=>d(c,"smallModel"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(u)]),_:1}),a[17]||(a[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[6]||(a[6]=c=>d(c,"detectionTarget"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),a[18]||(a[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[7]||(a[7]=c=>d(c,"classificationModel"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),a[19]||(a[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(z,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[8]||(a[8]=c=>d(c,"targetCount"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),a[20]||(a[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[9]||(a[9]=c=>d(c,"timerTarget"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),a[21]||(a[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(z,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[10]||(a[10]=c=>d(c,"ocr"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),a[22]||(a[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[11]||(a[11]=c=>d(c,"licensePlate"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),a[23]||(a[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:a[12]||(a[12]=c=>d(c,"faceRecognition"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),a[24]||(a[24]=e.createElementVNode("span",null,"人脸识别",-1))],32)])]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-fac9714d"]]);class Ee{static backendToFrontend(o){const{id:t,title:d,name:h,inputSchema:a,extraConfig:b}=o,T={id:t,title:d,label:h,type:"DETECTION_TARGET",inputSchema:a,extraConfig:b,data:{targetId:d,targetName:h,description:h,areas:a?.properties?.areas?.default||[],threshold:a?.properties?.threshold?.default||.5,targetWidth:a?.properties?.targetWidth?.default||20,targetHeight:a?.properties?.targetHeight?.default||20,postmodel:a?.properties?.postmodel?.default||"ClipVit",expandRect:a?.properties?.expandRect?.default!==void 0?a.properties.expandRect.default:!1,topScale:a?.properties?.topScale?.default||1.6,bottomScale:a?.properties?.bottomScale?.default||1.6,leftScale:a?.properties?.leftScale?.default||1.6,rightScale:a?.properties?.rightScale?.default||1.6,enableStructure:b?.showStruct!==void 0?!1:void 0}};return Object.keys(T.data).forEach(D=>{T.data[D]===void 0&&delete T.data[D]}),T}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},je=n=>et[n]||n,fe=(n,o,t={})=>({id:me(n),type:n,position:{...o},data:{label:t.label||je(n),...t}}),Ne=(n,o,t={})=>{const{sourceHandle:d,...h}=t,a={id:`e_${n}_${o}`,source:n,target:o};return d&&(a.sourceHandle=d),Object.keys(h).length>0&&(a.data=h),a},St=n=>{if(!n)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=n.rules||[],t=n.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(d=>({operator:d.op,value:d.value}))}},Vt=n=>{if(!n)return{duration:30,condition_type:"similarity",similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gt",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1};const o={">":"gt",">=":"gte","=":"eq","<=":"lte","<":"lt"};return{duration:n.value??30,condition_type:n.similarity?"similarity":"hit_rate",similarity_enabled:!!n.similarity,similarity_threshold:n.similarity?.value??90,hit_rate_enabled:!!n.hitCount,hit_rate_operator:o[n.hitCount?.op]||"gt",hit_rate_threshold:n.hitCount?.value??2,overlap_detection:n.overlap?{enabled:!0,operator:o[n.overlap.op]||"gt",threshold:n.overlap.value}:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1}},Bt=n=>{if(!n)return{};const o={};return n.interval&&(o.reportFrequency="interval",o.reportInterval=n.interval.value),n.dedup&&(o.enableDeduplication=!0,o.similarityThreshold=n.dedup.value),o},At=()=>({properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]}),Dt=()=>({properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",default:!1}},required:[]}),Lt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const o=Math.random()*16|0;return(n==="x"?o:o&3|8).toString(16)}),ze=()=>{const n=ae(),o=e.inject("editorConfig",null),t=f=>tt[f]||k.DETECTION_TARGET,d=(f,M)=>f?.find(B=>B.id===String(M))??f?.[M],h=(f,M)=>f.streamConfig?(f.children||[]).some(g=>(g.branchRefs||[]).some(E=>d(M.branches,E)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,a=f=>!f||typeof f!="object"?"无效的JSON格式":!f.ruleName&&f.ruleName!==""?"缺少 ruleName 字段":f.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",b=f=>{const M=o?.value??o;return f==="small"?M?.smallModels||[]:f==="detection"?M?.detection||[]:f==="classification"?M?.classification?.models||[]:[]},T=()=>{},D=(f,M)=>{f.modelName=M||"",f.title=M||"",f.modelId=M||null;const S=b("small").find(g=>g.title===M);S&&(f.input_schema=S.inputSchema||S.input_schema||{},f.modelId=S.id||S.title,f.modelName=S.name||M,f.modelType=S.type,f.supportDirectAlert=S.supportDirectAlert||!1,f.extraConfig=S.extraConfig)},z=async(f,M)=>{const B=t(f.toolTitle),S={label:f.nodeName||je(B),arguments:f.arguments||{},input_schema:{}};switch(B){case k.DETECTION_TARGET:S.targetId=f.toolTitle,S.targetName=f.nodeName||"检测目标";{const E=b("detection").find(i=>i.title===f.toolTitle);if(E){let s=Ee.backendToFrontend(E).inputSchema||{};if(f.toolTitle==="other"){const y={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};s={...s,properties:{...s.properties,...y.properties}}}S.input_schema=s}}break;case k.CLASSIFICATION_MODEL:S.modelName=f.nodeName||"分类模型";break;case k.SMALL_MODEL:D(S,f.toolTitle);break}return f.branchLogic&&(S.enableBranch=!0,S.branchLogic=f.branchLogic),fe(B,M,S)},q=(f,M,B,S)=>{const g={label:"小模型",input_schema:{},arguments:f.arguments||{}};return D(g,f.toolTitle),M===de.SMALL_MODEL_BRANCH&&(g.enableBranch=!0,g.branchLogic=B.logic||"and"),fe("smallModel",S,g)},u=async(f,M,B,S,g,E)=>{let i=M,s=S;const y={branchOrder:f.sortOrder??1,branchName:f.branchName||"",branchId:f.id??null};f.sourceHandle&&(y.sourceHandle=f.sourceHandle);const p=f.timeWindowSeconds??f.extraConfig?.timeWindowSeconds;p!==void 0&&(y.timeWindowSeconds=p),f.description&&(y.branchDescription=f.description);const w=[...f.nodes||[]].sort((N,A)=>(N.sortOrder??0)-(A.sortOrder??0)),H=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]);let F=-1;w.forEach((N,A)=>{H.has(t(N.toolTitle))&&(F=A)});const G=w.map(N=>({kind:"regular",data:N})),P=f.targetCount??f.extraConfig?.targetCount,j=f.duration??f.extraConfig?.duration,Y=[];P&&Y.push({kind:"targetCount",data:P}),j&&Y.push({kind:"timerTarget",data:j}),Y.length>0&&G.splice(F+1,0,...Y);for(let N=0;N<G.length;N++){const A=G[N];let R;if(A.kind==="regular")R=await z(A.data,{x:s,y:B});else if(A.kind==="targetCount"){const W=St(A.data);R=fe("targetCount",{x:s,y:B},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=Vt(A.data);R=fe("timerTarget",{x:s,y:B},{label:"目标计时",arguments:W,input_schema:{duration:{required:!0,type:"integer",min:1,max:3600},condition_type:{required:!0,type:"string",enum:["similarity","hit_rate"]},similarity_threshold:{required:!1,type:"integer",min:0,max:100},hit_rate_threshold:{required:!1,type:"integer",min:0,max:100},reset_timer:{required:!0,type:"boolean"}}})}g.push(R),E.push(Ne(i,R.id,N===0?y:void 0)),i=R.id,s+=ie.H_GAP}return{lastNodeId:i,endX:s}},x=f=>{const M=f.ruleSchema.sourceGroups||[],B=f.ruleSchema.groupLogic||"and",S=M.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:f.ruleName||"",enableBranch:S?!0:B!=="and",branchLogic:B,groupWindowSeconds:f.ruleSchema.groupWindowSeconds??null})},_=f=>{const M=Bt(f.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:At(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...M}})},c=(f,M)=>[...f||[]].sort((B,S)=>(B.sort??0)-(S.sort??0)).map(B=>{const S=h(B,M),g=[];return(B.children||[]).forEach(E=>{(E.branchRefs||[]).forEach(i=>{const s=d(M.branches,i);s&&g.push(s)})}),g.sort((E,i)=>(E.sortOrder??0)-(i.sortOrder??0)),{sg:B,mode:S,refBranches:g}}),C=f=>{const B=(f.reduce((S,g)=>S+Math.max(g.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-B/2},l=async(f,M,B,S,g,E)=>{const{sg:i,mode:s,refBranches:y}=f,p=Math.max(y.length,1),w=B+(p-1)*ie.V_GAP/2;let H=ie.START_X+ie.H_GAP,F=ie.START_X;const G=i.logic==="order",P=fe("dataSource",{x:H,y:w},{label:i.name||"数据源",sourceGroupId:i.sourceGroupId??null,enableImageSequence:G,input_schema:Dt(),arguments:{needCooperativeDetection:!!i.synEnabled,windowSeconds:i.windowSeconds||5,enableImageSequence:G},enableBranch:!0,branchLogic:G?"order":i.logic||"and"});S.push(P),g.push(Ne(M.id,P.id,{branchOrder:i.sort??null,branchName:i.name||""})),G&&y.forEach((N,A)=>{N.sourceHandle||(N.sourceHandle=A===0?"first-frame":Lt())});const j=G?{dataSourceNode:P,refBranches:y}:null;let Y=P.id;if(s===de.SMALL_MODEL||s===de.SMALL_MODEL_BRANCH){H+=ie.H_GAP;const N=q(i.streamConfig,s,i,{x:H,y:w});S.push(N),g.push(Ne(P.id,N.id)),Y=N.id}if(y.length>0)for(let N=0;N<y.length;N++){const A=B+N*ie.V_GAP,{lastNodeId:R,endX:W}=await u(y[N],Y,A,H+ie.H_GAP,S,g);g.push(Ne(R,E.id)),W>F&&(F=W)}else{g.push(Ne(Y,E.id));const N=H+ie.H_GAP;N>F&&(F=N)}return{branchY:B+p*ie.V_GAP,maxX:F,imageSequenceInfo:j}},L=f=>{for(const{dataSourceNode:M,refBranches:B}of f){const S=B.filter(g=>g.sourceHandle&&g.sourceHandle!=="first-frame");S.length>0&&(M.data.subsequentFrames=S.map((g,E)=>({id:E===0?"default-subsequent":`subsequent-${Date.now()}-${E}`,label:E===0?"后续帧检测":`后续帧检测${E+1}`,handleId:g.sourceHandle})))}};return{importFromJSON:async f=>{const M=a(f);if(M)return Z.ElMessage.error(M),!1;try{T();const B=[],S=[],g=x(f),E=_(f);B.push(g);const i=c(f.ruleSchema.sourceGroups,f);let s=C(i),y=ie.START_X;const p=[];for(const w of i){const H=await l(w,g,s,B,S,E);s=H.branchY,H.maxX>y&&(y=H.maxX),H.imageSequenceInfo&&p.push(H.imageSequenceInfo)}return E.position.x=y+ie.H_GAP,B.push(E),L(p),n.loadWorkflow(B,S),Z.ElMessage.success("导入成功"),!0}catch(B){return Z.ElMessage.error("导入失败: "+(B.message||"未知错误")),!1}},validateImportJSON:a}},Ot=()=>{const n=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:d,validateImportJSON:h}=ze(),a=(_,c)=>{const C=_.mode??0,l=_.interval??0,L=_.sw_decoding===!1?"GPU":"CPU";let $,f;return c?C===1?($=2,f=0):C===0&&l===0?($=3,f=0):($=1,f=l):C===1?($=2,f=0):l===0?($=0,f=30):($=0,f=l),{mode:$,interval:f,sw_decoding:L}},b=(_,c)=>{const C=_.frameExtractionType??1,l=_.frameInterval??0,$=(_.frameExtractionSourceType??1)===2?"GPU":"CPU";let f,M;return C===0?(f=3,M=0):C===1&&l===0?(f=c?2:0,M=30):C===1?(f=0,M=l):C===2?(f=1,M=l):C===3?(f=2,M=0):(f=c?3:0,M=30),{mode:f,interval:M,sw_decoding:$}},T=_=>_===1?"device":"platform",D=_=>!_||_.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(_.pollingAmount??1)},z=(_,c,C)=>{if(c){const l=_.find(L=>L.sourceGroupId===c);if(l)return l}return _[C]??null},q=(_,c)=>{if(!_?.branches)return null;for(const C of _.branches){const l=C.nodes?.find(L=>L.toolTitle===c);if(l?.arguments)return{...l.arguments}}return null},u=_=>{if(!Array.isArray(_)||_.length===0)return{timeZone:"",planType:0};const c=_.map(l=>({dayType:Number(l.dayType??0),timePeriod:(l.timePeriod??[]).map(L=>({startTime:L.startTime,endTime:L.endTime}))})),C=c.some(l=>l.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:c}),planType:C}};return{importFromJSON:async _=>{const c=h(_);if(c)return Z.ElMessage.error(c),!1;if(!await d(_))return!1;const l=n?.value??n;if(!l||typeof l!="object"||Object.keys(l).length===0)return!0;const L=l.graph??{},$=L.sources??[],f=L.extraConfig??{},M=t.nodes.find(i=>i.type===k.START);if(M){const i=l.name??L.workflowName??"",s=!!f.enableVideo,y=f.schedule??[],{timeZone:p,planType:w}=u(y);t.updateNodeData(M.id,{taskName:i,enableAlertVideo:s,schedule:y,timeZone:p,planType:w,...p?{executionTime:p}:{}})}const B=t.nodes.filter(i=>i.type===k.DATA_SOURCE),S=t.nodes.some(i=>i.type===k.SMALL_MODEL);return B.forEach((i,s)=>{const y=i.data?.sourceGroupId??null,p=z($,y,s);if(!p)return;const w=p.attach??{},H=p.streamConfig?.decoder??null,F=w.deviceType==="1400"?"1400":"camera",G=F==="camera"?H?a(H,S):b(w,S):{},P=F==="camera"?D(w.pollingConfig):{},j=F==="1400"?{detectionMode:T(w.detectionType)}:{},Y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...Y,deviceType:F,...G,...P,...j}});const N=o?.value??o;if(N?.datasource?.setDevices){const R=(y?$.filter(W=>W.sourceGroupId===y):[p]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));N.datasource.setDevices(i.id,R)}}),t.nodes.filter(i=>i.type===k.DETECTION_TARGET).forEach(i=>{const s=new Set,y=[i.id];let p=null;for(;y.length&&!p;){const N=y.shift();if(s.has(N))continue;s.add(N);const A=t.edges.filter(R=>R.target===N);for(const R of A){const W=t.nodes.find(r=>r.id===R.source);if(W){if(W.type===k.DATA_SOURCE){p=W.id;break}y.push(W.id)}}}if(!p)return;const H=(o?.value??o)?.datasource?.getDevices?.(p)??[];if(H.length<=1)return;const F=i.data?.targetId;if(!F)return;const G=H.map(N=>{const A=String(N.sourceId??N.id??""),R=$.find(W=>String(W.sourceId)===A);if(!R?.branches)return{deviceId:A,args:null};for(const W of R.branches){const r=W.nodes?.find(m=>m.toolTitle===F);if(r?.arguments)return{deviceId:A,args:{...r.arguments}}}return{deviceId:A,args:null}}),P=G.filter(N=>N.args!==null);if(P.length===0)return;const j=JSON.stringify(P[0].args);if(P.some(N=>JSON.stringify(N.args)!==j)){const N=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...N,configMode:"perDevice"}}),G.forEach(({deviceId:A,args:R})=>{R&&t.setTaskSourceArguments(p,A,i.id,R)})}}),t.nodes.filter(i=>i.type===k.FACE_RECOGNITION).forEach(i=>{const s=new Set,y=[i.id];let p=null;for(;y.length&&!p;){const Y=y.shift();if(s.has(Y))continue;s.add(Y);const N=t.edges.filter(A=>A.target===Y);for(const A of N){const R=t.nodes.find(W=>W.id===A.source);if(R){if(R.type===k.DATA_SOURCE){p=R.id;break}y.push(R.id)}}}const H=(p?t.nodes.find(Y=>Y.id===p):null)?.data?.sourceGroupId??null,F=B.findIndex(Y=>Y.id===p),G=z($,H,F>=0?F:0);if(!G)return;const P=q(G,"face");if(!P?.repositoryId)return;const j=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...j,repositoryId:Array.isArray(P.repositoryId)?P.repositoryId:[P.repositoryId]}})}),!0},validateImportJSON:h}},Mt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Ot():ze(),It={class:"node-content"},Rt={class:"node-label"},$t=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){return(o,t)=>{const d=e.resolveComponent("VideoPlay"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",It,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("span",Rt,e.toDisplayString(n.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Ft={class:"node-content"},qt={class:"node-label"},Gt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){return(o,t)=>{const d=e.resolveComponent("CircleClose"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ft,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("span",qt,e.toDisplayString(n.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Ht={class:"node-content"},Pt={class:"node-info"},jt={class:"node-label"},zt={key:1,class:"sequence-handles"},Ut={class:"handle-item"},Wt={class:"handle-label"},Jt={key:0,class:"handle-item add-button-item"},Yt=oe({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t=ae(),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,q=>{const u=Math.random()*16|0;return(q==="x"?u:u&3|8).toString(16)}),b=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let T=!1;const D=()=>{if(T)return;T=!0;const q=o.data.subsequentFrames||[],u={id:a(),label:`后续帧检测${q.length+1}`,handleId:a()};t.addSubsequentFrame(o.id,u),setTimeout(()=>{T=!1},300)},z=async q=>{const u=o.data.subsequentFrames.find(_=>_.id===q);if(t.edges.some(_=>_.source===o.id&&_.sourceHandle===u.handleId))try{await Z.ElMessageBox.confirm(`删除"${u.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,q)};return(q,u)=>{const x=e.resolveComponent("FolderOpened"),_=e.resolveComponent("el-icon"),c=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["data-source-node",{"sequence-mode":n.data.enableImageSequence,selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ht,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",Pt,[e.createElementVNode("div",jt,e.toDisplayString(n.data.label),1)])]),n.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(v.Handle),{key:0,type:"source",position:e.unref(v.Position).Right},null,8,["position"])),n.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",zt,[e.createElementVNode("div",Ut,[u[0]||(u[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,C=>(e.openBlock(),e.createElementBlock("div",{key:C.id,class:"handle-item"},[e.createElementVNode("span",Wt,e.toDisplayString(C.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:C.handleId,class:"handle-right"},null,8,["position","id"]),C.id!=="default-subsequent"&&!h.value?(e.openBlock(),e.createBlock(_,{key:0,class:"delete-icon",onClick:e.withModifiers(l=>z(C.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Jt,[e.createVNode(c,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(D,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Xt={class:"node-content"},Qt={class:"node-info"},Kt={class:"node-label"},Zt={key:0,class:"node-model"},vt={key:1,class:"node-placeholder"},eo={key:0,class:"direct-alert-badge"},to=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){return(o,t)=>{const d=e.resolveComponent("Cpu"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Xt,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",Qt,[e.createElementVNode("div",Kt,e.toDisplayString(n.data.label),1),n.data.modelName?(e.openBlock(),e.createElementBlock("div",Zt,e.toDisplayString(n.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",vt,"未选择模型"))])]),n.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",eo,[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),oo={class:"node-content"},no={class:"node-info"},ao={class:"node-target"},lo={class:"node-params"},ro=oe({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t=()=>o.data.targetName||o.data.label||"检测目标",d=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),h=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const a=o.data.arguments.object;if(Array.isArray(a))return a.filter(T=>T&&T.trim()!=="").length}return null});return(a,b)=>{const T=e.resolveComponent("View"),D=e.resolveComponent("el-icon"),z=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",oo,[e.createVNode(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",no,[b[1]||(b[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",ao,e.toDisplayString(t()),1),e.createElementVNode("div",lo,[h.value?(e.openBlock(),e.createBlock(z,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),d.value?(e.openBlock(),e.createBlock(z,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(n.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.targetHeight&&n.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(z,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(n.data.arguments.targetWidth)+"x"+e.toDisplayString(n.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(z,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...b[0]||(b[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),so={class:"node-content"},io={class:"node-info"},co={class:"node-label"},mo={key:0,class:"node-model"},po={key:1,class:"node-placeholder"},uo={key:2,class:"node-stats"},fo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){return(o,t)=>{const d=e.resolveComponent("Grid"),h=e.resolveComponent("el-icon"),a=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["classification-model-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",so,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",io,[e.createElementVNode("div",co,e.toDisplayString(n.data.label),1),n.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",mo,e.toDisplayString(n.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",po,"未选择模型")),n.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",uo,[n.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(a,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(n.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.categories?.length>0?(e.openBlock(),e.createBlock(a,{key:1,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(n.data.arguments.categories.length)+" 类 ",1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.topK?(e.openBlock(),e.createBlock(a,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" Top-"+e.toDisplayString(n.data.arguments.topK),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),go={class:"node-content"},ho={class:"node-info"},yo={class:"node-label"},_o={class:"node-params"},No=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){return ae(),(o,t)=>{const d=e.resolveComponent("el-icon"),h=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",go,[e.createVNode(d,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",ho,[e.createElementVNode("div",yo,e.toDisplayString(n.data.label),1),e.createElementVNode("div",_o,[n.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(h,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(n.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),Co={class:"node-content"},ko={class:"node-info"},bo={class:"node-label"},xo={class:"node-scope"},Eo={class:"node-params"},wo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t=ae(),d=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const a=t.nodes.find(b=>b.id===h);return a?a.data.label:"检测范围"};return(h,a)=>{const b=e.resolveComponent("Document"),T=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Co,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(b)]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(n.data.label),1),e.createElementVNode("div",xo,e.toDisplayString(d()),1),e.createElementVNode("div",Eo,[n.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(n.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.minPlateWidth!==void 0&&n.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(D,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(n.data.arguments.minPlateWidth)+"×"+e.toDisplayString(n.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),To={class:"node-content"},So={class:"node-info"},Vo={class:"node-params"},Bo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},d=e.computed(()=>{const h=o.data.arguments?.alertConditions||[];if(h.length===0)return"";if(h.length===1){const b=h[0];return`数量 ${t[b.operator]||b.operator} ${b.value}`}const a=o.data.arguments?.conditionRelation||"OR";return`${h.length} 个条件(${a})`});return(h,a)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",To,[e.createVNode(b,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",So,[a[0]||(a[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Vo,[d.value?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Ao={class:"node-content"},Do={class:"node-info"},Lo={class:"node-label"},Oo={class:"node-params"},Mo=oe({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t=e.computed(()=>o.data.description||"目标计时"),d=e.computed(()=>`${o.data.arguments?.duration||30}秒`),h=e.computed(()=>{const a=o.data.arguments?.condition_type;return a==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:a==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(a,b)=>{const T=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ao,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Do,[e.createElementVNode("div",Lo,e.toDisplayString(t.value),1),e.createElementVNode("div",Oo,[e.createVNode(D,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1}),h.value?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Io={class:"group-label"},Ro=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t={and:"ALL",or:"SOME"},d=e.computed(()=>t[o.data.branchLogic]??"ALL"),h=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),a={width:"8px",height:"8px",borderRadius:"2px"},b={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(T,D)=>{const z=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",Io,[e.createVNode(z,{type:h.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1},8,["type"]),D[0]||(D[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(ve.NodeResizer),{"min-width":200,"min-height":100,"handle-style":a,"line-style":b})],2)}}},[["__scopeId","data-v-adf6607d"]]),$o={class:"node-content"},Fo={class:"node-info"},qo={class:"node-label"},Go={class:"node-scope"},Ho={class:"node-params"},Po=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(n){const o=n,t=ae(),d=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const a=t.nodes.find(b=>b.id===h);return a?a.data.label:"检测范围"};return(h,a)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:n.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",$o,[e.createVNode(b,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",Fo,[e.createElementVNode("div",qo,e.toDisplayString(n.data.label),1),e.createElementVNode("div",Go,e.toDisplayString(d()),1),e.createElementVNode("div",Ho,[n.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(n.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),n.data.arguments?.minFaceWidth!==void 0&&n.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(T,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(n.data.arguments.minFaceWidth)+"×"+e.toDisplayString(n.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),jo={class:"quick-add-menu__list"},zo=["onClick"],Uo={class:"quick-add-menu__icon"},Wo={class:"quick-add-menu__label"},Jo={key:0,class:"quick-add-menu__empty"},ue=8,Yo=oe({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(n){const o=n,t=e.ref(null),d=e.ref({x:0,y:0});e.watch(()=>o.visible,async T=>{if(!T||(d.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const D=t.value.getBoundingClientRect(),z=window.innerWidth,q=window.innerHeight;let{x:u,y:x}=o.position;u+D.width>z-ue&&(u=z-D.width-ue),x+D.height>q-ue&&(x=q-D.height-ue),u<ue&&(u=ue),x<ue&&(x=ue),d.value={x:u,y:x}});const h=e.computed(()=>({left:d.value.x+"px",top:d.value.y+"px"})),a=[{type:"dataSource",label:"数据源",icon:"📦"},{type:"smallModel",label:"小模型",icon:"🤖"},{type:"detectionTarget",label:"检测目标",icon:"🎯"},{type:"classificationModel",label:"分类模型",icon:"🏷️"},{type:"ocr",label:"OCR识别",icon:"📝"},{type:"licensePlate",label:"车牌识别",icon:"🚗"},{type:"faceRecognition",label:"人脸识别",icon:"👤"},{type:"targetCount",label:"目标计数",icon:"📊"},{type:"timerTarget",label:"目标计时",icon:"⏱️"},{type:"end",label:"结束节点",icon:"🏁"}],b=e.computed(()=>{switch(o.sourceNodeType){case"start":return a.filter(T=>T.type==="dataSource");case"dataSource":return a.filter(T=>T.type==="smallModel"||T.type==="detectionTarget"||T.type==="classificationModel");case"smallModel":return a.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel"&&T.type!=="targetCount"&&T.type!=="timerTarget");case"detectionTarget":case"classificationModel":return a.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel");case"timerTarget":return a.filter(T=>["ocr","faceRecognition","licensePlate","end"].includes(T.type));case"targetCount":return a.filter(T=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(T.type));case"ocr":return a.filter(T=>["licensePlate","faceRecognition","end"].includes(T.type));case"licensePlate":return a.filter(T=>["ocr","faceRecognition","end"].includes(T.type));case"faceRecognition":return a.filter(T=>["ocr","licensePlate","end"].includes(T.type));default:return[]}});return(T,D)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[n.visible?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRef",ref:t,class:"quick-add-menu",style:e.normalizeStyle(h.value)},[D[1]||(D[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",jo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,z=>(e.openBlock(),e.createElementBlock("li",{key:z.type,class:"quick-add-menu__item",onClick:q=>T.$emit("select",z.type)},[e.createElementVNode("span",Uo,e.toDisplayString(z.icon),1),e.createElementVNode("span",Wo,e.toDisplayString(z.label),1)],8,zo))),128)),b.value.length===0?(e.openBlock(),e.createElementBlock("li",Jo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),n.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:D[0]||(D[0]=z=>T.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Xo={class:"workflow-canvas"},Ue=5,Qo=oe({__name:"WorkflowCanvas",setup(n){const o=ae(),{screenToFlowCoordinate:t,findNode:d,onConnectStart:h,onConnectEnd:a}=v.useVueFlow(),b=e.inject("editorConfig",null),T=e.inject("editorMode",ee.ALGORITHM),D=e.computed(()=>T===ee.TASK),z=e.inject("echoAlgodata",null),{importFromJSON:q}=Mt();e.watch(z,async r=>{if(r&&Object.keys(r).length>0&&(await e.nextTick(),await q(r),D.value)){const m=r?.ruleSchema?.sourceGroups??[];let V=null;if(m.some(I=>I.streamConfig)?V="stream":(m.length>1||m.some(I=>(I.children??[]).length>1))&&(V="image"),V){const I=o.nodes.find(U=>U.type===k.START);I&&o.updateNodeData(I.id,{streamType:V})}}},{immediate:!0});const u=(r,m)=>{if(!m?.properties)return r;const V={};return Object.entries(m.properties).forEach(([I,U])=>{U.default!==void 0&&(V[I]=U.default)}),r.data.arguments={...V,...r.data.arguments},r},x=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),_=()=>{x.visible=!1,x.sourceNodeId=null,x.sourceNodeType=null,x.sourceHandleId=null,$=!1};let c=null,C=!1,l=null,L=null,$=!1;const f=()=>{l&&(document.removeEventListener("mousemove",l),l=null),L&&(document.removeEventListener("mouseup",L),L=null)};e.onUnmounted(()=>{f()}),h(({nodeId:r,handleId:m,handleType:V,event:I})=>{if(V!=="source")return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const U=o.nodes.find(ne=>ne.id===r);if(!U||U.type==="end")return;if(U.type===k.DATA_SOURCE&&U.data?.enableImageSequence){if(m&&o.edges.filter(O=>O.source===r&&O.sourceHandle===m).length>=1)return}else if(U.type!==k.START&&U.type!==k.DATA_SOURCE&&o.edges.filter(O=>O.source===r).length>=1)return;const J=I?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}c={nodeId:r,sourceNodeType:U.type,handleId:m,menuX:Q,menuY:te,flowPos:{...U.position}},C=!1;const se=I?.clientX??0,ce=I?.clientY??0;f(),l=ne=>{(Math.abs(ne.clientX-se)>Ue||Math.abs(ne.clientY-ce)>Ue)&&(C=!0,f())},L=()=>{if(f(),!C&&c){$=!0;const ne=c;x.visible=!0,x.screenPos={x:ne.menuX,y:ne.menuY},x.sourceNodeId=ne.nodeId,x.sourceNodeType=ne.sourceNodeType,x.sourceHandleId=ne.handleId,x.flowPos=ne.flowPos}c=null},document.addEventListener("mousemove",l),document.addEventListener("mouseup",L)});const M=r=>{const m=x.sourceNodeId,V=o.nodes.find(K=>K.id===m);if(!V){_();return}if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),_();return}const I=V.position.x+250,U=V.position.y;let J={x:I,y:U};const Q=60,te=80;let se=0,ce=!0;for(;ce;){ce=!1;const K=U+se;for(const le of o.nodes)if(Math.abs(le.position.x-I)<100&&Math.abs(le.position.y-K)<Q+20){ce=!0,se+=te;break}}if(J.y=U+se,r==="end"){const K=o.nodes.find(le=>le.type==="end");if(K){if(o.edges.some(ke=>ke.source===m&&ke.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),_();return}const he=S(V,K);if(!he.valid){Z.ElMessage.warning(he.message),_();return}o.addConnection({source:m,target:K.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),F(),_(),Z.ElMessage.success("已连接到结束节点");return}}let ne;switch(r){case"end":ne=be(J);break;case"dataSource":ne=xe(J);break;case"smallModel":ne=Be(J);break;case"detectionTarget":ne=Ae(J);break;case"classificationModel":ne=De(J);break;case"ocr":{const K=b?.value??b;ne=u(Le(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=b?.value??b;ne=u(Oe(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=b?.value??b;ne=u(Re(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Me(J);break;case"timerTarget":ne=Ie(J);break;default:_();return}const O=S(V,ne);if(!O.valid){Z.ElMessage.warning(O.message),_();return}o.addNode(ne),o.addConnection({source:m,target:ne.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),F(),_(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},B=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],S=(r,m)=>{if(r?.parentNode&&m?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(m?.parentNode&&r?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(r?.type===k.START){if(m?.type!==k.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(U=>U.source===r.id).some(U=>o.nodes.find(Q=>Q.id===U.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(m?.type===k.SMALL_MODEL){if(r?.type!==k.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(J=>J.source===r.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type!==k.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(r?.type===k.DATA_SOURCE){if(m?.type!==k.SMALL_MODEL&&m?.type!==k.DETECTION_TARGET&&m?.type!==k.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(J=>J.source===r.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type===k.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(r?.type===k.SMALL_MODEL&&(m?.type===k.TARGET_COUNT||m?.type===k.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(r?.type===k.TARGET_COUNT&&![k.TIMER_TARGET,k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(m?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(r?.type===k.TIMER_TARGET&&![k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(m?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const V=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION];return V.includes(r?.type)&&!V.filter(U=>U!==r.type).concat(k.END).includes(m?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:m?.type!==k.END&&o.edges.filter(U=>U.target===m?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},g=e.markRaw({start:$t,end:Gt,dataSource:Yt,smallModel:to,detectionTarget:ro,classificationModel:fo,ocr:No,licensePlate:wo,targetCount:Bo,timerTarget:Mo,group:Ro,faceRecognition:Po}),E=e.computed({get:()=>o.nodes,set:r=>{o.nodes=r}}),i=e.computed({get:()=>o.edges,set:r=>{o.edges=r}}),s=r=>{r.forEach(m=>{if(m.type==="position"&&m.position)o.updateNodePosition(m.id,m.position);else if(m.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const V=o.nodes.find(U=>U.id===m.id);if(V&&V.type===k.START){Z.ElMessage.warning("开始节点不可删除");return}if(V&&V.type===k.END){Z.ElMessage.warning("结束节点不可删除");return}if(V&&V.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const I=V?.parentNode;o.removeNode(m.id),I&&o.nodes.filter(J=>J.parentNode===I).length===0&&o.dissolveParallelGroup(I)}})},y=r=>{r.forEach(m=>{if(m.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(m.id)}})},p=r=>{if($)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),_();return}const m=o.nodes.find(U=>U.id===r.source),V=o.nodes.find(U=>U.id===r.target),I=S(m,V);if(!I.valid){Z.ElMessage.warning(I.message),_();return}if(m?.type===k.DATA_SOURCE&&m.data.enableImageSequence&&r.sourceHandle&&o.edges.filter(J=>J.source===r.source&&J.sourceHandle===r.sourceHandle).length>=1){const J=r.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";Z.ElMessage.warning(`${J}连接点只能连接一个节点`);return}if(B.includes(m?.type)&&!m.data.enableBranch&&o.edges.filter(J=>J.source===r.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(r),F(),_()},w=r=>({and:"ALL",or:"SOME"})[r]||"ALL",H=r=>{const m=o.nodes.find(V=>V.id===r.source);if(!m)return"";if(m.type===k.START){const V=m.data.branchLogic||"and",I=w(V),U=r.data?.branchOrder;return U!=null?`${I} - 执行顺序 ${U}`:I}if(m.type===k.DATA_SOURCE){if(m.data?.enableImageSequence){const J=r.sourceHandle==="first-frame"?"首帧":"后续帧",Q=r.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const V=m.data.branchLogic||"and",I=w(V),U=r.data?.branchOrder;return U!=null?`${I} - 执行顺序 ${U}`:I}return""},F=()=>{o.edges.forEach(r=>{const m=H(r);r.label!==m&&(r.label=m,r.labelStyle=m?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,r.labelBgStyle=m?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,r.labelBgPadding=m?[4,6]:void 0)})},G=()=>{o.nodes.forEach(r=>{if(r.type!=="group")return;const m=r.data.sourceNodeId;if(!m)return;const V=o.nodes.find(I=>I.id===m);V?.data?.enableBranch&&V.data.branchLogic!==r.data.branchLogic&&o.updateNodeData(r.id,{branchLogic:V.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(r=>B.includes(r.type)).map(r=>({id:r.id,enableBranch:r.data.enableBranch,branchLogic:r.data.branchLogic})),(r,m)=>{m&&r.forEach(V=>{const I=m.find(U=>U.id===V.id);if(I){if(V.enableBranch&&!I.enableBranch){const U=o.nodes.find(J=>J.id===V.id);if(!U)return;o.createEmptyGroup({x:U.position.x+200,y:U.position.y-30},U.data.branchLogic||"and",V.id)}else if(!V.enableBranch&&I.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.dissolveParallelGroup(U.id)}if(V.enableBranch&&I.branchLogic!==V.branchLogic){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.updateNodeData(U.id,{branchLogic:V.branchLogic})}}})}),e.watch(()=>o.nodes.filter(r=>r.type!=="group").map(r=>({id:r.id,enableBranch:r.data.enableBranch,branchLogic:r.data.branchLogic,branchOrder:r.data.branchOrder})),()=>{F(),G()},{deep:!0}),e.watch(()=>o.edges.map(r=>({id:r.id,branchOrder:r.data?.branchOrder})),(r,m)=>{F(),m&&r.forEach(V=>{const I=m.find(U=>U.id===V.id);if(I&&I.branchOrder!==V.branchOrder&&V.branchOrder!==void 0){const U=o.edges.find(J=>J.id===V.id);if(U){const J=o.nodes.find(Q=>Q.id===U.source);J&&J.type===k.DATA_SOURCE&&o.updateNodePosition(J.id,{x:J.position.x,y:J.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([r,m])=>{o.nodes.forEach(V=>{r.has(V.id)?V.class="invalid-node":V.class==="invalid-node"&&(V.class="")}),o.edges.forEach(V=>{m.has(V.id)?V.class="invalid-edge":V.class==="invalid-edge"&&(V.class="")})},{deep:!0});const P=r=>{r.event?.target?.closest(".vue-flow__handle")||o.selectNode(r.node.id)},j=r=>{o.selectEdge(r.edge.id)},Y=r=>{if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(r.edge.id)},N=()=>{o.clearSelection()},A=({node:r})=>{if(r.type==="group"||!B.includes(r.type))return;const m=o.nodes.filter(I=>I.type==="group");let V=null;for(const I of m){const U=d(I.id);if(!U)continue;const J=U.dimensions?.width||parseInt(I.style?.width)||300,Q=U.dimensions?.height||parseInt(I.style?.height)||160;let te=r.position.x,se=r.position.y;if(r.parentNode){const he=o.nodes.find(ke=>ke.id===r.parentNode);he&&(te+=he.position.x,se+=he.position.y)}const ce=d(r.id),ne=ce?.dimensions?.width||160,O=ce?.dimensions?.height||60,K=te+ne/2,le=se+O/2;if(K>=I.position.x&&K<=I.position.x+J&&le>=I.position.y&&le<=I.position.y+Q){V=I.id;break}}V?r.parentNode!==V&&o.addNodeToGroup(r.id,V):r.parentNode&&o.removeNodeFromGroup(r.id)},R=r=>{r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="move")},W=r=>{r.preventDefault();const m=r.dataTransfer?.getData("application/vueflow");if(!m)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(m===k.START&&o.getNodeCountByType(k.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(m===k.END&&o.getNodeCountByType(k.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const V=160,I=60,U=t({x:r.clientX,y:r.clientY}),J={x:U.x-V/2,y:U.y-I/2};let Q;switch(m){case k.START:Q=Ve(J);break;case k.END:Q=be(J);break;case k.DATA_SOURCE:Q=xe(J);break;case k.SMALL_MODEL:Q=Be(J);break;case k.DETECTION_TARGET:Q=Ae(J);break;case k.CLASSIFICATION_MODEL:Q=De(J);break;case k.OCR:{const te=b?.value??b;Q=u(Le(J),te?.ocr?.[0]?.inputSchema);break}case k.LICENSE_PLATE:{const te=b?.value??b;Q=u(Oe(J),te?.license_plate?.[0]?.inputSchema);break}case k.TARGET_COUNT:Q=Me(J);break;case k.TIMER_TARGET:Q=Ie(J);break;case k.FACE_RECOGNITION:{const te=b?.value??b;Q=u(Re(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(r,m)=>(e.openBlock(),e.createElementBlock("div",Xo,[e.createVNode(e.unref(v.VueFlow),{nodes:E.value,"onUpdate:nodes":m[0]||(m[0]=V=>E.value=V),edges:i.value,"onUpdate:edges":m[1]||(m[1]=V=>i.value=V),"node-types":e.unref(g),onNodesChange:s,onEdgesChange:y,onConnect:p,onNodeClick:P,onEdgeClick:j,onEdgeDoubleClick:Y,onPaneClick:N,onDrop:W,onDragover:R,onNodeDragStop:A,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(Ke.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(Ze.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Yo,{visible:x.visible,position:x.screenPos,"source-node-type":x.sourceNodeType,onSelect:M,onClose:_},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-70847917"]]),Ko={class:"config-header"},Zo={key:0,class:"config-section"},vo={key:1,class:"config-section"},en=oe({__name:"EdgeConfig",setup(n){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),d=e.computed(()=>t===ee.TASK),h=e.computed(()=>{const q=o.selectedEdge;return q&&o.nodes.find(x=>x.id===q.source)?.data?.enableBranch?q:null}),a=e.computed(()=>h.value&&o.nodes.find(u=>u.id===h.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),b=e.computed(()=>{if(!h.value)return!1;const q=o.nodes.find(u=>u.id===h.value.source);return(q?.type==="dataSource"||q?.type==="start")&&q?.data?.enableBranch}),T=e.computed(()=>{if(!h.value)return 1;const q=o.nodes.find(u=>u.id===h.value.source);return q?o.edges.filter(u=>u.source===q.id).length:1}),D=e.computed(()=>{if(!h.value)return!1;const q=o.nodes.find(u=>u.id===h.value.source);return q?q.type==="dataSource"&&q.data?.enableImageSequence===!0&&h.value.sourceHandle!=="first-frame":!1}),z=q=>{h.value&&o.updateEdgeData(h.value.id,q)};return(q,u)=>{const x=e.resolveComponent("el-divider"),_=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-text"),C=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),$=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ko,[e.createElementVNode("h3",null,e.toDisplayString(a.value),1)]),e.createVNode(x),D.value?(e.openBlock(),e.createElementBlock("div",Zo,[u[3]||(u[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(C,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(_,{"model-value":h.value?.data?.timeWindowSeconds??null,onChange:u[0]||(u[0]=f=>z({timeWindowSeconds:f})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(c,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...u[2]||(u[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),b.value?(e.openBlock(),e.createElementBlock("div",vo,[u[5]||(u[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(C,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":h.value?.data?.branchOrder??null,disabled:d.value,onChange:u[1]||(u[1]=f=>z({branchOrder:f})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,f=>(e.openBlock(),e.createBlock(L,{key:f,label:`执行顺序 ${f}`,value:f},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(c,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...u[4]||(u[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),tn={class:"config-section"},on=oe({__name:"GroupNodeConfig",setup(n){return(o,t)=>{const d=e.resolveComponent("el-divider"),h=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(d),e.createElementVNode("div",tn,[e.createVNode(h,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),nn={class:"time-init-container"},an={key:0,class:"time-header flex-x-start"},ln={class:"tab-type flex-x"},rn={class:"time-content"},sn={id:"time-content-table-body"},cn=["onClick"],dn=["onClick"],mn=["data-sort","data-value","data-day","data-type","onMousedown"],pn={key:1},un=["data-sort","data-value","data-type","onMousedown"],fn={class:"time-list"},gn={key:0,class:"time-list-title"},hn={key:1,style:{"margin-right":"10px"}},yn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(n,{expose:o}){const t=n,d=e.ref(0);let h,a,b,T,D;const z=e.ref(new Map),q=e.ref(new Map),u=e.computed(()=>d.value===0?z.value:q.value);e.onMounted(()=>{h=document.querySelector("#time-content-table-body"),a=h.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",l)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",l)});const x=p=>{d.value!==p&&(d.value=p,e.nextTick(()=>{a=h.querySelectorAll("td.sel-able[data-type]"),a.forEach(H=>H.classList.remove("selected")),(p===0?z.value:q.value).forEach((H,F)=>{H.origin.forEach(G=>{Array.from(a).forEach(P=>{Number(P.dataset.sort)==G.sort&&Number(P.dataset.value)==G.value&&Number(P.dataset.day)==F&&P.classList.add("selected")})})})}))},_=e.ref([{name:"每日",value:0},{name:"一",value:1},{name:"二",value:2},{name:"三",value:3},{name:"四",value:4},{name:"五",value:5},{name:"六",value:6},{name:"日",value:7}]),c=(p,w,H)=>{t.operationType!=3&&H.which==1&&(T=p,b=Number(H.target.dataset.value),H.target.classList.contains("selected")?(H.target.classList.remove("selected"),D=""):(D="selected",H.target.classList.add("selected")),C(),B())},C=()=>{a.forEach(p=>{p.addEventListener("mouseover",L,!1,{once:!0})})},l=()=>{a.forEach(p=>{p.removeEventListener("mouseover",L)})},L=p=>{p.target.classList.remove("selected"),D&&p.target.classList.add(D);let w=Number(p.target.dataset.value),H=Number(p.target.dataset.day),F=H>T?H:T,G=H<T?H:T,P=w>b?w:b,j=w<b?w:b;for(let Y=G;Y<=F;Y++)for(let N=j;N<=P;N++){let A=document.querySelector(`td[data-value="${N}"][data-day="${Y}"]`);A.classList.remove("selected"),D&&A.classList.add(D)}B()},$=p=>{if(t.operationType==3)return;let w=[];a.forEach(H=>{Number(H.dataset.day)==p&&w.push(H)}),w.find(H=>!H.classList.contains("selected"))?w.forEach(H=>H.classList.add("selected")):w.forEach(H=>H.classList.remove("selected")),B()},f=p=>{if(t.operationType==3)return;let w=[];a.forEach(H=>{Number(H.dataset.sort)==p&&w.push(H)}),w.find(H=>!H.classList.contains("selected"))?w.forEach(H=>H.classList.add("selected")):w.forEach(H=>H.classList.remove("selected")),B()},M=()=>{a.forEach(w=>{w.classList.remove("selected")}),(d.value===0?z:q).value.clear()},B=()=>{const p=d.value===0?z:q;p.value.clear(),a.forEach(w=>{if(w.classList.contains("selected")){let H=w.dataset.day,F=w.dataset.sort,G=w.dataset.value;p.value.get(H)?p.value.get(H).origin.push({sort:Number(F),value:Number(G)}):p.value.set(H,{origin:[{sort:Number(F),value:Number(G)}],timeList:[]})}})},S=p=>{let F=u.value.get(p).origin.map(G=>G.value).reduce((G,P,j,Y)=>(j==0?G.push([P]):P==Y[j-1]+1?G[G.length-1].push(P):G.push([P]),G),[]);return F=F.map(G=>{let P=Math.max(...G)+1,j=Math.min(...G)+1,Y=j%2==0?30:0,N=P%2==0?0:30,A=g(Math.ceil(j/2)-1),R=g(Math.ceil(P/2)-(N==0?0:1));return{dayType:p,startTime:A+":"+(Y==0?"00":Y),endTime:R+":"+(N==0?"00":N)}}),u.value.get(p).timeList=F,F.map(G=>G.startTime+"-"+G.endTime).join()};function g(p){return p<10?"0"+p:p}const E=(p,w)=>{z.value.clear(),q.value.clear(),a.forEach(P=>P.classList.remove("selected")),d.value=w;const H=w===0?z:q,F=JSON.parse(p);let G=[];F.plan.forEach(P=>{P.timePeriod.forEach(j=>{G.push({...j,dayType:P.dayType})})}),e.nextTick(()=>{a=h.querySelectorAll("td.sel-able[data-type]"),G.forEach(P=>{H.value.get(P.dayType)?H.value.get(P.dayType).timeList.push(P):H.value.set(P.dayType,{origin:[],timeList:[{...P}]})}),H.value.forEach((P,j)=>{P.timeList.forEach(Y=>{let N=Number(Y.startTime.split(":")[1]),A=Number(Y.endTime.split(":")[1]),R=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if(R==W){P.origin.push({sort:R,value:2*R});return}for(let r=R;r<=W;r++)if(r==R)N==0?(P.origin.push({sort:r,value:2*r}),P.origin.push({sort:r,value:2*r+1})):P.origin.push({sort:r,value:2*r+1});else if(r>R&&r<W)P.origin.push({sort:r,value:2*r}),P.origin.push({sort:r,value:2*r+1});else if(A==0){if(r==W)return;P.origin.push({sort:r,value:2*r}),P.origin.push({sort:r,value:2*r+1})}else P.origin.push({sort:r,value:2*r})}),P.origin.forEach(Y=>{Array.from(a).find(N=>{Number(N.dataset.sort)==Y.sort&&Number(N.dataset.value)==Y.value&&Number(N.dataset.day)==j&&N.classList.add("selected")})})})})},i=(p,w)=>p.map(G=>G.value).sort((G,P)=>G-P).reduce((G,P,j,Y)=>(j==0?G.push([P]):P==Y[j-1]+1?G[G.length-1].push(P):G.push([P]),G),[]).map(G=>{let P=Math.max(...G)+1,j=Math.min(...G)+1,Y=j%2==0?30:0,N=P%2==0?0:30,A=g(Math.ceil(j/2)-1),R=g(Math.ceil(P/2)-(N==0?0:1));return{dayType:w,startTime:A+":"+(Y==0?"00":Y),endTime:R+":"+(N==0?"00":N)}});return o({getTimeData:()=>{(d.value===0?q:z).value.clear();let w=[];u.value.forEach((G,P)=>{const j=i(G.origin,P);w=w.concat(j)});let H={plan:[]},F=w.map(G=>G.dayType).filter((G,P,j)=>j.indexOf(G)===P);return F.length?(F.forEach(G=>{H.plan.push({dayType:G,timePeriod:w.filter(P=>P.dayType===G).map(P=>({startTime:P.startTime,endTime:P.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(H),planType:d.value}):{validTime:!1}},revertByTime:E,resetFn:()=>{d.value=0,z.value.clear(),q.value.clear(),e.nextTick(()=>{a.forEach(p=>{p.classList.remove("selected")}),a=h.querySelectorAll("td.sel-able[data-type]")})}}),(p,w)=>{const H=e.resolveComponent("el-icon"),F=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",nn,[n.operationType!=3?(e.openBlock(),e.createElementBlock("div",an,[e.createElementVNode("div",ln,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==0}]),onClick:w[0]||(w[0]=G=>x(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==1}]),onClick:w[1]||(w[1]=G=>x(1))}," 日计划 ",2)]),e.createVNode(F,{class:"rm-icon",link:"",type:"danger",onClick:M},{default:e.withCtx(()=>[e.createVNode(H,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",rn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:w[3]||(w[3]=G=>G.preventDefault())},[w[5]||(w[5]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th"),e.createElementVNode("th",{colspan:"24"},"上午"),e.createElementVNode("th",{colspan:"24"},"下午")])],-1)),e.createElementVNode("tbody",sn,[e.createElementVNode("tr",null,[w[4]||(w[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,G=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:P=>f(G-1)},e.toDisplayString(G-1),9,cn)),64))]),d.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(_.value.filter(G=>G.value!=0),G=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:P=>$(G.value)},e.toDisplayString(G.name),9,dn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,P=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((P-1)/2),"data-value":P-1,"data-day":G.value,"data-type":d.value,onMousedown:j=>c(G.value,P,j)},null,40,mn)),64))]))),256)):e.createCommentVNode("",!0),d.value==1?(e.openBlock(),e.createElementBlock("tr",pn,[e.createElementVNode("th",{onClick:w[2]||(w[2]=G=>$(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,G=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((G-1)/2),"data-value":G-1,"data-day":0,"data-type":d.value,onMousedown:P=>c(0,G,P)},null,40,un)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",fn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value.keys(),G=>(e.openBlock(),e.createElementBlock("div",null,[d.value==0?(e.openBlock(),e.createElementBlock("span",gn,[w[6]||(w[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(_.value.find(P=>P.value==G).name),1)])):(e.openBlock(),e.createElementBlock("span",hn,e.toDisplayString(_.value.find(P=>P.value==G).name),1)),e.createTextVNode(" ("+e.toDisplayString(S(G))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),_n={class:"time-template-dialog"},Nn={class:"time-editor-panel"},Cn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(n,{expose:o,emit:t}){const d=n,h=t,a=e.ref(null),b=e.ref(""),T=e.ref(""),D=e.ref(d.modelValue?.timeTemplateName||""),z=e.ref([]);return e.computed(()=>b.value?z.value.filter(x=>x.name.toLowerCase().includes(b.value.toLowerCase())):z.value),e.watch(D,x=>{h("update:modelValue",{...d.modelValue,timeTemplateName:x})}),o({getFormData:()=>{const x=a.value?.getTimeData();return{timeTemplateId:T.value,timeTemplateName:D.value,...x}},revertByTime:(x,_)=>{a.value?.revertByTime(x,_)}}),(x,_)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",_n,[e.createCommentVNode("",!0),e.createElementVNode("div",Nn,[e.createCommentVNode("",!0),e.createVNode(yn,{ref_key:"timeInitRef",ref:a},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),kn={class:"config-section"},bn={key:0,class:"config-section"},xn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},En={class:"config-section"},wn=oe({__name:"StartNodeConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("echoAlgodata",null),b=e.computed(()=>{const c=(a?.value??a)?.ruleSchema?.sourceGroups??[];if(c.some(L=>L.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const C=c.length>1,l=c.some(L=>(L.children??[]).length>1);return C||l?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(b,_=>{_.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:_.value})},{immediate:!0});const T=e.ref(!1),D=e.ref(null),z=()=>{const _=D.value?.getFormData();if(_?.validTime){const C=(JSON.parse(_.timeZone)?.plan??[]).map(l=>({dayType:String(l.dayType),timePeriod:l.timePeriod.map(L=>({startTime:L.startTime,endTime:L.endTime}))}));o.updateNodeData(t.value.id,{executionTime:_.timeZone,schedule:C,timeZone:_.timeZone,planType:_.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});T.value=!1},q=()=>{const _=t.value?.data;_?.timeZone&&D.value?.revertByTime(_.timeZone,_.planType??0)},u=e.computed(()=>t.value?o.edges.filter(c=>c.source===t.value.id).length>=2:!1),x=_=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:_})};return(_,c)=>{const C=e.resolveComponent("el-divider"),l=e.resolveComponent("el-input"),L=e.resolveComponent("el-form-item"),$=e.resolveComponent("el-form"),f=e.resolveComponent("el-option"),M=e.resolveComponent("el-select"),B=e.resolveComponent("el-switch"),S=e.resolveComponent("el-button"),g=e.resolveComponent("el-dialog"),E=e.resolveComponent("el-icon"),i=e.resolveComponent("el-tooltip"),s=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[c[15]||(c[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(C),e.createElementVNode("div",kn,[c[9]||(c[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.algorithmName,disabled:h.value,onInput:c[0]||(c[0]=y=>x(y)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),h.value?(e.openBlock(),e.createElementBlock("div",bn,[c[10]||(c[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.taskName,onInput:c[1]||(c[1]=y=>e.unref(o).updateNodeData(t.value.id,{taskName:y})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(M,{"model-value":b.value.locked?b.value.value:t.value?.data.streamType||"image",disabled:b.value.locked,onChange:c[2]||(c[2]=y=>e.unref(o).updateNodeData(t.value.id,{streamType:y})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"图片流",value:"image"}),e.createVNode(f,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),b.value.locked?(e.openBlock(),e.createElementBlock("div",xn,e.toDisplayString(b.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(L,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(B,{"model-value":t.value?.data.enableAlertVideo,onChange:c[3]||(c[3]=y=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:y}))},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:c[4]||(c[4]=y=>T.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(g,{modelValue:T.value,"onUpdate:modelValue":c[6]||(c[6]=y=>T.value=y),title:"执行时段",width:"1200px","append-to-body":"",onOpened:q},{footer:e.withCtx(()=>[e.createVNode(S,{onClick:c[5]||(c[5]=y=>T.value=!1)},{default:e.withCtx(()=>[...c[11]||(c[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(S,{type:"primary",onClick:z},{default:e.withCtx(()=>[...c[12]||(c[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(Cn,{ref_key:"timeTemplateRef",ref:D},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",En,[c[14]||(c[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(M,{"model-value":t.value?.data.branchLogic||"and",disabled:h.value,onChange:c[7]||(c[7]=y=>e.unref(o).updateNodeData(t.value.id,{branchLogic:y})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(f,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),u.value?(e.openBlock(),e.createBlock(L,{key:0},{label:e.withCtx(()=>[c[13]||(c[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(i,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(E,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:c[8]||(c[8]=y=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:y})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),Tn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Sn=["smallModel","detectionTarget"],we=()=>({schemaLoading:e.ref(!1),getToolType:a=>Tn[a]||null,needsToolSelection:a=>Sn.includes(a),fetchToolSchema:async(a,b="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(a,b="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Vn={key:0,class:"config-section"},Bn={key:3,class:"array-input"},An={key:1,class:"config-section"},Dn=oe({__name:"EndNodeConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:d,fetchSchemaForNodeType:h}=we(),a=e.computed(()=>{if(!t.value)return[];const u=t.value.data.input_schema||t.value.data.inputSchema;if(!u||!u.properties)return[];const x=u.required||[];return Object.entries(u.properties).map(([_,c])=>({key:_,type:c.type,label:c.title||c.label||c.description||_,description:c.description||"",default:c.default,required:x.includes(_)||c.required||!1,min:c.minimum!==void 0?c.minimum:c.min,max:c.maximum!==void 0?c.maximum:c.max,step:c.step,maxLength:c.maxLength,options:c.enum,optionLabels:c.enumLabels||c.enum,dependsOn:c.dependsOn}))}),b=u=>{if(t.value)return t.value.data.arguments?.[u]},T=(u,x)=>{if(!t.value)return;const c={...t.value.data.arguments||{},[u]:x};o.updateNodeData(t.value.id,{arguments:c})},D=u=>{if(!u.dependsOn||!t.value)return!0;const{field:x,value:_}=u.dependsOn,c=b(x);if(typeof _=="string"&&_.startsWith("!")){const C=_.substring(1);return c!==C}return Array.isArray(_)?_.includes(c):c===_},z=u=>{const x=b(u);return Array.isArray(x)?JSON.stringify(x):""},q=(u,x)=>{try{const _=JSON.parse(x);Array.isArray(_)&&T(u,_)}catch{}};return e.watch(()=>t.value?.id,async u=>{if(!u||!t.value)return;const x=t.value.type,_=t.value.data,c=_.input_schema||_.inputSchema;if(c&&c.properties&&Object.keys(c.properties).length>0)return;const C=await h(x);if(!C)return;const l=t.value?.data;l&&o.updateNodeData(t.value.id,{...l,input_schema:C.inputSchema,extraConfig:C.extraConfig,arguments:{...C.arguments,...l.arguments}})},{immediate:!0}),(u,x)=>{const _=e.resolveComponent("el-divider"),c=e.resolveComponent("el-icon"),C=e.resolveComponent("el-tooltip"),l=e.resolveComponent("el-option"),L=e.resolveComponent("el-select"),$=e.resolveComponent("el-switch"),f=e.resolveComponent("el-input-number"),M=e.resolveComponent("el-input"),B=e.resolveComponent("el-form-item"),S=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[x[2]||(x[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(_),a.value.length>0?(e.openBlock(),e.createElementBlock("div",Vn,[x[0]||(x[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(S,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,g=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:g.key,required:g.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(g.label),1),g.description?(e.openBlock(),e.createBlock(C,{key:0,content:g.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[g.options&&g.type==="string"?(e.openBlock(),e.createBlock(L,{key:0,"model-value":b(g.key),onChange:E=>T(g.key,E),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(E,i)=>(e.openBlock(),e.createBlock(l,{key:E,label:g.optionLabels?g.optionLabels[i]:E,value:E},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):g.type==="boolean"?(e.openBlock(),e.createBlock($,{key:1,"model-value":b(g.key),onChange:E=>T(g.key,E)},null,8,["model-value","onChange"])):g.type==="number"||g.type==="integer"?(e.openBlock(),e.createBlock(f,{key:2,"model-value":b(g.key),onChange:E=>T(g.key,E),min:g.min,max:g.max,step:g.step||(g.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):g.type==="array"&&!g.options?(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(M,{"model-value":z(g.key),onChange:E=>q(g.key,E),type:"textarea",rows:3,placeholder:g.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):g.type==="array"&&g.options?(e.openBlock(),e.createBlock(L,{key:4,"model-value":b(g.key),onChange:E=>T(g.key,E),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(E,i)=>(e.openBlock(),e.createBlock(l,{key:E,label:g.optionLabels?g.optionLabels[i]:E,value:E},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(M,{key:5,"model-value":b(g.key),onInput:E=>T(g.key,E),maxlength:g.maxLength,"show-word-limit":!!g.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!g.dependsOn||D(g)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(d)&&a.value.length===0?(e.openBlock(),e.createElementBlock("div",An,[...x[1]||(x[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),Ln={class:"config-header"},On={class:"config-section"},Mn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},In={key:0,class:"config-section"},Rn={key:3,class:"array-input"},$n={key:1,class:"config-section"},Fn={key:2,class:"config-section"},qn=oe({__name:"ClassificationModelConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("editorConfig",null),b=e.computed(()=>(a?.value??a)?.classification?.models??[]),T=e.computed(()=>(a?.value??a)?.classification?.modelParams??null),D=e.ref([]),z=e.ref(!1),q=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:B=>{t.value&&B&&l("modelId",B)}}),u=()=>{D.value=b.value},x=async B=>{if(!t.value||!B)return;const S=D.value.find(s=>s.id===B);if(!S)return;const g=t.value?.data;if(!g)return;const E=S.inputSchema||S.input_schema||T.value?.inputSchema||{},i={};E.properties&&Object.entries(E.properties).forEach(([s,y])=>{y.default!==void 0&&(i[s]=y.default)}),o.updateNodeData(t.value.id,{...g,input_schema:E,extraConfig:S.extraConfig||null,arguments:{...i,modelId:S.id,modelName:S.name}})},_=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},c=e.computed(()=>{if(!t.value)return[];const B=t.value.data.input_schema||t.value.data.inputSchema;if(!B||!B.properties)return[];const S=B.required||[];return Object.entries(B.properties).map(([g,E])=>({key:g,type:E.type,label:E.title||E.label||E.description||g,description:E.description||"",default:E.default,required:S.includes(g)||E.required||!1,min:E.minimum!==void 0?E.minimum:E.min,max:E.maximum!==void 0?E.maximum:E.max,step:E.step,maxLength:E.maxLength,options:E.enum,optionLabels:E.enumLabels||E.enum,dependsOn:E.dependsOn,sort:E.sort,hidden:E["x-hidden"]||!1})).filter(g=>!g.hidden).sort((g,E)=>(g.sort??1/0)-(E.sort??1/0))}),C=B=>{if(t.value)return t.value.data.arguments?.[B]},l=(B,S)=>{if(!t.value)return;const E={...t.value.data.arguments||{},[B]:S};o.updateNodeData(t.value.id,{arguments:E})},L=B=>{if(!B.dependsOn||!t.value)return!0;const{field:S,value:g}=B.dependsOn,E=C(S);if(typeof g=="string"&&g.startsWith("!")){const i=g.substring(1);return E!==i}return Array.isArray(g)?g.includes(E):E===g},$=B=>{const S=C(B);return Array.isArray(S)?JSON.stringify(S):""},f=(B,S)=>{try{const g=JSON.parse(S);Array.isArray(g)&&l(B,g)}catch{}},M=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async B=>{if(!B||!t.value)return;D.value.length===0&&u();const S=t.value.data,g=S.input_schema||S.inputSchema,E=S.arguments?.modelId;if(E&&g&&g.properties&&Object.keys(g.properties).length>0||!E)return;const i=D.value.find(w=>w.id===E);if(!i)return;const s=i.inputSchema||i.input_schema||T.value?.inputSchema||{},y={};s.properties&&Object.entries(s.properties).forEach(([w,H])=>{H.default!==void 0&&(y[w]=H.default)});const p=t.value?.data;p&&o.updateNodeData(t.value.id,{...p,input_schema:s,extraConfig:i.extraConfig||null,arguments:{...y,...p.arguments}})},{immediate:!0}),(B,S)=>{const g=e.resolveComponent("el-button"),E=e.resolveComponent("el-divider"),i=e.resolveComponent("el-option"),s=e.resolveComponent("el-select"),y=e.resolveComponent("el-form-item"),p=e.resolveComponent("el-form"),w=e.resolveComponent("el-icon"),H=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-switch"),G=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ln,[S[1]||(S[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:M},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",On,[S[2]||(S[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(s,{modelValue:q.value,"onUpdate:modelValue":S[0]||(S[0]=j=>q.value=j),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:z.value,disabled:h.value,onChange:x,onClear:_},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,j=>(e.openBlock(),e.createBlock(i,{key:j.id,label:j.name,value:j.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),D.value.length===0&&!z.value?(e.openBlock(),e.createElementBlock("div",Mn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),q.value&&c.value.length>0?(e.openBlock(),e.createElementBlock("div",In,[S[3]||(S[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,j=>e.withDirectives((e.openBlock(),e.createBlock(y,{key:j.key,required:j.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(j.label),1),j.description?(e.openBlock(),e.createBlock(H,{key:0,content:j.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[j.options&&j.type==="string"?(e.openBlock(),e.createBlock(s,{key:0,"model-value":C(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>l(j.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(j.options,(Y,N)=>(e.openBlock(),e.createBlock(i,{key:Y,label:j.optionLabels?j.optionLabels[N]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):j.type==="boolean"?(e.openBlock(),e.createBlock(F,{key:1,"model-value":C(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>l(j.key,Y)},null,8,["model-value","disabled","onChange"])):j.type==="number"||j.type==="integer"?(e.openBlock(),e.createBlock(G,{key:2,"model-value":C(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>l(j.key,Y),min:j.min,max:j.max,step:j.step||(j.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):j.type==="array"&&!j.options?(e.openBlock(),e.createElementBlock("div",Rn,[e.createVNode(P,{"model-value":$(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>f(j.key,Y),type:"textarea",rows:3,placeholder:j.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):j.type==="array"&&j.options?(e.openBlock(),e.createBlock(s,{key:4,"model-value":C(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>l(j.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(j.options,(Y,N)=>(e.openBlock(),e.createBlock(i,{key:Y,label:j.optionLabels?j.optionLabels[N]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(P,{key:5,"model-value":C(j.key),disabled:h.value&&j.key!=="threshold",onInput:Y=>l(j.key,Y),maxlength:j.maxLength,"show-word-limit":!!j.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!j.dependsOn||L(j)]])),128))]),_:1})])):e.createCommentVNode("",!0),q.value&&z.value&&c.value.length===0?(e.openBlock(),e.createElementBlock("div",$n,[...S[4]||(S[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!q.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Fn,[...S[5]||(S[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),Gn={class:"config-header"},Hn={class:"config-section"},Pn=oe({__name:"OcrConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("editorConfig",null),b=e.computed(()=>(a?.value??a)?.ocr?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(q,u)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[q]:u}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,q=>{if(!q||!t.value)return;const u=b.value,x=t.value.data.arguments||{},_={};u?.properties&&Object.entries(u.properties).forEach(([c,C])=>{C.default!==void 0&&(_[c]=C.default)}),o.updateNodeData(t.value.id,{arguments:{..._,...x}})},{immediate:!0}),(q,u)=>{const x=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),C=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Gn,[u[1]||(u[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Hn,[u[2]||(u[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(C,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:u[0]||(u[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),jn={class:"config-header"},zn={class:"config-section"},Un=oe({__name:"LicensePlateConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("editorConfig",null),b=e.computed(()=>(a?.value??a)?.license_plate?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(q,u)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[q]:u}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,q=>{if(!q||!t.value)return;const u=b.value,x=t.value.data.arguments||{},_={};u?.properties&&Object.entries(u.properties).forEach(([c,C])=>{C.default!==void 0&&(_[c]=C.default)}),o.updateNodeData(t.value.id,{arguments:{..._,...x}})},{immediate:!0}),(q,u)=>{const x=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),C=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[u[1]||(u[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",zn,[u[2]||(u[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(C,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:u[0]||(u[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Wn={class:"config-header"},Jn={class:"config-section"},Yn={key:0,class:"config-section"},We=oe({__name:"FaceConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("editorConfig",null),b=e.computed(()=>(a?.value??a)?.face?.faceRepos??[]),T=e.ref(null),D=e.computed(()=>({repositoryId:x.value})),z={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},q=e.computed(()=>t.value?.data.arguments?.threshold??.5),u=C=>t.value?.data.arguments?.[C],x=e.computed(()=>{const C=u("repositoryId");return C?Array.isArray(C)?C:[C]:[]}),_=(C,l)=>{if(!t.value)return;const L=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...L,[C]:l}})},c=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,C=>{if(!C||!t.value)return;const L=(a?.value??a)?.face?.faceParams?.[0]?.inputSchema??null,$=t.value.data.arguments||{},f={};L?.properties&&Object.entries(L.properties).forEach(([M,B])=>{B.default!==void 0&&(f[M]=B.default)}),o.updateNodeData(t.value.id,{arguments:{...f,...$}})},{immediate:!0}),(C,l)=>{const L=e.resolveComponent("el-button"),$=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),M=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form"),S=e.resolveComponent("el-option"),g=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Wn,[l[2]||(l[2]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode($),e.createElementVNode("div",Jn,[l[3]||(l[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(M,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":q.value,onChange:l[0]||(l[0]=E=>_("threshold",E)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(d)==="task"?(e.openBlock(),e.createElementBlock("div",Yn,[l[4]||(l[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(B,{model:D.value,rules:z,ref_key:"faceFormRef",ref:T,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(M,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":x.value,onChange:l[1]||(l[1]=E=>_("repositoryId",E)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,E=>(e.openBlock(),e.createBlock(S,{key:E.id,label:E.name,value:E.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Xn={class:"config-header"},Qn={key:0,class:"config-section"},Kn={key:3,class:"array-input"},Zn={key:1,class:"config-section"},vn=oe({__name:"StreamConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),{schemaLoading:a,fetchSchemaForNodeType:b}=we(),T=e.computed(()=>{if(!t.value)return[];const c=t.value.data.input_schema||t.value.data.inputSchema;if(!c||!c.properties)return[];const C=c.required||[];return Object.entries(c.properties).map(([l,L])=>({key:l,type:L.type,label:L.title||L.label||L.description||l,description:L.description||"",default:L.default,required:C.includes(l)||L.required||!1,min:L.minimum!==void 0?L.minimum:L.min,max:L.maximum!==void 0?L.maximum:L.max,step:L.step,maxLength:L.maxLength,options:L.enum,optionLabels:L.enumLabels||L.enum,dependsOn:L.dependsOn,sort:L.sort})).sort((l,L)=>(l.sort??1/0)-(L.sort??1/0))}),D=c=>{if(t.value)return t.value.data.arguments?.[c]},z=(c,C)=>{if(!t.value)return;const L={...t.value.data.arguments||{},[c]:C};o.updateNodeData(t.value.id,{arguments:L})},q=c=>{if(!c.dependsOn||!t.value)return!0;const{field:C,value:l}=c.dependsOn,L=D(C);if(typeof l=="string"&&l.startsWith("!")){const $=l.substring(1);return L!==$}return Array.isArray(l)?l.includes(L):L===l},u=c=>{const C=D(c);return Array.isArray(C)?JSON.stringify(C):""},x=(c,C)=>{try{const l=JSON.parse(C);Array.isArray(l)&&z(c,l)}catch{}},_=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async c=>{if(!c||!t.value)return;const C=t.value.type,l=t.value.data,L=l.input_schema||l.inputSchema;if(L&&L.properties&&Object.keys(L.properties).length>0)return;const $=await b(C);if(!$)return;const f=t.value?.data;f&&o.updateNodeData(t.value.id,{...f,input_schema:$.inputSchema,extraConfig:$.extraConfig,arguments:{...$.arguments,...f.arguments}})},{immediate:!0}),(c,C)=>{const l=e.resolveComponent("el-button"),L=e.resolveComponent("el-divider"),$=e.resolveComponent("el-icon"),f=e.resolveComponent("el-tooltip"),M=e.resolveComponent("el-option"),B=e.resolveComponent("el-select"),S=e.resolveComponent("el-switch"),g=e.resolveComponent("el-input-number"),E=e.resolveComponent("el-input"),i=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Xn,[C[0]||(C[0]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(l,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:_},null,8,["icon"]))]),e.createVNode(L),T.value.length>0?(e.openBlock(),e.createElementBlock("div",Qn,[C[1]||(C[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,y=>e.withDirectives((e.openBlock(),e.createBlock(i,{key:y.key,required:y.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(y.label),1),y.description?(e.openBlock(),e.createBlock(f,{key:0,content:y.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode($,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[y.options&&y.type==="string"?(e.openBlock(),e.createBlock(B,{key:0,"model-value":D(y.key),onChange:p=>z(y.key,p),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(p,w)=>(e.openBlock(),e.createBlock(M,{key:p,label:y.optionLabels?y.optionLabels[w]:p,value:p},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):y.type==="boolean"?(e.openBlock(),e.createBlock(S,{key:1,"model-value":D(y.key),onChange:p=>z(y.key,p)},null,8,["model-value","onChange"])):y.type==="number"||y.type==="integer"?(e.openBlock(),e.createBlock(g,{key:2,"model-value":D(y.key),onChange:p=>z(y.key,p),min:y.min,max:y.max,step:y.step||(y.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):y.type==="array"&&!y.options?(e.openBlock(),e.createElementBlock("div",Kn,[e.createVNode(E,{"model-value":u(y.key),onChange:p=>x(y.key,p),type:"textarea",rows:3,placeholder:y.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):y.type==="array"&&y.options?(e.openBlock(),e.createBlock(B,{key:4,"model-value":D(y.key),onChange:p=>z(y.key,p),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(p,w)=>(e.openBlock(),e.createBlock(M,{key:p,label:y.optionLabels?y.optionLabels[w]:p,value:p},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(E,{key:5,"model-value":D(y.key),onInput:p=>z(y.key,p),maxlength:y.maxLength,"show-word-limit":!!y.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!y.dependsOn||q(y)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(a)&&T.value.length===0?(e.openBlock(),e.createElementBlock("div",Zn,[...C[2]||(C[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),ea={class:"config-header"},ta={class:"config-section"},oa={key:0,class:"config-section"},na={key:1,class:"config-section"},aa={key:0,class:"el-form-item__error"},la={key:2,class:"config-section"},ra={key:3,class:"config-section"},sa={key:4,class:"config-section"},ia=oe({__name:"DataSourceConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.inject("taskModeConfig",null),a=e.computed(()=>d==="task"),b=e.computed(()=>l("deviceType")??"camera"),T=e.computed(()=>{const i=o.nodes.find(y=>y.type===k.START);return i?.data?.streamType?i.data.streamType:(h?.value??h)?.streamType??"image"}),D=e.computed(()=>{const i=h?.value??h,s=t.value?.id;return i?.datasource?.getDevices?.(s)?.length??0}),z=()=>{const i=h?.value??h,s=t.value?.id,y=t.value?.data?.label??"",p=i?.datasource?.getDevices?.(s)??[],w=o.nodes.filter(F=>F.type===k.DATA_SOURCE).findIndex(F=>F.id===s),H=t.value?.data?.sourceGroupId??i?.datasource?.getSourceGroupIdByIndex?.(w)??s;i?.datasource?.onDeviceClick?.(s,y,H,p,b.value)},{fetchSchemaForNodeType:q}=we(),u=e.computed(()=>o.nodes.some(i=>i.type===k.SMALL_MODEL)),x=e.computed(()=>o.getDataSourceCount()>=2),_=e.computed(()=>!o.supportPatrol()),c=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),C=e.computed(()=>{if(!t.value)return[];const i=t.value.data.input_schema||t.value.data.inputSchema;if(!i||!i.properties)return[];const s=i.required||[];return Object.entries(i.properties).map(([y,p])=>({key:y,type:p.type,label:p.title||p.label||p.description||y,description:p.description||"",default:p.default,required:s.includes(y)||p.required||!1,min:p.minimum!==void 0?p.minimum:p.min,max:p.maximum!==void 0?p.maximum:p.max,step:p.step,maxLength:p.maxLength,options:p.enum,optionLabels:p.enumLabels||p.enum,dependsOn:p.dependsOn}))}),l=i=>{if(t.value)return t.value.data.arguments?.[i]},L=e.computed(()=>!!l("enableImageSequence")),$=e.computed(()=>!!l("needCooperativeDetection")),f=(i,s)=>{if(!t.value)return;const p={...t.value.data.arguments||{},[i]:s};o.updateNodeData(t.value.id,{arguments:p})},M=async i=>{if(!t.value)return;if(o.edges.some(y=>y.source===t.value.id))try{await Z.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(p=>p.source===t.value.id).forEach(p=>{o.removeEdge(p.id)}),i&&f("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),f("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)}catch{return}else i&&f("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),f("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)},B=i=>{t.value&&(i&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),f("enableImageSequence",!1),f("enablePatrol",!1)),f("needCooperativeDetection",i))};e.watch(T,i=>{i==="stream"&&t.value&&l("deviceType")==="1400"&&f("deviceType","camera")},{immediate:!0});const S=e.computed(()=>a.value&&b.value==="camera"&&T.value!=="stream"&&o.supportPatrol());e.watch(S,i=>{!i&&t.value&&l("enablePatrol")&&f("enablePatrol",!1)}),e.watch(D,i=>{i>0&&l("enablePatrol")&&(l("patrolGroupSize")??1)>i&&f("patrolGroupSize",i)});const g=i=>{if(!i.dependsOn||!t.value)return!0;const{field:s,value:y}=i.dependsOn,p=l(s);if(typeof y=="string"&&y.startsWith("!")){const w=y.substring(1);return p!==w}return Array.isArray(y)?y.includes(p):p===y},E=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async i=>{if(!i||!t.value)return;const s=t.value.type,y=t.value.data;if(s==="dataSource"&&a.value){const F=y.arguments||{},G={},P=o.nodes.some(j=>j.type===k.SMALL_MODEL);F.mode===void 0&&(G.mode=P?3:0),F.interval===void 0&&(G.interval=30),T.value==="stream"&&F.sw_decoding===void 0&&(G.sw_decoding="CPU"),Object.keys(G).length>0&&o.updateNodeData(i,{arguments:{...F,...G}})}const p=y.input_schema||y.inputSchema;if(s==="dataSource"&&p&&p.properties&&!p.properties.windowSeconds){p.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},y.arguments.windowSeconds||o.updateNodeData(t.value.id,{...y,input_schema:p,arguments:{...y.arguments,windowSeconds:5}});return}if(p&&p.properties&&Object.keys(p.properties).length>0)return;const w=await q(s);if(!w)return;const H=t.value?.data;H&&o.updateNodeData(t.value.id,{...H,input_schema:w.inputSchema,extraConfig:w.extraConfig,arguments:{...w.arguments,...H.arguments}})},{immediate:!0}),(i,s)=>{const y=e.resolveComponent("el-button"),p=e.resolveComponent("el-divider"),w=e.resolveComponent("el-icon"),H=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-option"),G=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),j=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),N=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-form"),R=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ea,[s[11]||(s[11]=e.createElementVNode("h3",null,"节点配置",-1)),a.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(y,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:E},null,8,["icon"]))]),e.createVNode(p),e.createElementVNode("div",ta,[s[12]||(s[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.value,r=>e.withDirectives((e.openBlock(),e.createBlock(N,{key:r.key,required:r.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(r.label),1),r.description?(e.openBlock(),e.createBlock(H,{key:0,content:r.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[r.options&&r.type==="string"?(e.openBlock(),e.createBlock(G,{key:0,"model-value":l(r.key),onChange:m=>f(r.key,m),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.options,(m,V)=>(e.openBlock(),e.createBlock(F,{key:m,label:r.optionLabels?r.optionLabels[V]:m,value:m},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):r.type==="boolean"?(e.openBlock(),e.createBlock(H,{key:1,content:a.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":r.key==="needCooperativeDetection"&&L.value?"已开启图片时序,无法同时开启协同检测":r.key==="enableImageSequence"&&$.value?"已开启协同检测,无法同时开启图片时序":r.key==="enableImageSequence"&&x.value?"多数据源场景下不允许开启图片时序":"",disabled:!(a.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence"))&&!(r.key==="needCooperativeDetection"&&L.value)&&!(r.key==="enableImageSequence"&&$.value)&&!(r.key==="enableImageSequence"&&x.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":l(r.key),disabled:a.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence")||r.key==="needCooperativeDetection"&&L.value||r.key==="enableImageSequence"&&$.value||r.key==="enableImageSequence"&&x.value,onChange:m=>r.key==="enableImageSequence"?M(m):r.key==="needCooperativeDetection"?B(m):f(r.key,m)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):r.type==="number"||r.type==="integer"?(e.openBlock(),e.createBlock(j,{key:2,"model-value":l(r.key),onChange:m=>f(r.key,m),min:r.min,max:r.max,step:r.step||(r.type==="integer"?1:.1),precision:r.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(Y,{key:3,"model-value":l(r.key),onInput:m=>f(r.key,m),maxlength:r.maxLength,"show-word-limit":!!r.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!r.dependsOn||g(r)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",oa,[s[13]||(s[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":t.value?.data.branchLogic||"and",disabled:a.value,onChange:s[0]||(s[0]=r=>e.unref(o).updateNodeData(t.value.id,{branchLogic:r})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(F,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(F,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),a.value?(e.openBlock(),e.createElementBlock("div",na,[s[16]||(s[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("deviceType")??"camera",onChange:s[1]||(s[1]=r=>f("deviceType",r))},{default:e.withCtx(()=>[e.createVNode(R,{value:"camera"},{default:e.withCtx(()=>[...s[14]||(s[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(R,{value:"1400",disabled:T.value==="stream"},{default:e.withCtx(()=>[...s[15]||(s[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(N,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${D.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":D.value===0}),onClick:z},null,8,["model-value","class"]),D.value===0?(e.openBlock(),e.createElementBlock("div",aa,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),a.value&&b.value==="1400"?(e.openBlock(),e.createElementBlock("div",la,[s[19]||(s[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("detectionMode")??"platform",onChange:s[2]||(s[2]=r=>f("detectionMode",r))},{default:e.withCtx(()=>[e.createVNode(R,{value:"platform"},{default:e.withCtx(()=>[...s[17]||(s[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(R,{value:"device"},{default:e.withCtx(()=>[...s[18]||(s[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),a.value&&b.value==="camera"&&T.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ra,[s[21]||(s[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(H,{disabled:!_.value,content:c.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":_.value?!1:l("enablePatrol"),disabled:_.value,onChange:s[3]||(s[3]=r=>f("enablePatrol",r))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),l("enablePatrol")?(e.openBlock(),e.createBlock(N,{key:0},{label:e.withCtx(()=>[s[20]||(s[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(H,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(j,{"model-value":l("patrolGroupSize")??1,onChange:s[4]||(s[4]=r=>f("patrolGroupSize",r)),min:1,max:D.value>0?D.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),a.value&&b.value==="camera"?(e.openBlock(),e.createElementBlock("div",sa,[s[22]||(s[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"抽帧策略"},{default:e.withCtx(()=>[T.value==="image"?(e.openBlock(),e.createBlock(G,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"按时间间隔抽帧",value:0})]),_:1})):u.value?(e.openBlock(),e.createBlock(G,{key:1,"model-value":l("mode")??3,onChange:s[5]||(s[5]=r=>{f("mode",r),r===1&&f("interval",u.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"每一帧都检测",value:3}),e.createVNode(F,{label:"跳帧检测",value:1}),e.createVNode(F,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(G,{key:2,"model-value":l("mode")??0,onChange:s[6]||(s[6]=r=>{f("mode",r),r===0&&f("interval",30),r===1&&f("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"按时间间隔抽帧",value:0}),e.createVNode(F,{label:"跳帧检测",value:1}),e.createVNode(F,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),T.value==="image"||T.value==="stream"&&(l("mode")??0)===0?(e.openBlock(),e.createBlock(N,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":l("interval")??30,onChange:s[7]||(s[7]=r=>f("interval",r)),min:1,max:T.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),T.value==="stream"&&(l("mode")??0)===1?(e.openBlock(),e.createBlock(N,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[u.value?(e.openBlock(),e.createBlock(j,{key:0,"model-value":l("interval")??5,onChange:s[8]||(s[8]=r=>f("interval",r)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(G,{key:1,"model-value":l("interval")??25,onChange:s[9]||(s[9]=r=>f("interval",r)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:25,value:25}),e.createVNode(F,{label:50,value:50}),e.createVNode(F,{label:75,value:75}),e.createVNode(F,{label:125,value:125}),e.createVNode(F,{label:250,value:250}),e.createVNode(F,{label:375,value:375}),e.createVNode(F,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),T.value==="stream"?(e.openBlock(),e.createBlock(N,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":l("sw_decoding")??"CPU",onChange:s[10]||(s[10]=r=>f("sw_decoding",r)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"GPU",value:"GPU"}),e.createVNode(F,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),ca={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Je=(n=null)=>{const o=e.ref(n||[]),t=e.ref(!1),d=e.ref(null),h=e.ref(""),a=async(_=!1)=>{if(n){o.value=n;return}},b=async()=>{o.value=[],await a(!0)},T=_=>o.value.find(c=>c.id===_||c.title===_),D=_=>{const c=T(_);if(!c)return{};const C=c.inputSchema||c.input_schema;if(!C||!C.properties)return{};const l={};return Object.entries(C.properties).forEach(([L,$])=>{$.default!==void 0&&(l[L]=$.default)}),l},z=_=>{const c=T(_);if(!c)return[];const C=c.inputSchema||c.input_schema;if(!C||!C.properties)return[];const l=C.required||[];return Object.entries(C.properties).map(([L,$])=>({key:L,type:$.type,label:$.title||$.description||L,description:$.description||"",default:$.default,required:l.includes(L)||$.required||!1,min:$.minimum,max:$.maximum,step:$.step,options:$.enum,optionLabels:$.enumLabels||$.enum,dependsOn:$.dependsOn}))},q=e.computed(()=>{if(!h.value)return o.value;const _=h.value.toLowerCase();return o.value.filter(c=>c.name?.toLowerCase().includes(_)||c.type?.toLowerCase().includes(_)||c.title?.toLowerCase().includes(_)||c.description&&c.description.toLowerCase().includes(_)||u(c.type).toLowerCase().includes(_))}),u=_=>ca[_]||_;return{models:o,loading:t,error:d,searchKeyword:h,filteredModels:q,loadSmallModels:a,reloadSmallModels:b,getModelConfig:T,getTypeLabel:u,getDefaultArguments:D,getSchemaFields:z,validateArguments:(_,c)=>{const C=T(_);if(!C)return{valid:!1,errors:["模型不存在"]};const l=[],L=C.inputSchema||C.input_schema;return!L||!L.properties?{valid:!0,errors:[]}:(Object.entries(L.properties).forEach(([$,f])=>{const M=c[$];if(f.required&&(M==null||M==="")){l.push(`${f.title||$} 为必填项`);return}if(M!=null&&(f.type==="number"||f.type==="integer")){if(typeof M!="number"){l.push(`${f.title||$} 必须是数字`);return}f.minimum!==void 0&&M<f.minimum&&l.push(`${f.title||$} 不能小于 ${f.minimum}`),f.maximum!==void 0&&M>f.maximum&&l.push(`${f.title||$} 不能大于 ${f.maximum}`)}}),{valid:l.length===0,errors:l})}}},da={class:"small-model-selector"},ma={key:0,class:"loading-state"},pa={key:1,class:"error-state"},ua={key:2,class:"model-list"},fa=["onClick"],ga={class:"model-header"},ha={class:"model-name"},ya={class:"model-description"},_a={class:"model-meta"},Na={key:3,class:"empty-state"},Ca=oe({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(n,{emit:o}){const t=n,d=o,{loading:h,error:a,searchKeyword:b,filteredModels:T,loadSmallModels:D,reloadSmallModels:z,getTypeLabel:q}=Je(t.externalModels),u=c=>{d("update:modelValue",c.id),d("select",c)},x=()=>{z()},_=c=>({safety:"warning",security:"danger",traffic:"info"})[c]||"info";return e.onMounted(()=>{t.externalModels||D()}),(c,C)=>{const l=e.resolveComponent("el-input"),L=e.resolveComponent("el-icon"),$=e.resolveComponent("el-button"),f=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",da,[e.createVNode(l,{modelValue:e.unref(b),"onUpdate:modelValue":C[0]||(C[0]=M=>e.isRef(b)?b.value=M:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(X.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(h)?(e.openBlock(),e.createElementBlock("div",ma,[e.createVNode(L,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),C[2]||(C[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(a)?(e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(L,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(a)),1),e.createVNode($,{type:"primary",onClick:x},{default:e.withCtx(()=>[...C[3]||(C[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(T).length>0?(e.openBlock(),e.createElementBlock("div",ua,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(T),M=>(e.openBlock(),e.createElementBlock("div",{key:M.id,class:e.normalizeClass(["model-item",{selected:n.modelValue===M.id}]),onClick:B=>u(M)},[e.createElementVNode("div",ga,[e.createElementVNode("div",ha,[e.createVNode(L,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(M.name),1)]),e.createVNode(f,{type:_(M.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(q)(M.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ya,e.toDisplayString(M.description),1),e.createElementVNode("div",_a,[M.supportDirectAlert?(e.openBlock(),e.createBlock(f,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...C[4]||(C[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,fa))),128))])):(e.openBlock(),e.createElementBlock("div",Na,[e.createVNode(L,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),C[6]||(C[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode($,{text:"",onClick:C[1]||(C[1]=M=>b.value="")},{default:e.withCtx(()=>[...C[5]||(C[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),ka={class:"position-tooltip"},Te=oe({__name:"PositionTooltip",setup(n){return(o,t)=>(e.openBlock(),e.createElementBlock("div",ka,[...t[0]||(t[0]=[e.createStaticVNode('<div class="tooltip-title" data-v-6ac23ee8>提示说明</div><div class="tooltip-desc" data-v-6ac23ee8> 目标点为点位代表目标位置的点,系统默认使用目标框的中心点表示目标的位置。只有当目标的重心点满足检测框完整落在检测区域时,才表示目标进入检测框或者离开检测区域。 </div><div class="tooltip-examples" data-v-6ac23ee8><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例1:以目标框的中心点代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="60" cy="90" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0.5   Y轴: 0.5</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例2:以目标框的最左上角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="5" cy="5" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0   Y轴: 0</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例3:以目标框的最右下角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="115" cy="175" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 1   Y轴: 1</div></div></div>',3)])]))}},[["__scopeId","data-v-6ac23ee8"]]),ba={class:"config-header"},xa={class:"config-section"},Ea={key:0,class:"model-selector-wrapper"},wa={key:1,class:"selected-model-info"},Ta={class:"model-info-header"},Sa={class:"model-info-name"},Va={class:"model-info-description"},Ba={key:0,class:"config-section"},Aa={key:3,class:"array-input"},Da="检测到事件后,连续两次告警上报的时间间隔",La=oe({__name:"SmallModelConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=e.inject("editorConfig",null),b=e.computed(()=>(a?.value??a)?.smallModels??null),{models:T}=Je(b.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),z={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},q=e.computed(()=>{if(!t.value)return[];const B=t.value.data.input_schema||t.value.data.inputSchema;if(!B||!B.properties)return[];const S=B.required||[],g=t.value.data.title||"";return Object.entries(B.properties).filter(([E])=>D.has(E)).map(([E,i])=>{const s={key:E,type:i.type,label:i.title||i.label||i.description||E,description:i.description||"",default:i.default,required:S.includes(E)||i.required||!1,min:i.minimum!==void 0?i.minimum:i.min,max:i.maximum!==void 0?i.maximum:i.max,step:i.step,maxLength:i.maxLength,options:i.enum,optionLabels:i.enumLabels||i.enum,dependsOn:i.dependsOn,sort:i.sort};return E==="interval"&&(s.label="告警间隔(秒)",s.description=z[g]||Da,s.isInterval=!0,s.default=s.default!=null?s.default/1e3:10,s.min=s.min!=null?s.min/1e3:1,s.max=s.max!=null?s.max/1e3:void 0,s.step=1,s.precision=0),E==="threshold"&&(s.label="小模型阈值",s.step=.01,s.precision=2),E==="targetWidth"&&(s.label="最小目标宽度",s.default=60,s.min=20,s.max=1920,s.step=1,s.precision=0),E==="targetHeight"&&(s.label="最小目标高度",s.default=60,s.min=20,s.max=1080,s.step=1,s.precision=0),E==="topScale"&&(s.label="调整目标框高度比例 (上)",s.max=10,s.step=.1,s.precision=1),E==="bottomScale"&&(s.label="调整目标框高度比例 (下)",s.max=10,s.step=.1,s.precision=1),E==="leftScale"&&(s.label="调整目标框宽度比例 (左)",s.max=10,s.step=.1,s.precision=1),E==="rightScale"&&(s.label="调整目标框宽度比例 (右)",s.max=10,s.step=.1,s.precision=1),E==="x_ratio"&&(s.label="X轴位置信息",s.step=.01,s.precision=2),E==="y_ratio"&&(s.label="Y轴位置信息",s.step=.01,s.precision=2),E==="targetDuration"&&(s.label="目标持续时间(秒)",s.default=s.default!=null?s.default/1e3:1,s.min=s.min!=null?s.min/1e3:1,s.max=s.max!=null?s.max/1e3:void 0,s.step=.01,s.precision=2),E==="overloadNumber"&&(s.precision=0),E==="targetNumber"&&(s.precision=0),s}).filter(E=>!["areas","darwin","direction","lines"].includes(E.key)).filter(E=>!(E.key==="targetDuration"&&g==="NonMotorCounter")).sort((E,i)=>(E.sort??1/0)-(i.sort??1/0))}),u=["interval","targetDuration"],x=B=>{if(!t.value)return;const S=t.value.data.arguments?.[B];return u.includes(B)&&S!=null?S/1e3:S},_=(B,S)=>{if(!t.value)return;let g=S;u.includes(B)&&S!=null&&(g=S*1e3);const i={...t.value.data.arguments||{},[B]:g};o.updateNodeData(t.value.id,{arguments:i})},c=B=>{if(!B.dependsOn||!t.value)return!0;const{field:S,value:g}=B.dependsOn,E=x(S);if(typeof g=="string"&&g.startsWith("!")){const i=g.substring(1);return E!==i}return Array.isArray(g)?g.includes(E):E===g},C=B=>{const S=x(B);return Array.isArray(S)?JSON.stringify(S):""},l=(B,S)=>{try{const g=JSON.parse(S);Array.isArray(g)&&_(B,g)}catch{}},L=async B=>{if(!t.value)return;const S=B.inputSchema||B.input_schema||{},g={};S.properties&&Object.entries(S.properties).forEach(([E,i])=>{i.default!==void 0&&(g[E]=i.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:B.id||B.title,title:B.title,modelName:B.name,modelType:B.type,input_schema:S,extraConfig:B.extraConfig,supportDirectAlert:B.supportDirectAlert||!1,arguments:g})},$=()=>{t.value&&Z.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},f=()=>t.value?.data.modelId?T.value.find(S=>S.id===t.value.data.modelId)?.description||"暂无描述":"",M=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(B,S)=>{const g=e.resolveComponent("el-button"),E=e.resolveComponent("el-divider"),i=e.resolveComponent("el-icon"),s=e.resolveComponent("el-tag"),y=e.resolveComponent("el-tooltip"),p=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),H=e.resolveComponent("el-switch"),F=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input"),P=e.resolveComponent("el-text"),j=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ba,[S[0]||(S[0]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:M},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",xa,[S[3]||(S[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!h.value?(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(Ca,{"model-value":t.value?.data.modelId,"external-models":b.value,onSelect:L},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",wa,[e.createElementVNode("div",Ta,[e.createElementVNode("div",Sa,[e.createVNode(i,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"text",text:"",size:"small",onClick:$},{default:e.withCtx(()=>[...S[1]||(S[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Va,e.toDisplayString(f()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(s,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...S[2]||(S[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ba,[S[4]||(S[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(Y,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(q.value,N=>e.withDirectives((e.openBlock(),e.createBlock(j,{key:N.key,required:N.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(N.label),1),N.key==="x_ratio"||N.key==="y_ratio"?(e.openBlock(),e.createBlock(y,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):N.description?(e.openBlock(),e.createBlock(y,{key:1,content:N.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[N.options&&N.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":x(N.key),onChange:A=>_(N.key,A),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(A,R)=>(e.openBlock(),e.createBlock(p,{key:A,label:N.optionLabels?N.optionLabels[R]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):N.type==="boolean"?(e.openBlock(),e.createBlock(H,{key:1,"model-value":x(N.key),onChange:A=>_(N.key,A)},null,8,["model-value","onChange"])):N.type==="number"||N.type==="integer"||N.type==="float"?(e.openBlock(),e.createBlock(F,{key:2,"model-value":x(N.key),onChange:A=>_(N.key,A),min:N.min,max:N.max,step:N.step||(N.type==="integer"||N.type==="number"?1:.01),precision:N.precision??(N.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):N.type==="array"&&!N.options?(e.openBlock(),e.createElementBlock("div",Aa,[e.createVNode(G,{"model-value":C(N.key),onChange:A=>l(N.key,A),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(P,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(N.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):N.type==="array"&&N.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":x(N.key),onChange:A=>_(N.key,A),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(A,R)=>(e.openBlock(),e.createBlock(p,{key:A,label:N.optionLabels?N.optionLabels[R]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":x(N.key),onInput:A=>_(N.key,A)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!N.dependsOn||c(N)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Oa=(n=null)=>{const o=ae(),t=e.ref(n?n.map(u=>Ee.backendToFrontend(u)):[]),d=e.ref(!1),h=e.ref(null),a=async(u=!1)=>{if(n){t.value=n.map(x=>Ee.backendToFrontend(x));return}},b=u=>t.value.find(x=>x.title===u)||null,T=u=>{const x=b(u);return x?{targetId:x.title,targetName:x.label,threshold:x.data.threshold||.5,targetWidth:x.data.targetWidth||20,targetHeight:x.data.targetHeight||20,postmodel:x.data.postmodel||"ClipVit",areas:x.data.areas||[],expandRect:x.data.expandRect!==void 0?x.data.expandRect:!1,topScale:x.data.topScale||1.6,bottomScale:x.data.bottomScale||1.6,leftScale:x.data.leftScale||1.6,rightScale:x.data.rightScale||1.6,enableStructure:x.data.enableStructure}:{}},D=(u=null)=>o.nodes.filter(x=>x.type==="detectionTarget"&&x.id!==u).map(x=>({value:x.id,label:x.data.targetName||x.data.label})),z=(u=null)=>{const x=[{value:"original",label:"原图"}],_=D(u);return[...x,..._]},q=e.computed(()=>t.value.map(u=>({value:u.title,label:u.label,...u})));return{detectionTargets:t,loading:d,error:h,loadDetectionTargets:a,getTargetById:b,getDefaultConfig:T,getDetectionTargetNodes:D,getDetectionScopeOptions:z,getTargetOptions:q}},Ma={class:"paired-array-input"},Se=oe({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(n,{emit:o}){const t=(q,u)=>{let x;return(..._)=>{clearTimeout(x),x=setTimeout(()=>q(..._),u)}},d=n,h=o,a=e.ref([]),b=()=>{const q=d.primaryValue||[],u=d.pairedValue||[],x=Math.max(q.length,u.length,1);a.value=Array.from({length:x},(_,c)=>({primary:q[c]||"",paired:u[c]!==void 0?u[c]:d.pairedField.default?.[0]||.5}))};e.watch(()=>[d.primaryValue,d.pairedValue],()=>{b()},{immediate:!0,deep:!0});const T=t((q,u)=>{h("update",q,u)},300);e.watch(a,q=>{const u=q.map(_=>_.primary),x=q.map(_=>_.paired);T(u,x)},{deep:!0});const D=()=>{a.value.length>=10||a.value.push({primary:"",paired:d.pairedField.default?.[0]||.5})},z=q=>{a.value.length>1&&a.value.splice(q,1)};return(q,u)=>{const x=e.resolveComponent("el-input"),_=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Ma,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,(C,l)=>(e.openBlock(),e.createElementBlock("div",{key:l,class:"input-row"},[e.createVNode(x,{modelValue:a.value[l].primary,"onUpdate:modelValue":L=>a.value[l].primary=L,placeholder:n.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!a.value[l].primary||a.value[l].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(_,{modelValue:a.value[l].paired,"onUpdate:modelValue":L=>a.value[l].paired=L,min:n.pairedField.min||0,max:n.pairedField.max||1,step:n.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(c,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:a.value.length===1,onClick:L=>z(l)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(c,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:a.value.length>=10,onClick:D},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(n.primaryField.label)+e.toDisplayString(a.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),Ia={class:"config-header"},Ra={class:"config-section"},$a={class:"flex items-center justify-between"},Fa={key:0,class:"config-section"},qa={key:1,class:"config-section"},Ga={key:2,class:"config-section"},Ha={class:"device-list"},Pa=["onClick"],ja={class:"device-name"},za={key:0,class:"device-list-empty"},Ua={key:4,class:"array-input"},Wa={key:4,class:"array-input"},Ja=oe({__name:"DetectionTargetConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d==="task"),a=e.inject("taskModeConfig",null),b=e.inject("echoAlgodata",null),T=e.inject("echoTaskData",null),D=e.computed(()=>{if(!t.value)return null;const N=new Set,A=[t.value.id];for(;A.length;){const R=A.shift();if(N.has(R))continue;N.add(R);const W=o.edges.filter(r=>r.target===R);for(const r of W){const m=o.nodes.find(V=>V.id===r.source);if(m){if(m.type==="dataSource")return m.id;A.push(m.id)}}}return null}),z=e.computed(()=>{const N=D.value;return N?(a?.value??a)?.datasource?.getDevices?.(N)??[]:[]}),q=e.computed(()=>h.value&&z.value.length>0),u=e.ref(""),x=e.ref(""),_=e.computed(()=>{const N=x.value.trim().toLowerCase();return N?z.value.filter(A=>(A.sourceName??A.name??String(A.sourceId??A.id??A)).toLowerCase().includes(N)):z.value}),c=e.computed(()=>{const N={},A=D.value,R=t.value?.id;if(!A||!R)return N;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const r of z.value){const m=String(r.sourceId??r.id??r),V=o.getTaskSourceArguments(A,m,R);if(V===null){N[m]=!1;continue}const I=new Set([...Object.keys(V),...Object.keys(W)]);let U=!1;for(const J of I)if(JSON.stringify(V[J])!==JSON.stringify(W[J])){U=!0;break}N[m]=U}return N});e.watch([z,()=>t.value?.data?.arguments?.configMode],([N])=>{N.length>0?u.value=String(N[0]?.sourceId??N[0]?.id??N[0]):u.value=""},{immediate:!0});const C=(N,A=null)=>{if(A){const m=((T?.value??T)?.graph?.sources??[]).find(V=>String(V.sourceId)===String(A));if(m?.branches)for(const V of m.branches){const I=V.nodes?.find(U=>U.toolTitle===N);if(I?.arguments)return{...I.arguments}}return null}const R=b?.value??b;if(!R?.branches)return null;for(const W of R.branches){const r=W.nodes?.find(m=>m.toolTitle===N);if(r?.arguments)return{...r.arguments}}return null},l=N=>{const A=D.value,R=t.value?.id;if(!A||!R||!N||o.getTaskSourceArguments(A,N,R)!==null)return;const W=t.value?.data?.targetId,r=W?C(W,N):null,m=t.value?.data?.arguments??{},V={...r??m};delete V.configMode,o.setTaskSourceArguments(A,N,R,V)};e.watch(u,N=>{N&&t.value?.data?.arguments?.configMode==="perDevice"&&l(N)}),e.watch(()=>t.value?.data?.arguments?.configMode,N=>{N==="perDevice"&&u.value&&l(u.value)});const L=e.inject("editorConfig",null),$=e.computed(()=>(L?.value??L)?.detection??null),{detectionTargets:f,loading:M}=Oa($.value),B=e.computed(()=>{if(!t.value)return[];const N=t.value.data.input_schema||t.value.data.inputSchema;if(!N||!N.properties)return[];const A=N.required||[];return Object.entries(N.properties).map(([R,W])=>({key:R,type:W.type,label:W.title||W.label||W.description||R,description:W.description||"",default:W.default,required:A.includes(R)||W.required||!1,min:W.minimum!==void 0?W.minimum:W.min,max:W.maximum!==void 0?W.maximum:W.max,step:W.step,maxLength:W.maxLength,options:W.enum,optionLabels:W.enumLabels||W.enum,dependsOn:W.dependsOn,"x-component":W["x-component"],"x-paired-with":W["x-paired-with"],sort:W.sort})).sort((R,W)=>(R.sort??1/0)-(W.sort??1/0))}),S=N=>N.type==="array"&&N["x-component"]==="paired-array"&&N["x-paired-with"],g=N=>{const A=N["x-paired-with"];return B.value.find(R=>R.key===A)},E={targetWidth:{label:"最小目标宽度",min:20,max:1920,step:1,precision:0,default:60},targetHeight:{label:"最小目标高度",min:20,max:1080,step:1,precision:0,default:60},threshold:{label:"检测阈值",step:.01,precision:2},topScale:{label:"调整目标框高度比例 (上)",description:"按照目标框中心点坐标,向上缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},bottomScale:{label:"调整目标框高度比例 (下)",description:"按照目标框中心点坐标,向下缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},rightScale:{label:"调整目标框宽度比例 (右)",description:"按照目标框中心点坐标,向右缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},leftScale:{label:"调整目标框宽度比例 (左)",description:"按照目标框中心点坐标,向左缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},enableStruct:{label:"属性检测"},x_ratio:{label:"X轴位置信息",step:.01,precision:2},y_ratio:{label:"Y轴位置信息",step:.01,precision:2}},i=new Set(Object.keys(E)),s=e.computed(()=>{const N=t.value?.data.targetId,A=new Set;return B.value.forEach(R=>{R["x-paired-with"]&&A.add(R["x-paired-with"])}),B.value.filter(R=>N==="traffic_accident"?R.key==="threshold":i.has(R.key)&&!A.has(R.key)&&!S(R)).map(R=>{const W=E[R.key]||{};return{...R,label:W.label||R.label,description:W.description||R.description,min:W.min??R.min,max:W.max??R.max,step:W.step??R.step,precision:W.precision,default:W.default??R.default}})}),y=e.computed(()=>B.value.filter(N=>S(N))),p=N=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&u.value){const R=D.value,W=o.getTaskSourceArguments(R,u.value,t.value.id);if(W!==null)return W[N]}return t.value.data.arguments?.[N]},w=(N,A)=>{if(!t.value)return;const R=t.value.data.arguments?.configMode;if(N!=="configMode"&&R==="perDevice"&&u.value){const m=D.value;o.updateTaskSourceArgument(m,u.value,t.value.id,N,A);return}const r={...t.value.data.arguments||{},[N]:A};o.updateNodeData(t.value.id,{arguments:r})},H=N=>{if(!N.dependsOn||!t.value)return!0;const{field:A,value:R}=N.dependsOn,W=p(A);if(typeof R=="string"&&R.startsWith("!")){const r=R.substring(1);return W!==r}return Array.isArray(R)?R.includes(W):W===R},F=N=>{const A=p(N);return Array.isArray(A)?JSON.stringify(A):""},G=(N,A)=>{try{const R=JSON.parse(A);Array.isArray(R)&&w(N,R)}catch{}},P=(N,A,R,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&u.value){const I=D.value;o.updateTaskSourceArgument(I,u.value,t.value.id,N,A),o.updateTaskSourceArgument(I,u.value,t.value.id,R,W);return}const V={...t.value.data.arguments||{},[N]:A,[R]:W};o.updateNodeData(t.value.id,{arguments:V})},j=async N=>{if(!t.value||!N)return;const A=f.value.find(V=>V.title===N);if(!A)return;let R=A.inputSchema||A.input_schema||{};if(N==="other"){const V={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};R={...R,properties:{...R.properties,...V.properties}}}const W={};R.properties&&Object.entries(R.properties).forEach(([V,I])=>{I.default!==void 0&&(W[V]=I.default)});const r=t.value.data,m={...W,target_class:A.title};o.updateNodeData(t.value.id,{...r,targetId:A.title,targetName:A.label,label:A.label,input_schema:R,inputSchema:R,extraConfig:A.extraConfig,arguments:m})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,N=>{if(!N||!t.value)return;const A=f.value.find(r=>r.title===N);if(!A)return;const R=t.value.data;if(R.input_schema&&Object.keys(R.input_schema).length>0)return;const W={...A.defaultArguments,...R.arguments,target_class:A.title};o.updateNodeData(t.value.id,{...R,input_schema:A.inputSchema,arguments:W})}),(N,A)=>{const R=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),r=e.resolveComponent("el-option"),m=e.resolveComponent("el-select"),V=e.resolveComponent("el-form-item"),I=e.resolveComponent("el-form"),U=e.resolveComponent("el-radio"),J=e.resolveComponent("el-radio-group"),Q=e.resolveComponent("el-icon"),te=e.resolveComponent("el-tooltip"),se=e.resolveComponent("el-input"),ce=e.resolveComponent("el-switch"),ne=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ia,[A[2]||(A[2]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(R,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",Ra,[A[3]||(A[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.targetId,disabled:h.value,onChange:j,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(M),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f),O=>(e.openBlock(),e.createBlock(r,{key:O.title,label:O.label,value:O.title},{default:e.withCtx(()=>[e.createElementVNode("div",$a,[e.createElementVNode("span",null,e.toDisplayString(O.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),q.value?(e.openBlock(),e.createElementBlock("div",Fa,[A[6]||(A[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:A[0]||(A[0]=O=>w("configMode",O))},{default:e.withCtx(()=>[e.createVNode(U,{value:"unified"},{default:e.withCtx(()=>[...A[4]||(A[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(U,{value:"perDevice"},{default:e.withCtx(()=>[...A[5]||(A[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),y.value.length>0?(e.openBlock(),e.createElementBlock("div",qa,[A[7]||(A[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(I,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,O=>(e.openBlock(),e.createBlock(V,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.description?(e.openBlock(),e.createBlock(te,{key:0,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Se,{"primary-field":O,"paired-field":g(O),"primary-value":p(O.key),"paired-value":p(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",Ga,[A[9]||(A[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&z.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(se,{modelValue:x.value,"onUpdate:modelValue":A[1]||(A[1]=O=>x.value=O),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(Q,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Ha,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.value,O=>(e.openBlock(),e.createElementBlock("div",{key:String(O.sourceId??O.id??O),class:e.normalizeClass(["device-list-item",{"is-active":u.value===String(O.sourceId??O.id??O),"has-custom":c.value[String(O.sourceId??O.id??O)]}]),onClick:K=>u.value=String(O.sourceId??O.id??O)},[e.createElementVNode("span",ja,e.toDisplayString(O.sourceName??O.name??String(O.sourceId??O.id??O)),1),c.value[String(O.sourceId??O.id??O)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...A[8]||(A[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Pa))),128)),_.value.length===0?(e.openBlock(),e.createElementBlock("div",za," 无匹配设备 ")):e.createCommentVNode("",!0)]),u.value?(e.openBlock(),e.createBlock(I,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,O=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(te,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(m,{key:0,"model-value":p(O.key),onChange:K=>w(O.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":p(O.key),onChange:K=>w(O.key,K)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":p(O.key),onChange:K=>w(O.key,K),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S(O)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":O,"paired-field":g(O),"primary-value":p(O.key),"paired-value":p(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Ua,[e.createVNode(se,{"model-value":F(O.key),onChange:K=>G(O.key,K),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(m,{key:5,"model-value":p(O.key),onChange:K=>w(O.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":p(O.key),onInput:K=>w(O.key,K),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||H(O)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(I,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,O=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(te,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(m,{key:0,"model-value":p(O.key),onChange:K=>w(O.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":p(O.key),onChange:K=>w(O.key,K)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":p(O.key),onChange:K=>w(O.key,K),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S(O)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":O,"paired-field":g(O),"primary-value":p(O.key),"paired-value":p(O["x-paired-with"]),onUpdate:(K,le)=>P(O.key,K,O["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Wa,[e.createVNode(se,{"model-value":F(O.key),onChange:K=>G(O.key,K),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(m,{key:5,"model-value":p(O.key),onChange:K=>w(O.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:O.optionLabels?O.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":p(O.key),onInput:K=>w(O.key,K),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||H(O)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ya={class:"config-header"},Xa={class:"config-section"},Qa={key:0,style:{"margin-bottom":"8px"}},Ka=oe({__name:"TargetCountConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=q=>{if(!t.value)return;const u={...t.value.data.arguments,conditionRelation:q};o.updateNodeData(t.value.id,{arguments:u})},b=()=>{if(!t.value)return;const u=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],x={...t.value.data.arguments,alertConditions:u};o.updateNodeData(t.value.id,{arguments:x})},T=(q,u,x)=>{if(!t.value)return;const _=[...t.value.data.arguments?.alertConditions||[]];_[q]={..._[q],[u]:x};const c={...t.value.data.arguments,alertConditions:_};o.updateNodeData(t.value.id,{arguments:c})},D=q=>{if(!t.value)return;const u=[...t.value.data.arguments?.alertConditions||[]];u.splice(q,1);const x={...t.value.data.arguments,alertConditions:u};o.updateNodeData(t.value.id,{arguments:x})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(q,u)=>{const x=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-text"),C=e.resolveComponent("el-option"),l=e.resolveComponent("el-select"),L=e.resolveComponent("el-input-number"),$=e.resolveComponent("el-radio"),f=e.resolveComponent("el-radio-group"),M=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ya,[u[1]||(u[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Xa,[u[9]||(u[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(M,null,{label:e.withCtx(()=>[u[3]||(u[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(c,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...u[2]||(u[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(c,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...u[4]||(u[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(S,g)=>(e.openBlock(),e.createElementBlock("div",{key:g,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(l,{"model-value":S.operator,onChange:E=>T(g,"operator",E),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(C,{label:"等于 =",value:"="}),e.createVNode(C,{label:"大于 >",value:">"}),e.createVNode(C,{label:"小于 <",value:"<"}),e.createVNode(C,{label:"大于等于 ≥",value:">="}),e.createVNode(C,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(L,{"model-value":S.value,onChange:E=>T(g,"value",E),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(x,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:E=>D(g)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Qa,[e.createVNode(c,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...u[5]||(u[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(f,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:u[0]||(u[0]=S=>a(S))},{default:e.withCtx(()=>[e.createVNode($,{value:"OR"},{default:e.withCtx(()=>[...u[6]||(u[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode($,{value:"AND"},{default:e.withCtx(()=>[...u[7]||(u[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(x,{type:"text",link:"",icon:e.unref(X.Plus),onClick:b},{default:e.withCtx(()=>[...u[8]||(u[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Za={class:"config-header"},va={class:"config-section"},el={style:{display:"flex","align-items":"center",gap:"8px"}},tl={style:{display:"flex","align-items":"center",gap:"8px"}},ol={style:{display:"flex","align-items":"center",gap:"8px"}},nl=oe({__name:"TimerTargetConfig",setup(n){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),a=C=>{if(!t.value)return;const l={...t.value.data.arguments,duration:C};o.updateNodeData(t.value.id,{arguments:l})},b=C=>{if(!t.value)return;const l={...t.value.data.arguments,similarity_enabled:C};o.updateNodeData(t.value.id,{arguments:l})},T=C=>{if(!t.value)return;const l={...t.value.data.arguments,similarity_threshold:C};o.updateNodeData(t.value.id,{arguments:l})},D=C=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_enabled:C};o.updateNodeData(t.value.id,{arguments:l})},z=C=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_operator:C};o.updateNodeData(t.value.id,{arguments:l})},q=C=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_threshold:C};o.updateNodeData(t.value.id,{arguments:l})},u=C=>{if(!t.value)return;const l=t.value.data.arguments?.overlap_detection||{},L={...t.value.data.arguments,overlap_detection:{operator:l.operator??"gt",threshold:l.threshold??90,...l,enabled:C}};o.updateNodeData(t.value.id,{arguments:L})},x=C=>{if(!t.value)return;const l={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:C}};o.updateNodeData(t.value.id,{arguments:l})},_=C=>{if(!t.value)return;const l={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:C}};o.updateNodeData(t.value.id,{arguments:l})},c=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(C,l)=>{const L=e.resolveComponent("el-button"),$=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),M=e.resolveComponent("el-text"),B=e.resolveComponent("el-form-item"),S=e.resolveComponent("el-switch"),g=e.resolveComponent("el-icon"),E=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-slider"),s=e.resolveComponent("el-option"),y=e.resolveComponent("el-select"),p=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Za,[l[9]||(l[9]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode($),e.createElementVNode("div",va,[l[13]||(l[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(B,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.duration??30,onChange:l[0]||(l[0]=w=>a(w)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(M,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...l[10]||(l[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(B,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(S,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:l[1]||(l[1]=w=>b(w))},null,8,["model-value"]),e.createVNode(E,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(B,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:l[2]||(l[2]=w=>T(w)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(M,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...l[11]||(l[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(B,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(S,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:l[3]||(l[3]=w=>D(w))},null,8,["model-value"]),e.createVNode(E,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(B,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(y,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:l[4]||(l[4]=w=>z(w)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(s,{label:"大于 >",value:"gt"}),e.createVNode(s,{label:"大于等于 >=",value:"gte"}),e.createVNode(s,{label:"等于 =",value:"eq"}),e.createVNode(s,{label:"小于等于 <=",value:"lte"}),e.createVNode(s,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(B,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:l[5]||(l[5]=w=>q(w)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(M,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...l[12]||(l[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(B,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(S,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:l[6]||(l[6]=w=>u(w))},null,8,["model-value"]),e.createVNode(E,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(B,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(y,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:l[7]||(l[7]=w=>x(w)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(s,{label:"大于 >",value:"gt"}),e.createVNode(s,{label:"等于 =",value:"eq"}),e.createVNode(s,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(B,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:l[8]||(l[8]=w=>_(w)),min:0,max:100,precision:2,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-2969d123"]]),al={class:"node-config-panel"},ll={class:"config-content"},rl=oe({__name:"NodeConfigPanel",setup(n){const o=ae(),t={edge:en,group:on,start:wn,end:Dn,classificationModel:qn,ocr:Pn,licensePlate:Un,face:We,stream:vn,dataSource:ia,smallModel:La,detectionTarget:Ja,targetCount:Ka,timerTarget:nl,faceRecognition:We},d=e.computed(()=>{const h=o.selectedEdge;if(h)return o.nodes.find(T=>T.id===h.source)?.data?.enableBranch&&t.edge||null;const a=o.selectedNode;return a&&t[a.type]||null});return(h,a)=>(e.openBlock(),e.createElementBlock("div",al,[e.createElementVNode("div",ll,[d.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),sl={class:"workflow-editor",id:"workflow-editor"},il={class:"editor-content"},cl={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:n=>Object.values(ee).includes(n)},pageMode:{type:String,default:ye.CREATE,validator:n=>Object.values(ye).includes(n)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(n,{expose:o}){const t=n,d=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",d),e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig)),e.provide("editorConfig",e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig)),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const h=ae(d),{copyToClipboard:a,downloadJSON:b,exportToJSON:T}=_t(t.mode,h,e.computed(()=>t.taskModeConfig)),{runValidation:D}=Ct(t.mode,h,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{at(d)});const z=e.computed(()=>{if(h.selectedNodeId)return!0;const u=h.selectedEdge;return u?!!h.nodes.find(_=>_.id===u.source)?.data?.enableBranch:!1});return o({reset:()=>{h.resetWorkflow()},runTest:D,copyJSON:a,exportJSON:T}),(u,x)=>(e.openBlock(),e.createElementBlock("div",sl,[e.createElementVNode("div",il,[e.createVNode(Tt),e.createVNode(Qo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[z.value?(e.openBlock(),e.createBlock(rl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ye=oe(cl,[["__scopeId","data-v-9201f6b3"]]),dl={Box:X.Box,CircleCheck:X.CircleCheck,CircleClose:X.CircleClose,Close:X.Close,CopyDocument:X.CopyDocument,Cpu:X.Cpu,DArrowLeft:X.DArrowLeft,DataAnalysis:X.DataAnalysis,Delete:X.Delete,Document:X.Document,Download:X.Download,FolderOpened:X.FolderOpened,Grid:X.Grid,Loading:X.Loading,Plus:X.Plus,QuestionFilled:X.QuestionFilled,RefreshLeft:X.RefreshLeft,Search:X.Search,Timer:X.Timer,Upload:X.Upload,User:X.User,View:X.View,VideoPlay:X.VideoPlay,Warning:X.Warning},Xe=n=>{Object.entries(dl).forEach(([o,t])=>{n.component(o,t)}),n.component("WorkflowEditor",Ye)},ml={install:Xe};re.EditorMode=ee,re.NodeType=k,re.PageMode=ye,re.WorkflowEditor=Ye,re.default=ml,re.install=Xe,Object.defineProperties(re,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));