aiflowui 1.0.12 → 1.0.13

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,Ze,v,ve,et,tt){"use strict";const b={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"},ot={[b.DETECTION_TARGET]:"检测目标",[b.CLASSIFICATION_MODEL]:"分类模型",[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时",[b.FACE_RECOGNITION]:"人脸识别",[b.SMALL_MODEL]:"小模型"},nt={cls:b.CLASSIFICATION_MODEL,ocr:b.OCR,license_plate:b.LICENSE_PLATE,target_count:b.TARGET_COUNT,timer_target:b.TIMER_TARGET,face:b.FACE_RECOGNITION,face_recognition:b.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:{}}}),at=(a,o={width:300,height:160},t="and",d=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:d},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}),d={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[d]}},lt=a=>Ze.defineStore(`aiflow-workflow-${a}`,()=>{const o=$e(),t=e.ref(o.nodes),d=e.ref(o.edges),h=e.ref(null),n=e.ref(null),k=e.ref(new Set),T=e.ref(new Set),A=e.ref({}),z=(c,V,F,U)=>{A.value[c]||(A.value[c]={}),A.value[c][V]||(A.value[c][V]={}),A.value[c][V][F]={...U}},O=(c,V,F,U,J)=>{A.value[c]||(A.value[c]={}),A.value[c][V]||(A.value[c][V]={}),A.value[c][V][F]||(A.value[c][V][F]={}),A.value[c][V][F][U]=J},p=(c,V,F)=>A.value[c]?.[V]?.[F]??null,x=()=>{A.value={}},N=e.computed(()=>h.value?t.value.find(c=>c.id===h.value):null),m=e.computed(()=>n.value?d.value.find(c=>c.id===n.value):null),C=c=>t.value.filter(V=>V.type===c).length,l=()=>{const c=t.value.filter(V=>V.type===b.DATA_SOURCE);c.length!==0&&(c.length===1?c[0].data.label="数据源":c.forEach((V,F)=>{V.data.label=`数据源 ${F+1}`}))},L=()=>t.value.filter(c=>c.type===b.DATA_SOURCE).length,q=()=>t.value.filter(V=>V.type===b.DATA_SOURCE).some(V=>V.data.arguments?.needCooperativeDetection===!0),u=()=>{const c=L(),V=q();return!(c>1||V)},I=c=>{t.value.push(c),c.type===b.DATA_SOURCE&&l()},B=c=>{const V=t.value.find(U=>U.id===c),F=V?.type===b.DATA_SOURCE;if(V?.type==="group"){w(c),d.value=d.value.filter(U=>U.source!==c&&U.target!==c),h.value===c&&(h.value=null);return}t.value=t.value.filter(U=>U.id!==c),d.value=d.value.filter(U=>U.source!==c&&U.target!==c),h.value===c&&(h.value=null),F&&l()},S=(c,V)=>{const F=t.value.find(U=>U.id===c);F&&(F.data={...F.data,...V})},g=(c,V)=>{const F=t.value.find(U=>U.id===c);F&&(F.position=V)},E=c=>{const V=t.value.find(F=>F.id===c.source);if(V&&(V.type===b.START||V.type===b.DATA_SOURCE)&&V.data?.enableBranch===!0){const U=d.value.filter(J=>J.source===c.source).length+1;c={...c,data:{...c.data,branchOrder:U}}}d.value=v.addEdge(c,d.value)},i=c=>{const V=d.value.find(F=>F.id===c);if(d.value=d.value.filter(F=>F.id!==c),n.value===c&&(n.value=null),V&&V.data?.branchOrder!==void 0){const F=t.value.find(U=>U.id===V.source);F&&(F.type===b.START||F.type===b.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=(c,V="and",F=null)=>{const U=at(c,{width:300,height:160},V,F);return t.value.unshift(U),U.id},y=(c,V)=>{const F=t.value.find(Q=>Q.id===c),U=t.value.find(Q=>Q.id===V);if(!F||!U||F.parentNode===V)return;F.parentNode&&f(c);const J=t.value.find(Q=>Q.id===c);J&&(t.value=t.value.map(Q=>Q.id!==c?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:V,extent:"parent"}))},f=c=>{const V=t.value.find(Q=>Q.id===c);if(!V||!V.parentNode)return;const F=t.value.find(Q=>Q.id===V.parentNode),U=F?V.position.x+F.position.x:V.position.x,J=F?V.position.y+F.position.y:V.position.y;t.value=t.value.map(Q=>{if(Q.id!==c)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},w=c=>{const V=t.value.find(F=>F.id===c);V&&(t.value=t.value.filter(F=>F.id!==c).map(F=>{if(F.parentNode!==c)return F;const U={...F,position:{x:F.position.x+V.position.x,y:F.position.y+V.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:d,selectedNodeId:h,selectedEdgeId:n,invalidNodeIds:k,invalidEdgeIds:T,selectedNode:N,selectedEdge:m,getNodeCountByType:C,getDataSourceCount:L,hasCooperativeDetection:q,supportPatrol:u,addNode:I,removeNode:B,updateNodeData:S,updateNodePosition:g,addConnection:E,removeEdge:i,updateEdgeData:(c,V)=>{const F=d.value.find(U=>U.id===c);if(F){if(V.branchOrder!==void 0){const U=t.value.find(J=>J.id===F.source);if(U&&(U.type===b.START||U.type===b.DATA_SOURCE)){const J=F.data?.branchOrder,Q=V.branchOrder;if(J!==Q&&Q!==null){const se=d.value.filter(ce=>ce.source===F.source&&ce.id!==c).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}F.data={...F.data,...V}}},selectNode:c=>{h.value=c,n.value=null},selectEdge:c=>{n.value=c,h.value=null},clearSelection:()=>{h.value=null,n.value=null},resetWorkflow:()=>{const c=$e();t.value=c.nodes,d.value=c.edges,h.value=null,n.value=null,x()},loadWorkflow:(c,V)=>{t.value=c,d.value=V,h.value=null,n.value=null,x()},refreshDataSourceLabels:l,createEmptyGroup:s,addNodeToGroup:y,removeNodeFromGroup:f,dissolveParallelGroup:w,initializeSubsequentFrames:c=>{t.value.find(F=>F.id===c)&&S(c,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(c,V)=>{const F=t.value.find(U=>U.id===c);!F||F.type!=="dataSource"||(F.data.subsequentFrames||(F.data.subsequentFrames=[]),F.data.subsequentFrames.push(V),S(c,{subsequentFrames:[...F.data.subsequentFrames]}))},removeSubsequentFrame:(c,V)=>{const F=t.value.find(Q=>Q.id===c);if(!F||F.type!=="dataSource")return;const U=F.data.subsequentFrames.find(Q=>Q.id===V);U&&d.value.filter(te=>te.source===c&&te.sourceHandle===U.handleId).forEach(te=>i(te.id));const J=F.data.subsequentFrames.filter(Q=>Q.id!==V);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),S(c,{subsequentFrames:J})},setInvalidIds:(c,V)=>{k.value=new Set(c),T.value=new Set(V)},clearInvalidIds:()=>{k.value=new Set,T.value=new Set},taskSources:A,setTaskSourceArguments:z,updateTaskSourceArgument:O,getTaskSourceArguments:p,clearTaskSources:x}}),ae=(a=null)=>{const o=a??e.inject("workflowInstanceId","default");return ge.has(o)||ge.set(o,lt(o)),ge.get(o)()},rt=a=>{if(ge.has(a)){try{ge.get(a)().$dispose()}catch{}ge.delete(a)}},Fe=(a,o,t)=>{const d=[],h=[],n=a.filter(l=>l.type!=="group"),k=n.filter(l=>l.type===b.START);k.length===0?d.push("工作流必须包含一个开始节点"):k.length>1&&d.push("工作流只能包含一个开始节点");const T=n.filter(l=>l.type===b.END);T.length===0?d.push("工作流必须包含一个结束节点"):T.length>1&&d.push("工作流只能包含一个结束节点");const A=n.filter(l=>l.type===b.DATA_SOURCE);A.length===0&&d.push("工作流必须至少包含一个数据源节点"),n.filter(l=>l.type===b.DETECTION_TARGET||l.type===b.SMALL_MODEL||l.type===b.CLASSIFICATION_MODEL).length===0&&d.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),n.some(l=>l.type===b.SMALL_MODEL),A.some(l=>l.data.arguments?.needCooperativeDetection===!0),A.length>1,n.forEach(l=>{const L=o.filter(u=>u.target===l.id),q=o.filter(u=>u.source===l.id);if(l.type===b.START&&L.length>0&&h.push("开始节点不应有输入连接"),l.type===b.END&&q.length>0&&h.push("结束节点不应有输出连接"),l.type===b.START&&q.length===0&&d.push("开始节点必须有输出连接"),l.type===b.END&&L.length===0&&d.push("结束节点必须有输入连接"),l.type===b.DATA_SOURCE&&l.data.enableImageSequence)if(q.length===0)d.push({nodeId:l.id,message:`数据源节点"${l.data.label}"开启了图片时序但未连接到任何处理节点`});else{const u=q.filter(g=>g.sourceHandle==="first-frame"),I=l.data.subsequentFrames||[],B=new Set(q.map(g=>g.sourceHandle)),S=I.filter(g=>!B.has(g.handleId));u.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!==b.START&&l.type!==b.END&&!l.parentNode&&(L.length===0||q.length===0)&&h.push(`节点 "${l.data.label}" 可能未正确连接`)});const O=new Set;o.forEach(l=>{const L=a.find(q=>q.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||"未命名"}"缺少必填项:后续检测帧的持续时间`}),O.add(l.source),O.add(l.target)}),n.forEach(l=>{l.parentNode||!O.has(l.id)&&n.length>1&&h.push(`节点 "${l.data.label}" 未连接到工作流`)});const p=st(n,o);d.push(...p);const x=ct(n,o);d.push(...x);const N=it(n);d.push(...N);const m=dt(n,o);d.push(...m);const C=mt(n,o);return d.push(...C),t==="task"&&n.filter(L=>L.type===b.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}},st=(a,o)=>{const t=[],d=a.find(k=>k.type===b.START);if(!d)return t;const h=new Set,n=(k,T,A,z)=>{if(T.includes(k))return;const O=a.find(C=>C.id===k);if(!O)return;const p=[...T,k];let x=[...A],N=[...z];if(O.type===b.TARGET_COUNT&&x.push(O),O.type===b.TIMER_TARGET&&N.push(O),O.type===b.END){const C=p.join("->");h.has(C)||(h.add(C),x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const m=o.filter(C=>C.source===k);m.length===0?(x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(C=>`"${C.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(C=>`"${C.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):m.forEach(C=>{n(C.target,p,x,N)})};return n(d.id,[],[],[]),t},it=a=>{const o=[],t=a.filter(h=>h.type===b.DATA_SOURCE),d=a.filter(h=>h.type===b.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},ct=(a,o)=>{const t=[];return a.filter(h=>h.type===b.DATA_SOURCE).forEach(h=>{const n=o.filter(k=>k.source===h.id);if(n.length>1){const k=n.map(z=>z.target),A=a.filter(z=>k.includes(z.id)).filter(z=>z.type===b.SMALL_MODEL);if(A.length>0){const z=A.map(O=>`"${O.data.label||O.data.modelName}"`).join("、");t.push(`数据源节点"${h.data.label}"开启了多分支,不能包含小模型节点(${z})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},dt=(a,o)=>{const t=[],d=[b.TARGET_COUNT,b.TIMER_TARGET],h={[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时"};return a.filter(k=>k.type===b.SMALL_MODEL).forEach(k=>{o.filter(A=>A.source===k.id).forEach(A=>{const z=a.find(O=>O.id===A.target);if(z&&d.includes(z.type)){const O=h[z.type]||z.type;t.push(`小模型节点"${k.data.label||k.data.modelName}"不能直接连接${O}节点"${z.data.label}",请先连接检测目标节点`)}})}),t},mt=(a,o)=>{const t=[],d=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION],h={[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.FACE_RECOGNITION]:"人脸识别"};return a.filter(k=>d.includes(k.type)).forEach(k=>{const T=o.filter(O=>O.source===k.id),A=d.filter(O=>O!==k.type).concat(b.END),z=k.data.label||h[k.type];T.forEach(O=>{const p=a.find(x=>x.id===O.target);p&&!A.includes(p.type)&&t.push(`${z}节点"${z}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${p.data.label||p.type}"节点`)}),T.length===0&&t.push(`${z}节点"${z}"必须连接到其他辅助节点或结束节点`)}),t},qe=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(d=>t.get(d)).filter(Boolean),Ge=(a,o)=>{const t={},d=new Set(a.filter(n=>n.type==="group").map(n=>n.id));return[...o].sort((n,k)=>{const T=n.data?.branchOrder??1/0,A=k.data?.branchOrder??1/0;return T-A}).forEach(n=>{if(d.has(n.source)&&d.has(n.target))return;let k=n.source,T=n.target;if(d.has(k)){const A=o.find(z=>z.target===k&&!d.has(z.source));if(!A)return;k=A.source}if(d.has(T)){const A=o.find(z=>z.source===T&&!d.has(z.target));if(!A)return;T=A.target}t[k]||(t[k]=[]),t[k].includes(T)||t[k].push(T)}),t},He=(a,o)=>{const t=[...o.values()].find(k=>k.type===b.START);if(!t)return[];const d=new Set,h=[],n=k=>{if(d.has(k))return;d.add(k);const T=o.get(k);if(!T)return;T.type!==b.START&&T.type!==b.END&&T.type!=="group"&&h.push(T),(a[k]||[]).forEach(z=>n(z))};return n(t.id),h},pt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ce=(a,o,t,d)=>{const h=a.nodes.findIndex(k=>k.toolTitle===o);if(h===-1)return;const n=a.nodes[h];n.arguments?.[t]&&(a[d]=n.arguments[t]),a.nodes=a.nodes.filter((k,T)=>T!==h),a.nodes.forEach((k,T)=>{k.sortOrder=T+1})},ut=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(d=>({op:d.operator,value:d.value}))}}},ft=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const d={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:d[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.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 a.similarity_enabled&&a.similarity_threshold!==void 0&&(o.similarity={op:">",value:a.similarity_threshold,matchFrames:3}),{duration:o}},gt={[b.TARGET_COUNT]:ut,[b.TIMER_TARGET]:ft},_e=(a,o)=>{if(!a)return{};const t=gt[o];if(t)return t(a);const d={...a};return pt.forEach(h=>{delete d[h]}),Object.keys(d).forEach(h=>{const n=d[h];(n==null||n==="")&&delete d[h]}),o===b.FACE_RECOGNITION&&d.repositoryId!==void 0&&(Array.isArray(d.repositoryId)||(d.repositoryId=[d.repositoryId]),d.repositoryId.length===0&&delete d.repositoryId),d},ht=a=>{switch(a.type){case b.DETECTION_TARGET:return a.data.targetId||"";case b.CLASSIFICATION_MODEL:return"cls";case b.OCR:return"ocr";case b.LICENSE_PLATE:return"license_plate";case b.SMALL_MODEL:return a.data.title||a.data.modelName||"";case b.TARGET_COUNT:return"target_count";case b.TIMER_TARGET:return"timer_target";case b.FACE_RECOGNITION:return"face";default:return a.data.label||""}},yt=(a,o,t,d,h=null)=>{const n={toolTitle:ht(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:_e(h??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(n.branchLogic=a.data.branchLogic),t){const k=d.find(T=>T.source===t&&T.target===a.id);k?.data?.branchOrder!==void 0&&k?.data?.branchOrder!==null&&(n.branchOrder=k.data.branchOrder)}return n},Pe=(a,o,t,d,h,n=null,k=[])=>{const T=[],A=Array.isArray(a)?[...a]:[a],z=new Set;let O=1;for(;A.length>0;){const p=[...A];A.length=0;const x=[];p.forEach(N=>{if(z.has(N))return;z.add(N);const m=d.get(N);!m||m.type===b.END||m.type===b.START||m.type===b.DATA_SOURCE||((t[N]||[]).forEach(l=>{const L=d.get(l);L&&L.type!==b.END&&A.push(l)}),k.includes(m.type))||x.push(m)}),x.length>0&&(x.forEach(N=>{const m=n?.(N.id)??null,C=yt(N,O,o,h,m);x.length>1&&(C.nodeLogic="or"),T.push(C)}),O++)}return T},_t=(a=null)=>{const o=a??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)),n=(i,s,y,f)=>{if(y){const w=pe(i,y.id,s).find(G=>G.type===b.SMALL_MODEL);if(w)return w}return f.find(w=>w.type===b.SMALL_MODEL)||null},k=(i,s,y)=>{const w=pe(s,i.id,y).find(R=>R.type===b.SMALL_MODEL);return w?pe(s,w.id,y).filter(R=>R.type!==b.END&&R.type!==b.START&&R.type!==b.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},T=(i,s,y,f,w)=>{if(s===de.SMALL_MODEL||s===de.SMALL_MODEL_BRANCH){const R=n(f,w,y,i);return R?{toolTitle:R.data.title||R.data.modelName||"",toolType:"small",arguments:_e(R.data.arguments,b.SMALL_MODEL)}:null}const G=i.find(R=>R.type===b.DETECTION_TARGET);return G?{toolTitle:G.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:_e(G.data.arguments,b.DETECTION_TARGET)}:null},A=()=>{const i=o.nodes.find(f=>f.type===b.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(f=>f.sortOrder);if(new Set(s).size!==s.length){const f=s.filter((w,G)=>s.indexOf(w)!==G);throw new Error(`分支执行顺序存在重复:${[...new Set(f)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},O=(i,s,y,f,w)=>{let G=[],R;if(i===de.IMAGE_BRANCH)s&&(G=pe(f,s.id,w).filter(H=>H.type!==b.END)),R=s?.id||y.find(H=>H.type===b.DATA_SOURCE)?.id;else if(i===de.SMALL_MODEL_BRANCH){const H=n(f,w,s,y);H&&(G=pe(f,H.id,w).filter(P=>P.type!==b.END),R=H.id)}return{branchStartNodes:G,sourceNodeId:R}},p=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]),x=(i,s,y)=>{const f=new Set,w=[],G=R=>{if(f.has(R))return;f.add(R);const H=y.get(R);if(!H||H.type===b.END)return;p.has(H.type)&&w.push(H),(s[R]||[]).forEach(j=>G(j))};return G(i),w.length>0?w[w.length-1]:null},N=(i,s,y,f,w)=>{const G=`分支${w+1}`,R=x(s,y,f);if(!R)return i?.data?.nodeName||G;if(R.type===b.DETECTION_TARGET&&R.data?.targetId==="other"){const P=R.data?.arguments?.object;if(Array.isArray(P)&&P.length>0){const j=P.join(",");return j.length>32?j.slice(0,32):j}}if(R.type===b.CLASSIFICATION_MODEL){const P=R.data?.arguments?.modelName||R.data?.label;if(!P)return G;const j=R.data?.arguments?.resultNegate?"(取反)":"";return P+j}return R.data?.label||R.data?.targetName||G},m=(i,s,y,f,w,G)=>{const{branchStartNodes:R,sourceNodeId:H}=O(s,y,i,f,w);if(R.length===0)return[];const P=[];return R.forEach((j,Y)=>{const _=Pe([j.id],H,f,w,G);if(_.length===0)return;const D=H?G.find(c=>c.source===H&&c.target===j.id):null,$=D?.data||{},W=$.branchOrder!==void 0&&$.branchOrder!==null?$.branchOrder:Y+1,r={branchName:$.branchName||N(j,j.id,f,w,Y),sortOrder:W,nodes:_};D?.sourceHandle&&(r.sourceHandle=D.sourceHandle),Ce(r,"target_count","targetCount","targetCount"),Ce(r,"timer_target","duration","duration"),$.timeWindowSeconds!==void 0&&$.timeWindowSeconds!==null&&(r.timeWindowSeconds=$.timeWindowSeconds),$.branchDescription&&(r.description=$.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),f=Ge(i,s),w=He(f,y),G=[...y.values()].find(R=>R.type===b.START);return{allNodes:i,edges:s,nodeMap:y,adj:f,orderedNodes:w,startNode:G}},L=i=>{const s={ruleName:i?.data?.algorithmName||"",description:"",webhookUrl:""},y=A();Object.keys(y).length>0&&(s.extraConfig=y);const w=(d?.value??d)?.platform;return s.attach=w?{platform:w}:{},s},q=(i,s)=>{const y=i.filter(f=>f.type===b.DATA_SOURCE);if(y.length===0){const f=s.find(w=>w.type===b.DATA_SOURCE);f&&y.push(f)}return y},u=i=>i?.data?.enableImageSequence||i?.data?.arguments?.enableImageSequence||!1?"order":i?.data?.enableBranch&&i.data.branchLogic||"and",I=(i,s,y,f)=>{const{orderedNodes:w,adj:G,nodeMap:R,edges:H}=s,P=k(i,G,R),j=!!i.data.arguments?.needCooperativeDetection,Y=H.find(r=>r.target===i.id),_=Y?.data?.branchOrder!==void 0&&Y?.data?.branchOrder!==null?Y.data.branchOrder:f+1,D={sourceGroupId:null,name:i.data.label||"数据源",sort:_,synEnabled:j};if(j&&(D.windowSeconds=i.data.arguments?.windowSeconds||5),P===de.SMALL_MODEL){const r=T(w,P,i,G,R);return r&&(D.streamConfig=r),D.logic="and",D.children=[],D}if(P===de.SMALL_MODEL_BRANCH){const r=T(w,P,i,G,R);r&&(D.streamConfig=r)}D.logic=u(i);const $=m(w,P,i,G,R,H),W=y.length;return D.children=$.map((r,c)=>({name:r.branchName,branchRefs:[W+c]})),y.push(...$),D},B=(i,s)=>{const f={groupLogic:i?.data?.enableBranch&&i.data.branchLogic||"and",sourceGroups:s};return s.length>=2&&(f.groupWindowSeconds=i.data.groupWindowSeconds),f},S=()=>{if(!C())return null;try{const i=l(),s=L(i.startNode),y=q(i.orderedNodes,i.allNodes),f=[],w=y.map((G,R)=>I(G,i,f,R));return s.ruleSchema=B(i.startNode,w),f.length>0&&(s.branches=f),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"}),f=URL.createObjectURL(y),w=document.createElement("a");w.href=f,w.download=`workflow_${Date.now()}.json`,w.click(),URL.revokeObjectURL(f),Z.ElMessage.success("导出成功")}}},Nt=(a=null,o=null)=>{const t=a??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",ye.CREATE);const d=e.inject("editorConfig",null),h=e.inject("taskModeConfig",null),n=o??d,k=o??h,T=e.inject("echoTaskData",null),A=e.computed(()=>({errors:[],warnings:[]})),z=(q,u)=>{const I={},B=u?.data?.arguments??{};B.reportFrequency==="interval"&&B.reportInterval&&(I.interval={value:B.reportInterval}),B.enableDeduplication&&B.similarityThreshold!==void 0&&(I.dedup={value:B.similarityThreshold}),t.nodes.filter(E=>E.type===b.DATA_SOURCE).length>=2&&q?.data?.groupWindowSeconds!==void 0&&(I.groupWindowSeconds=q.data.groupWindowSeconds),I.enableVideo=!!q?.data?.enableAlertVideo;const g=q?.data?.schedule;return Array.isArray(g)&&g.length>0?I.schedule=g:I.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],I},O=(q,u,I,B,S="image")=>{const g=pe(u,q.id,I).find(E=>E.type===b.SMALL_MODEL);if(g){const E=q.data?.arguments??{};return{toolTitle:g.data.title||g.data.modelName||"",toolType:"small",arguments:_e(g.data.arguments,b.SMALL_MODEL),decoder:p(E,!0)}}if(S==="stream"){const E=B.find(s=>s.type===b.DETECTION_TARGET);if(!E)return null;const i=q.data?.arguments??{};return{toolTitle:E.data.targetId||"",toolType:"stream",arguments:_e(E.data.arguments,b.DETECTION_TARGET),decoder:p(i,!1)}}return null},p=(q,u)=>{const I=q.mode??(u?3:0),B=q.interval??0,S=q.sw_decoding??(u?"CPU":"GPU");let g=0,E=0;return u?I===3?(g=0,E=0):I===2?(g=1,E=0):I===1&&(g=0,E=B):I===0?(g=0,E=B*25):I===1?(g=0,E=B):I===2&&(g=1,E=0),{sw_decoding:S==="CPU",mode:g,interval:E}},x=(q,u,I,B,S=null)=>{let g=q.id,E=pe(u,q.id,I).filter(y=>y.type!==b.END&&y.type!==b.START);E.length===1&&E[0].type===b.SMALL_MODEL&&(g=E[0].id,E=pe(u,g,I).filter(y=>y.type!==b.END&&y.type!==b.START));const i=E;if(i.length===0)return[];const s=S?y=>t.getTaskSourceArguments(q.id,S,y):null;return i.map((y,f)=>{const w=Pe([y.id],g,u,I,B,s,[b.SMALL_MODEL]),G=B.find(Y=>Y.source===g&&Y.target===y.id),R=G?.data??{},H=R.branchOrder??f+1,P=R.branchId??null,j={branchId:P,id:P,branchName:R.branchName||y.data?.label||`分支${f+1}`,sortOrder:H,nodes:w};return G?.sourceHandle&&(j.sourceHandle=G.sourceHandle),R.timeWindowSeconds!==void 0&&R.timeWindowSeconds!==null&&(j.timeWindowSeconds=R.timeWindowSeconds),R.branchDescription&&(j.description=R.branchDescription),Ce(j,"target_count","targetCount","targetCount"),Ce(j,"timer_target","duration","duration"),j})},N=(q,u,I,B,S=null,g=null,E=null,i=1,s=!1,y=!1)=>{const f=S??q.deviceType??"",w=f==="1400"||f==="2",G=w?"1400":"camera",R=u==="stream"?2:1,H=w&&g!==null?g==="device"?1:2:q.detectionType??2,j=(T?.value??T)?.graph?.sources??[],Y=String(q.sourceId??q.id??""),D=j.find(W=>String(W.sourceId)===Y)?.attach??{},$={deviceType:G,detectionType:H,dataSourceType:R,sourceOrder:I,timeTemplateId:D.timeTemplateId??"",timeTemplateName:D.timeTemplateName??"",platform:B?.platform??"TAI"};if(!w){const W=E?.mode??0;W===3?($.frameExtractionType=0,$.frameInterval=0):W===2?($.frameExtractionType=y?1:3,$.frameInterval=0):($.frameExtractionType=W+1,$.frameInterval=E?.interval??30);const r=E?.sw_decoding??"CPU";$.frameExtractionSourceType=r==="GPU"?2:1,i===1&&u==="image"&&!s&&!!E?.enablePatrol?$.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,E?.patrolGroupSize??1)),pollingInterval:"0"}:$.pollingConfig={enablePolling:0},$.thirdId=q.thirdId??""}return $},m=(q,u,I,B,S,g,E)=>{const i=k?.value??k,s=i?.value??i,y=s?.datasource?.getDevices?.(q.id)??[],f=q.data?.sourceGroupId??null,w=!!q.data?.arguments?.needCooperativeDetection,G=w?q.data?.arguments?.windowSeconds??5:void 0,R=u?.data?.streamType??"image",H=pe(I,q.id,B).some(c=>c.type===b.SMALL_MODEL),P=H?"small":R,j=O(q,I,B,E,R),Y=q.data?.arguments?.deviceType??null,_=q.data?.arguments?.detectionMode??null,D=q.data?.arguments??null,$=t.getDataSourceCount();if(y.length>0)return y.map((c,V)=>{const F=String(c.sourceId??c.id??""),U=x(q,I,B,S,F),J={sourceId:c.sourceId??c.id??"",sourceName:c.sourceName??c.name??"",sourceType:P,sourceGroupId:f,areas:c.area??c.areas??[],branches:U,attach:N(c,R,V,s,Y,_,D,$,w,H),synEnabled:w,...G!==void 0&&{windowSeconds:G}};return j&&(J.streamConfig=j,J.streamUrl="rtsp"),J});const W=x(q,I,B,S),r={sourceId:"",sourceName:q.data?.label??"数据源",sourceType:P,sourceGroupId:f,areas:[],branches:W,attach:N({},R,0,s,Y,_,D,$,w,H),synEnabled:w};return j&&(r.streamConfig=j,r.streamUrl="rtsp"),[r]},C=()=>{try{const q=t.nodes,u=t.edges,I=qe(q),B=Ge(q,u),S=[...I.values()].find(G=>G.type===b.START),g=[...I.values()].find(G=>G.type===b.END),E=n?.value??n,i=E?.value??E,s=He(B,I);let y=s.filter(G=>G.type===b.DATA_SOURCE);y.length===0&&(y=q.filter(G=>G.type===b.DATA_SOURCE));const f=y.flatMap((G,R)=>m(G,S,B,I,u,R,s)),w={workflowName:S?.data?.taskName??"",ruleId:i?.ruleId??"",sources:f,extraConfig:z(S,g),description:""};if((i?.platform??"TAI")==="THIRD"){const R=y[0]?.data?.arguments??{},H=R.mode??0,P=R.interval??0;let j,Y,_;return H===0?(j="time",Y=P,_=0):(j="frame",Y=0,H===3?_=0:H===2?_=-1:_=P),{name:w.workflowName,type:"simple",plan:w.extraConfig.schedule??[],inferStrategy:j,timeInterval:Y,frameInterval:_,mps:w.extraConfig.enableVideo??!1,graph:w}}return w}catch(q){return Z.ElMessage.error(q.message||"导出失败"),null}};return{validation:A,exportToJSON:C,copyToClipboard:()=>{const q=C();if(!q)return;const u=JSON.stringify(q,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(u).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const I=document.createElement("textarea");I.value=u,I.style.position="fixed",I.style.opacity="0",document.body.appendChild(I),I.select(),document.execCommand("copy"),document.body.removeChild(I),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const q=C();if(!q)return;const u=JSON.stringify(q,null,2),I=new Blob([u],{type:"application/json"}),B=URL.createObjectURL(I),S=document.createElement("a");S.href=B,S.download=`task_workflow_${Date.now()}.json`,S.click(),URL.revokeObjectURL(B),Z.ElMessage.success("导出成功")}}},je=(a=null,o=null,t=null)=>{const d=e.inject("editorMode",ee.ALGORITHM);return(a??d)===ee.TASK?Nt(o,t):_t(o)},Ct=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 ze(a=null,o=null,t=null){const d=o??ae(),h=e.inject("editorMode",ee.ALGORITHM),n=a??h,k=e.inject("taskModeConfig",null),T=t??k,A=p=>{const{type:x,data:N}=p,m=N.arguments||{},C=[];switch(x){case b.START:if(n===ee.TASK)if(N.taskName?.trim()||C.push("任务名称"),!N.executionTime?.trim())C.push("任务执行时间");else{const l=Ct(N.executionTime);(!l||!Array.isArray(l.plan)||l.plan.length===0)&&C.push("任务执行时间(计划为空)")}else N.algorithmName?.trim()||C.push("算法名称");break;case b.SMALL_MODEL:N.modelId||C.push("模型选择");break;case b.DETECTION_TARGET:N.targetId||C.push("检测目标选择");break;case b.CLASSIFICATION_MODEL:m.modelId||C.push("分类模型选择");break;case b.DATA_SOURCE:n===ee.TASK&&((T?.value??T)?.datasource?.getDevices?.(p.id)??[]).length===0&&C.push("设备选择");break;case b.TARGET_COUNT:break;case b.TIMER_TARGET:(!m.duration||m.duration<1)&&C.push("持续时间");break}return C},z=p=>{const x=d.nodes.find(m=>m.id===p.source);if(!x)return[];const N=[];return x.type===b.DATA_SOURCE&&x.data?.enableImageSequence===!0&&p.sourceHandle!=="first-frame"&&(!p.data?.timeWindowSeconds||p.data.timeWindowSeconds<1)&&N.push("后续检测帧的持续时间"),N};return{runValidation:()=>{const{nodes:p,edges:x}=d;d.clearInvalidIds();const N=Fe(p,x,n),m=N.errors,C=[],l=[],L=[];p.filter(g=>g.type!=="group").forEach(g=>{const E=A(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("、")}`))}),m.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 u=m.map(g=>typeof g=="object"?g.message:g),I=N.warnings.map(g=>typeof g=="object"?g.message:g),B=[...u.map(g=>({msg:g,type:"error"})),...L.map(g=>({msg:g,type:"warning"})),...I.map(g=>({msg:g,type:"warning"}))],S=u.length===0&&L.length===0;if(S&&I.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(B.length>0){const g=B[0];Z.ElMessage[g.type](g.msg)}return S}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[d,h]of o)t[d]=h;return t},kt={class:"toolbar"},bt={class:"toolbar-right"},xt=oe({__name:"WorkflowToolbar",setup(a){const o=ae(),{copyToClipboard:t,downloadJSON:d}=je(),{runValidation:h}=ze(),n=()=>{o.resetWorkflow()},k=()=>{h()},T=()=>{t()},A=()=>{d()};return(z,O)=>{const p=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",kt,[O[4]||(O[4]=e.createElementVNode("div",{class:"toolbar-left"},[e.createElementVNode("h2",null,"AIPass 算法编排系统")],-1)),e.createElementVNode("div",bt,[e.createVNode(p,{type:"info",icon:e.unref(X.RefreshLeft),onClick:n},{default:e.withCtx(()=>[...O[0]||(O[0]=[e.createTextVNode(" 重置 ",-1)])]),_:1},8,["icon"]),e.createVNode(p,{type:"danger",icon:e.unref(X.CircleCheck),onClick:k},{default:e.withCtx(()=>[...O[1]||(O[1]=[e.createTextVNode(" 运行测试 ",-1)])]),_:1},8,["icon"]),e.createVNode(p,{type:"success",icon:e.unref(X.CopyDocument),onClick:T},{default:e.withCtx(()=>[...O[2]||(O[2]=[e.createTextVNode(" 复制JSON ",-1)])]),_:1},8,["icon"]),e.createVNode(p,{type:"warning",icon:e.unref(X.Download),onClick:A},{default:e.withCtx(()=>[...O[3]||(O[3]=[e.createTextVNode(" 导出JSON ",-1)])]),_:1},8,["icon"])])])}}},[["__scopeId","data-v-17ee463c"]]),Et={key:0},wt={class:"node-list"},Tt={class:"node-list"},St={class:"node-list"},Vt={class:"node-list"},Bt=oe({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),d=(h,n)=>{h.dataTransfer&&(h.dataTransfer.setData("application/vueflow",n),h.dataTransfer.effectAllowed="move")};return(h,n)=>{const k=e.resolveComponent("el-icon"),T=e.resolveComponent("VideoPlay"),A=e.resolveComponent("CircleClose"),z=e.resolveComponent("el-collapse-item"),O=e.resolveComponent("FolderOpened"),p=e.resolveComponent("Cpu"),x=e.resolveComponent("View"),N=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:n[1]||(n[1]=m=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",Et,"节点工具箱")):(e.openBlock(),e.createBlock(k,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(k,{key:2,class:"toggle-btn",onClick:n[0]||(n[0]=e.withModifiers(m=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:t.value,"onUpdate:modelValue":n[13]||(n[13]=m=>t.value=m),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(z,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[2]||(n[2]=m=>d(m,"start"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),n[14]||(n[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[3]||(n[3]=m=>d(m,"end"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(A)]),_:1}),n[15]||(n[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(z,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",Tt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[4]||(n[4]=m=>d(m,"dataSource"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(O)]),_:1}),n[16]||(n[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[5]||(n[5]=m=>d(m,"smallModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(p)]),_:1}),n[17]||(n[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[6]||(n[6]=m=>d(m,"detectionTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),n[18]||(n[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[7]||(n[7]=m=>d(m,"classificationModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),n[19]||(n[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(z,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",St,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[8]||(n[8]=m=>d(m,"targetCount"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),n[20]||(n[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[9]||(n[9]=m=>d(m,"timerTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),n[21]||(n[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(z,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",Vt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[10]||(n[10]=m=>d(m,"ocr"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),n[22]||(n[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[11]||(n[11]=m=>d(m,"licensePlate"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),n[23]||(n[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[12]||(n[12]=m=>d(m,"faceRecognition"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),n[24]||(n[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:n,extraConfig:k}=o,T={id:t,title:d,label:h,type:"DETECTION_TARGET",inputSchema:n,extraConfig:k,data:{targetId:d,targetName:h,description:h,areas:n?.properties?.areas?.default||[],threshold:n?.properties?.threshold?.default||.5,targetWidth:n?.properties?.targetWidth?.default||20,targetHeight:n?.properties?.targetHeight?.default||20,postmodel:n?.properties?.postmodel?.default||"ClipVit",expandRect:n?.properties?.expandRect?.default!==void 0?n.properties.expandRect.default:!1,topScale:n?.properties?.topScale?.default||1.6,bottomScale:n?.properties?.bottomScale?.default||1.6,leftScale:n?.properties?.leftScale?.default||1.6,rightScale:n?.properties?.rightScale?.default||1.6,enableStructure:k?.showStruct!==void 0?!1:void 0}};return Object.keys(T.data).forEach(A=>{T.data[A]===void 0&&delete T.data[A]}),T}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Ue=a=>ot[a]||a,fe=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||Ue(a),...t}}),Ne=(a,o,t={})=>{const{sourceHandle:d,...h}=t,n={id:`e_${a}_${o}`,source:a,target:o};return d&&(n.sourceHandle=d),Object.keys(h).length>0&&(n.data=h),n},At=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(d=>({operator:d.op,value:d.value}))}},Dt=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}},Lt=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},Ot=()=>({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"]}),Mt=()=>({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:[]}),It=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),We=()=>{const a=ae(),o=e.inject("editorConfig",null),t=u=>nt[u]||b.DETECTION_TARGET,d=(u,I)=>u?.find(B=>B.id===String(I))??u?.[I],h=(u,I)=>u.streamConfig?(u.children||[]).some(g=>(g.branchRefs||[]).some(E=>d(I.branches,E)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,n=u=>!u||typeof u!="object"?"无效的JSON格式":!u.ruleName&&u.ruleName!==""?"缺少 ruleName 字段":u.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",k=u=>{const I=o?.value??o;return u==="small"?I?.smallModels||[]:u==="detection"?I?.detection||[]:u==="classification"?I?.classification?.models||[]:[]},T=()=>{},A=(u,I)=>{u.modelName=I||"",u.title=I||"",u.modelId=I||null;const S=k("small").find(g=>g.title===I);S&&(u.input_schema=S.inputSchema||S.input_schema||{},u.modelId=S.id||S.title,u.modelName=S.name||I,u.modelType=S.type,u.supportDirectAlert=S.supportDirectAlert||!1,u.extraConfig=S.extraConfig)},z=async(u,I)=>{const B=t(u.toolTitle),S={label:u.nodeName||Ue(B),arguments:u.arguments||{},input_schema:{}};switch(B){case b.DETECTION_TARGET:S.targetId=u.toolTitle,S.targetName=u.nodeName||"检测目标";{const E=k("detection").find(i=>i.title===u.toolTitle);if(E){let s=Ee.backendToFrontend(E).inputSchema||{};if(u.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 b.CLASSIFICATION_MODEL:S.modelName=u.nodeName||"分类模型";break;case b.SMALL_MODEL:A(S,u.toolTitle);break}return u.branchLogic&&(S.enableBranch=!0,S.branchLogic=u.branchLogic),fe(B,I,S)},O=(u,I,B,S)=>{const g={label:"小模型",input_schema:{},arguments:u.arguments||{}};return A(g,u.toolTitle),I===de.SMALL_MODEL_BRANCH&&(g.enableBranch=!0,g.branchLogic=B.logic||"and"),fe("smallModel",S,g)},p=async(u,I,B,S,g,E)=>{let i=I,s=S;const y={branchOrder:u.sortOrder??1,branchName:u.branchName||"",branchId:u.id??null};u.sourceHandle&&(y.sourceHandle=u.sourceHandle);const f=u.timeWindowSeconds??u.extraConfig?.timeWindowSeconds;f!==void 0&&(y.timeWindowSeconds=f),u.description&&(y.branchDescription=u.description);const w=[...u.nodes||[]].sort((_,D)=>(_.sortOrder??0)-(D.sortOrder??0)),G=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]);let R=-1;w.forEach((_,D)=>{G.has(t(_.toolTitle))&&(R=D)});const H=w.map(_=>({kind:"regular",data:_})),P=u.targetCount??u.extraConfig?.targetCount,j=u.duration??u.extraConfig?.duration,Y=[];P&&Y.push({kind:"targetCount",data:P}),j&&Y.push({kind:"timerTarget",data:j}),Y.length>0&&H.splice(R+1,0,...Y);for(let _=0;_<H.length;_++){const D=H[_];let $;if(D.kind==="regular")$=await z(D.data,{x:s,y:B});else if(D.kind==="targetCount"){const W=At(D.data);$=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=Dt(D.data);$=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($),E.push(Ne(i,$.id,_===0?y:void 0)),i=$.id,s+=ie.H_GAP}return{lastNodeId:i,endX:s}},x=u=>{const I=u.ruleSchema.sourceGroups||[],B=u.ruleSchema.groupLogic||"and",S=I.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:u.ruleName||"",enableBranch:S?!0:B!=="and",branchLogic:B,groupWindowSeconds:u.ruleSchema.groupWindowSeconds??null})},N=u=>{const I=Lt(u.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:Ot(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...I}})},m=(u,I)=>[...u||[]].sort((B,S)=>(B.sort??0)-(S.sort??0)).map(B=>{const S=h(B,I),g=[];return(B.children||[]).forEach(E=>{(E.branchRefs||[]).forEach(i=>{const s=d(I.branches,i);s&&g.push(s)})}),g.sort((E,i)=>(E.sortOrder??0)-(i.sortOrder??0)),{sg:B,mode:S,refBranches:g}}),C=u=>{const B=(u.reduce((S,g)=>S+Math.max(g.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-B/2},l=async(u,I,B,S,g,E)=>{const{sg:i,mode:s,refBranches:y}=u,f=Math.max(y.length,1),w=B+(f-1)*ie.V_GAP/2;let G=ie.START_X+ie.H_GAP,R=ie.START_X;const H=i.logic==="order",P=fe("dataSource",{x:G,y:w},{label:i.name||"数据源",sourceGroupId:i.sourceGroupId??null,enableImageSequence:H,input_schema:Mt(),arguments:{needCooperativeDetection:!!i.synEnabled,windowSeconds:i.windowSeconds||5,enableImageSequence:H},enableBranch:!0,branchLogic:H?"order":i.logic||"and"});S.push(P),g.push(Ne(I.id,P.id,{branchOrder:i.sort??null,branchName:i.name||""})),H&&y.forEach((_,D)=>{_.sourceHandle||(_.sourceHandle=D===0?"first-frame":It())});const j=H?{dataSourceNode:P,refBranches:y}:null;let Y=P.id;if(s===de.SMALL_MODEL||s===de.SMALL_MODEL_BRANCH){G+=ie.H_GAP;const _=O(i.streamConfig,s,i,{x:G,y:w});S.push(_),g.push(Ne(P.id,_.id)),Y=_.id}if(y.length>0)for(let _=0;_<y.length;_++){const D=B+_*ie.V_GAP,{lastNodeId:$,endX:W}=await p(y[_],Y,D,G+ie.H_GAP,S,g);g.push(Ne($,E.id)),W>R&&(R=W)}else{g.push(Ne(Y,E.id));const _=G+ie.H_GAP;_>R&&(R=_)}return{branchY:B+f*ie.V_GAP,maxX:R,imageSequenceInfo:j}},L=u=>{for(const{dataSourceNode:I,refBranches:B}of u){const S=B.filter(g=>g.sourceHandle&&g.sourceHandle!=="first-frame");S.length>0&&(I.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 u=>{const I=n(u);if(I)return Z.ElMessage.error(I),!1;try{T();const B=[],S=[],g=x(u),E=N(u);B.push(g);const i=m(u.ruleSchema.sourceGroups,u);let s=C(i),y=ie.START_X;const f=[];for(const w of i){const G=await l(w,g,s,B,S,E);s=G.branchY,G.maxX>y&&(y=G.maxX),G.imageSequenceInfo&&f.push(G.imageSequenceInfo)}return E.position.x=y+ie.H_GAP,B.push(E),L(f),a.loadWorkflow(B,S),Z.ElMessage.success("导入成功"),!0}catch(B){return Z.ElMessage.error("导入失败: "+(B.message||"未知错误")),!1}},validateImportJSON:n}},Rt=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:d,validateImportJSON:h}=We(),n=(N,m)=>{const C=N.mode??0,l=N.interval??0,L=N.sw_decoding===!1?"GPU":"CPU";let q,u;return m?C===1?(q=2,u=0):C===0&&l===0?(q=3,u=0):(q=1,u=l):C===1?(q=2,u=0):l===0?(q=0,u=30):(q=0,u=l),{mode:q,interval:u,sw_decoding:L}},k=(N,m)=>{const C=N.frameExtractionType??1,l=N.frameInterval??0,q=(N.frameExtractionSourceType??1)===2?"GPU":"CPU";let u,I;return C===0?(u=3,I=0):C===1&&l===0?(u=m?2:0,I=30):C===1?(u=0,I=l):C===2?(u=1,I=l):C===3?(u=2,I=0):(u=m?3:0,I=30),{mode:u,interval:I,sw_decoding:q}},T=N=>N===1?"device":"platform",A=N=>!N||N.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(N.pollingAmount??1)},z=(N,m,C)=>{if(m){const l=N.find(L=>L.sourceGroupId===m);if(l)return l}return N[C]??null},O=(N,m)=>{if(!N?.branches)return null;for(const C of N.branches){const l=C.nodes?.find(L=>L.toolTitle===m);if(l?.arguments)return{...l.arguments}}return null},p=N=>{if(!Array.isArray(N)||N.length===0)return{timeZone:"",planType:0};const m=N.map(l=>({dayType:Number(l.dayType??0),timePeriod:(l.timePeriod??[]).map(L=>({startTime:L.startTime,endTime:L.endTime}))})),C=m.some(l=>l.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:m}),planType:C}};return{importFromJSON:async N=>{const m=h(N);if(m)return Z.ElMessage.error(m),!1;if(!await d(N))return!1;const l=a?.value??a;if(!l||typeof l!="object"||Object.keys(l).length===0)return!0;const L=l.graph??{},q=L.sources??[],u=L.extraConfig??{},I=t.nodes.find(i=>i.type===b.START);if(I){const i=l.name??L.workflowName??"",s=!!u.enableVideo,y=u.schedule??[],{timeZone:f,planType:w}=p(y);t.updateNodeData(I.id,{taskName:i,enableAlertVideo:s,schedule:y,timeZone:f,planType:w,...f?{executionTime:f}:{}})}const B=t.nodes.filter(i=>i.type===b.DATA_SOURCE),S=t.nodes.some(i=>i.type===b.SMALL_MODEL);return B.forEach((i,s)=>{const y=i.data?.sourceGroupId??null,f=z(q,y,s);if(!f)return;const w=f.attach??{},G=f.streamConfig?.decoder??null,R=w.deviceType==="1400"?"1400":"camera",H=R==="camera"?G?n(G,S):k(w,S):{},P=R==="camera"?A(w.pollingConfig):{},j=R==="1400"?{detectionMode:T(w.detectionType)}:{},Y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...Y,deviceType:R,...H,...P,...j}});const _=o?.value??o;if(_?.datasource?.setDevices){const $=(y?q.filter(W=>W.sourceGroupId===y):[f]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));_.datasource.setDevices(i.id,$)}}),t.nodes.filter(i=>i.type===b.DETECTION_TARGET).forEach(i=>{const s=new Set,y=[i.id];let f=null;for(;y.length&&!f;){const _=y.shift();if(s.has(_))continue;s.add(_);const D=t.edges.filter($=>$.target===_);for(const $ of D){const W=t.nodes.find(r=>r.id===$.source);if(W){if(W.type===b.DATA_SOURCE){f=W.id;break}y.push(W.id)}}}if(!f)return;const G=(o?.value??o)?.datasource?.getDevices?.(f)??[];if(G.length<=1)return;const R=i.data?.targetId;if(!R)return;const H=G.map(_=>{const D=String(_.sourceId??_.id??""),$=q.find(W=>String(W.sourceId)===D);if(!$?.branches)return{deviceId:D,args:null};for(const W of $.branches){const r=W.nodes?.find(c=>c.toolTitle===R);if(r?.arguments)return{deviceId:D,args:{...r.arguments}}}return{deviceId:D,args:null}}),P=H.filter(_=>_.args!==null);if(P.length===0)return;const j=JSON.stringify(P[0].args);if(P.some(_=>JSON.stringify(_.args)!==j)){const _=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{..._,configMode:"perDevice"}}),H.forEach(({deviceId:D,args:$})=>{$&&t.setTaskSourceArguments(f,D,i.id,$)})}}),t.nodes.filter(i=>i.type===b.FACE_RECOGNITION).forEach(i=>{const s=new Set,y=[i.id];let f=null;for(;y.length&&!f;){const Y=y.shift();if(s.has(Y))continue;s.add(Y);const _=t.edges.filter(D=>D.target===Y);for(const D of _){const $=t.nodes.find(W=>W.id===D.source);if($){if($.type===b.DATA_SOURCE){f=$.id;break}y.push($.id)}}}const G=(f?t.nodes.find(Y=>Y.id===f):null)?.data?.sourceGroupId??null,R=B.findIndex(Y=>Y.id===f),H=z(q,G,R>=0?R:0);if(!H)return;const P=O(H,"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}},$t=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Rt():We(),Ft={class:"node-content"},qt={class:"node-label"},Gt=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){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:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},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(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Ht={class:"node-content"},Pt={class:"node-label"},jt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){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: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(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("span",Pt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),zt={class:"node-content"},Ut={class:"node-info"},Wt={class:"node-label"},Jt={key:1,class:"sequence-handles"},Yt={class:"handle-item"},Xt={class:"handle-label"},Qt={key:0,class:"handle-item add-button-item"},Kt=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(),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,O=>{const p=Math.random()*16|0;return(O==="x"?p:p&3|8).toString(16)}),k=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let T=!1;const A=()=>{if(T)return;T=!0;const O=o.data.subsequentFrames||[],p={id:n(),label:`后续帧检测${O.length+1}`,handleId:n()};t.addSubsequentFrame(o.id,p),setTimeout(()=>{T=!1},300)},z=async O=>{const p=o.data.subsequentFrames.find(N=>N.id===O);if(t.edges.some(N=>N.source===o.id&&N.sourceHandle===p.handleId))try{await Z.ElMessageBox.confirm(`删除"${p.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,O)};return(O,p)=>{const x=e.resolveComponent("FolderOpened"),N=e.resolveComponent("el-icon"),m=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",zt,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",Ut,[e.createElementVNode("div",Wt,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",Jt,[e.createElementVNode("div",Yt,[p[0]||(p[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(k.value,C=>(e.openBlock(),e.createElementBlock("div",{key:C.id,class:"handle-item"},[e.createElementVNode("span",Xt,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(N,{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",Qt,[e.createVNode(m,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(A,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Zt={class:"node-content"},vt={class:"node-info"},eo={class:"node-label"},to={key:0,class:"node-model"},oo={key:1,class:"node-placeholder"},no={key:0,class:"direct-alert-badge"},ao=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){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:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Zt,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",vt,[e.createElementVNode("div",eo,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",to,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",oo,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",no,[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"]]),lo={class:"node-content"},ro={class:"node-info"},so={class:"node-target"},io={class:"node-params"},co=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||"检测目标",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 n=o.data.arguments.object;if(Array.isArray(n))return n.filter(T=>T&&T.trim()!=="").length}return null});return(n,k)=>{const T=e.resolveComponent("View"),A=e.resolveComponent("el-icon"),z=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",lo,[e.createVNode(A,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",ro,[k[1]||(k[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",so,e.toDisplayString(t()),1),e.createElementVNode("div",io,[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(a.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.targetHeight&&a.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(z,{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(z,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...k[0]||(k[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"]]),mo={class:"node-content"},po={class:"node-info"},uo={class:"node-label"},fo={key:0,class:"node-model"},go={key:1,class:"node-placeholder"},ho={key:2,class:"node-stats"},yo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const d=e.resolveComponent("Grid"),h=e.resolveComponent("el-icon"),n=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",mo,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",po,[e.createElementVNode("div",uo,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",fo,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",go,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",ho,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(n,{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(n,{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(n,{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"]]),_o={class:"node-content"},No={class:"node-info"},Co={class:"node-label"},ko={class:"node-params"},bo=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){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: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(d,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",No,[e.createElementVNode("div",Co,e.toDisplayString(a.data.label),1),e.createElementVNode("div",ko,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(h,{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"]]),xo={class:"node-content"},Eo={class:"node-info"},wo={class:"node-label"},To={class:"node-scope"},So={class:"node-params"},Vo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),d=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const n=t.nodes.find(k=>k.id===h);return n?n.data.label:"检测范围"};return(h,n)=>{const k=e.resolveComponent("Document"),T=e.resolveComponent("el-icon"),A=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",xo,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(k)]),_:1}),e.createElementVNode("div",Eo,[e.createElementVNode("div",wo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",To,e.toDisplayString(d()),1),e.createElementVNode("div",So,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(A,{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(A,{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"]]),Bo={class:"node-content"},Ao={class:"node-info"},Do={class:"node-params"},Lo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},d=e.computed(()=>{const h=o.data.arguments?.alertConditions||[];if(h.length===0)return"";if(h.length===1){const k=h[0];return`数量 ${t[k.operator]||k.operator} ${k.value}`}const n=o.data.arguments?.conditionRelation||"OR";return`${h.length} 个条件(${n})`});return(h,n)=>{const k=e.resolveComponent("el-icon"),T=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",Bo,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",Ao,[n[0]||(n[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Do,[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"]]),Oo={class:"node-content"},Mo={class:"node-info"},Io={class:"node-label"},Ro={class:"node-params"},$o=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||"目标计时"),d=e.computed(()=>`${o.data.arguments?.duration||30}秒`),h=e.computed(()=>{const n=o.data.arguments?.condition_type;return n==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:n==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(n,k)=>{const T=e.resolveComponent("el-icon"),A=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",Oo,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Mo,[e.createElementVNode("div",Io,e.toDisplayString(t.value),1),e.createElementVNode("div",Ro,[e.createVNode(A,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1}),h.value?(e.openBlock(),e.createBlock(A,{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"]]),Fo={class:"group-label"},qo=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},d=e.computed(()=>t[o.data.branchLogic]??"ALL"),h=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),n={width:"8px",height:"8px",borderRadius:"2px"},k={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(T,A)=>{const z=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",Fo,[e.createVNode(z,{type:h.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1},8,["type"]),A[0]||(A[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(tt.NodeResizer),{"min-width":200,"min-height":100,"handle-style":n,"line-style":k})],2)}}},[["__scopeId","data-v-adf6607d"]]),Go={class:"node-content"},Ho={class:"node-info"},Po={class:"node-label"},jo={class:"node-scope"},zo={class:"node-params"},Uo=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),d=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const n=t.nodes.find(k=>k.id===h);return n?n.data.label:"检测范围"};return(h,n)=>{const k=e.resolveComponent("el-icon"),T=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",Go,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",Ho,[e.createElementVNode("div",Po,e.toDisplayString(a.data.label),1),e.createElementVNode("div",jo,e.toDisplayString(d()),1),e.createElementVNode("div",zo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(T,{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(T,{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"]]),Wo={class:"quick-add-menu__list"},Jo=["onClick"],Yo={class:"quick-add-menu__icon"},Xo={class:"quick-add-menu__label"},Qo={key:0,class:"quick-add-menu__empty"},ue=8,Ko=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),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 A=t.value.getBoundingClientRect(),z=window.innerWidth,O=window.innerHeight;let{x:p,y:x}=o.position;p+A.width>z-ue&&(p=z-A.width-ue),x+A.height>O-ue&&(x=O-A.height-ue),p<ue&&(p=ue),x<ue&&(x=ue),d.value={x:p,y:x}});const h=e.computed(()=>({left:d.value.x+"px",top:d.value.y+"px"})),n=[{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:"🏁"}],k=e.computed(()=>{switch(o.sourceNodeType){case"start":return n.filter(T=>T.type==="dataSource");case"dataSource":return n.filter(T=>T.type==="smallModel"||T.type==="detectionTarget"||T.type==="classificationModel");case"smallModel":return n.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel"&&T.type!=="targetCount"&&T.type!=="timerTarget");case"detectionTarget":case"classificationModel":return n.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel");case"timerTarget":return n.filter(T=>["ocr","faceRecognition","licensePlate","end"].includes(T.type));case"targetCount":return n.filter(T=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(T.type));case"ocr":return n.filter(T=>["licensePlate","faceRecognition","end"].includes(T.type));case"licensePlate":return n.filter(T=>["ocr","faceRecognition","end"].includes(T.type));case"faceRecognition":return n.filter(T=>["ocr","licensePlate","end"].includes(T.type));default:return[]}});return(T,A)=>(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(h.value)},[A[1]||(A[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Wo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,z=>(e.openBlock(),e.createElementBlock("li",{key:z.type,class:"quick-add-menu__item",onClick:O=>T.$emit("select",z.type)},[e.createElementVNode("span",Yo,e.toDisplayString(z.icon),1),e.createElementVNode("span",Xo,e.toDisplayString(z.label),1)],8,Jo))),128)),k.value.length===0?(e.openBlock(),e.createElementBlock("li",Qo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),a.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:A[0]||(A[0]=z=>T.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Zo={class:"workflow-canvas"},Je=5,vo=oe({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:d,onConnectStart:h,onConnectEnd:n}=v.useVueFlow(),k=e.inject("editorConfig",null),T=e.inject("editorMode",ee.ALGORITHM),A=e.computed(()=>T===ee.TASK),z=e.inject("echoAlgodata",null),{importFromJSON:O}=$t();e.watch(z,async r=>{if(r&&Object.keys(r).length>0&&(await e.nextTick(),await O(r),A.value)){const c=r?.ruleSchema?.sourceGroups??[];let V=null;if(c.some(F=>F.streamConfig)?V="stream":(c.length>1||c.some(F=>(F.children??[]).length>1))&&(V="image"),V){const F=o.nodes.find(U=>U.type===b.START);F&&o.updateNodeData(F.id,{streamType:V})}}},{immediate:!0});const p=(r,c)=>{if(!c?.properties)return r;const V={};return Object.entries(c.properties).forEach(([F,U])=>{U.default!==void 0&&(V[F]=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}}),N=()=>{x.visible=!1,x.sourceNodeId=null,x.sourceNodeType=null,x.sourceHandleId=null,q=!1};let m=null,C=!1,l=null,L=null,q=!1;const u=()=>{l&&(document.removeEventListener("mousemove",l),l=null),L&&(document.removeEventListener("mouseup",L),L=null)};e.onUnmounted(()=>{u()}),h(({nodeId:r,handleId:c,handleType:V,event:F})=>{if(V!=="source")return;if(A.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const U=o.nodes.find(ne=>ne.id===r);if(!U||U.type==="end")return;if(U.type===b.DATA_SOURCE&&U.data?.enableImageSequence){if(c&&o.edges.filter(M=>M.source===r&&M.sourceHandle===c).length>=1)return}else if(U.type!==b.START&&U.type!==b.DATA_SOURCE&&o.edges.filter(M=>M.source===r).length>=1)return;const J=F?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}m={nodeId:r,sourceNodeType:U.type,handleId:c,menuX:Q,menuY:te,flowPos:{...U.position}},C=!1;const se=F?.clientX??0,ce=F?.clientY??0;u(),l=ne=>{(Math.abs(ne.clientX-se)>Je||Math.abs(ne.clientY-ce)>Je)&&(C=!0,u())},L=()=>{if(u(),!C&&m){q=!0;const ne=m;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}m=null},document.addEventListener("mousemove",l),document.addEventListener("mouseup",L)});const I=r=>{const c=x.sourceNodeId,V=o.nodes.find(K=>K.id===c);if(!V){N();return}if(A.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),N();return}const F=V.position.x+250,U=V.position.y;let J={x:F,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-F)<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===c&&ke.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),N();return}const he=S(V,K);if(!he.valid){Z.ElMessage.warning(he.message),N();return}o.addConnection({source:c,target:K.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),R(),N(),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=k?.value??k;ne=p(Le(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=k?.value??k;ne=p(Oe(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=k?.value??k;ne=p(Re(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Me(J);break;case"timerTarget":ne=Ie(J);break;default:N();return}const M=S(V,ne);if(!M.valid){Z.ElMessage.warning(M.message),N();return}o.addNode(ne),o.addConnection({source:c,target:ne.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),R(),N(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},B=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],S=(r,c)=>{if(r?.parentNode&&c?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(c?.parentNode&&r?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(r?.type===b.START){if(c?.type!==b.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(c?.type===b.SMALL_MODEL){if(r?.type!==b.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!==b.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(r?.type===b.DATA_SOURCE){if(c?.type!==b.SMALL_MODEL&&c?.type!==b.DETECTION_TARGET&&c?.type!==b.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===b.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(r?.type===b.SMALL_MODEL&&(c?.type===b.TARGET_COUNT||c?.type===b.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(r?.type===b.TARGET_COUNT&&![b.TIMER_TARGET,b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(c?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(r?.type===b.TIMER_TARGET&&![b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(c?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const V=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION];return V.includes(r?.type)&&!V.filter(U=>U!==r.type).concat(b.END).includes(c?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:c?.type!==b.END&&o.edges.filter(U=>U.target===c?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},g=e.markRaw({start:Gt,end:jt,dataSource:Kt,smallModel:ao,detectionTarget:co,classificationModel:yo,ocr:bo,licensePlate:Vo,targetCount:Lo,timerTarget:$o,group:qo,faceRecognition:Uo}),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(c=>{if(c.type==="position"&&c.position)o.updateNodePosition(c.id,c.position);else if(c.type==="remove"){if(A.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const V=o.nodes.find(U=>U.id===c.id);if(V&&V.type===b.START){Z.ElMessage.warning("开始节点不可删除");return}if(V&&V.type===b.END){Z.ElMessage.warning("结束节点不可删除");return}if(V&&V.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const F=V?.parentNode;o.removeNode(c.id),F&&o.nodes.filter(J=>J.parentNode===F).length===0&&o.dissolveParallelGroup(F)}})},y=r=>{r.forEach(c=>{if(c.type==="remove"){if(A.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(c.id)}})},f=r=>{if(q)return;if(A.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),N();return}const c=o.nodes.find(U=>U.id===r.source),V=o.nodes.find(U=>U.id===r.target),F=S(c,V);if(!F.valid){Z.ElMessage.warning(F.message),N();return}if(c?.type===b.DATA_SOURCE&&c.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(c?.type)&&!c.data.enableBranch&&o.edges.filter(J=>J.source===r.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(r),R(),N()},w=r=>({and:"ALL",or:"SOME"})[r]||"ALL",G=r=>{const c=o.nodes.find(V=>V.id===r.source);if(!c)return"";if(c.type===b.START){const V=c.data.branchLogic||"and",F=w(V),U=r.data?.branchOrder;return U!=null?`${F} - 执行顺序 ${U}`:F}if(c.type===b.DATA_SOURCE){if(c.data?.enableImageSequence){const J=r.sourceHandle==="first-frame"?"首帧":"后续帧",Q=r.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const V=c.data.branchLogic||"and",F=w(V),U=r.data?.branchOrder;return U!=null?`${F} - 执行顺序 ${U}`:F}return""},R=()=>{o.edges.forEach(r=>{const c=G(r);r.label!==c&&(r.label=c,r.labelStyle=c?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,r.labelBgStyle=c?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,r.labelBgPadding=c?[4,6]:void 0)})},H=()=>{o.nodes.forEach(r=>{if(r.type!=="group")return;const c=r.data.sourceNodeId;if(!c)return;const V=o.nodes.find(F=>F.id===c);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,c)=>{c&&r.forEach(V=>{const F=c.find(U=>U.id===V.id);if(F){if(V.enableBranch&&!F.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&&F.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.dissolveParallelGroup(U.id)}if(V.enableBranch&&F.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})),()=>{R(),H()},{deep:!0}),e.watch(()=>o.edges.map(r=>({id:r.id,branchOrder:r.data?.branchOrder})),(r,c)=>{R(),c&&r.forEach(V=>{const F=c.find(U=>U.id===V.id);if(F&&F.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===b.DATA_SOURCE&&o.updateNodePosition(J.id,{x:J.position.x,y:J.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([r,c])=>{o.nodes.forEach(V=>{r.has(V.id)?V.class="invalid-node":V.class==="invalid-node"&&(V.class="")}),o.edges.forEach(V=>{c.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(A.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(r.edge.id)},_=()=>{o.clearSelection()},D=({node:r})=>{if(r.type==="group"||!B.includes(r.type))return;const c=o.nodes.filter(F=>F.type==="group");let V=null;for(const F of c){const U=d(F.id);if(!U)continue;const J=U.dimensions?.width||parseInt(F.style?.width)||300,Q=U.dimensions?.height||parseInt(F.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,M=ce?.dimensions?.height||60,K=te+ne/2,le=se+M/2;if(K>=F.position.x&&K<=F.position.x+J&&le>=F.position.y&&le<=F.position.y+Q){V=F.id;break}}V?r.parentNode!==V&&o.addNodeToGroup(r.id,V):r.parentNode&&o.removeNodeFromGroup(r.id)},$=r=>{r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="move")},W=r=>{r.preventDefault();const c=r.dataTransfer?.getData("application/vueflow");if(!c)return;if(A.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(c===b.START&&o.getNodeCountByType(b.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(c===b.END&&o.getNodeCountByType(b.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const V=160,F=60,U=t({x:r.clientX,y:r.clientY}),J={x:U.x-V/2,y:U.y-F/2};let Q;switch(c){case b.START:Q=Ve(J);break;case b.END:Q=be(J);break;case b.DATA_SOURCE:Q=xe(J);break;case b.SMALL_MODEL:Q=Be(J);break;case b.DETECTION_TARGET:Q=Ae(J);break;case b.CLASSIFICATION_MODEL:Q=De(J);break;case b.OCR:{const te=k?.value??k;Q=p(Le(J),te?.ocr?.[0]?.inputSchema);break}case b.LICENSE_PLATE:{const te=k?.value??k;Q=p(Oe(J),te?.license_plate?.[0]?.inputSchema);break}case b.TARGET_COUNT:Q=Me(J);break;case b.TIMER_TARGET:Q=Ie(J);break;case b.FACE_RECOGNITION:{const te=k?.value??k;Q=p(Re(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(r,c)=>(e.openBlock(),e.createElementBlock("div",Zo,[e.createVNode(e.unref(v.VueFlow),{nodes:E.value,"onUpdate:nodes":c[0]||(c[0]=V=>E.value=V),edges:i.value,"onUpdate:edges":c[1]||(c[1]=V=>i.value=V),"node-types":e.unref(g),onNodesChange:s,onEdgesChange:y,onConnect:f,onNodeClick:P,onEdgeClick:j,onEdgeDoubleClick:Y,onPaneClick:_,onDrop:W,onDragover:$,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(ve.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(et.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Ko,{visible:x.visible,position:x.screenPos,"source-node-type":x.sourceNodeType,onSelect:I,onClose:N},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-70847917"]]),en={class:"config-header"},tn={key:0,class:"config-section"},on={key:1,class:"config-section"},nn=oe({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),d=e.computed(()=>t===ee.TASK),h=e.computed(()=>{const O=o.selectedEdge;return O&&o.nodes.find(x=>x.id===O.source)?.data?.enableBranch?O:null}),n=e.computed(()=>h.value&&o.nodes.find(p=>p.id===h.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),k=e.computed(()=>{if(!h.value)return!1;const O=o.nodes.find(p=>p.id===h.value.source);return(O?.type==="dataSource"||O?.type==="start")&&O?.data?.enableBranch}),T=e.computed(()=>{if(!h.value)return 1;const O=o.nodes.find(p=>p.id===h.value.source);return O?o.edges.filter(p=>p.source===O.id).length:1}),A=e.computed(()=>{if(!h.value)return!1;const O=o.nodes.find(p=>p.id===h.value.source);return O?O.type==="dataSource"&&O.data?.enableImageSequence===!0&&h.value.sourceHandle!=="first-frame":!1}),z=O=>{h.value&&o.updateEdgeData(h.value.id,O)};return(O,p)=>{const x=e.resolveComponent("el-divider"),N=e.resolveComponent("el-input-number"),m=e.resolveComponent("el-text"),C=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),q=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",en,[e.createElementVNode("h3",null,e.toDisplayString(n.value),1)]),e.createVNode(x),A.value?(e.openBlock(),e.createElementBlock("div",tn,[p[3]||(p[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(N,{"model-value":h.value?.data?.timeWindowSeconds??null,onChange:p[0]||(p[0]=u=>z({timeWindowSeconds:u})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(m,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),k.value?(e.openBlock(),e.createElementBlock("div",on,[p[5]||(p[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(q,{"model-value":h.value?.data?.branchOrder??null,disabled:d.value,onChange:p[1]||(p[1]=u=>z({branchOrder:u})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,u=>(e.openBlock(),e.createBlock(L,{key:u,label:`执行顺序 ${u}`,value:u},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(m,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...p[4]||(p[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),an={class:"config-section"},ln=oe({__name:"GroupNodeConfig",setup(a){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",an,[e.createVNode(h,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),rn={class:"time-init-container"},sn={key:0,class:"time-header flex-x-start"},cn={class:"tab-type flex-x"},dn={class:"time-content"},mn={id:"time-content-table-body"},pn=["onClick"],un=["onClick"],fn=["data-sort","data-value","data-day","data-type","onMousedown"],gn={key:1},hn=["data-sort","data-value","data-type","onMousedown"],yn={class:"time-list"},_n={key:0,class:"time-list-title"},Nn={key:1,style:{"margin-right":"10px"}},Cn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,d=e.ref(0);let h,n,k,T,A;const z=e.ref(new Map),O=e.ref(new Map),p=e.computed(()=>d.value===0?z.value:O.value);e.onMounted(()=>{h=document.querySelector("#time-content-table-body"),n=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=f=>{d.value!==f&&(d.value=f,e.nextTick(()=>{n=h.querySelectorAll("td.sel-able[data-type]"),n.forEach(G=>G.classList.remove("selected")),(f===0?z.value:O.value).forEach((G,R)=>{G.origin.forEach(H=>{Array.from(n).forEach(P=>{Number(P.dataset.sort)==H.sort&&Number(P.dataset.value)==H.value&&Number(P.dataset.day)==R&&P.classList.add("selected")})})})}))},N=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}]),m=(f,w,G)=>{t.operationType!=3&&G.which==1&&(T=f,k=Number(G.target.dataset.value),G.target.classList.contains("selected")?(G.target.classList.remove("selected"),A=""):(A="selected",G.target.classList.add("selected")),C(),B())},C=()=>{n.forEach(f=>{f.addEventListener("mouseover",L,!1,{once:!0})})},l=()=>{n.forEach(f=>{f.removeEventListener("mouseover",L)})},L=f=>{f.target.classList.remove("selected"),A&&f.target.classList.add(A);let w=Number(f.target.dataset.value),G=Number(f.target.dataset.day),R=G>T?G:T,H=G<T?G:T,P=w>k?w:k,j=w<k?w:k;for(let Y=H;Y<=R;Y++)for(let _=j;_<=P;_++){let D=document.querySelector(`td[data-value="${_}"][data-day="${Y}"]`);D.classList.remove("selected"),A&&D.classList.add(A)}B()},q=f=>{if(t.operationType==3)return;let w=[];n.forEach(G=>{Number(G.dataset.day)==f&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),B()},u=f=>{if(t.operationType==3)return;let w=[];n.forEach(G=>{Number(G.dataset.sort)==f&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),B()},I=()=>{n.forEach(w=>{w.classList.remove("selected")}),(d.value===0?z:O).value.clear()},B=()=>{const f=d.value===0?z:O;f.value.clear(),n.forEach(w=>{if(w.classList.contains("selected")){let G=w.dataset.day,R=w.dataset.sort,H=w.dataset.value;f.value.get(G)?f.value.get(G).origin.push({sort:Number(R),value:Number(H)}):f.value.set(G,{origin:[{sort:Number(R),value:Number(H)}],timeList:[]})}})},S=f=>{let R=p.value.get(f).origin.map(H=>H.value).reduce((H,P,j,Y)=>(j==0?H.push([P]):P==Y[j-1]+1?H[H.length-1].push(P):H.push([P]),H),[]);return R=R.map(H=>{let P=Math.max(...H)+1,j=Math.min(...H)+1,Y=j%2==0?30:0,_=P%2==0?0:30,D=g(Math.ceil(j/2)-1),$=g(Math.ceil(P/2)-(_==0?0:1));return{dayType:f,startTime:D+":"+(Y==0?"00":Y),endTime:$+":"+(_==0?"00":_)}}),p.value.get(f).timeList=R,R.map(H=>H.startTime+"-"+H.endTime).join()};function g(f){return f<10?"0"+f:f}const E=(f,w)=>{z.value.clear(),O.value.clear(),n.forEach(P=>P.classList.remove("selected")),d.value=w;const G=w===0?z:O,R=JSON.parse(f);let H=[];R.plan.forEach(P=>{P.timePeriod.forEach(j=>{H.push({...j,dayType:P.dayType})})}),e.nextTick(()=>{n=h.querySelectorAll("td.sel-able[data-type]"),H.forEach(P=>{G.value.get(P.dayType)?G.value.get(P.dayType).timeList.push(P):G.value.set(P.dayType,{origin:[],timeList:[{...P}]})}),G.value.forEach((P,j)=>{P.timeList.forEach(Y=>{let _=Number(Y.startTime.split(":")[1]),D=Number(Y.endTime.split(":")[1]),$=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if($==W){P.origin.push({sort:$,value:2*$});return}for(let r=$;r<=W;r++)if(r==$)_==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<W)P.origin.push({sort:r,value:2*r}),P.origin.push({sort:r,value:2*r+1});else if(D==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(n).find(_=>{Number(_.dataset.sort)==Y.sort&&Number(_.dataset.value)==Y.value&&Number(_.dataset.day)==j&&_.classList.add("selected")})})})})},i=(f,w)=>f.map(H=>H.value).sort((H,P)=>H-P).reduce((H,P,j,Y)=>(j==0?H.push([P]):P==Y[j-1]+1?H[H.length-1].push(P):H.push([P]),H),[]).map(H=>{let P=Math.max(...H)+1,j=Math.min(...H)+1,Y=j%2==0?30:0,_=P%2==0?0:30,D=g(Math.ceil(j/2)-1),$=g(Math.ceil(P/2)-(_==0?0:1));return{dayType:w,startTime:D+":"+(Y==0?"00":Y),endTime:$+":"+(_==0?"00":_)}});return o({getTimeData:()=>{(d.value===0?O:z).value.clear();let w=[];p.value.forEach((H,P)=>{const j=i(H.origin,P);w=w.concat(j)});let G={plan:[]},R=w.map(H=>H.dayType).filter((H,P,j)=>j.indexOf(H)===P);return R.length?(R.forEach(H=>{G.plan.push({dayType:H,timePeriod:w.filter(P=>P.dayType===H).map(P=>({startTime:P.startTime,endTime:P.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(G),planType:d.value}):{validTime:!1}},revertByTime:E,resetFn:()=>{d.value=0,z.value.clear(),O.value.clear(),e.nextTick(()=>{n.forEach(f=>{f.classList.remove("selected")}),n=h.querySelectorAll("td.sel-able[data-type]")})}}),(f,w)=>{const G=e.resolveComponent("el-icon"),R=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",rn,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",sn,[e.createElementVNode("div",cn,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==0}]),onClick:w[0]||(w[0]=H=>x(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==1}]),onClick:w[1]||(w[1]=H=>x(1))}," 日计划 ",2)]),e.createVNode(R,{class:"rm-icon",link:"",type:"danger",onClick:I},{default:e.withCtx(()=>[e.createVNode(G,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",dn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:w[3]||(w[3]=H=>H.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",mn,[e.createElementVNode("tr",null,[w[4]||(w[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,H=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:P=>u(H-1)},e.toDisplayString(H-1),9,pn)),64))]),d.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(N.value.filter(H=>H.value!=0),H=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:P=>q(H.value)},e.toDisplayString(H.name),9,un),(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":H.value,"data-type":d.value,onMousedown:j=>m(H.value,P,j)},null,40,fn)),64))]))),256)):e.createCommentVNode("",!0),d.value==1?(e.openBlock(),e.createElementBlock("tr",gn,[e.createElementVNode("th",{onClick:w[2]||(w[2]=H=>q(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,H=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((H-1)/2),"data-value":H-1,"data-day":0,"data-type":d.value,onMousedown:P=>m(0,H,P)},null,40,hn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",yn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value.keys(),H=>(e.openBlock(),e.createElementBlock("div",null,[d.value==0?(e.openBlock(),e.createElementBlock("span",_n,[w[6]||(w[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(N.value.find(P=>P.value==H).name),1)])):(e.openBlock(),e.createElementBlock("span",Nn,e.toDisplayString(N.value.find(P=>P.value==H).name),1)),e.createTextVNode(" ("+e.toDisplayString(S(H))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),kn={class:"time-template-dialog"},bn={class:"time-editor-panel"},xn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const d=a,h=t,n=e.ref(null),k=e.ref(""),T=e.ref(""),A=e.ref(d.modelValue?.timeTemplateName||""),z=e.ref([]);return e.computed(()=>k.value?z.value.filter(x=>x.name.toLowerCase().includes(k.value.toLowerCase())):z.value),e.watch(A,x=>{h("update:modelValue",{...d.modelValue,timeTemplateName:x})}),o({getFormData:()=>{const x=n.value?.getTimeData();return{timeTemplateId:T.value,timeTemplateName:A.value,...x}},revertByTime:(x,N)=>{n.value?.revertByTime(x,N)}}),(x,N)=>(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",kn,[e.createCommentVNode("",!0),e.createElementVNode("div",bn,[e.createCommentVNode("",!0),e.createVNode(Cn,{ref_key:"timeInitRef",ref:n},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),En={class:"config-section"},wn={key:0,class:"config-section"},Tn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},Sn={class:"config-section"},Vn=oe({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("echoAlgodata",null),k=e.computed(()=>{const m=(n?.value??n)?.ruleSchema?.sourceGroups??[];if(m.some(L=>L.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const C=m.length>1,l=m.some(L=>(L.children??[]).length>1);return C||l?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(k,N=>{N.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:N.value})},{immediate:!0});const T=e.ref(!1),A=e.ref(null),z=()=>{const N=A.value?.getFormData();if(N?.validTime){const C=(JSON.parse(N.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:N.timeZone,schedule:C,timeZone:N.timeZone,planType:N.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});T.value=!1},O=()=>{const N=t.value?.data;N?.timeZone&&A.value?.revertByTime(N.timeZone,N.planType??0)},p=e.computed(()=>t.value?o.edges.filter(m=>m.source===t.value.id).length>=2:!1),x=N=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:N})};return(N,m)=>{const C=e.resolveComponent("el-divider"),l=e.resolveComponent("el-input"),L=e.resolveComponent("el-form-item"),q=e.resolveComponent("el-form"),u=e.resolveComponent("el-option"),I=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,[m[15]||(m[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(C),e.createElementVNode("div",En,[m[9]||(m[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(q,{"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:m[0]||(m[0]=y=>x(y)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),h.value?(e.openBlock(),e.createElementBlock("div",wn,[m[10]||(m[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(q,{"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:m[1]||(m[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(I,{"model-value":k.value.locked?k.value.value:t.value?.data.streamType||"image",disabled:k.value.locked,onChange:m[2]||(m[2]=y=>e.unref(o).updateNodeData(t.value.id,{streamType:y})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(u,{label:"图片流",value:"image"}),e.createVNode(u,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),k.value.locked?(e.openBlock(),e.createElementBlock("div",Tn,e.toDisplayString(k.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(L,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(B,{"model-value":t.value?.data.enableAlertVideo,onChange:m[3]||(m[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:m[4]||(m[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":m[6]||(m[6]=y=>T.value=y),title:"执行时段",width:"1200px","append-to-body":"",onOpened:O},{footer:e.withCtx(()=>[e.createVNode(S,{onClick:m[5]||(m[5]=y=>T.value=!1)},{default:e.withCtx(()=>[...m[11]||(m[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(S,{type:"primary",onClick:z},{default:e.withCtx(()=>[...m[12]||(m[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(xn,{ref_key:"timeTemplateRef",ref:A},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",Sn,[m[14]||(m[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(q,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(I,{"model-value":t.value?.data.branchLogic||"and",disabled:h.value,onChange:m[7]||(m[7]=y=>e.unref(o).updateNodeData(t.value.id,{branchLogic:y})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(u,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(u,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),p.value?(e.openBlock(),e.createBlock(L,{key:0},{label:e.withCtx(()=>[m[13]||(m[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:m[8]||(m[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"]]),Bn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},An=["smallModel","detectionTarget"],we=()=>({schemaLoading:e.ref(!1),getToolType:n=>Bn[n]||null,needsToolSelection:n=>An.includes(n),fetchToolSchema:async(n,k="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(n,k="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Dn={key:0,class:"config-section"},Ln={key:3,class:"array-input"},On={key:1,class:"config-section"},Mn=oe({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:d,fetchSchemaForNodeType:h}=we(),n=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const x=p.required||[];return Object.entries(p.properties).map(([N,m])=>({key:N,type:m.type,label:m.title||m.label||m.description||N,description:m.description||"",default:m.default,required:x.includes(N)||m.required||!1,min:m.minimum!==void 0?m.minimum:m.min,max:m.maximum!==void 0?m.maximum:m.max,step:m.step,maxLength:m.maxLength,options:m.enum,optionLabels:m.enumLabels||m.enum,dependsOn:m.dependsOn}))}),k=p=>{if(t.value)return t.value.data.arguments?.[p]},T=(p,x)=>{if(!t.value)return;const m={...t.value.data.arguments||{},[p]:x};o.updateNodeData(t.value.id,{arguments:m})},A=p=>{if(!p.dependsOn||!t.value)return!0;const{field:x,value:N}=p.dependsOn,m=k(x);if(typeof N=="string"&&N.startsWith("!")){const C=N.substring(1);return m!==C}return Array.isArray(N)?N.includes(m):m===N},z=p=>{const x=k(p);return Array.isArray(x)?JSON.stringify(x):""},O=(p,x)=>{try{const N=JSON.parse(x);Array.isArray(N)&&T(p,N)}catch{}};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const x=t.value.type,N=t.value.data,m=N.input_schema||N.inputSchema;if(m&&m.properties&&Object.keys(m.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}),(p,x)=>{const N=e.resolveComponent("el-divider"),m=e.resolveComponent("el-icon"),C=e.resolveComponent("el-tooltip"),l=e.resolveComponent("el-option"),L=e.resolveComponent("el-select"),q=e.resolveComponent("el-switch"),u=e.resolveComponent("el-input-number"),I=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(N),n.value.length>0?(e.openBlock(),e.createElementBlock("div",Dn,[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(n.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(m,{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":k(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(q,{key:1,"model-value":k(g.key),onChange:E=>T(g.key,E)},null,8,["model-value","onChange"])):g.type==="number"||g.type==="integer"?(e.openBlock(),e.createBlock(u,{key:2,"model-value":k(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",Ln,[e.createVNode(I,{"model-value":z(g.key),onChange:E=>O(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":k(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(I,{key:5,"model-value":k(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||A(g)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(d)&&n.value.length===0?(e.openBlock(),e.createElementBlock("div",On,[...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"]]),In={class:"config-header"},Rn={class:"config-section"},$n={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Fn={key:0,class:"config-section"},qn={key:3,class:"array-input"},Gn={key:1,class:"config-section"},Hn={key:2,class:"config-section"},Pn=oe({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),k=e.computed(()=>(n?.value??n)?.classification?.models??[]),T=e.computed(()=>(n?.value??n)?.classification?.modelParams??null),A=e.ref([]),z=e.ref(!1),O=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:B=>{t.value&&B&&l("modelId",B)}}),p=()=>{A.value=k.value},x=async B=>{if(!t.value||!B)return;const S=A.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}})},N=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},m=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},q=B=>{const S=C(B);return Array.isArray(S)?JSON.stringify(S):""},u=(B,S)=>{try{const g=JSON.parse(S);Array.isArray(g)&&l(B,g)}catch{}},I=()=>{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;A.value.length===0&&p();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=A.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,G])=>{G.default!==void 0&&(y[w]=G.default)});const f=t.value?.data;f&&o.updateNodeData(t.value.id,{...f,input_schema:s,extraConfig:i.extraConfig||null,arguments:{...y,...f.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"),f=e.resolveComponent("el-form"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),R=e.resolveComponent("el-switch"),H=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",In,[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:I},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",Rn,[S[2]||(S[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(f,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(s,{modelValue:O.value,"onUpdate:modelValue":S[0]||(S[0]=j=>O.value=j),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:z.value,disabled:h.value,onChange:x,onClear:N},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(A.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"]),A.value.length===0&&!z.value?(e.openBlock(),e.createElementBlock("div",$n," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),O.value&&m.value.length>0?(e.openBlock(),e.createElementBlock("div",Fn,[S[3]||(S[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(f,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.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(G,{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,_)=>(e.openBlock(),e.createBlock(i,{key:Y,label:j.optionLabels?j.optionLabels[_]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):j.type==="boolean"?(e.openBlock(),e.createBlock(R,{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(H,{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",qn,[e.createVNode(P,{"model-value":q(j.key),disabled:h.value&&j.key!=="threshold",onChange:Y=>u(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,_)=>(e.openBlock(),e.createBlock(i,{key:Y,label:j.optionLabels?j.optionLabels[_]: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),O.value&&z.value&&m.value.length===0?(e.openBlock(),e.createElementBlock("div",Gn,[...S[4]||(S[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!O.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Hn,[...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"]]),jn={class:"config-header"},zn={class:"config-section"},Un=oe({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),k=e.computed(()=>(n?.value??n)?.ocr?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),A=(O,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[O]:p}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,O=>{if(!O||!t.value)return;const p=k.value,x=t.value.data.arguments||{},N={};p?.properties&&Object.entries(p.properties).forEach(([m,C])=>{C.default!==void 0&&(N[m]=C.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...x}})},{immediate:!0}),(O,p)=>{const x=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),m=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,[p[1]||(p[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(N),e.createElementVNode("div",zn,[p[2]||(p[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(m,{"model-value":T.value,onChange:p[0]||(p[0]=L=>A("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Wn={class:"config-header"},Jn={class:"config-section"},Yn=oe({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),k=e.computed(()=>(n?.value??n)?.license_plate?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),A=(O,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[O]:p}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,O=>{if(!O||!t.value)return;const p=k.value,x=t.value.data.arguments||{},N={};p?.properties&&Object.entries(p.properties).forEach(([m,C])=>{C.default!==void 0&&(N[m]=C.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...x}})},{immediate:!0}),(O,p)=>{const x=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),m=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",Wn,[p[1]||(p[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(N),e.createElementVNode("div",Jn,[p[2]||(p[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(m,{"model-value":T.value,onChange:p[0]||(p[0]=L=>A("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Xn={class:"config-header"},Qn={class:"config-section"},Kn={key:0,class:"config-section"},Ye=oe({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),k=e.computed(()=>(n?.value??n)?.face?.faceRepos??[]),T=e.ref(null),A=e.computed(()=>({repositoryId:x.value})),z={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},O=e.computed(()=>t.value?.data.arguments?.threshold??.5),p=C=>t.value?.data.arguments?.[C],x=e.computed(()=>{const C=p("repositoryId");return C?Array.isArray(C)?C:[C]:[]}),N=(C,l)=>{if(!t.value)return;const L=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...L,[C]:l}})},m=()=>{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=(n?.value??n)?.face?.faceParams?.[0]?.inputSchema??null,q=t.value.data.arguments||{},u={};L?.properties&&Object.entries(L.properties).forEach(([I,B])=>{B.default!==void 0&&(u[I]=B.default)}),o.updateNodeData(t.value.id,{arguments:{...u,...q}})},{immediate:!0}),(C,l)=>{const L=e.resolveComponent("el-button"),q=e.resolveComponent("el-divider"),u=e.resolveComponent("el-input-number"),I=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",Xn,[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:m},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",Qn,[l[3]||(l[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(I,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":O.value,onChange:l[0]||(l[0]=E=>N("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",Kn,[l[4]||(l[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(B,{model:A.value,rules:z,ref_key:"faceFormRef",ref:T,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(I,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":x.value,onChange:l[1]||(l[1]=E=>N("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(k.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"]]),Zn={class:"config-header"},vn={key:0,class:"config-section"},ea={key:3,class:"array-input"},ta={key:1,class:"config-section"},oa=oe({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),{schemaLoading:n,fetchSchemaForNodeType:k}=we(),T=e.computed(()=>{if(!t.value)return[];const m=t.value.data.input_schema||t.value.data.inputSchema;if(!m||!m.properties)return[];const C=m.required||[];return Object.entries(m.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))}),A=m=>{if(t.value)return t.value.data.arguments?.[m]},z=(m,C)=>{if(!t.value)return;const L={...t.value.data.arguments||{},[m]:C};o.updateNodeData(t.value.id,{arguments:L})},O=m=>{if(!m.dependsOn||!t.value)return!0;const{field:C,value:l}=m.dependsOn,L=A(C);if(typeof l=="string"&&l.startsWith("!")){const q=l.substring(1);return L!==q}return Array.isArray(l)?l.includes(L):L===l},p=m=>{const C=A(m);return Array.isArray(C)?JSON.stringify(C):""},x=(m,C)=>{try{const l=JSON.parse(C);Array.isArray(l)&&z(m,l)}catch{}},N=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async m=>{if(!m||!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 q=await k(C);if(!q)return;const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:q.inputSchema,extraConfig:q.extraConfig,arguments:{...q.arguments,...u.arguments}})},{immediate:!0}),(m,C)=>{const l=e.resolveComponent("el-button"),L=e.resolveComponent("el-divider"),q=e.resolveComponent("el-icon"),u=e.resolveComponent("el-tooltip"),I=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",Zn,[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:N},null,8,["icon"]))]),e.createVNode(L),T.value.length>0?(e.openBlock(),e.createElementBlock("div",vn,[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(u,{key:0,content:y.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(()=>[y.options&&y.type==="string"?(e.openBlock(),e.createBlock(B,{key:0,"model-value":A(y.key),onChange:f=>z(y.key,f),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(f,w)=>(e.openBlock(),e.createBlock(I,{key:f,label:y.optionLabels?y.optionLabels[w]:f,value:f},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):y.type==="boolean"?(e.openBlock(),e.createBlock(S,{key:1,"model-value":A(y.key),onChange:f=>z(y.key,f)},null,8,["model-value","onChange"])):y.type==="number"||y.type==="integer"?(e.openBlock(),e.createBlock(g,{key:2,"model-value":A(y.key),onChange:f=>z(y.key,f),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",ea,[e.createVNode(E,{"model-value":p(y.key),onChange:f=>x(y.key,f),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":A(y.key),onChange:f=>z(y.key,f),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(f,w)=>(e.openBlock(),e.createBlock(I,{key:f,label:y.optionLabels?y.optionLabels[w]:f,value:f},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(E,{key:5,"model-value":A(y.key),onInput:f=>z(y.key,f),maxlength:y.maxLength,"show-word-limit":!!y.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!y.dependsOn||O(y)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(n)&&T.value.length===0?(e.openBlock(),e.createElementBlock("div",ta,[...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"]]),na={class:"config-header"},aa={class:"config-section"},la={key:0,class:"config-section"},ra={key:1,class:"config-section"},sa={key:0,class:"el-form-item__error"},ia={key:2,class:"config-section"},ca={key:3,class:"config-section"},da={key:4,class:"config-section"},ma=oe({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.inject("taskModeConfig",null),n=e.computed(()=>d==="task"),k=e.computed(()=>l("deviceType")??"camera"),T=e.computed(()=>{const i=o.nodes.find(y=>y.type===b.START);return i?.data?.streamType?i.data.streamType:(h?.value??h)?.streamType??"image"}),A=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??"",f=i?.datasource?.getDevices?.(s)??[],w=o.nodes.filter(R=>R.type===b.DATA_SOURCE).findIndex(R=>R.id===s),G=t.value?.data?.sourceGroupId??i?.datasource?.getSourceGroupIdByIndex?.(w)??s;i?.datasource?.onDeviceClick?.(s,y,G,f,k.value)},{fetchSchemaForNodeType:O}=we(),p=e.computed(()=>o.nodes.some(i=>i.type===b.SMALL_MODEL)),x=e.computed(()=>o.getDataSourceCount()>=2),N=e.computed(()=>!o.supportPatrol()),m=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,f])=>({key:y,type:f.type,label:f.title||f.label||f.description||y,description:f.description||"",default:f.default,required:s.includes(y)||f.required||!1,min:f.minimum!==void 0?f.minimum:f.min,max:f.maximum!==void 0?f.maximum:f.max,step:f.step,maxLength:f.maxLength,options:f.enum,optionLabels:f.enumLabels||f.enum,dependsOn:f.dependsOn}))}),l=i=>{if(t.value)return t.value.data.arguments?.[i]},L=e.computed(()=>!!l("enableImageSequence")),q=e.computed(()=>!!l("needCooperativeDetection")),u=(i,s)=>{if(!t.value)return;const f={...t.value.data.arguments||{},[i]:s};o.updateNodeData(t.value.id,{arguments:f})},I=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(f=>f.source===t.value.id).forEach(f=>{o.removeEdge(f.id)}),i&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),u("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)}catch{return}else i&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),u("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)},B=i=>{t.value&&(i&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),u("enableImageSequence",!1),u("enablePatrol",!1)),u("needCooperativeDetection",i))};e.watch(T,i=>{i==="stream"&&t.value&&l("deviceType")==="1400"&&u("deviceType","camera")},{immediate:!0});const S=e.computed(()=>n.value&&k.value==="camera"&&T.value!=="stream"&&o.supportPatrol());e.watch(S,i=>{!i&&t.value&&l("enablePatrol")&&u("enablePatrol",!1)}),e.watch(A,i=>{i>0&&l("enablePatrol")&&(l("patrolGroupSize")??1)>i&&u("patrolGroupSize",i)});const g=i=>{if(!i.dependsOn||!t.value)return!0;const{field:s,value:y}=i.dependsOn,f=l(s);if(typeof y=="string"&&y.startsWith("!")){const w=y.substring(1);return f!==w}return Array.isArray(y)?y.includes(f):f===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"&&n.value){const R=y.arguments||{},H={},P=o.nodes.some(j=>j.type===b.SMALL_MODEL);R.mode===void 0&&(H.mode=P?3:0),R.interval===void 0&&(H.interval=30),T.value==="stream"&&R.sw_decoding===void 0&&(H.sw_decoding="CPU"),Object.keys(H).length>0&&o.updateNodeData(i,{arguments:{...R,...H}})}const f=y.input_schema||y.inputSchema;if(s==="dataSource"&&f&&f.properties&&!f.properties.windowSeconds){f.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:f,arguments:{...y.arguments,windowSeconds:5}});return}if(f&&f.properties&&Object.keys(f.properties).length>0)return;const w=await O(s);if(!w)return;const G=t.value?.data;G&&o.updateNodeData(t.value.id,{...G,input_schema:w.inputSchema,extraConfig:w.extraConfig,arguments:{...w.arguments,...G.arguments}})},{immediate:!0}),(i,s)=>{const y=e.resolveComponent("el-button"),f=e.resolveComponent("el-divider"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),R=e.resolveComponent("el-option"),H=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),j=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),_=e.resolveComponent("el-form-item"),D=e.resolveComponent("el-form"),$=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",na,[s[11]||(s[11]=e.createElementVNode("h3",null,"节点配置",-1)),n.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(f),e.createElementVNode("div",aa,[s[12]||(s[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,r=>e.withDirectives((e.openBlock(),e.createBlock(_,{key:r.key,required:r.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(r.label),1),r.description?(e.openBlock(),e.createBlock(G,{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(H,{key:0,"model-value":l(r.key),onChange:c=>u(r.key,c),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.options,(c,V)=>(e.openBlock(),e.createBlock(R,{key:c,label:r.optionLabels?r.optionLabels[V]:c,value:c},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):r.type==="boolean"?(e.openBlock(),e.createBlock(G,{key:1,content:n.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":r.key==="needCooperativeDetection"&&L.value?"已开启图片时序,无法同时开启协同检测":r.key==="enableImageSequence"&&q.value?"已开启协同检测,无法同时开启图片时序":r.key==="enableImageSequence"&&x.value?"多数据源场景下不允许开启图片时序":"",disabled:!(n.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence"))&&!(r.key==="needCooperativeDetection"&&L.value)&&!(r.key==="enableImageSequence"&&q.value)&&!(r.key==="enableImageSequence"&&x.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":l(r.key),disabled:n.value&&(r.key==="needCooperativeDetection"||r.key==="enableImageSequence")||r.key==="needCooperativeDetection"&&L.value||r.key==="enableImageSequence"&&q.value||r.key==="enableImageSequence"&&x.value,onChange:c=>r.key==="enableImageSequence"?I(c):r.key==="needCooperativeDetection"?B(c):u(r.key,c)},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:c=>u(r.key,c),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:c=>u(r.key,c),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",la,[s[13]||(s[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(H,{"model-value":t.value?.data.branchLogic||"and",disabled:n.value,onChange:s[0]||(s[0]=r=>e.unref(o).updateNodeData(t.value.id,{branchLogic:r})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(R,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(R,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),n.value?(e.openBlock(),e.createElementBlock("div",ra,[s[16]||(s[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("deviceType")??"camera",onChange:s[1]||(s[1]=r=>u("deviceType",r))},{default:e.withCtx(()=>[e.createVNode($,{value:"camera"},{default:e.withCtx(()=>[...s[14]||(s[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode($,{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(_,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${A.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":A.value===0}),onClick:z},null,8,["model-value","class"]),A.value===0?(e.openBlock(),e.createElementBlock("div",sa,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&k.value==="1400"?(e.openBlock(),e.createElementBlock("div",ia,[s[19]||(s[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("detectionMode")??"platform",onChange:s[2]||(s[2]=r=>u("detectionMode",r))},{default:e.withCtx(()=>[e.createVNode($,{value:"platform"},{default:e.withCtx(()=>[...s[17]||(s[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode($,{value:"device"},{default:e.withCtx(()=>[...s[18]||(s[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&k.value==="camera"&&T.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ca,[s[21]||(s[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(G,{disabled:!N.value,content:m.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":N.value?!1:l("enablePatrol"),disabled:N.value,onChange:s[3]||(s[3]=r=>u("enablePatrol",r))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),l("enablePatrol")?(e.openBlock(),e.createBlock(_,{key:0},{label:e.withCtx(()=>[s[20]||(s[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(G,{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=>u("patrolGroupSize",r)),min:1,max:A.value>0?A.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),n.value&&k.value==="camera"?(e.openBlock(),e.createElementBlock("div",da,[s[22]||(s[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"抽帧策略"},{default:e.withCtx(()=>[T.value==="image"?(e.openBlock(),e.createBlock(H,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:"按时间间隔抽帧",value:0})]),_:1})):p.value?(e.openBlock(),e.createBlock(H,{key:1,"model-value":l("mode")??3,onChange:s[5]||(s[5]=r=>{u("mode",r),r===1&&u("interval",p.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:"每一帧都检测",value:3}),e.createVNode(R,{label:"跳帧检测",value:1}),e.createVNode(R,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(H,{key:2,"model-value":l("mode")??0,onChange:s[6]||(s[6]=r=>{u("mode",r),r===0&&u("interval",30),r===1&&u("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:"按时间间隔抽帧",value:0}),e.createVNode(R,{label:"跳帧检测",value:1}),e.createVNode(R,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),T.value==="image"||T.value==="stream"&&(l("mode")??0)===0?(e.openBlock(),e.createBlock(_,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":l("interval")??30,onChange:s[7]||(s[7]=r=>u("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(_,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[p.value?(e.openBlock(),e.createBlock(j,{key:0,"model-value":l("interval")??5,onChange:s[8]||(s[8]=r=>u("interval",r)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(H,{key:1,"model-value":l("interval")??25,onChange:s[9]||(s[9]=r=>u("interval",r)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:25,value:25}),e.createVNode(R,{label:50,value:50}),e.createVNode(R,{label:75,value:75}),e.createVNode(R,{label:125,value:125}),e.createVNode(R,{label:250,value:250}),e.createVNode(R,{label:375,value:375}),e.createVNode(R,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),T.value==="stream"?(e.openBlock(),e.createBlock(_,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(H,{"model-value":l("sw_decoding")??"CPU",onChange:s[10]||(s[10]=r=>u("sw_decoding",r)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(R,{label:"GPU",value:"GPU"}),e.createVNode(R,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),pa={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Xe=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),d=e.ref(null),h=e.ref(""),n=async(N=!1)=>{if(a){o.value=a;return}},k=async()=>{o.value=[],await n(!0)},T=N=>o.value.find(m=>m.id===N||m.title===N),A=N=>{const m=T(N);if(!m)return{};const C=m.inputSchema||m.input_schema;if(!C||!C.properties)return{};const l={};return Object.entries(C.properties).forEach(([L,q])=>{q.default!==void 0&&(l[L]=q.default)}),l},z=N=>{const m=T(N);if(!m)return[];const C=m.inputSchema||m.input_schema;if(!C||!C.properties)return[];const l=C.required||[];return Object.entries(C.properties).map(([L,q])=>({key:L,type:q.type,label:q.title||q.description||L,description:q.description||"",default:q.default,required:l.includes(L)||q.required||!1,min:q.minimum,max:q.maximum,step:q.step,options:q.enum,optionLabels:q.enumLabels||q.enum,dependsOn:q.dependsOn}))},O=e.computed(()=>{if(!h.value)return o.value;const N=h.value.toLowerCase();return o.value.filter(m=>m.name?.toLowerCase().includes(N)||m.type?.toLowerCase().includes(N)||m.title?.toLowerCase().includes(N)||m.description&&m.description.toLowerCase().includes(N)||p(m.type).toLowerCase().includes(N))}),p=N=>pa[N]||N;return{models:o,loading:t,error:d,searchKeyword:h,filteredModels:O,loadSmallModels:n,reloadSmallModels:k,getModelConfig:T,getTypeLabel:p,getDefaultArguments:A,getSchemaFields:z,validateArguments:(N,m)=>{const C=T(N);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(([q,u])=>{const I=m[q];if(u.required&&(I==null||I==="")){l.push(`${u.title||q} 为必填项`);return}if(I!=null&&(u.type==="number"||u.type==="integer")){if(typeof I!="number"){l.push(`${u.title||q} 必须是数字`);return}u.minimum!==void 0&&I<u.minimum&&l.push(`${u.title||q} 不能小于 ${u.minimum}`),u.maximum!==void 0&&I>u.maximum&&l.push(`${u.title||q} 不能大于 ${u.maximum}`)}}),{valid:l.length===0,errors:l})}}},ua={class:"small-model-selector"},fa={key:0,class:"loading-state"},ga={key:1,class:"error-state"},ha={key:2,class:"model-list"},ya=["onClick"],_a={class:"model-header"},Na={class:"model-name"},Ca={class:"model-description"},ka={class:"model-meta"},ba={key:3,class:"empty-state"},xa=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,d=o,{loading:h,error:n,searchKeyword:k,filteredModels:T,loadSmallModels:A,reloadSmallModels:z,getTypeLabel:O}=Xe(t.externalModels),p=m=>{d("update:modelValue",m.id),d("select",m)},x=()=>{z()},N=m=>({safety:"warning",security:"danger",traffic:"info"})[m]||"info";return e.onMounted(()=>{t.externalModels||A()}),(m,C)=>{const l=e.resolveComponent("el-input"),L=e.resolveComponent("el-icon"),q=e.resolveComponent("el-button"),u=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",ua,[e.createVNode(l,{modelValue:e.unref(k),"onUpdate:modelValue":C[0]||(C[0]=I=>e.isRef(k)?k.value=I: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",fa,[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(n)?(e.openBlock(),e.createElementBlock("div",ga,[e.createVNode(L,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(n)),1),e.createVNode(q,{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",ha,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(T),I=>(e.openBlock(),e.createElementBlock("div",{key:I.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===I.id}]),onClick:B=>p(I)},[e.createElementVNode("div",_a,[e.createElementVNode("div",Na,[e.createVNode(L,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(I.name),1)]),e.createVNode(u,{type:N(I.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(O)(I.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",Ca,e.toDisplayString(I.description),1),e.createElementVNode("div",ka,[I.supportDirectAlert?(e.openBlock(),e.createBlock(u,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...C[4]||(C[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ya))),128))])):(e.openBlock(),e.createElementBlock("div",ba,[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(q,{text:"",onClick:C[1]||(C[1]=I=>k.value="")},{default:e.withCtx(()=>[...C[5]||(C[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),Ea={class:"position-tooltip"},Te=oe({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",Ea,[...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"]]),wa={class:"config-header"},Ta={class:"config-section"},Sa={key:0,class:"model-selector-wrapper"},Va={key:1,class:"selected-model-info"},Ba={class:"model-info-header"},Aa={class:"model-info-name"},Da={class:"model-info-description"},La={key:0,class:"config-section"},Oa={key:3,class:"array-input"},Ma="检测到事件后,连续两次告警上报的时间间隔",Ia=oe({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),k=e.computed(()=>(n?.value??n)?.smallModels??null),{models:T}=Xe(k.value),A=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),z={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},O=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])=>A.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]||Ma,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))}),p=["interval","targetDuration"],x=B=>{if(!t.value)return;const S=t.value.data.arguments?.[B];return p.includes(B)&&S!=null?S/1e3:S},N=(B,S)=>{if(!t.value)return;let g=S;p.includes(B)&&S!=null&&(g=S*1e3);const i={...t.value.data.arguments||{},[B]:g};o.updateNodeData(t.value.id,{arguments:i})},m=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)&&N(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})},q=()=>{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(()=>{})},u=()=>t.value?.data.modelId?T.value.find(S=>S.id===t.value.data.modelId)?.description||"暂无描述":"",I=()=>{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"),f=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),R=e.resolveComponent("el-input-number"),H=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",wa,[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:I},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",Ta,[S[3]||(S[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!h.value?(e.openBlock(),e.createElementBlock("div",Sa,[e.createVNode(xa,{"model-value":t.value?.data.modelId,"external-models":k.value,onSelect:L},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Va,[e.createElementVNode("div",Ba,[e.createElementVNode("div",Aa,[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:q},{default:e.withCtx(()=>[...S[1]||(S[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Da,e.toDisplayString(u()),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",La,[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(O.value,_=>e.withDirectives((e.openBlock(),e.createBlock(j,{key:_.key,required:_.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(_.label),1),_.key==="x_ratio"||_.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})):_.description?(e.openBlock(),e.createBlock(y,{key:1,content:_.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(()=>[_.options&&_.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":x(_.key),onChange:D=>N(_.key,D),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(D,$)=>(e.openBlock(),e.createBlock(f,{key:D,label:_.optionLabels?_.optionLabels[$]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):_.type==="boolean"?(e.openBlock(),e.createBlock(G,{key:1,"model-value":x(_.key),onChange:D=>N(_.key,D)},null,8,["model-value","onChange"])):_.type==="number"||_.type==="integer"||_.type==="float"?(e.openBlock(),e.createBlock(R,{key:2,"model-value":x(_.key),onChange:D=>N(_.key,D),min:_.min,max:_.max,step:_.step||(_.type==="integer"||_.type==="number"?1:.01),precision:_.precision??(_.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):_.type==="array"&&!_.options?(e.openBlock(),e.createElementBlock("div",Oa,[e.createVNode(H,{"model-value":C(_.key),onChange:D=>l(_.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(_.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):_.type==="array"&&_.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":x(_.key),onChange:D=>N(_.key,D),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(D,$)=>(e.openBlock(),e.createBlock(f,{key:D,label:_.optionLabels?_.optionLabels[$]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(H,{key:5,"model-value":x(_.key),onInput:D=>N(_.key,D)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!_.dependsOn||m(_)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Ra=(a=null)=>{const o=ae(),t=e.ref(a?a.map(p=>Ee.backendToFrontend(p)):[]),d=e.ref(!1),h=e.ref(null),n=async(p=!1)=>{if(a){t.value=a.map(x=>Ee.backendToFrontend(x));return}},k=p=>t.value.find(x=>x.title===p)||null,T=p=>{const x=k(p);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}:{}},A=(p=null)=>o.nodes.filter(x=>x.type==="detectionTarget"&&x.id!==p).map(x=>({value:x.id,label:x.data.targetName||x.data.label})),z=(p=null)=>{const x=[{value:"original",label:"原图"}],N=A(p);return[...x,...N]},O=e.computed(()=>t.value.map(p=>({value:p.title,label:p.label,...p})));return{detectionTargets:t,loading:d,error:h,loadDetectionTargets:n,getTargetById:k,getDefaultConfig:T,getDetectionTargetNodes:A,getDetectionScopeOptions:z,getTargetOptions:O}},$a={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=(O,p)=>{let x;return(...N)=>{clearTimeout(x),x=setTimeout(()=>O(...N),p)}},d=a,h=o,n=e.ref([]),k=()=>{const O=d.primaryValue||[],p=d.pairedValue||[],x=Math.max(O.length,p.length,1);n.value=Array.from({length:x},(N,m)=>({primary:O[m]||"",paired:p[m]!==void 0?p[m]:d.pairedField.default?.[0]||.5}))};e.watch(()=>[d.primaryValue,d.pairedValue],()=>{k()},{immediate:!0,deep:!0});const T=t((O,p)=>{h("update",O,p)},300);e.watch(n,O=>{const p=O.map(N=>N.primary),x=O.map(N=>N.paired);T(p,x)},{deep:!0});const A=()=>{n.value.length>=10||n.value.push({primary:"",paired:d.pairedField.default?.[0]||.5})},z=O=>{n.value.length>1&&n.value.splice(O,1)};return(O,p)=>{const x=e.resolveComponent("el-input"),N=e.resolveComponent("el-input-number"),m=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",$a,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,(C,l)=>(e.openBlock(),e.createElementBlock("div",{key:l,class:"input-row"},[e.createVNode(x,{modelValue:n.value[l].primary,"onUpdate:modelValue":L=>n.value[l].primary=L,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!n.value[l].primary||n.value[l].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(N,{modelValue:n.value[l].paired,"onUpdate:modelValue":L=>n.value[l].paired=L,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(m,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:n.value.length===1,onClick:L=>z(l)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(m,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:n.value.length>=10,onClick:A},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(a.primaryField.label)+e.toDisplayString(n.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),Fa={class:"config-header"},qa={class:"config-section"},Ga={class:"flex items-center justify-between"},Ha={key:0,class:"config-section"},Pa={key:1,class:"config-section"},ja={key:2,class:"config-section"},za={class:"device-list"},Ua=["onClick"],Wa={class:"device-name"},Ja={key:0,class:"device-list-empty"},Ya={key:4,class:"array-input"},Xa={key:4,class:"array-input"},Qa=oe({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d==="task"),n=e.inject("taskModeConfig",null),k=e.inject("echoAlgodata",null),T=e.inject("echoTaskData",null),A=e.computed(()=>{if(!t.value)return null;const _=new Set,D=[t.value.id];for(;D.length;){const $=D.shift();if(_.has($))continue;_.add($);const W=o.edges.filter(r=>r.target===$);for(const r of W){const c=o.nodes.find(V=>V.id===r.source);if(c){if(c.type==="dataSource")return c.id;D.push(c.id)}}}return null}),z=e.computed(()=>{const _=A.value;return _?(n?.value??n)?.datasource?.getDevices?.(_)??[]:[]}),O=e.computed(()=>h.value&&z.value.length>0),p=e.ref(""),x=e.ref(""),N=e.computed(()=>{const _=x.value.trim().toLowerCase();return _?z.value.filter(D=>(D.sourceName??D.name??String(D.sourceId??D.id??D)).toLowerCase().includes(_)):z.value}),m=e.computed(()=>{const _={},D=A.value,$=t.value?.id;if(!D||!$)return _;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const r of z.value){const c=String(r.sourceId??r.id??r),V=o.getTaskSourceArguments(D,c,$);if(V===null){_[c]=!1;continue}const F=new Set([...Object.keys(V),...Object.keys(W)]);let U=!1;for(const J of F)if(JSON.stringify(V[J])!==JSON.stringify(W[J])){U=!0;break}_[c]=U}return _});e.watch([z,()=>t.value?.data?.arguments?.configMode],([_])=>{_.length>0?p.value=String(_[0]?.sourceId??_[0]?.id??_[0]):p.value=""},{immediate:!0});const C=(_,D=null)=>{if(D){const c=((T?.value??T)?.graph?.sources??[]).find(V=>String(V.sourceId)===String(D));if(c?.branches)for(const V of c.branches){const F=V.nodes?.find(U=>U.toolTitle===_);if(F?.arguments)return{...F.arguments}}return null}const $=k?.value??k;if(!$?.branches)return null;for(const W of $.branches){const r=W.nodes?.find(c=>c.toolTitle===_);if(r?.arguments)return{...r.arguments}}return null},l=_=>{const D=A.value,$=t.value?.id;if(!D||!$||!_||o.getTaskSourceArguments(D,_,$)!==null)return;const W=t.value?.data?.targetId,r=W?C(W,_):null,c=t.value?.data?.arguments??{},V={...r??c};delete V.configMode,o.setTaskSourceArguments(D,_,$,V)};e.watch(p,_=>{_&&t.value?.data?.arguments?.configMode==="perDevice"&&l(_)}),e.watch(()=>t.value?.data?.arguments?.configMode,_=>{_==="perDevice"&&p.value&&l(p.value)});const L=e.inject("editorConfig",null),q=e.computed(()=>(L?.value??L)?.detection??null),{detectionTargets:u,loading:I}=Ra(q.value),B=e.computed(()=>{if(!t.value)return[];const _=t.value.data.input_schema||t.value.data.inputSchema;if(!_||!_.properties)return[];const D=_.required||[];return Object.entries(_.properties).map(([$,W])=>({key:$,type:W.type,label:W.title||W.label||W.description||$,description:W.description||"",default:W.default,required:D.includes($)||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(($,W)=>($.sort??1/0)-(W.sort??1/0))}),S=_=>_.type==="array"&&_["x-component"]==="paired-array"&&_["x-paired-with"],g=_=>{const D=_["x-paired-with"];return B.value.find($=>$.key===D)},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 _=t.value?.data.targetId,D=new Set;return B.value.forEach($=>{$["x-paired-with"]&&D.add($["x-paired-with"])}),B.value.filter($=>_==="traffic_accident"?$.key==="threshold":i.has($.key)&&!D.has($.key)&&!S($)).map($=>{const W=E[$.key]||{};return{...$,label:W.label||$.label,description:W.description||$.description,min:W.min??$.min,max:W.max??$.max,step:W.step??$.step,precision:W.precision,default:W.default??$.default}})}),y=e.computed(()=>B.value.filter(_=>S(_))),f=_=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const $=A.value,W=o.getTaskSourceArguments($,p.value,t.value.id);if(W!==null)return W[_]}return t.value.data.arguments?.[_]},w=(_,D)=>{if(!t.value)return;const $=t.value.data.arguments?.configMode;if(_!=="configMode"&&$==="perDevice"&&p.value){const c=A.value;o.updateTaskSourceArgument(c,p.value,t.value.id,_,D);return}const r={...t.value.data.arguments||{},[_]:D};o.updateNodeData(t.value.id,{arguments:r})},G=_=>{if(!_.dependsOn||!t.value)return!0;const{field:D,value:$}=_.dependsOn,W=f(D);if(typeof $=="string"&&$.startsWith("!")){const r=$.substring(1);return W!==r}return Array.isArray($)?$.includes(W):W===$},R=_=>{const D=f(_);return Array.isArray(D)?JSON.stringify(D):""},H=(_,D)=>{try{const $=JSON.parse(D);Array.isArray($)&&w(_,$)}catch{}},P=(_,D,$,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const F=A.value;o.updateTaskSourceArgument(F,p.value,t.value.id,_,D),o.updateTaskSourceArgument(F,p.value,t.value.id,$,W);return}const V={...t.value.data.arguments||{},[_]:D,[$]:W};o.updateNodeData(t.value.id,{arguments:V})},j=async _=>{if(!t.value||!_)return;const D=u.value.find(V=>V.title===_);if(!D)return;let $=D.inputSchema||D.input_schema||{};if(_==="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}}};$={...$,properties:{...$.properties,...V.properties}}}const W={};$.properties&&Object.entries($.properties).forEach(([V,F])=>{F.default!==void 0&&(W[V]=F.default)});const r=t.value.data,c={...W,target_class:D.title};o.updateNodeData(t.value.id,{...r,targetId:D.title,targetName:D.label,label:D.label,input_schema:$,inputSchema:$,extraConfig:D.extraConfig,arguments:c})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,_=>{if(!_||!t.value)return;const D=u.value.find(r=>r.title===_);if(!D)return;const $=t.value.data;if($.input_schema&&Object.keys($.input_schema).length>0)return;const W={...D.defaultArguments,...$.arguments,target_class:D.title};o.updateNodeData(t.value.id,{...$,input_schema:D.inputSchema,arguments:W})}),(_,D)=>{const $=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),r=e.resolveComponent("el-option"),c=e.resolveComponent("el-select"),V=e.resolveComponent("el-form-item"),F=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",Fa,[D[2]||(D[2]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock($,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",qa,[D[3]||(D[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":t.value?.data.targetId,disabled:h.value,onChange:j,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(I),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(u),M=>(e.openBlock(),e.createBlock(r,{key:M.title,label:M.label,value:M.title},{default:e.withCtx(()=>[e.createElementVNode("div",Ga,[e.createElementVNode("span",null,e.toDisplayString(M.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),O.value?(e.openBlock(),e.createElementBlock("div",Ha,[D[6]||(D[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(F,{"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:D[0]||(D[0]=M=>w("configMode",M))},{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),y.value.length>0?(e.openBlock(),e.createElementBlock("div",Pa,[D[7]||(D[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,M=>(e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.description?(e.openBlock(),e.createBlock(te,{key:0,content:M.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":M,"paired-field":g(M),"primary-value":f(M.key),"paired-value":f(M["x-paired-with"]),onUpdate:(K,le)=>P(M.key,K,M["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",ja,[D[9]||(D[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":D[1]||(D[1]=M=>x.value=M),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",za,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,M=>(e.openBlock(),e.createElementBlock("div",{key:String(M.sourceId??M.id??M),class:e.normalizeClass(["device-list-item",{"is-active":p.value===String(M.sourceId??M.id??M),"has-custom":m.value[String(M.sourceId??M.id??M)]}]),onClick:K=>p.value=String(M.sourceId??M.id??M)},[e.createElementVNode("span",Wa,e.toDisplayString(M.sourceName??M.name??String(M.sourceId??M.id??M)),1),m.value[String(M.sourceId??M.id??M)]?(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,Ua))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("div",Ja," 无匹配设备 ")):e.createCommentVNode("",!0)]),p.value?(e.openBlock(),e.createBlock(F,{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,M=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.key==="x_ratio"||M.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})):M.description?(e.openBlock(),e.createBlock(te,{key:1,content:M.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(()=>[M.options&&M.type==="string"?(e.openBlock(),e.createBlock(c,{key:0,"model-value":f(M.key),onChange:K=>w(M.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):M.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":f(M.key),onChange:K=>w(M.key,K)},null,8,["model-value","onChange"])):M.type==="number"||M.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":f(M.key),onChange:K=>w(M.key,K),min:M.min,max:M.max,step:M.step||(M.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S(M)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":M,"paired-field":g(M),"primary-value":f(M.key),"paired-value":f(M["x-paired-with"]),onUpdate:(K,le)=>P(M.key,K,M["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):M.type==="array"&&!M.options?(e.openBlock(),e.createElementBlock("div",Ya,[e.createVNode(se,{"model-value":R(M.key),onChange:K=>H(M.key,K),type:"textarea",rows:3,placeholder:M.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):M.type==="array"&&M.options?(e.openBlock(),e.createBlock(c,{key:5,"model-value":f(M.key),onChange:K=>w(M.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":f(M.key),onInput:K=>w(M.key,K),maxlength:M.maxLength,"show-word-limit":!!M.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!M.dependsOn||G(M)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(F,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,M=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.key==="x_ratio"||M.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})):M.description?(e.openBlock(),e.createBlock(te,{key:1,content:M.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(()=>[M.options&&M.type==="string"?(e.openBlock(),e.createBlock(c,{key:0,"model-value":f(M.key),onChange:K=>w(M.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):M.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":f(M.key),onChange:K=>w(M.key,K)},null,8,["model-value","onChange"])):M.type==="number"||M.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":f(M.key),onChange:K=>w(M.key,K),min:M.min,max:M.max,step:M.step||(M.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S(M)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":M,"paired-field":g(M),"primary-value":f(M.key),"paired-value":f(M["x-paired-with"]),onUpdate:(K,le)=>P(M.key,K,M["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):M.type==="array"&&!M.options?(e.openBlock(),e.createElementBlock("div",Xa,[e.createVNode(se,{"model-value":R(M.key),onChange:K=>H(M.key,K),type:"textarea",rows:3,placeholder:M.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):M.type==="array"&&M.options?(e.openBlock(),e.createBlock(c,{key:5,"model-value":f(M.key),onChange:K=>w(M.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(r,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":f(M.key),onInput:K=>w(M.key,K),maxlength:M.maxLength,"show-word-limit":!!M.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!M.dependsOn||G(M)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ka={class:"config-header"},Za={class:"config-section"},va={key:0,style:{"margin-bottom":"8px"}},el=oe({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=O=>{if(!t.value)return;const p={...t.value.data.arguments,conditionRelation:O};o.updateNodeData(t.value.id,{arguments:p})},k=()=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],x={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:x})},T=(O,p,x)=>{if(!t.value)return;const N=[...t.value.data.arguments?.alertConditions||[]];N[O]={...N[O],[p]:x};const m={...t.value.data.arguments,alertConditions:N};o.updateNodeData(t.value.id,{arguments:m})},A=O=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[]];p.splice(O,1);const x={...t.value.data.arguments,alertConditions:p};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(O,p)=>{const x=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),m=e.resolveComponent("el-text"),C=e.resolveComponent("el-option"),l=e.resolveComponent("el-select"),L=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-radio"),u=e.resolveComponent("el-radio-group"),I=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ka,[p[1]||(p[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(N),e.createElementVNode("div",Za,[p[9]||(p[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(I,null,{label:e.withCtx(()=>[p[3]||(p[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(m,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(m,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...p[4]||(p[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=>A(g)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",va,[e.createVNode(m,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...p[5]||(p[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(u,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:p[0]||(p[0]=S=>n(S))},{default:e.withCtx(()=>[e.createVNode(q,{value:"OR"},{default:e.withCtx(()=>[...p[6]||(p[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(q,{value:"AND"},{default:e.withCtx(()=>[...p[7]||(p[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:k},{default:e.withCtx(()=>[...p[8]||(p[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),tl={class:"config-header"},ol={class:"config-section"},nl={style:{display:"flex","align-items":"center",gap:"8px"}},al={style:{display:"flex","align-items":"center",gap:"8px"}},ll={style:{display:"flex","align-items":"center",gap:"8px"}},rl=oe({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>d===ee.TASK),n=C=>{if(!t.value)return;const l={...t.value.data.arguments,duration:C};o.updateNodeData(t.value.id,{arguments:l})},k=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})},A=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})},O=C=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_threshold:C};o.updateNodeData(t.value.id,{arguments:l})},p=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})},N=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})},m=()=>{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"),q=e.resolveComponent("el-divider"),u=e.resolveComponent("el-input-number"),I=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"),f=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",tl,[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:m},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",ol,[l[13]||(l[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(f,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(B,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":t.value?.data.arguments?.duration??30,onChange:l[0]||(l[0]=w=>n(w)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(I,{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",nl,[e.createVNode(S,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:l[1]||(l[1]=w=>k(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(I,{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",al,[e.createVNode(S,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:l[3]||(l[3]=w=>A(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(u,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:l[5]||(l[5]=w=>O(w)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(I,{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",ll,[e.createVNode(S,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:l[6]||(l[6]=w=>p(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(u,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:l[8]||(l[8]=w=>N(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"]]),sl={class:"node-config-panel"},il={class:"config-content"},cl=oe({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:nn,group:ln,start:Vn,end:Mn,classificationModel:Pn,ocr:Un,licensePlate:Yn,face:Ye,stream:oa,dataSource:ma,smallModel:Ia,detectionTarget:Qa,targetCount:el,timerTarget:rl,faceRecognition:Ye},d=e.computed(()=>{const h=o.selectedEdge;if(h)return o.nodes.find(T=>T.id===h.source)?.data?.enableBranch&&t.edge||null;const n=o.selectedNode;return n&&t[n.type]||null});return(h,n)=>(e.openBlock(),e.createElementBlock("div",sl,[e.createElementVNode("div",il,[d.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),dl={class:"workflow-editor",id:"workflow-editor"},ml={class:"editor-content"},pl={__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,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:n,downloadJSON:k,exportToJSON:T}=je(t.mode,h,e.computed(()=>t.taskModeConfig)),{runValidation:A}=ze(t.mode,h,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{rt(d)});const z=e.computed(()=>{if(h.selectedNodeId)return!0;const p=h.selectedEdge;return p?!!h.nodes.find(N=>N.id===p.source)?.data?.enableBranch:!1});return o({reset:()=>{h.resetWorkflow()},runTest:A,copyJSON:n,exportJSON:T}),(p,x)=>(e.openBlock(),e.createElementBlock("div",dl,[e.createVNode(xt),e.createElementVNode("div",ml,[e.createVNode(Bt),e.createVNode(vo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[z.value?(e.openBlock(),e.createBlock(cl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Qe=oe(pl,[["__scopeId","data-v-e5f52170"]]),ul={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},Ke=a=>{Object.entries(ul).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Qe)},fl={install:Ke};re.EditorMode=ee,re.NodeType=b,re.PageMode=ye,re.WorkflowEditor=Qe,re.default=fl,re.install=Ke,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=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",d=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:d},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}),d={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[d]}},nt=a=>Qe.defineStore(`aiflow-workflow-${a}`,()=>{const o=$e(),t=e.ref(o.nodes),d=e.ref(o.edges),y=e.ref(null),n=e.ref(null),C=e.ref(new Set),T=e.ref(new Set),D=e.ref({}),z=(i,w,F,U)=>{D.value[i]||(D.value[i]={}),D.value[i][w]||(D.value[i][w]={}),D.value[i][w][F]={...U}},G=(i,w,F,U,J)=>{D.value[i]||(D.value[i]={}),D.value[i][w]||(D.value[i][w]={}),D.value[i][w][F]||(D.value[i][w][F]={}),D.value[i][w][F][U]=J},p=(i,w,F)=>D.value[i]?.[w]?.[F]??null,b=()=>{D.value={}},_=e.computed(()=>y.value?t.value.find(i=>i.id===y.value):null),c=e.computed(()=>n.value?d.value.find(i=>i.id===n.value):null),N=i=>t.value.filter(w=>w.type===i).length,l=()=>{const i=t.value.filter(w=>w.type===k.DATA_SOURCE);i.length!==0&&(i.length===1?i[0].data.label="数据源":i.forEach((w,F)=>{w.data.label=`数据源 ${F+1}`}))},O=()=>t.value.filter(i=>i.type===k.DATA_SOURCE).length,q=()=>t.value.filter(w=>w.type===k.DATA_SOURCE).some(w=>w.data.arguments?.needCooperativeDetection===!0),u=()=>{const i=O(),w=q();return!(i>1||w)},R=i=>{t.value.push(i),i.type===k.DATA_SOURCE&&l()},V=i=>{const w=t.value.find(U=>U.id===i),F=w?.type===k.DATA_SOURCE;if(w?.type==="group"){E(i),d.value=d.value.filter(U=>U.source!==i&&U.target!==i),y.value===i&&(y.value=null);return}t.value=t.value.filter(U=>U.id!==i),d.value=d.value.filter(U=>U.source!==i&&U.target!==i),y.value===i&&(y.value=null),F&&l()},B=(i,w)=>{const F=t.value.find(U=>U.id===i);F&&(F.data={...F.data,...w})},f=(i,w)=>{const F=t.value.find(U=>U.id===i);F&&(F.position=w)},x=i=>{const w=t.value.find(F=>F.id===i.source);if(w&&(w.type===k.START||w.type===k.DATA_SOURCE)&&w.data?.enableBranch===!0){const U=d.value.filter(J=>J.source===i.source).length+1;i={...i,data:{...i.data,branchOrder:U}}}d.value=v.addEdge(i,d.value)},S=i=>{const w=d.value.find(F=>F.id===i);if(d.value=d.value.filter(F=>F.id!==i),n.value===i&&(n.value=null),w&&w.data?.branchOrder!==void 0){const F=t.value.find(U=>U.id===w.source);F&&(F.type===k.START||F.type===k.DATA_SOURCE)&&d.value.filter(J=>J.source===w.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=(i,w="and",F=null)=>{const U=ot(i,{width:300,height:160},w,F);return t.value.unshift(U),U.id},g=(i,w)=>{const F=t.value.find(Q=>Q.id===i),U=t.value.find(Q=>Q.id===w);if(!F||!U||F.parentNode===w)return;F.parentNode&&m(i);const J=t.value.find(Q=>Q.id===i);J&&(t.value=t.value.map(Q=>Q.id!==i?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:w,extent:"parent"}))},m=i=>{const w=t.value.find(Q=>Q.id===i);if(!w||!w.parentNode)return;const F=t.value.find(Q=>Q.id===w.parentNode),U=F?w.position.x+F.position.x:w.position.x,J=F?w.position.y+F.position.y:w.position.y;t.value=t.value.map(Q=>{if(Q.id!==i)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},E=i=>{const w=t.value.find(F=>F.id===i);w&&(t.value=t.value.filter(F=>F.id!==i).map(F=>{if(F.parentNode!==i)return F;const U={...F,position:{x:F.position.x+w.position.x,y:F.position.y+w.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:d,selectedNodeId:y,selectedEdgeId:n,invalidNodeIds:C,invalidEdgeIds:T,selectedNode:_,selectedEdge:c,getNodeCountByType:N,getDataSourceCount:O,hasCooperativeDetection:q,supportPatrol:u,addNode:R,removeNode:V,updateNodeData:B,updateNodePosition:f,addConnection:x,removeEdge:S,updateEdgeData:(i,w)=>{const F=d.value.find(U=>U.id===i);if(F){if(w.branchOrder!==void 0){const U=t.value.find(J=>J.id===F.source);if(U&&(U.type===k.START||U.type===k.DATA_SOURCE)){const J=F.data?.branchOrder,Q=w.branchOrder;if(J!==Q&&Q!==null){const se=d.value.filter(ce=>ce.source===F.source&&ce.id!==i).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}F.data={...F.data,...w}}},selectNode:i=>{y.value=i,n.value=null},selectEdge:i=>{n.value=i,y.value=null},clearSelection:()=>{y.value=null,n.value=null},resetWorkflow:()=>{const i=$e();t.value=i.nodes,d.value=i.edges,y.value=null,n.value=null,b()},loadWorkflow:(i,w)=>{t.value=i,d.value=w,y.value=null,n.value=null,b()},refreshDataSourceLabels:l,createEmptyGroup:r,addNodeToGroup:g,removeNodeFromGroup:m,dissolveParallelGroup:E,initializeSubsequentFrames:i=>{t.value.find(F=>F.id===i)&&B(i,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(i,w)=>{const F=t.value.find(U=>U.id===i);!F||F.type!=="dataSource"||(F.data.subsequentFrames||(F.data.subsequentFrames=[]),F.data.subsequentFrames.push(w),B(i,{subsequentFrames:[...F.data.subsequentFrames]}))},removeSubsequentFrame:(i,w)=>{const F=t.value.find(Q=>Q.id===i);if(!F||F.type!=="dataSource")return;const U=F.data.subsequentFrames.find(Q=>Q.id===w);U&&d.value.filter(te=>te.source===i&&te.sourceHandle===U.handleId).forEach(te=>S(te.id));const J=F.data.subsequentFrames.filter(Q=>Q.id!==w);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),B(i,{subsequentFrames:J})},setInvalidIds:(i,w)=>{C.value=new Set(i),T.value=new Set(w)},clearInvalidIds:()=>{C.value=new Set,T.value=new Set},taskSources:D,setTaskSourceArguments:z,updateTaskSourceArgument:G,getTaskSourceArguments:p,clearTaskSources:b}}),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 d=[],y=[],n=a.filter(l=>l.type!=="group"),C=n.filter(l=>l.type===k.START);C.length===0?d.push("工作流必须包含一个开始节点"):C.length>1&&d.push("工作流只能包含一个开始节点");const T=n.filter(l=>l.type===k.END);T.length===0?d.push("工作流必须包含一个结束节点"):T.length>1&&d.push("工作流只能包含一个结束节点");const D=n.filter(l=>l.type===k.DATA_SOURCE);D.length===0&&d.push("工作流必须至少包含一个数据源节点"),n.filter(l=>l.type===k.DETECTION_TARGET||l.type===k.SMALL_MODEL||l.type===k.CLASSIFICATION_MODEL).length===0&&d.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),n.some(l=>l.type===k.SMALL_MODEL),D.some(l=>l.data.arguments?.needCooperativeDetection===!0),D.length>1,n.forEach(l=>{const O=o.filter(u=>u.target===l.id),q=o.filter(u=>u.source===l.id);if(l.type===k.START&&O.length>0&&y.push("开始节点不应有输入连接"),l.type===k.END&&q.length>0&&y.push("结束节点不应有输出连接"),l.type===k.START&&q.length===0&&d.push("开始节点必须有输出连接"),l.type===k.END&&O.length===0&&d.push("结束节点必须有输入连接"),l.type===k.DATA_SOURCE&&l.data.enableImageSequence)if(q.length===0)d.push({nodeId:l.id,message:`数据源节点"${l.data.label}"开启了图片时序但未连接到任何处理节点`});else{const u=q.filter(f=>f.sourceHandle==="first-frame"),R=l.data.subsequentFrames||[],V=new Set(q.map(f=>f.sourceHandle)),B=R.filter(f=>!V.has(f.handleId));u.length===0&&y.push({nodeId:l.id,message:`数据源节点"${l.data.label}"的首帧检测未连接`}),B.length>0&&y.push({nodeId:l.id,message:`数据源节点"${l.data.label}"有${B.length}个后续帧未连接`})}l.type!==k.START&&l.type!==k.END&&!l.parentNode&&(O.length===0||q.length===0)&&y.push(`节点 "${l.data.label}" 可能未正确连接`)});const G=new Set;o.forEach(l=>{const O=a.find(q=>q.id===l.source);O?.type==="dataSource"&&O.data?.enableImageSequence===!0&&l.sourceHandle!=="first-frame"&&(!l.data?.timeWindowSeconds||l.data.timeWindowSeconds<1)&&d.push({edgeId:l.id,message:`分支"${l.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),G.add(l.source),G.add(l.target)}),n.forEach(l=>{l.parentNode||!G.has(l.id)&&n.length>1&&y.push(`节点 "${l.data.label}" 未连接到工作流`)});const p=lt(n,o);d.push(...p);const b=st(n,o);d.push(...b);const _=rt(n);d.push(..._);const c=it(n,o);d.push(...c);const N=ct(n,o);return d.push(...N),t==="task"&&n.filter(O=>O.type===k.FACE_RECOGNITION).forEach(O=>{(!O.data.arguments?.repositoryId||Array.isArray(O.data.arguments.repositoryId)&&O.data.arguments.repositoryId.length===0)&&d.push({nodeId:O.id,message:`人脸识别节点"${O.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:d.length===0,errors:d,warnings:y}},lt=(a,o)=>{const t=[],d=a.find(C=>C.type===k.START);if(!d)return t;const y=new Set,n=(C,T,D,z)=>{if(T.includes(C))return;const G=a.find(N=>N.id===C);if(!G)return;const p=[...T,C];let b=[...D],_=[...z];if(G.type===k.TARGET_COUNT&&b.push(G),G.type===k.TIMER_TARGET&&_.push(G),G.type===k.END){const N=p.join("->");y.has(N)||(y.add(N),b.length>1&&t.push(`工作流分支中存在多个目标计数节点(${b.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),_.length>1&&t.push(`工作流分支中存在多个目标计时节点(${_.map(l=>`"${l.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const c=o.filter(N=>N.source===C);c.length===0?(b.length>1&&t.push(`工作流分支中存在多个目标计数节点(${b.map(N=>`"${N.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),_.length>1&&t.push(`工作流分支中存在多个目标计时节点(${_.map(N=>`"${N.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):c.forEach(N=>{n(N.target,p,b,_)})};return n(d.id,[],[],[]),t},rt=a=>{const o=[],t=a.filter(y=>y.type===k.DATA_SOURCE),d=a.filter(y=>y.type===k.SMALL_MODEL);return d.length>0&&t.length>1&&d.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 n=o.filter(C=>C.source===y.id);if(n.length>1){const C=n.map(z=>z.target),D=a.filter(z=>C.includes(z.id)).filter(z=>z.type===k.SMALL_MODEL);if(D.length>0){const z=D.map(G=>`"${G.data.label||G.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${z})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},it=(a,o)=>{const t=[],d=[k.TARGET_COUNT,k.TIMER_TARGET],y={[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时"};return a.filter(C=>C.type===k.SMALL_MODEL).forEach(C=>{o.filter(D=>D.source===C.id).forEach(D=>{const z=a.find(G=>G.id===D.target);if(z&&d.includes(z.type)){const G=y[z.type]||z.type;t.push(`小模型节点"${C.data.label||C.data.modelName}"不能直接连接${G}节点"${z.data.label}",请先连接检测目标节点`)}})}),t},ct=(a,o)=>{const t=[],d=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION],y={[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.FACE_RECOGNITION]:"人脸识别"};return a.filter(C=>d.includes(C.type)).forEach(C=>{const T=o.filter(G=>G.source===C.id),D=d.filter(G=>G!==C.type).concat(k.END),z=C.data.label||y[C.type];T.forEach(G=>{const p=a.find(b=>b.id===G.target);p&&!D.includes(p.type)&&t.push(`${z}节点"${z}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${p.data.label||p.type}"节点`)}),T.length===0&&t.push(`${z}节点"${z}"必须连接到其他辅助节点或结束节点`)}),t},qe=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(d=>t.get(d)).filter(Boolean),Ge=(a,o)=>{const t={},d=new Set(a.filter(n=>n.type==="group").map(n=>n.id));return[...o].sort((n,C)=>{const T=n.data?.branchOrder??1/0,D=C.data?.branchOrder??1/0;return T-D}).forEach(n=>{if(d.has(n.source)&&d.has(n.target))return;let C=n.source,T=n.target;if(d.has(C)){const D=o.find(z=>z.target===C&&!d.has(z.source));if(!D)return;C=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[C]||(t[C]=[]),t[C].includes(T)||t[C].push(T)}),t},He=(a,o)=>{const t=[...o.values()].find(C=>C.type===k.START);if(!t)return[];const d=new Set,y=[],n=C=>{if(d.has(C))return;d.add(C);const T=o.get(C);if(!T)return;T.type!==k.START&&T.type!==k.END&&T.type!=="group"&&y.push(T),(a[C]||[]).forEach(z=>n(z))};return n(t.id),y},dt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ce=(a,o,t,d)=>{const y=a.nodes.findIndex(C=>C.toolTitle===o);if(y===-1)return;const n=a.nodes[y];n.arguments?.[t]&&(a[d]=n.arguments[t]),a.nodes=a.nodes.filter((C,T)=>T!==y),a.nodes.forEach((C,T)=>{C.sortOrder=T+1})},mt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(d=>({op:d.operator,value:d.value}))}}},pt=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const d={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:d[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const d=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[d]||">",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 d={...a};return dt.forEach(y=>{delete d[y]}),Object.keys(d).forEach(y=>{const n=d[y];(n==null||n==="")&&delete d[y]}),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=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,d,y=null)=>{const n={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&&(n.branchLogic=a.data.branchLogic),t){const C=d.find(T=>T.source===t&&T.target===a.id);C?.data?.branchOrder!==void 0&&C?.data?.branchOrder!==null&&(n.branchOrder=C.data.branchOrder)}return n},Pe=(a,o,t,d,y,n=null,C=[])=>{const T=[],D=Array.isArray(a)?[...a]:[a],z=new Set;let G=1;for(;D.length>0;){const p=[...D];D.length=0;const b=[];p.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 O=d.get(l);O&&O.type!==k.END&&D.push(l)}),C.includes(c.type))||b.push(c)}),b.length>0&&(b.forEach(_=>{const c=n?.(_.id)??null,N=gt(_,G,o,y,c);b.length>1&&(N.nodeLogic="or"),T.push(N)}),G++)}return T},ht=(a=null,o=null)=>{const t=a??ae(),d=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",ye.CREATE);const y=o??e.inject("editorConfig",null),n=e.computed(()=>Fe(t.nodes,t.edges,d)),C=(r,g,m,E)=>{if(m){const L=pe(r,m.id,g).find(P=>P.type===k.SMALL_MODEL);if(L)return L}return E.find(L=>L.type===k.SMALL_MODEL)||null},T=(r,g,m)=>{const L=pe(g,r.id,m).find(A=>A.type===k.SMALL_MODEL);return L?pe(g,L.id,m).filter(A=>A.type!==k.END&&A.type!==k.START&&A.type!==k.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},D=(r,g,m,E,L)=>{if(g===de.SMALL_MODEL||g===de.SMALL_MODEL_BRANCH){const A=C(E,L,m,r);return A?{toolTitle:A.data.title||A.data.modelName||"",toolType:"small",arguments:_e(A.data.arguments,k.SMALL_MODEL)}:null}const P=r.find(A=>A.type===k.DETECTION_TARGET);return P?{toolTitle:P.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:_e(P.data.arguments,k.DETECTION_TARGET)}:null},z=()=>{const r=t.nodes.find(E=>E.type===k.END);if(!r||!r.data.arguments)return{};const g=r.data.arguments,m={};return g.reportFrequency==="interval"&&g.reportInterval&&(m.interval={value:g.reportInterval}),g.enableDeduplication&&g.similarityThreshold!==void 0&&(m.dedup={value:g.similarityThreshold}),m},G=r=>{if(r.length<=1)return;const g=r.map(E=>E.sortOrder);if(new Set(g).size!==g.length){const E=g.filter((L,P)=>g.indexOf(L)!==P);throw new Error(`分支执行顺序存在重复:${[...new Set(E)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},p=(r,g,m,E,L)=>{let P=[],A;if(r===de.IMAGE_BRANCH)g&&(P=pe(E,g.id,L).filter(j=>j.type!==k.END)),A=g?.id||m.find(j=>j.type===k.DATA_SOURCE)?.id;else if(r===de.SMALL_MODEL_BRANCH){const j=C(E,L,g,m);j&&(P=pe(E,j.id,L).filter(H=>H.type!==k.END),A=j.id)}return{branchStartNodes:P,sourceNodeId:A}},b=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]),_=(r,g,m)=>{const E=new Set,L=[],P=A=>{if(E.has(A))return;E.add(A);const j=m.get(A);if(!j||j.type===k.END)return;b.has(j.type)&&L.push(j),(g[A]||[]).forEach(Y=>P(Y))};return P(r),L.length>0?L[L.length-1]:null},c=(r,g,m,E,L)=>{const P=`分支${L+1}`,A=_(g,m,E);if(!A)return r?.data?.nodeName||P;if(A.type===k.DETECTION_TARGET&&A.data?.targetId==="other"){const H=A.data?.arguments?.object;if(Array.isArray(H)&&H.length>0){const Y=H.join(",");return Y.length>32?Y.slice(0,32):Y}}if(A.type===k.CLASSIFICATION_MODEL){const H=A.data?.arguments?.modelName||A.data?.label;if(!H)return P;const Y=A.data?.arguments?.resultNegate?"(取反)":"";return H+Y}return A.data?.label||A.data?.targetName||P},N=(r,g,m,E,L,P)=>{const{branchStartNodes:A,sourceNodeId:j}=p(g,m,r,E,L);if(A.length===0)return[];const H=[];return A.forEach((Y,h)=>{const M=Pe([Y.id],j,E,L,P);if(M.length===0)return;const $=j?P.find(w=>w.source===j&&w.target===Y.id):null,W=$?.data||{},s=W.branchOrder!==void 0&&W.branchOrder!==null?W.branchOrder:h+1,i={branchName:W.branchName||c(Y,Y.id,E,L,h),sortOrder:s,nodes:M};$?.sourceHandle&&(i.sourceHandle=$.sourceHandle),Ce(i,"target_count","targetCount","targetCount"),Ce(i,"timer_target","duration","duration"),W.timeWindowSeconds!==void 0&&W.timeWindowSeconds!==null&&(i.timeWindowSeconds=W.timeWindowSeconds),W.branchDescription&&(i.description=W.branchDescription),H.push(i)}),G(H),H},l=()=>{const r=n.value;if(r.errors.length>0){const g=r.errors.map(m=>typeof m=="object"?m.message:m);return Z.ElMessage.error(`验证失败: ${g.join(", ")}`),!1}return r.warnings.length>0&&Z.ElMessage.warning(`警告: ${r.warnings.join(", ")}`),!0},O=()=>{const r=t.nodes,g=t.edges,m=qe(r),E=Ge(r,g),L=He(E,m),P=[...m.values()].find(A=>A.type===k.START);return{allNodes:r,edges:g,nodeMap:m,adj:E,orderedNodes:L,startNode:P}},q=r=>{const g={ruleName:r?.data?.algorithmName||"",description:"",webhookUrl:""},m=z();Object.keys(m).length>0&&(g.extraConfig=m);const L=(y?.value??y)?.platform;return g.attach=L?{platform:L}:{},g},u=(r,g)=>{const m=r.filter(E=>E.type===k.DATA_SOURCE);if(m.length===0){const E=g.find(L=>L.type===k.DATA_SOURCE);E&&m.push(E)}return m},R=r=>r?.data?.enableImageSequence||r?.data?.arguments?.enableImageSequence||!1?"order":r?.data?.enableBranch&&r.data.branchLogic||"and",V=(r,g,m,E)=>{const{orderedNodes:L,adj:P,nodeMap:A,edges:j}=g,H=T(r,P,A),Y=!!r.data.arguments?.needCooperativeDetection,h=j.find(i=>i.target===r.id),M=h?.data?.branchOrder!==void 0&&h?.data?.branchOrder!==null?h.data.branchOrder:E+1,$={sourceGroupId:null,name:r.data.label||"数据源",sort:M,synEnabled:Y};if(Y&&($.windowSeconds=r.data.arguments?.windowSeconds||5),H===de.SMALL_MODEL){const i=D(L,H,r,P,A);return i&&($.streamConfig=i),$.logic="and",$.children=[],$}if(H===de.SMALL_MODEL_BRANCH){const i=D(L,H,r,P,A);i&&($.streamConfig=i)}$.logic=R(r);const W=N(L,H,r,P,A,j),s=m.length;return $.children=W.map((i,w)=>({name:i.branchName,branchRefs:[s+w]})),m.push(...W),$},B=(r,g)=>{const E={groupLogic:r?.data?.enableBranch&&r.data.branchLogic||"and",sourceGroups:g};return g.length>=2&&(E.groupWindowSeconds=r.data.groupWindowSeconds),E},f=()=>{if(!l())return null;try{const r=O(),g=q(r.startNode),m=u(r.orderedNodes,r.allNodes),E=[],L=m.map((P,A)=>V(P,r,E,A));return g.ruleSchema=B(r.startNode,L),E.length>0&&(g.branches=E),g}catch(r){return Z.ElMessage.error(r.message||"导出失败"),null}};return{validation:n,exportToJSON:f,copyToClipboard:()=>{try{const r=f();if(!r)return;const g=JSON.stringify(r,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(g).then(()=>{Z.ElMessage.success("已复制到剪贴板")}).catch(()=>{Z.ElMessage.error("复制失败")});else{const m=document.createElement("textarea");m.value=g,m.style.position="fixed",m.style.opacity="0",document.body.appendChild(m),m.select(),document.execCommand("copy"),document.body.removeChild(m),Z.ElMessage.success("已复制到剪贴板")}}catch(r){console.error("复制JSON失败:",r),Z.ElMessage.error(`复制失败: ${r.message}`)}},downloadJSON:()=>{const r=f();if(!r)return;const g=JSON.stringify(r,null,2),m=new Blob([g],{type:"application/json"}),E=URL.createObjectURL(m),L=document.createElement("a");L.href=E,L.download=`workflow_${Date.now()}.json`,L.click(),URL.revokeObjectURL(E),Z.ElMessage.success("导出成功")}}},yt=(a=null,o=null)=>{const t=a??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",ye.CREATE);const d=e.inject("editorConfig",null),y=e.inject("taskModeConfig",null),n=o??d,C=o??y,T=e.inject("echoTaskData",null),D=e.computed(()=>({errors:[],warnings:[]})),z=(q,u)=>{const R={},V=u?.data?.arguments??{};V.reportFrequency==="interval"&&V.reportInterval&&(R.interval={value:V.reportInterval}),V.enableDeduplication&&V.similarityThreshold!==void 0&&(R.dedup={value:V.similarityThreshold}),t.nodes.filter(x=>x.type===k.DATA_SOURCE).length>=2&&q?.data?.groupWindowSeconds!==void 0&&(R.groupWindowSeconds=q.data.groupWindowSeconds),R.enableVideo=!!q?.data?.enableAlertVideo;const f=q?.data?.schedule;return Array.isArray(f)&&f.length>0?R.schedule=f:R.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],R},G=(q,u,R,V,B="image")=>{const f=pe(u,q.id,R).find(x=>x.type===k.SMALL_MODEL);if(f){const x=q.data?.arguments??{};return{toolTitle:f.data.title||f.data.modelName||"",toolType:"small",arguments:_e(f.data.arguments,k.SMALL_MODEL),decoder:p(x,!0)}}if(B==="stream"){const x=V.find(r=>r.type===k.DETECTION_TARGET);if(!x)return null;const S=q.data?.arguments??{};return{toolTitle:x.data.targetId||"",toolType:"stream",arguments:_e(x.data.arguments,k.DETECTION_TARGET),decoder:p(S,!1)}}return null},p=(q,u)=>{const R=q.mode??(u?3:0),V=q.interval??0,B=q.sw_decoding??(u?"CPU":"GPU");let f=0,x=0;return u?R===3?(f=0,x=0):R===2?(f=1,x=0):R===1&&(f=0,x=V):R===0?(f=0,x=V*25):R===1?(f=0,x=V):R===2&&(f=1,x=0),{sw_decoding:B==="CPU",mode:f,interval:x}},b=(q,u,R,V,B=null)=>{let f=q.id,x=pe(u,q.id,R).filter(g=>g.type!==k.END&&g.type!==k.START);x.length===1&&x[0].type===k.SMALL_MODEL&&(f=x[0].id,x=pe(u,f,R).filter(g=>g.type!==k.END&&g.type!==k.START));const S=x;if(S.length===0)return[];const r=B?g=>t.getTaskSourceArguments(q.id,B,g):null;return S.map((g,m)=>{const E=Pe([g.id],f,u,R,V,r,[k.SMALL_MODEL]),L=V.find(Y=>Y.source===f&&Y.target===g.id),P=L?.data??{},A=P.branchOrder??m+1,j=P.branchId??null,H={branchId:j,id:j,branchName:P.branchName||g.data?.label||`分支${m+1}`,sortOrder:A,nodes:E};return L?.sourceHandle&&(H.sourceHandle=L.sourceHandle),P.timeWindowSeconds!==void 0&&P.timeWindowSeconds!==null&&(H.timeWindowSeconds=P.timeWindowSeconds),P.branchDescription&&(H.description=P.branchDescription),Ce(H,"target_count","targetCount","targetCount"),Ce(H,"timer_target","duration","duration"),H})},_=(q,u,R,V,B=null,f=null,x=null,S=1,r=!1,g=!1)=>{const m=B??q.deviceType??"",E=m==="1400"||m==="2",L=E?"1400":"camera",P=u==="stream"?2:1,A=E&&f!==null?f==="device"?1:2:q.detectionType??2,H=(T?.value??T)?.graph?.sources??[],Y=String(q.sourceId??q.id??""),M=H.find(W=>String(W.sourceId)===Y)?.attach??{},$={deviceType:L,detectionType:A,dataSourceType:P,sourceOrder:R,timeTemplateId:M.timeTemplateId??"",timeTemplateName:M.timeTemplateName??"",platform:V?.platform??"TAI"};if(!E){const W=x?.mode??0;W===3?($.frameExtractionType=0,$.frameInterval=0):W===2?($.frameExtractionType=g?1:3,$.frameInterval=0):($.frameExtractionType=W+1,$.frameInterval=x?.interval??30);const s=x?.sw_decoding??"CPU";$.frameExtractionSourceType=s==="GPU"?2:1,S===1&&u==="image"&&!r&&!!x?.enablePatrol?$.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,x?.patrolGroupSize??1)),pollingInterval:"0"}:$.pollingConfig={enablePolling:0},$.thirdId=q.thirdId??""}return $},c=(q,u,R,V,B,f,x)=>{const S=C?.value??C,r=S?.value??S,g=r?.datasource?.getDevices?.(q.id)??[],m=q.data?.sourceGroupId??null,E=!!q.data?.arguments?.needCooperativeDetection,L=E?q.data?.arguments?.windowSeconds??5:void 0,P=u?.data?.streamType??"image",A=pe(R,q.id,V).some(i=>i.type===k.SMALL_MODEL),j=A?"small":P,H=G(q,R,V,x,P),Y=q.data?.arguments?.deviceType??null,h=q.data?.arguments?.detectionMode??null,M=q.data?.arguments??null,$=t.getDataSourceCount();if(g.length>0)return g.map((i,w)=>{const F=String(i.sourceId??i.id??""),U=b(q,R,V,B,F),J={sourceId:i.sourceId??i.id??"",sourceName:i.sourceName??i.name??"",sourceType:j,sourceGroupId:m,areas:i.area??i.areas??[],branches:U,attach:_(i,P,w,r,Y,h,M,$,E,A),synEnabled:E,...L!==void 0&&{windowSeconds:L}};return H&&(J.streamConfig=H,J.streamUrl="rtsp"),J});const W=b(q,R,V,B),s={sourceId:"",sourceName:q.data?.label??"数据源",sourceType:j,sourceGroupId:m,areas:[],branches:W,attach:_({},P,0,r,Y,h,M,$,E,A),synEnabled:E};return H&&(s.streamConfig=H,s.streamUrl="rtsp"),[s]},N=()=>{try{const q=t.nodes,u=t.edges,R=qe(q),V=Ge(q,u),B=[...R.values()].find(L=>L.type===k.START),f=[...R.values()].find(L=>L.type===k.END),x=n?.value??n,S=x?.value??x,r=He(V,R);let g=r.filter(L=>L.type===k.DATA_SOURCE);g.length===0&&(g=q.filter(L=>L.type===k.DATA_SOURCE));const m=g.flatMap((L,P)=>c(L,B,V,R,u,P,r)),E={workflowName:B?.data?.taskName??"",ruleId:S?.ruleId??"",sources:m,extraConfig:z(B,f),description:""};if((S?.platform??"TAI")==="THIRD"){const P=g[0]?.data?.arguments??{},A=P.mode??0,j=P.interval??0;let H,Y,h;return A===0?(H="time",Y=j,h=0):(H="frame",Y=0,A===3?h=0:A===2?h=-1:h=j),{name:E.workflowName,type:"simple",plan:E.extraConfig.schedule??[],inferStrategy:H,timeInterval:Y,frameInterval:h,mps:E.extraConfig.enableVideo??!1,graph:E}}return E}catch(q){return Z.ElMessage.error(q.message||"导出失败"),null}};return{validation:D,exportToJSON:N,copyToClipboard:()=>{const q=N();if(!q)return;const u=JSON.stringify(q,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(u).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const R=document.createElement("textarea");R.value=u,R.style.position="fixed",R.style.opacity="0",document.body.appendChild(R),R.select(),document.execCommand("copy"),document.body.removeChild(R),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const q=N();if(!q)return;const u=JSON.stringify(q,null,2),R=new Blob([u],{type:"application/json"}),V=URL.createObjectURL(R),B=document.createElement("a");B.href=V,B.download=`task_workflow_${Date.now()}.json`,B.click(),URL.revokeObjectURL(V),Z.ElMessage.success("导出成功")}}},_t=(a=null,o=null,t=null)=>{const d=e.inject("editorMode",ee.ALGORITHM);return(a??d)===ee.TASK?yt(o,t):ht(o,t)},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 d=o??ae(),y=e.inject("editorMode",ee.ALGORITHM),n=a??y,C=e.inject("taskModeConfig",null),T=t??C,D=p=>{const{type:b,data:_}=p,c=_.arguments||{},N=[];switch(b){case k.START:if(n===ee.TASK)if(_.taskName?.trim()||N.push("任务名称"),!_.executionTime?.trim())N.push("任务执行时间");else{const l=Nt(_.executionTime);(!l||!Array.isArray(l.plan)||l.plan.length===0)&&N.push("任务执行时间(计划为空)")}else _.algorithmName?.trim()||N.push("算法名称");break;case k.SMALL_MODEL:_.modelId||N.push("模型选择");break;case k.DETECTION_TARGET:_.targetId||N.push("检测目标选择");break;case k.CLASSIFICATION_MODEL:c.modelId||N.push("分类模型选择");break;case k.DATA_SOURCE:n===ee.TASK&&((T?.value??T)?.datasource?.getDevices?.(p.id)??[]).length===0&&N.push("设备选择");break;case k.TARGET_COUNT:break;case k.TIMER_TARGET:(!c.duration||c.duration<1)&&N.push("持续时间");break}return N},z=p=>{const b=d.nodes.find(c=>c.id===p.source);if(!b)return[];const _=[];return b.type===k.DATA_SOURCE&&b.data?.enableImageSequence===!0&&p.sourceHandle!=="first-frame"&&(!p.data?.timeWindowSeconds||p.data.timeWindowSeconds<1)&&_.push("后续检测帧的持续时间"),_};return{runValidation:()=>{const{nodes:p,edges:b}=d;d.clearInvalidIds();const _=Fe(p,b,n),c=_.errors,N=[],l=[],O=[];p.filter(f=>f.type!=="group").forEach(f=>{const x=D(f);x.length>0&&(N.push(f.id),O.push(`节点"${f.data.label}"缺少必填参数:${x.join("、")}`))}),b.forEach(f=>{const x=z(f);x.length>0&&(l.push(f.id),O.push(`分支"${f.data?.branchName||"未命名"}"缺少:${x.join("、")}`))}),c.forEach(f=>{typeof f=="object"&&(f.nodeId&&N.push(f.nodeId),f.edgeId&&l.push(f.edgeId))}),(N.length>0||l.length>0)&&(d.setInvalidIds(N,l),setTimeout(()=>{d.clearInvalidIds()},5e3));const u=c.map(f=>typeof f=="object"?f.message:f),R=_.warnings.map(f=>typeof f=="object"?f.message:f),V=[...u.map(f=>({msg:f,type:"error"})),...O.map(f=>({msg:f,type:"warning"})),...R.map(f=>({msg:f,type:"warning"}))],B=u.length===0&&O.length===0;if(B&&R.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(V.length>0){const f=V[0];Z.ElMessage[f.type](f.msg)}return B}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[d,y]of o)t[d]=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"]),d=(y,n)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",n),y.dataTransfer.effectAllowed="move")};return(y,n)=>{const C=e.resolveComponent("el-icon"),T=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),z=e.resolveComponent("el-collapse-item"),G=e.resolveComponent("FolderOpened"),p=e.resolveComponent("Cpu"),b=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:n[1]||(n[1]=c=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",kt,"节点工具箱")):(e.openBlock(),e.createBlock(C,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(C,{key:2,class:"toggle-btn",onClick:n[0]||(n[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":n[13]||(n[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:n[2]||(n[2]=c=>d(c,"start"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),n[14]||(n[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[3]||(n[3]=c=>d(c,"end"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),n[15]||(n[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:n[4]||(n[4]=c=>d(c,"dataSource"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(G)]),_:1}),n[16]||(n[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[5]||(n[5]=c=>d(c,"smallModel"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(p)]),_:1}),n[17]||(n[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[6]||(n[6]=c=>d(c,"detectionTarget"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(b)]),_:1}),n[18]||(n[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[7]||(n[7]=c=>d(c,"classificationModel"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),n[19]||(n[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:n[8]||(n[8]=c=>d(c,"targetCount"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),n[20]||(n[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[9]||(n[9]=c=>d(c,"timerTarget"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),n[21]||(n[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:n[10]||(n[10]=c=>d(c,"ocr"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),n[22]||(n[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[11]||(n[11]=c=>d(c,"licensePlate"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),n[23]||(n[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[12]||(n[12]=c=>d(c,"faceRecognition"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),n[24]||(n[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:y,inputSchema:n,extraConfig:C}=o,T={id:t,title:d,label:y,type:"DETECTION_TARGET",inputSchema:n,extraConfig:C,data:{targetId:d,targetName:y,description:y,areas:n?.properties?.areas?.default||[],threshold:n?.properties?.threshold?.default||.5,targetWidth:n?.properties?.targetWidth?.default||20,targetHeight:n?.properties?.targetHeight?.default||20,postmodel:n?.properties?.postmodel?.default||"ClipVit",expandRect:n?.properties?.expandRect?.default!==void 0?n.properties.expandRect.default:!1,topScale:n?.properties?.topScale?.default||1.6,bottomScale:n?.properties?.bottomScale?.default||1.6,leftScale:n?.properties?.leftScale?.default||1.6,rightScale:n?.properties?.rightScale?.default||1.6,enableStructure:C?.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=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:d,...y}=t,n={id:`e_${a}_${o}`,source:a,target:o};return d&&(n.sourceHandle=d),Object.keys(y).length>0&&(n.data=y),n},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(d=>({operator:d.op,value:d.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=u=>tt[u]||k.DETECTION_TARGET,d=(u,R)=>u?.find(V=>V.id===String(R))??u?.[R],y=(u,R)=>u.streamConfig?(u.children||[]).some(f=>(f.branchRefs||[]).some(x=>d(R.branches,x)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,n=u=>!u||typeof u!="object"?"无效的JSON格式":!u.ruleName&&u.ruleName!==""?"缺少 ruleName 字段":u.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",C=u=>{const R=o?.value??o;return u==="small"?R?.smallModels||[]:u==="detection"?R?.detection||[]:u==="classification"?R?.classification?.models||[]:[]},T=()=>{},D=(u,R)=>{u.modelName=R||"",u.title=R||"",u.modelId=R||null;const B=C("small").find(f=>f.title===R);B&&(u.input_schema=B.inputSchema||B.input_schema||{},u.modelId=B.id||B.title,u.modelName=B.name||R,u.modelType=B.type,u.supportDirectAlert=B.supportDirectAlert||!1,u.extraConfig=B.extraConfig)},z=async(u,R)=>{const V=t(u.toolTitle),B={label:u.nodeName||je(V),arguments:u.arguments||{},input_schema:{}};switch(V){case k.DETECTION_TARGET:B.targetId=u.toolTitle,B.targetName=u.nodeName||"检测目标";{const x=C("detection").find(S=>S.title===u.toolTitle);if(x){let r=Ee.backendToFrontend(x).inputSchema||{};if(u.toolTitle==="other"){const g={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,...g.properties}}}B.input_schema=r}}break;case k.CLASSIFICATION_MODEL:B.modelName=u.nodeName||"分类模型";break;case k.SMALL_MODEL:D(B,u.toolTitle);break}return u.branchLogic&&(B.enableBranch=!0,B.branchLogic=u.branchLogic),fe(V,R,B)},G=(u,R,V,B)=>{const f={label:"小模型",input_schema:{},arguments:u.arguments||{}};return D(f,u.toolTitle),R===de.SMALL_MODEL_BRANCH&&(f.enableBranch=!0,f.branchLogic=V.logic||"and"),fe("smallModel",B,f)},p=async(u,R,V,B,f,x)=>{let S=R,r=B;const g={branchOrder:u.sortOrder??1,branchName:u.branchName||"",branchId:u.id??null};u.sourceHandle&&(g.sourceHandle=u.sourceHandle);const m=u.timeWindowSeconds??u.extraConfig?.timeWindowSeconds;m!==void 0&&(g.timeWindowSeconds=m),u.description&&(g.branchDescription=u.description);const E=[...u.nodes||[]].sort((h,M)=>(h.sortOrder??0)-(M.sortOrder??0)),L=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]);let P=-1;E.forEach((h,M)=>{L.has(t(h.toolTitle))&&(P=M)});const A=E.map(h=>({kind:"regular",data:h})),j=u.targetCount??u.extraConfig?.targetCount,H=u.duration??u.extraConfig?.duration,Y=[];j&&Y.push({kind:"targetCount",data:j}),H&&Y.push({kind:"timerTarget",data:H}),Y.length>0&&A.splice(P+1,0,...Y);for(let h=0;h<A.length;h++){const M=A[h];let $;if(M.kind==="regular")$=await z(M.data,{x:r,y:V});else if(M.kind==="targetCount"){const W=St(M.data);$=fe("targetCount",{x:r,y:V},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=Vt(M.data);$=fe("timerTarget",{x:r,y:V},{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"}}})}f.push($),x.push(Ne(S,$.id,h===0?g:void 0)),S=$.id,r+=ie.H_GAP}return{lastNodeId:S,endX:r}},b=u=>{const R=u.ruleSchema.sourceGroups||[],V=u.ruleSchema.groupLogic||"and",B=R.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:u.ruleName||"",enableBranch:B?!0:V!=="and",branchLogic:V,groupWindowSeconds:u.ruleSchema.groupWindowSeconds??null})},_=u=>{const R=Bt(u.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:At(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...R}})},c=(u,R)=>[...u||[]].sort((V,B)=>(V.sort??0)-(B.sort??0)).map(V=>{const B=y(V,R),f=[];return(V.children||[]).forEach(x=>{(x.branchRefs||[]).forEach(S=>{const r=d(R.branches,S);r&&f.push(r)})}),f.sort((x,S)=>(x.sortOrder??0)-(S.sortOrder??0)),{sg:V,mode:B,refBranches:f}}),N=u=>{const V=(u.reduce((B,f)=>B+Math.max(f.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-V/2},l=async(u,R,V,B,f,x)=>{const{sg:S,mode:r,refBranches:g}=u,m=Math.max(g.length,1),E=V+(m-1)*ie.V_GAP/2;let L=ie.START_X+ie.H_GAP,P=ie.START_X;const A=S.logic==="order",j=fe("dataSource",{x:L,y:E},{label:S.name||"数据源",sourceGroupId:S.sourceGroupId??null,enableImageSequence:A,input_schema:Dt(),arguments:{needCooperativeDetection:!!S.synEnabled,windowSeconds:S.windowSeconds||5,enableImageSequence:A},enableBranch:!0,branchLogic:A?"order":S.logic||"and"});B.push(j),f.push(Ne(R.id,j.id,{branchOrder:S.sort??null,branchName:S.name||""})),A&&g.forEach((h,M)=>{h.sourceHandle||(h.sourceHandle=M===0?"first-frame":Lt())});const H=A?{dataSourceNode:j,refBranches:g}:null;let Y=j.id;if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){L+=ie.H_GAP;const h=G(S.streamConfig,r,S,{x:L,y:E});B.push(h),f.push(Ne(j.id,h.id)),Y=h.id}if(g.length>0)for(let h=0;h<g.length;h++){const M=V+h*ie.V_GAP,{lastNodeId:$,endX:W}=await p(g[h],Y,M,L+ie.H_GAP,B,f);f.push(Ne($,x.id)),W>P&&(P=W)}else{f.push(Ne(Y,x.id));const h=L+ie.H_GAP;h>P&&(P=h)}return{branchY:V+m*ie.V_GAP,maxX:P,imageSequenceInfo:H}},O=u=>{for(const{dataSourceNode:R,refBranches:V}of u){const B=V.filter(f=>f.sourceHandle&&f.sourceHandle!=="first-frame");B.length>0&&(R.data.subsequentFrames=B.map((f,x)=>({id:x===0?"default-subsequent":`subsequent-${Date.now()}-${x}`,label:x===0?"后续帧检测":`后续帧检测${x+1}`,handleId:f.sourceHandle})))}};return{importFromJSON:async u=>{const R=n(u);if(R)return Z.ElMessage.error(R),!1;try{T();const V=[],B=[],f=b(u),x=_(u);V.push(f);const S=c(u.ruleSchema.sourceGroups,u);let r=N(S),g=ie.START_X;const m=[];for(const E of S){const L=await l(E,f,r,V,B,x);r=L.branchY,L.maxX>g&&(g=L.maxX),L.imageSequenceInfo&&m.push(L.imageSequenceInfo)}return x.position.x=g+ie.H_GAP,V.push(x),O(m),a.loadWorkflow(V,B),Z.ElMessage.success("导入成功"),!0}catch(V){return Z.ElMessage.error("导入失败: "+(V.message||"未知错误")),!1}},validateImportJSON:n}},Ot=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:d,validateImportJSON:y}=ze(),n=(_,c)=>{const N=_.mode??0,l=_.interval??0,O=_.sw_decoding===!1?"GPU":"CPU";let q,u;return c?N===1?(q=2,u=0):N===0&&l===0?(q=3,u=0):(q=1,u=l):N===1?(q=2,u=0):l===0?(q=0,u=30):(q=0,u=l),{mode:q,interval:u,sw_decoding:O}},C=(_,c)=>{const N=_.frameExtractionType??1,l=_.frameInterval??0,q=(_.frameExtractionSourceType??1)===2?"GPU":"CPU";let u,R;return N===0?(u=3,R=0):N===1&&l===0?(u=c?2:0,R=30):N===1?(u=0,R=l):N===2?(u=1,R=l):N===3?(u=2,R=0):(u=c?3:0,R=30),{mode:u,interval:R,sw_decoding:q}},T=_=>_===1?"device":"platform",D=_=>!_||_.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(_.pollingAmount??1)},z=(_,c,N)=>{if(c){const l=_.find(O=>O.sourceGroupId===c);if(l)return l}return _[N]??null},G=(_,c)=>{if(!_?.branches)return null;for(const N of _.branches){const l=N.nodes?.find(O=>O.toolTitle===c);if(l?.arguments)return{...l.arguments}}return null},p=_=>{if(!Array.isArray(_)||_.length===0)return{timeZone:"",planType:0};const c=_.map(l=>({dayType:Number(l.dayType??0),timePeriod:(l.timePeriod??[]).map(O=>({startTime:O.startTime,endTime:O.endTime}))})),N=c.some(l=>l.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:c}),planType:N}};return{importFromJSON:async _=>{const c=y(_);if(c)return Z.ElMessage.error(c),!1;if(!await d(_))return!1;const l=a?.value??a;if(!l||typeof l!="object"||Object.keys(l).length===0)return!0;const O=l.graph??{},q=O.sources??[],u=O.extraConfig??{},R=t.nodes.find(S=>S.type===k.START);if(R){const S=l.name??O.workflowName??"",r=!!u.enableVideo,g=u.schedule??[],{timeZone:m,planType:E}=p(g);t.updateNodeData(R.id,{taskName:S,enableAlertVideo:r,schedule:g,timeZone:m,planType:E,...m?{executionTime:m}:{}})}const V=t.nodes.filter(S=>S.type===k.DATA_SOURCE),B=t.nodes.some(S=>S.type===k.SMALL_MODEL);return V.forEach((S,r)=>{const g=S.data?.sourceGroupId??null,m=z(q,g,r);if(!m)return;const E=m.attach??{},L=m.streamConfig?.decoder??null,P=E.deviceType==="1400"?"1400":"camera",A=P==="camera"?L?n(L,B):C(E,B):{},j=P==="camera"?D(E.pollingConfig):{},H=P==="1400"?{detectionMode:T(E.detectionType)}:{},Y=S.data?.arguments??{};t.updateNodeData(S.id,{arguments:{...Y,deviceType:P,...A,...j,...H}});const h=o?.value??o;if(h?.datasource?.setDevices){const $=(g?q.filter(W=>W.sourceGroupId===g):[m]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));h.datasource.setDevices(S.id,$)}}),t.nodes.filter(S=>S.type===k.DETECTION_TARGET).forEach(S=>{const r=new Set,g=[S.id];let m=null;for(;g.length&&!m;){const h=g.shift();if(r.has(h))continue;r.add(h);const M=t.edges.filter($=>$.target===h);for(const $ of M){const W=t.nodes.find(s=>s.id===$.source);if(W){if(W.type===k.DATA_SOURCE){m=W.id;break}g.push(W.id)}}}if(!m)return;const L=(o?.value??o)?.datasource?.getDevices?.(m)??[];if(L.length<=1)return;const P=S.data?.targetId;if(!P)return;const A=L.map(h=>{const M=String(h.sourceId??h.id??""),$=q.find(W=>String(W.sourceId)===M);if(!$?.branches)return{deviceId:M,args:null};for(const W of $.branches){const s=W.nodes?.find(i=>i.toolTitle===P);if(s?.arguments)return{deviceId:M,args:{...s.arguments}}}return{deviceId:M,args:null}}),j=A.filter(h=>h.args!==null);if(j.length===0)return;const H=JSON.stringify(j[0].args);if(j.some(h=>JSON.stringify(h.args)!==H)){const h=S.data?.arguments??{};t.updateNodeData(S.id,{arguments:{...h,configMode:"perDevice"}}),A.forEach(({deviceId:M,args:$})=>{$&&t.setTaskSourceArguments(m,M,S.id,$)})}}),t.nodes.filter(S=>S.type===k.FACE_RECOGNITION).forEach(S=>{const r=new Set,g=[S.id];let m=null;for(;g.length&&!m;){const Y=g.shift();if(r.has(Y))continue;r.add(Y);const h=t.edges.filter(M=>M.target===Y);for(const M of h){const $=t.nodes.find(W=>W.id===M.source);if($){if($.type===k.DATA_SOURCE){m=$.id;break}g.push($.id)}}}const L=(m?t.nodes.find(Y=>Y.id===m):null)?.data?.sourceGroupId??null,P=V.findIndex(Y=>Y.id===m),A=z(q,L,P>=0?P:0);if(!A)return;const j=G(A,"face");if(!j?.repositoryId)return;const H=S.data?.arguments??{};t.updateNodeData(S.id,{arguments:{...H,repositoryId:Array.isArray(j.repositoryId)?j.repositoryId:[j.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 d=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(d)]),_: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 d=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(d)]),_: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(),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,G=>{const p=Math.random()*16|0;return(G==="x"?p:p&3|8).toString(16)}),C=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 G=o.data.subsequentFrames||[],p={id:n(),label:`后续帧检测${G.length+1}`,handleId:n()};t.addSubsequentFrame(o.id,p),setTimeout(()=>{T=!1},300)},z=async G=>{const p=o.data.subsequentFrames.find(_=>_.id===G);if(t.edges.some(_=>_.source===o.id&&_.sourceHandle===p.handleId))try{await Z.ElMessageBox.confirm(`删除"${p.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,G)};return(G,p)=>{const b=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":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(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(b)]),_: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,[p[0]||(p[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(C.value,N=>(e.openBlock(),e.createElementBlock("div",{key:N.id,class:"handle-item"},[e.createElementVNode("span",Wt,e.toDisplayString(N.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:N.handleId,class:"handle-right"},null,8,["position","id"]),N.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(_,{key:0,class:"delete-icon",onClick:e.withModifiers(l=>z(N.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(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(a){return(o,t)=>{const d=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(d)]),_: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||"检测目标",d=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 n=o.data.arguments.object;if(Array.isArray(n))return n.filter(T=>T&&T.trim()!=="").length}return null});return(n,C)=>{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: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(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",no,[C[1]||(C[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(z,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.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(a.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.targetHeight&&a.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(z,{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(z,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...C[0]||(C[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 d=e.resolveComponent("Grid"),y=e.resolveComponent("el-icon"),n=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(d)]),_: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(n,{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(n,{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(n,{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 d=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(d,{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(),d=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(C=>C.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const C=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: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(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(C)]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",xo,e.toDisplayString(d()),1),e.createElementVNode("div",Eo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(D,{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(D,{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={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},d=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const C=y[0];return`数量 ${t[C.operator]||C.operator} ${C.value}`}const n=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${n})`});return(y,n)=>{const C=e.resolveComponent("el-icon"),T=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(C,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",So,[n[0]||(n[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(a){const o=a,t=e.computed(()=>o.data.description||"目标计时"),d=e.computed(()=>`${o.data.arguments?.duration||30}秒`),y=e.computed(()=>{const n=o.data.arguments?.condition_type;return n==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:n==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(n,C)=>{const T=e.resolveComponent("el-icon"),D=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(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}),y.value?(e.openBlock(),e.createBlock(D,{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"},d=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),n={width:"8px",height:"8px",borderRadius:"2px"},C={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: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(z,{type:y.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":n,"line-style":C})],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(),d=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(C=>C.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const C=e.resolveComponent("el-icon"),T=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(C,{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(d()),1),e.createElementVNode("div",Ho,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(T,{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(T,{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),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,G=window.innerHeight;let{x:p,y:b}=o.position;p+D.width>z-ue&&(p=z-D.width-ue),b+D.height>G-ue&&(b=G-D.height-ue),p<ue&&(p=ue),b<ue&&(b=ue),d.value={x:p,y:b}});const y=e.computed(()=>({left:d.value.x+"px",top:d.value.y+"px"})),n=[{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:"🏁"}],C=e.computed(()=>{switch(o.sourceNodeType){case"start":return n.filter(T=>T.type==="dataSource");case"dataSource":return n.filter(T=>T.type==="smallModel"||T.type==="detectionTarget"||T.type==="classificationModel");case"smallModel":return n.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel"&&T.type!=="targetCount"&&T.type!=="timerTarget");case"detectionTarget":case"classificationModel":return n.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel");case"timerTarget":return n.filter(T=>["ocr","faceRecognition","licensePlate","end"].includes(T.type));case"targetCount":return n.filter(T=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(T.type));case"ocr":return n.filter(T=>["licensePlate","faceRecognition","end"].includes(T.type));case"licensePlate":return n.filter(T=>["ocr","faceRecognition","end"].includes(T.type));case"faceRecognition":return n.filter(T=>["ocr","licensePlate","end"].includes(T.type));default:return[]}});return(T,D)=>(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)},[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(C.value,z=>(e.openBlock(),e.createElementBlock("li",{key:z.type,class:"quick-add-menu__item",onClick:G=>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)),C.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: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(a){const o=ae(),{screenToFlowCoordinate:t,findNode:d,onConnectStart:y,onConnectEnd:n}=v.useVueFlow(),C=e.inject("editorConfig",null),T=e.inject("editorMode",ee.ALGORITHM),D=e.computed(()=>T===ee.TASK),z=e.inject("echoAlgodata",null),{importFromJSON:G}=Mt();e.watch(z,async s=>{if(s&&Object.keys(s).length>0&&(await e.nextTick(),await G(s),D.value)){const i=s?.ruleSchema?.sourceGroups??[];let w=null;if(i.some(F=>F.streamConfig)?w="stream":(i.length>1||i.some(F=>(F.children??[]).length>1))&&(w="image"),w){const F=o.nodes.find(U=>U.type===k.START);F&&o.updateNodeData(F.id,{streamType:w})}}},{immediate:!0});const p=(s,i)=>{if(!i?.properties)return s;const w={};return Object.entries(i.properties).forEach(([F,U])=>{U.default!==void 0&&(w[F]=U.default)}),s.data.arguments={...w,...s.data.arguments},s},b=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),_=()=>{b.visible=!1,b.sourceNodeId=null,b.sourceNodeType=null,b.sourceHandleId=null,q=!1};let c=null,N=!1,l=null,O=null,q=!1;const u=()=>{l&&(document.removeEventListener("mousemove",l),l=null),O&&(document.removeEventListener("mouseup",O),O=null)};e.onUnmounted(()=>{u()}),y(({nodeId:s,handleId:i,handleType:w,event:F})=>{if(w!=="source")return;if(D.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(i&&o.edges.filter(I=>I.source===s&&I.sourceHandle===i).length>=1)return}else if(U.type!==k.START&&U.type!==k.DATA_SOURCE&&o.edges.filter(I=>I.source===s).length>=1)return;const J=F?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}c={nodeId:s,sourceNodeType:U.type,handleId:i,menuX:Q,menuY:te,flowPos:{...U.position}},N=!1;const se=F?.clientX??0,ce=F?.clientY??0;u(),l=ne=>{(Math.abs(ne.clientX-se)>Ue||Math.abs(ne.clientY-ce)>Ue)&&(N=!0,u())},O=()=>{if(u(),!N&&c){q=!0;const ne=c;b.visible=!0,b.screenPos={x:ne.menuX,y:ne.menuY},b.sourceNodeId=ne.nodeId,b.sourceNodeType=ne.sourceNodeType,b.sourceHandleId=ne.handleId,b.flowPos=ne.flowPos}c=null},document.addEventListener("mousemove",l),document.addEventListener("mouseup",O)});const R=s=>{const i=b.sourceNodeId,w=o.nodes.find(K=>K.id===i);if(!w){_();return}if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),_();return}const F=w.position.x+250,U=w.position.y;let J={x:F,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-F)<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===i&&ke.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),_();return}const he=B(w,K);if(!he.valid){Z.ElMessage.warning(he.message),_();return}o.addConnection({source:i,target:K.id,sourceHandle:b.sourceHandleId||null,targetHandle:null}),P(),_(),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=C?.value??C;ne=p(Le(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=C?.value??C;ne=p(Oe(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=C?.value??C;ne=p(Re(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Me(J);break;case"timerTarget":ne=Ie(J);break;default:_();return}const I=B(w,ne);if(!I.valid){Z.ElMessage.warning(I.message),_();return}o.addNode(ne),o.addConnection({source:i,target:ne.id,sourceHandle:b.sourceHandleId||null,targetHandle:null}),P(),_(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},V=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],B=(s,i)=>{if(s?.parentNode&&i?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(i?.parentNode&&s?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(s?.type===k.START){if(i?.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(i?.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(i?.type!==k.SMALL_MODEL&&i?.type!==k.DETECTION_TARGET&&i?.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&&(i?.type===k.TARGET_COUNT||i?.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(i?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(s?.type===k.TIMER_TARGET&&![k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(i?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const w=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION];return w.includes(s?.type)&&!w.filter(U=>U!==s.type).concat(k.END).includes(i?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:i?.type!==k.END&&o.edges.filter(U=>U.target===i?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},f=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}),x=e.computed({get:()=>o.nodes,set:s=>{o.nodes=s}}),S=e.computed({get:()=>o.edges,set:s=>{o.edges=s}}),r=s=>{s.forEach(i=>{if(i.type==="position"&&i.position)o.updateNodePosition(i.id,i.position);else if(i.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const w=o.nodes.find(U=>U.id===i.id);if(w&&w.type===k.START){Z.ElMessage.warning("开始节点不可删除");return}if(w&&w.type===k.END){Z.ElMessage.warning("结束节点不可删除");return}if(w&&w.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const F=w?.parentNode;o.removeNode(i.id),F&&o.nodes.filter(J=>J.parentNode===F).length===0&&o.dissolveParallelGroup(F)}})},g=s=>{s.forEach(i=>{if(i.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(i.id)}})},m=s=>{if(q)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),_();return}const i=o.nodes.find(U=>U.id===s.source),w=o.nodes.find(U=>U.id===s.target),F=B(i,w);if(!F.valid){Z.ElMessage.warning(F.message),_();return}if(i?.type===k.DATA_SOURCE&&i.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(V.includes(i?.type)&&!i.data.enableBranch&&o.edges.filter(J=>J.source===s.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(s),P(),_()},E=s=>({and:"ALL",or:"SOME"})[s]||"ALL",L=s=>{const i=o.nodes.find(w=>w.id===s.source);if(!i)return"";if(i.type===k.START){const w=i.data.branchLogic||"and",F=E(w),U=s.data?.branchOrder;return U!=null?`${F} - 执行顺序 ${U}`:F}if(i.type===k.DATA_SOURCE){if(i.data?.enableImageSequence){const J=s.sourceHandle==="first-frame"?"首帧":"后续帧",Q=s.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const w=i.data.branchLogic||"and",F=E(w),U=s.data?.branchOrder;return U!=null?`${F} - 执行顺序 ${U}`:F}return""},P=()=>{o.edges.forEach(s=>{const i=L(s);s.label!==i&&(s.label=i,s.labelStyle=i?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,s.labelBgStyle=i?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,s.labelBgPadding=i?[4,6]:void 0)})},A=()=>{o.nodes.forEach(s=>{if(s.type!=="group")return;const i=s.data.sourceNodeId;if(!i)return;const w=o.nodes.find(F=>F.id===i);w?.data?.enableBranch&&w.data.branchLogic!==s.data.branchLogic&&o.updateNodeData(s.id,{branchLogic:w.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(s=>V.includes(s.type)).map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic})),(s,i)=>{i&&s.forEach(w=>{const F=i.find(U=>U.id===w.id);if(F){if(w.enableBranch&&!F.enableBranch){const U=o.nodes.find(J=>J.id===w.id);if(!U)return;o.createEmptyGroup({x:U.position.x+200,y:U.position.y-30},U.data.branchLogic||"and",w.id)}else if(!w.enableBranch&&F.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===w.id);U&&o.dissolveParallelGroup(U.id)}if(w.enableBranch&&F.branchLogic!==w.branchLogic){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===w.id);U&&o.updateNodeData(U.id,{branchLogic:w.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})),()=>{P(),A()},{deep:!0}),e.watch(()=>o.edges.map(s=>({id:s.id,branchOrder:s.data?.branchOrder})),(s,i)=>{P(),i&&s.forEach(w=>{const F=i.find(U=>U.id===w.id);if(F&&F.branchOrder!==w.branchOrder&&w.branchOrder!==void 0){const U=o.edges.find(J=>J.id===w.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,i])=>{o.nodes.forEach(w=>{s.has(w.id)?w.class="invalid-node":w.class==="invalid-node"&&(w.class="")}),o.edges.forEach(w=>{i.has(w.id)?w.class="invalid-edge":w.class==="invalid-edge"&&(w.class="")})},{deep:!0});const j=s=>{s.event?.target?.closest(".vue-flow__handle")||o.selectNode(s.node.id)},H=s=>{o.selectEdge(s.edge.id)},Y=s=>{if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(s.edge.id)},h=()=>{o.clearSelection()},M=({node:s})=>{if(s.type==="group"||!V.includes(s.type))return;const i=o.nodes.filter(F=>F.type==="group");let w=null;for(const F of i){const U=d(F.id);if(!U)continue;const J=U.dimensions?.width||parseInt(F.style?.width)||300,Q=U.dimensions?.height||parseInt(F.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=d(s.id),ne=ce?.dimensions?.width||160,I=ce?.dimensions?.height||60,K=te+ne/2,le=se+I/2;if(K>=F.position.x&&K<=F.position.x+J&&le>=F.position.y&&le<=F.position.y+Q){w=F.id;break}}w?s.parentNode!==w&&o.addNodeToGroup(s.id,w):s.parentNode&&o.removeNodeFromGroup(s.id)},$=s=>{s.preventDefault(),s.dataTransfer&&(s.dataTransfer.dropEffect="move")},W=s=>{s.preventDefault();const i=s.dataTransfer?.getData("application/vueflow");if(!i)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(i===k.START&&o.getNodeCountByType(k.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(i===k.END&&o.getNodeCountByType(k.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const w=160,F=60,U=t({x:s.clientX,y:s.clientY}),J={x:U.x-w/2,y:U.y-F/2};let Q;switch(i){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=C?.value??C;Q=p(Le(J),te?.ocr?.[0]?.inputSchema);break}case k.LICENSE_PLATE:{const te=C?.value??C;Q=p(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=C?.value??C;Q=p(Re(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(s,i)=>(e.openBlock(),e.createElementBlock("div",Xo,[e.createVNode(e.unref(v.VueFlow),{nodes:x.value,"onUpdate:nodes":i[0]||(i[0]=w=>x.value=w),edges:S.value,"onUpdate:edges":i[1]||(i[1]=w=>S.value=w),"node-types":e.unref(f),onNodesChange:r,onEdgesChange:g,onConnect:m,onNodeClick:j,onEdgeClick:H,onEdgeDoubleClick:Y,onPaneClick:h,onDrop:W,onDragover:$,onNodeDragStop:M,"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:b.visible,position:b.screenPos,"source-node-type":b.sourceNodeType,onSelect:R,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(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),d=e.computed(()=>t===ee.TASK),y=e.computed(()=>{const G=o.selectedEdge;return G&&o.nodes.find(b=>b.id===G.source)?.data?.enableBranch?G:null}),n=e.computed(()=>y.value&&o.nodes.find(p=>p.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),C=e.computed(()=>{if(!y.value)return!1;const G=o.nodes.find(p=>p.id===y.value.source);return(G?.type==="dataSource"||G?.type==="start")&&G?.data?.enableBranch}),T=e.computed(()=>{if(!y.value)return 1;const G=o.nodes.find(p=>p.id===y.value.source);return G?o.edges.filter(p=>p.source===G.id).length:1}),D=e.computed(()=>{if(!y.value)return!1;const G=o.nodes.find(p=>p.id===y.value.source);return G?G.type==="dataSource"&&G.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),z=G=>{y.value&&o.updateEdgeData(y.value.id,G)};return(G,p)=>{const b=e.resolveComponent("el-divider"),_=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-text"),N=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form"),O=e.resolveComponent("el-option"),q=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ko,[e.createElementVNode("h3",null,e.toDisplayString(n.value),1)]),e.createVNode(b),D.value?(e.openBlock(),e.createElementBlock("div",Zo,[p[3]||(p[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(_,{"model-value":y.value?.data?.timeWindowSeconds??null,onChange:p[0]||(p[0]=u=>z({timeWindowSeconds:u})),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(()=>[...p[2]||(p[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),C.value?(e.openBlock(),e.createElementBlock("div",vo,[p[5]||(p[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":y.value?.data?.branchOrder??null,disabled:d.value,onChange:p[1]||(p[1]=u=>z({branchOrder:u})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,u=>(e.openBlock(),e.createBlock(O,{key:u,label:`执行顺序 ${u}`,value:u},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(()=>[...p[4]||(p[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 d=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(d),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,d=e.ref(0);let y,n,C,T,D;const z=e.ref(new Map),G=e.ref(new Map),p=e.computed(()=>d.value===0?z.value:G.value);e.onMounted(()=>{y=document.querySelector("#time-content-table-body"),n=y.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 b=m=>{d.value!==m&&(d.value=m,e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),n.forEach(L=>L.classList.remove("selected")),(m===0?z.value:G.value).forEach((L,P)=>{L.origin.forEach(A=>{Array.from(n).forEach(j=>{Number(j.dataset.sort)==A.sort&&Number(j.dataset.value)==A.value&&Number(j.dataset.day)==P&&j.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=(m,E,L)=>{t.operationType!=3&&L.which==1&&(T=m,C=Number(L.target.dataset.value),L.target.classList.contains("selected")?(L.target.classList.remove("selected"),D=""):(D="selected",L.target.classList.add("selected")),N(),V())},N=()=>{n.forEach(m=>{m.addEventListener("mouseover",O,!1,{once:!0})})},l=()=>{n.forEach(m=>{m.removeEventListener("mouseover",O)})},O=m=>{m.target.classList.remove("selected"),D&&m.target.classList.add(D);let E=Number(m.target.dataset.value),L=Number(m.target.dataset.day),P=L>T?L:T,A=L<T?L:T,j=E>C?E:C,H=E<C?E:C;for(let Y=A;Y<=P;Y++)for(let h=H;h<=j;h++){let M=document.querySelector(`td[data-value="${h}"][data-day="${Y}"]`);M.classList.remove("selected"),D&&M.classList.add(D)}V()},q=m=>{if(t.operationType==3)return;let E=[];n.forEach(L=>{Number(L.dataset.day)==m&&E.push(L)}),E.find(L=>!L.classList.contains("selected"))?E.forEach(L=>L.classList.add("selected")):E.forEach(L=>L.classList.remove("selected")),V()},u=m=>{if(t.operationType==3)return;let E=[];n.forEach(L=>{Number(L.dataset.sort)==m&&E.push(L)}),E.find(L=>!L.classList.contains("selected"))?E.forEach(L=>L.classList.add("selected")):E.forEach(L=>L.classList.remove("selected")),V()},R=()=>{n.forEach(E=>{E.classList.remove("selected")}),(d.value===0?z:G).value.clear()},V=()=>{const m=d.value===0?z:G;m.value.clear(),n.forEach(E=>{if(E.classList.contains("selected")){let L=E.dataset.day,P=E.dataset.sort,A=E.dataset.value;m.value.get(L)?m.value.get(L).origin.push({sort:Number(P),value:Number(A)}):m.value.set(L,{origin:[{sort:Number(P),value:Number(A)}],timeList:[]})}})},B=m=>{let P=p.value.get(m).origin.map(A=>A.value).reduce((A,j,H,Y)=>(H==0?A.push([j]):j==Y[H-1]+1?A[A.length-1].push(j):A.push([j]),A),[]);return P=P.map(A=>{let j=Math.max(...A)+1,H=Math.min(...A)+1,Y=H%2==0?30:0,h=j%2==0?0:30,M=f(Math.ceil(H/2)-1),$=f(Math.ceil(j/2)-(h==0?0:1));return{dayType:m,startTime:M+":"+(Y==0?"00":Y),endTime:$+":"+(h==0?"00":h)}}),p.value.get(m).timeList=P,P.map(A=>A.startTime+"-"+A.endTime).join()};function f(m){return m<10?"0"+m:m}const x=(m,E)=>{z.value.clear(),G.value.clear(),n.forEach(j=>j.classList.remove("selected")),d.value=E;const L=E===0?z:G,P=JSON.parse(m);let A=[];P.plan.forEach(j=>{j.timePeriod.forEach(H=>{A.push({...H,dayType:j.dayType})})}),e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),A.forEach(j=>{L.value.get(j.dayType)?L.value.get(j.dayType).timeList.push(j):L.value.set(j.dayType,{origin:[],timeList:[{...j}]})}),L.value.forEach((j,H)=>{j.timeList.forEach(Y=>{let h=Number(Y.startTime.split(":")[1]),M=Number(Y.endTime.split(":")[1]),$=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if($==W){j.origin.push({sort:$,value:2*$});return}for(let s=$;s<=W;s++)if(s==$)h==0?(j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1})):j.origin.push({sort:s,value:2*s+1});else if(s>$&&s<W)j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1});else if(M==0){if(s==W)return;j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1})}else j.origin.push({sort:s,value:2*s})}),j.origin.forEach(Y=>{Array.from(n).find(h=>{Number(h.dataset.sort)==Y.sort&&Number(h.dataset.value)==Y.value&&Number(h.dataset.day)==H&&h.classList.add("selected")})})})})},S=(m,E)=>m.map(A=>A.value).sort((A,j)=>A-j).reduce((A,j,H,Y)=>(H==0?A.push([j]):j==Y[H-1]+1?A[A.length-1].push(j):A.push([j]),A),[]).map(A=>{let j=Math.max(...A)+1,H=Math.min(...A)+1,Y=H%2==0?30:0,h=j%2==0?0:30,M=f(Math.ceil(H/2)-1),$=f(Math.ceil(j/2)-(h==0?0:1));return{dayType:E,startTime:M+":"+(Y==0?"00":Y),endTime:$+":"+(h==0?"00":h)}});return o({getTimeData:()=>{(d.value===0?G:z).value.clear();let E=[];p.value.forEach((A,j)=>{const H=S(A.origin,j);E=E.concat(H)});let L={plan:[]},P=E.map(A=>A.dayType).filter((A,j,H)=>H.indexOf(A)===j);return P.length?(P.forEach(A=>{L.plan.push({dayType:A,timePeriod:E.filter(j=>j.dayType===A).map(j=>({startTime:j.startTime,endTime:j.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(L),planType:d.value}):{validTime:!1}},revertByTime:x,resetFn:()=>{d.value=0,z.value.clear(),G.value.clear(),e.nextTick(()=>{n.forEach(m=>{m.classList.remove("selected")}),n=y.querySelectorAll("td.sel-able[data-type]")})}}),(m,E)=>{const L=e.resolveComponent("el-icon"),P=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:d.value==0}]),onClick:E[0]||(E[0]=A=>b(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==1}]),onClick:E[1]||(E[1]=A=>b(1))}," 日计划 ",2)]),e.createVNode(P,{class:"rm-icon",link:"",type:"danger",onClick:R},{default:e.withCtx(()=>[e.createVNode(L,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:E[3]||(E[3]=A=>A.preventDefault())},[E[5]||(E[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,[E[4]||(E[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,A=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:j=>u(A-1)},e.toDisplayString(A-1),9,cn)),64))]),d.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(_.value.filter(A=>A.value!=0),A=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:j=>q(A.value)},e.toDisplayString(A.name),9,dn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,j=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((j-1)/2),"data-value":j-1,"data-day":A.value,"data-type":d.value,onMousedown:H=>c(A.value,j,H)},null,40,mn)),64))]))),256)):e.createCommentVNode("",!0),d.value==1?(e.openBlock(),e.createElementBlock("tr",pn,[e.createElementVNode("th",{onClick:E[2]||(E[2]=A=>q(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,A=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((A-1)/2),"data-value":A-1,"data-day":0,"data-type":d.value,onMousedown:j=>c(0,A,j)},null,40,un)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",fn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value.keys(),A=>(e.openBlock(),e.createElementBlock("div",null,[d.value==0?(e.openBlock(),e.createElementBlock("span",gn,[E[6]||(E[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(_.value.find(j=>j.value==A).name),1)])):(e.openBlock(),e.createElementBlock("span",hn,e.toDisplayString(_.value.find(j=>j.value==A).name),1)),e.createTextVNode(" ("+e.toDisplayString(B(A))+") ",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 d=a,y=t,n=e.ref(null),C=e.ref(""),T=e.ref(""),D=e.ref(d.modelValue?.timeTemplateName||""),z=e.ref([]);return e.computed(()=>C.value?z.value.filter(b=>b.name.toLowerCase().includes(C.value.toLowerCase())):z.value),e.watch(D,b=>{y("update:modelValue",{...d.modelValue,timeTemplateName:b})}),o({getFormData:()=>{const b=n.value?.getTimeData();return{timeTemplateId:T.value,timeTemplateName:D.value,...b}},revertByTime:(b,_)=>{n.value?.revertByTime(b,_)}}),(b,_)=>(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:n},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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("echoAlgodata",null),C=e.computed(()=>{const c=(n?.value??n)?.ruleSchema?.sourceGroups??[];if(c.some(O=>O.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const N=c.length>1,l=c.some(O=>(O.children??[]).length>1);return N||l?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(C,_=>{_.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 N=(JSON.parse(_.timeZone)?.plan??[]).map(l=>({dayType:String(l.dayType),timePeriod:l.timePeriod.map(O=>({startTime:O.startTime,endTime:O.endTime}))}));o.updateNodeData(t.value.id,{executionTime:_.timeZone,schedule:N,timeZone:_.timeZone,planType:_.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});T.value=!1},G=()=>{const _=t.value?.data;_?.timeZone&&D.value?.revertByTime(_.timeZone,_.planType??0)},p=e.computed(()=>t.value?o.edges.filter(c=>c.source===t.value.id).length>=2:!1),b=_=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:_})};return(_,c)=>{const N=e.resolveComponent("el-divider"),l=e.resolveComponent("el-input"),O=e.resolveComponent("el-form-item"),q=e.resolveComponent("el-form"),u=e.resolveComponent("el-option"),R=e.resolveComponent("el-select"),V=e.resolveComponent("el-switch"),B=e.resolveComponent("el-button"),f=e.resolveComponent("el-dialog"),x=e.resolveComponent("el-icon"),S=e.resolveComponent("el-tooltip"),r=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(N),e.createElementVNode("div",kn,[c[9]||(c[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(q,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:c[0]||(c[0]=g=>b(g)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",bn,[c[10]||(c[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(q,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.taskName,onInput:c[1]||(c[1]=g=>e.unref(o).updateNodeData(t.value.id,{taskName:g})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(O,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":C.value.locked?C.value.value:t.value?.data.streamType||"image",disabled:C.value.locked,onChange:c[2]||(c[2]=g=>e.unref(o).updateNodeData(t.value.id,{streamType:g})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(u,{label:"图片流",value:"image"}),e.createVNode(u,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),C.value.locked?(e.openBlock(),e.createElementBlock("div",xn,e.toDisplayString(C.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(O,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(V,{"model-value":t.value?.data.enableAlertVideo,onChange:c[3]||(c[3]=g=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:g}))},null,8,["model-value"])]),_:1}),e.createVNode(O,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(l,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:c[4]||(c[4]=g=>T.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(f,{modelValue:T.value,"onUpdate:modelValue":c[6]||(c[6]=g=>T.value=g),title:"执行时段",width:"1200px","append-to-body":"",onOpened:G},{footer:e.withCtx(()=>[e.createVNode(B,{onClick:c[5]||(c[5]=g=>T.value=!1)},{default:e.withCtx(()=>[...c[11]||(c[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(B,{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(q,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:c[7]||(c[7]=g=>e.unref(o).updateNodeData(t.value.id,{branchLogic:g})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(u,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(u,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),p.value?(e.openBlock(),e.createBlock(O,{key:0},{label:e.withCtx(()=>[c[13]||(c[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(S,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(x,{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:c[8]||(c[8]=g=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:g})),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:n=>Tn[n]||null,needsToolSelection:n=>Sn.includes(n),fetchToolSchema:async(n,C="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(n,C="")=>(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:d,fetchSchemaForNodeType:y}=we(),n=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const b=p.required||[];return Object.entries(p.properties).map(([_,c])=>({key:_,type:c.type,label:c.title||c.label||c.description||_,description:c.description||"",default:c.default,required:b.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}))}),C=p=>{if(t.value)return t.value.data.arguments?.[p]},T=(p,b)=>{if(!t.value)return;const c={...t.value.data.arguments||{},[p]:b};o.updateNodeData(t.value.id,{arguments:c})},D=p=>{if(!p.dependsOn||!t.value)return!0;const{field:b,value:_}=p.dependsOn,c=C(b);if(typeof _=="string"&&_.startsWith("!")){const N=_.substring(1);return c!==N}return Array.isArray(_)?_.includes(c):c===_},z=p=>{const b=C(p);return Array.isArray(b)?JSON.stringify(b):""},G=(p,b)=>{try{const _=JSON.parse(b);Array.isArray(_)&&T(p,_)}catch{}};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const b=t.value.type,_=t.value.data,c=_.input_schema||_.inputSchema;if(c&&c.properties&&Object.keys(c.properties).length>0)return;const N=await y(b);if(!N)return;const l=t.value?.data;l&&o.updateNodeData(t.value.id,{...l,input_schema:N.inputSchema,extraConfig:N.extraConfig,arguments:{...N.arguments,...l.arguments}})},{immediate:!0}),(p,b)=>{const _=e.resolveComponent("el-divider"),c=e.resolveComponent("el-icon"),N=e.resolveComponent("el-tooltip"),l=e.resolveComponent("el-option"),O=e.resolveComponent("el-select"),q=e.resolveComponent("el-switch"),u=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-input"),V=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[b[2]||(b[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(_),n.value.length>0?(e.openBlock(),e.createElementBlock("div",Vn,[b[0]||(b[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,f=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:f.key,required:f.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(f.label),1),f.description?(e.openBlock(),e.createBlock(N,{key:0,content:f.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(()=>[f.options&&f.type==="string"?(e.openBlock(),e.createBlock(O,{key:0,"model-value":C(f.key),onChange:x=>T(f.key,x),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(x,S)=>(e.openBlock(),e.createBlock(l,{key:x,label:f.optionLabels?f.optionLabels[S]:x,value:x},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):f.type==="boolean"?(e.openBlock(),e.createBlock(q,{key:1,"model-value":C(f.key),onChange:x=>T(f.key,x)},null,8,["model-value","onChange"])):f.type==="number"||f.type==="integer"?(e.openBlock(),e.createBlock(u,{key:2,"model-value":C(f.key),onChange:x=>T(f.key,x),min:f.min,max:f.max,step:f.step||(f.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):f.type==="array"&&!f.options?(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(R,{"model-value":z(f.key),onChange:x=>G(f.key,x),type:"textarea",rows:3,placeholder:f.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):f.type==="array"&&f.options?(e.openBlock(),e.createBlock(O,{key:4,"model-value":C(f.key),onChange:x=>T(f.key,x),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(x,S)=>(e.openBlock(),e.createBlock(l,{key:x,label:f.optionLabels?f.optionLabels[S]:x,value:x},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(R,{key:5,"model-value":C(f.key),onInput:x=>T(f.key,x),maxlength:f.maxLength,"show-word-limit":!!f.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!f.dependsOn||D(f)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(d)&&n.value.length===0?(e.openBlock(),e.createElementBlock("div",An,[...b[1]||(b[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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),C=e.computed(()=>(n?.value??n)?.classification?.models??[]),T=e.computed(()=>(n?.value??n)?.classification?.modelParams??null),D=e.ref([]),z=e.ref(!1),G=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:V=>{t.value&&V&&l("modelId",V)}}),p=()=>{D.value=C.value},b=async V=>{if(!t.value||!V)return;const B=D.value.find(r=>r.id===V);if(!B)return;const f=t.value?.data;if(!f)return;const x=B.inputSchema||B.input_schema||T.value?.inputSchema||{},S={};x.properties&&Object.entries(x.properties).forEach(([r,g])=>{g.default!==void 0&&(S[r]=g.default)}),o.updateNodeData(t.value.id,{...f,input_schema:x,extraConfig:B.extraConfig||null,arguments:{...S,modelId:B.id,modelName:B.name}})},_=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},c=e.computed(()=>{if(!t.value)return[];const V=t.value.data.input_schema||t.value.data.inputSchema;if(!V||!V.properties)return[];const B=V.required||[];return Object.entries(V.properties).map(([f,x])=>({key:f,type:x.type,label:x.title||x.label||x.description||f,description:x.description||"",default:x.default,required:B.includes(f)||x.required||!1,min:x.minimum!==void 0?x.minimum:x.min,max:x.maximum!==void 0?x.maximum:x.max,step:x.step,maxLength:x.maxLength,options:x.enum,optionLabels:x.enumLabels||x.enum,dependsOn:x.dependsOn,sort:x.sort,hidden:x["x-hidden"]||!1})).filter(f=>!f.hidden).sort((f,x)=>(f.sort??1/0)-(x.sort??1/0))}),N=V=>{if(t.value)return t.value.data.arguments?.[V]},l=(V,B)=>{if(!t.value)return;const x={...t.value.data.arguments||{},[V]:B};o.updateNodeData(t.value.id,{arguments:x})},O=V=>{if(!V.dependsOn||!t.value)return!0;const{field:B,value:f}=V.dependsOn,x=N(B);if(typeof f=="string"&&f.startsWith("!")){const S=f.substring(1);return x!==S}return Array.isArray(f)?f.includes(x):x===f},q=V=>{const B=N(V);return Array.isArray(B)?JSON.stringify(B):""},u=(V,B)=>{try{const f=JSON.parse(B);Array.isArray(f)&&l(V,f)}catch{}},R=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async V=>{if(!V||!t.value)return;D.value.length===0&&p();const B=t.value.data,f=B.input_schema||B.inputSchema,x=B.arguments?.modelId;if(x&&f&&f.properties&&Object.keys(f.properties).length>0||!x)return;const S=D.value.find(E=>E.id===x);if(!S)return;const r=S.inputSchema||S.input_schema||T.value?.inputSchema||{},g={};r.properties&&Object.entries(r.properties).forEach(([E,L])=>{L.default!==void 0&&(g[E]=L.default)});const m=t.value?.data;m&&o.updateNodeData(t.value.id,{...m,input_schema:r,extraConfig:S.extraConfig||null,arguments:{...g,...m.arguments}})},{immediate:!0}),(V,B)=>{const f=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),S=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),g=e.resolveComponent("el-form-item"),m=e.resolveComponent("el-form"),E=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tooltip"),P=e.resolveComponent("el-switch"),A=e.resolveComponent("el-input-number"),j=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ln,[B[1]||(B[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(f,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:R},null,8,["icon"]))]),e.createVNode(x),e.createElementVNode("div",On,[B[2]||(B[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(m,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(r,{modelValue:G.value,"onUpdate:modelValue":B[0]||(B[0]=H=>G.value=H),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:z.value,disabled:y.value,onChange:b,onClear:_},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,H=>(e.openBlock(),e.createBlock(S,{key:H.id,label:H.name,value:H.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})]),G.value&&c.value.length>0?(e.openBlock(),e.createElementBlock("div",In,[B[3]||(B[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(m,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,H=>e.withDirectives((e.openBlock(),e.createBlock(g,{key:H.key,required:H.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(H.label),1),H.description?(e.openBlock(),e.createBlock(L,{key:0,content:H.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(E,{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(r,{key:0,"model-value":N(H.key),disabled:y.value&&H.key!=="threshold",onChange:Y=>l(H.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(H.options,(Y,h)=>(e.openBlock(),e.createBlock(S,{key:Y,label:H.optionLabels?H.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):H.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":N(H.key),disabled:y.value&&H.key!=="threshold",onChange:Y=>l(H.key,Y)},null,8,["model-value","disabled","onChange"])):H.type==="number"||H.type==="integer"?(e.openBlock(),e.createBlock(A,{key:2,"model-value":N(H.key),disabled:y.value&&H.key!=="threshold",onChange:Y=>l(H.key,Y),min:H.min,max:H.max,step:H.step||(H.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):H.type==="array"&&!H.options?(e.openBlock(),e.createElementBlock("div",Rn,[e.createVNode(j,{"model-value":q(H.key),disabled:y.value&&H.key!=="threshold",onChange:Y=>u(H.key,Y),type:"textarea",rows:3,placeholder:H.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):H.type==="array"&&H.options?(e.openBlock(),e.createBlock(r,{key:4,"model-value":N(H.key),disabled:y.value&&H.key!=="threshold",onChange:Y=>l(H.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(H.options,(Y,h)=>(e.openBlock(),e.createBlock(S,{key:Y,label:H.optionLabels?H.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(j,{key:5,"model-value":N(H.key),disabled:y.value&&H.key!=="threshold",onInput:Y=>l(H.key,Y),maxlength:H.maxLength,"show-word-limit":!!H.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!H.dependsOn||O(H)]])),128))]),_:1})])):e.createCommentVNode("",!0),G.value&&z.value&&c.value.length===0?(e.openBlock(),e.createElementBlock("div",$n,[...B[4]||(B[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!G.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Fn,[...B[5]||(B[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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),C=e.computed(()=>(n?.value??n)?.ocr?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(G,p)=>{if(!t.value)return;const b=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...b,[G]:p}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,G=>{if(!G||!t.value)return;const p=C.value,b=t.value.data.arguments||{},_={};p?.properties&&Object.entries(p.properties).forEach(([c,N])=>{N.default!==void 0&&(_[c]=N.default)}),o.updateNodeData(t.value.id,{arguments:{..._,...b}})},{immediate:!0}),(G,p)=>{const b=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),N=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Gn,[p[1]||(p[1]=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:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Hn,[p[2]||(p[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:p[0]||(p[0]=O=>D("threshold",O)),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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),C=e.computed(()=>(n?.value??n)?.license_plate?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(G,p)=>{if(!t.value)return;const b=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...b,[G]:p}})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,G=>{if(!G||!t.value)return;const p=C.value,b=t.value.data.arguments||{},_={};p?.properties&&Object.entries(p.properties).forEach(([c,N])=>{N.default!==void 0&&(_[c]=N.default)}),o.updateNodeData(t.value.id,{arguments:{..._,...b}})},{immediate:!0}),(G,p)=>{const b=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),N=e.resolveComponent("el-form-item"),l=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[p[1]||(p[1]=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:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",zn,[p[2]||(p[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(l,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:p[0]||(p[0]=O=>D("threshold",O)),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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),C=e.computed(()=>(n?.value??n)?.face?.faceRepos??[]),T=e.ref(null),D=e.computed(()=>({repositoryId:b.value})),z={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},G=e.computed(()=>t.value?.data.arguments?.threshold??.5),p=N=>t.value?.data.arguments?.[N],b=e.computed(()=>{const N=p("repositoryId");return N?Array.isArray(N)?N:[N]:[]}),_=(N,l)=>{if(!t.value)return;const O=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...O,[N]:l}})},c=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,N=>{if(!N||!t.value)return;const O=(n?.value??n)?.face?.faceParams?.[0]?.inputSchema??null,q=t.value.data.arguments||{},u={};O?.properties&&Object.entries(O.properties).forEach(([R,V])=>{V.default!==void 0&&(u[R]=V.default)}),o.updateNodeData(t.value.id,{arguments:{...u,...q}})},{immediate:!0}),(N,l)=>{const O=e.resolveComponent("el-button"),q=e.resolveComponent("el-divider"),u=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-form-item"),V=e.resolveComponent("el-form"),B=e.resolveComponent("el-option"),f=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Wn,[l[2]||(l[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(O,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",Jn,[l[3]||(l[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(V,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(R,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":G.value,onChange:l[0]||(l[0]=x=>_("threshold",x)),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(V,{model:D.value,rules:z,ref_key:"faceFormRef",ref:T,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(R,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":b.value,onChange:l[1]||(l[1]=x=>_("repositoryId",x)),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(C.value,x=>(e.openBlock(),e.createBlock(B,{key:x.id,label:x.name,value:x.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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),{schemaLoading:n,fetchSchemaForNodeType:C}=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 N=c.required||[];return Object.entries(c.properties).map(([l,O])=>({key:l,type:O.type,label:O.title||O.label||O.description||l,description:O.description||"",default:O.default,required:N.includes(l)||O.required||!1,min:O.minimum!==void 0?O.minimum:O.min,max:O.maximum!==void 0?O.maximum:O.max,step:O.step,maxLength:O.maxLength,options:O.enum,optionLabels:O.enumLabels||O.enum,dependsOn:O.dependsOn,sort:O.sort})).sort((l,O)=>(l.sort??1/0)-(O.sort??1/0))}),D=c=>{if(t.value)return t.value.data.arguments?.[c]},z=(c,N)=>{if(!t.value)return;const O={...t.value.data.arguments||{},[c]:N};o.updateNodeData(t.value.id,{arguments:O})},G=c=>{if(!c.dependsOn||!t.value)return!0;const{field:N,value:l}=c.dependsOn,O=D(N);if(typeof l=="string"&&l.startsWith("!")){const q=l.substring(1);return O!==q}return Array.isArray(l)?l.includes(O):O===l},p=c=>{const N=D(c);return Array.isArray(N)?JSON.stringify(N):""},b=(c,N)=>{try{const l=JSON.parse(N);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 N=t.value.type,l=t.value.data,O=l.input_schema||l.inputSchema;if(O&&O.properties&&Object.keys(O.properties).length>0)return;const q=await C(N);if(!q)return;const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:q.inputSchema,extraConfig:q.extraConfig,arguments:{...q.arguments,...u.arguments}})},{immediate:!0}),(c,N)=>{const l=e.resolveComponent("el-button"),O=e.resolveComponent("el-divider"),q=e.resolveComponent("el-icon"),u=e.resolveComponent("el-tooltip"),R=e.resolveComponent("el-option"),V=e.resolveComponent("el-select"),B=e.resolveComponent("el-switch"),f=e.resolveComponent("el-input-number"),x=e.resolveComponent("el-input"),S=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Xn,[N[0]||(N[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.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(O),T.value.length>0?(e.openBlock(),e.createElementBlock("div",Qn,[N[1]||(N[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(T.value,g=>e.withDirectives((e.openBlock(),e.createBlock(S,{key:g.key,required:g.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(g.label),1),g.description?(e.openBlock(),e.createBlock(u,{key:0,content:g.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(()=>[g.options&&g.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":D(g.key),onChange:m=>z(g.key,m),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(m,E)=>(e.openBlock(),e.createBlock(R,{key:m,label:g.optionLabels?g.optionLabels[E]:m,value:m},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):g.type==="boolean"?(e.openBlock(),e.createBlock(B,{key:1,"model-value":D(g.key),onChange:m=>z(g.key,m)},null,8,["model-value","onChange"])):g.type==="number"||g.type==="integer"?(e.openBlock(),e.createBlock(f,{key:2,"model-value":D(g.key),onChange:m=>z(g.key,m),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",Kn,[e.createVNode(x,{"model-value":p(g.key),onChange:m=>b(g.key,m),type:"textarea",rows:3,placeholder:g.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):g.type==="array"&&g.options?(e.openBlock(),e.createBlock(V,{key:4,"model-value":D(g.key),onChange:m=>z(g.key,m),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(m,E)=>(e.openBlock(),e.createBlock(R,{key:m,label:g.optionLabels?g.optionLabels[E]:m,value:m},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(x,{key:5,"model-value":D(g.key),onInput:m=>z(g.key,m),maxlength:g.maxLength,"show-word-limit":!!g.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!g.dependsOn||G(g)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(n)&&T.value.length===0?(e.openBlock(),e.createElementBlock("div",Zn,[...N[2]||(N[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),d=e.inject("editorMode",ee.ALGORITHM),y=e.inject("taskModeConfig",null),n=e.computed(()=>d==="task"),C=e.computed(()=>l("deviceType")??"camera"),T=e.computed(()=>{const S=o.nodes.find(g=>g.type===k.START);return S?.data?.streamType?S.data.streamType:(y?.value??y)?.streamType??"image"}),D=e.computed(()=>{const S=y?.value??y,r=t.value?.id;return S?.datasource?.getDevices?.(r)?.length??0}),z=()=>{const S=y?.value??y,r=t.value?.id,g=t.value?.data?.label??"",m=S?.datasource?.getDevices?.(r)??[],E=o.nodes.filter(P=>P.type===k.DATA_SOURCE).findIndex(P=>P.id===r),L=t.value?.data?.sourceGroupId??S?.datasource?.getSourceGroupIdByIndex?.(E)??r;S?.datasource?.onDeviceClick?.(r,g,L,m,C.value)},{fetchSchemaForNodeType:G}=we(),p=e.computed(()=>o.nodes.some(S=>S.type===k.SMALL_MODEL)),b=e.computed(()=>o.getDataSourceCount()>=2),_=e.computed(()=>!o.supportPatrol()),c=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),N=e.computed(()=>{if(!t.value)return[];const S=t.value.data.input_schema||t.value.data.inputSchema;if(!S||!S.properties)return[];const r=S.required||[];return Object.entries(S.properties).map(([g,m])=>({key:g,type:m.type,label:m.title||m.label||m.description||g,description:m.description||"",default:m.default,required:r.includes(g)||m.required||!1,min:m.minimum!==void 0?m.minimum:m.min,max:m.maximum!==void 0?m.maximum:m.max,step:m.step,maxLength:m.maxLength,options:m.enum,optionLabels:m.enumLabels||m.enum,dependsOn:m.dependsOn}))}),l=S=>{if(t.value)return t.value.data.arguments?.[S]},O=e.computed(()=>!!l("enableImageSequence")),q=e.computed(()=>!!l("needCooperativeDetection")),u=(S,r)=>{if(!t.value)return;const m={...t.value.data.arguments||{},[S]:r};o.updateNodeData(t.value.id,{arguments:m})},R=async S=>{if(!t.value)return;if(o.edges.some(g=>g.source===t.value.id))try{await Z.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(m=>m.source===t.value.id).forEach(m=>{o.removeEdge(m.id)}),S&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:S}),u("enableImageSequence",S),S&&o.initializeSubsequentFrames(t.value.id)}catch{return}else S&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:S}),u("enableImageSequence",S),S&&o.initializeSubsequentFrames(t.value.id)},V=S=>{t.value&&(S&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),u("enableImageSequence",!1),u("enablePatrol",!1)),u("needCooperativeDetection",S))};e.watch(T,S=>{S==="stream"&&t.value&&l("deviceType")==="1400"&&u("deviceType","camera")},{immediate:!0});const B=e.computed(()=>n.value&&C.value==="camera"&&T.value!=="stream"&&o.supportPatrol());e.watch(B,S=>{!S&&t.value&&l("enablePatrol")&&u("enablePatrol",!1)}),e.watch(D,S=>{S>0&&l("enablePatrol")&&(l("patrolGroupSize")??1)>S&&u("patrolGroupSize",S)});const f=S=>{if(!S.dependsOn||!t.value)return!0;const{field:r,value:g}=S.dependsOn,m=l(r);if(typeof g=="string"&&g.startsWith("!")){const E=g.substring(1);return m!==E}return Array.isArray(g)?g.includes(m):m===g},x=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async S=>{if(!S||!t.value)return;const r=t.value.type,g=t.value.data;if(r==="dataSource"&&n.value){const P=g.arguments||{},A={},j=o.nodes.some(H=>H.type===k.SMALL_MODEL);P.mode===void 0&&(A.mode=j?3:0),P.interval===void 0&&(A.interval=30),T.value==="stream"&&P.sw_decoding===void 0&&(A.sw_decoding="CPU"),Object.keys(A).length>0&&o.updateNodeData(S,{arguments:{...P,...A}})}const m=g.input_schema||g.inputSchema;if(r==="dataSource"&&m&&m.properties&&!m.properties.windowSeconds){m.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},g.arguments.windowSeconds||o.updateNodeData(t.value.id,{...g,input_schema:m,arguments:{...g.arguments,windowSeconds:5}});return}if(m&&m.properties&&Object.keys(m.properties).length>0)return;const E=await G(r);if(!E)return;const L=t.value?.data;L&&o.updateNodeData(t.value.id,{...L,input_schema:E.inputSchema,extraConfig:E.extraConfig,arguments:{...E.arguments,...L.arguments}})},{immediate:!0}),(S,r)=>{const g=e.resolveComponent("el-button"),m=e.resolveComponent("el-divider"),E=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tooltip"),P=e.resolveComponent("el-option"),A=e.resolveComponent("el-select"),j=e.resolveComponent("el-switch"),H=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),h=e.resolveComponent("el-form-item"),M=e.resolveComponent("el-form"),$=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)),n.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:x},null,8,["icon"]))]),e.createVNode(m),e.createElementVNode("div",ta,[r[12]||(r[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.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(L,{key:0,content:s.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(E,{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(A,{key:0,"model-value":l(s.key),onChange:i=>u(s.key,i),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.options,(i,w)=>(e.openBlock(),e.createBlock(P,{key:i,label:s.optionLabels?s.optionLabels[w]:i,value:i},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):s.type==="boolean"?(e.openBlock(),e.createBlock(L,{key:1,content:n.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":s.key==="needCooperativeDetection"&&O.value?"已开启图片时序,无法同时开启协同检测":s.key==="enableImageSequence"&&q.value?"已开启协同检测,无法同时开启图片时序":s.key==="enableImageSequence"&&b.value?"多数据源场景下不允许开启图片时序":"",disabled:!(n.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence"))&&!(s.key==="needCooperativeDetection"&&O.value)&&!(s.key==="enableImageSequence"&&q.value)&&!(s.key==="enableImageSequence"&&b.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":l(s.key),disabled:n.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")||s.key==="needCooperativeDetection"&&O.value||s.key==="enableImageSequence"&&q.value||s.key==="enableImageSequence"&&b.value,onChange:i=>s.key==="enableImageSequence"?R(i):s.key==="needCooperativeDetection"?V(i):u(s.key,i)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):s.type==="number"||s.type==="integer"?(e.openBlock(),e.createBlock(H,{key:2,"model-value":l(s.key),onChange:i=>u(s.key,i),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":l(s.key),onInput:i=>u(s.key,i),maxlength:s.maxLength,"show-word-limit":!!s.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!s.dependsOn||f(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(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":t.value?.data.branchLogic||"and",disabled:n.value,onChange:r[0]||(r[0]=s=>e.unref(o).updateNodeData(t.value.id,{branchLogic:s})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(P,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(P,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),n.value?(e.openBlock(),e.createElementBlock("div",na,[r[16]||(r[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("deviceType")??"camera",onChange:r[1]||(r[1]=s=>u("deviceType",s))},{default:e.withCtx(()=>[e.createVNode($,{value:"camera"},{default:e.withCtx(()=>[...r[14]||(r[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode($,{value:"1400",disabled:T.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":`已选 ${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),n.value&&C.value==="1400"?(e.openBlock(),e.createElementBlock("div",la,[r[19]||(r[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":l("detectionMode")??"platform",onChange:r[2]||(r[2]=s=>u("detectionMode",s))},{default:e.withCtx(()=>[e.createVNode($,{value:"platform"},{default:e.withCtx(()=>[...r[17]||(r[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode($,{value:"device"},{default:e.withCtx(()=>[...r[18]||(r[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&C.value==="camera"&&T.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ra,[r[21]||(r[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(L,{disabled:!_.value,content:c.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":_.value?!1:l("enablePatrol"),disabled:_.value,onChange:r[3]||(r[3]=s=>u("enablePatrol",s))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),l("enablePatrol")?(e.openBlock(),e.createBlock(h,{key:0},{label:e.withCtx(()=>[r[20]||(r[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(L,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(E,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(H,{"model-value":l("patrolGroupSize")??1,onChange:r[4]||(r[4]=s=>u("patrolGroupSize",s)),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),n.value&&C.value==="camera"?(e.openBlock(),e.createElementBlock("div",sa,[r[22]||(r[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"抽帧策略"},{default:e.withCtx(()=>[T.value==="image"?(e.openBlock(),e.createBlock(A,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:"按时间间隔抽帧",value:0})]),_:1})):p.value?(e.openBlock(),e.createBlock(A,{key:1,"model-value":l("mode")??3,onChange:r[5]||(r[5]=s=>{u("mode",s),s===1&&u("interval",p.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:"每一帧都检测",value:3}),e.createVNode(P,{label:"跳帧检测",value:1}),e.createVNode(P,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(A,{key:2,"model-value":l("mode")??0,onChange:r[6]||(r[6]=s=>{u("mode",s),s===0&&u("interval",30),s===1&&u("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:"按时间间隔抽帧",value:0}),e.createVNode(P,{label:"跳帧检测",value:1}),e.createVNode(P,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),T.value==="image"||T.value==="stream"&&(l("mode")??0)===0?(e.openBlock(),e.createBlock(h,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(H,{"model-value":l("interval")??30,onChange:r[7]||(r[7]=s=>u("interval",s)),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(h,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[p.value?(e.openBlock(),e.createBlock(H,{key:0,"model-value":l("interval")??5,onChange:r[8]||(r[8]=s=>u("interval",s)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(A,{key:1,"model-value":l("interval")??25,onChange:r[9]||(r[9]=s=>u("interval",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:25,value:25}),e.createVNode(P,{label:50,value:50}),e.createVNode(P,{label:75,value:75}),e.createVNode(P,{label:125,value:125}),e.createVNode(P,{label:250,value:250}),e.createVNode(P,{label:375,value:375}),e.createVNode(P,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),T.value==="stream"?(e.openBlock(),e.createBlock(h,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":l("sw_decoding")??"CPU",onChange:r[10]||(r[10]=s=>u("sw_decoding",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(P,{label:"GPU",value:"GPU"}),e.createVNode(P,{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),d=e.ref(null),y=e.ref(""),n=async(_=!1)=>{if(a){o.value=a;return}},C=async()=>{o.value=[],await n(!0)},T=_=>o.value.find(c=>c.id===_||c.title===_),D=_=>{const c=T(_);if(!c)return{};const N=c.inputSchema||c.input_schema;if(!N||!N.properties)return{};const l={};return Object.entries(N.properties).forEach(([O,q])=>{q.default!==void 0&&(l[O]=q.default)}),l},z=_=>{const c=T(_);if(!c)return[];const N=c.inputSchema||c.input_schema;if(!N||!N.properties)return[];const l=N.required||[];return Object.entries(N.properties).map(([O,q])=>({key:O,type:q.type,label:q.title||q.description||O,description:q.description||"",default:q.default,required:l.includes(O)||q.required||!1,min:q.minimum,max:q.maximum,step:q.step,options:q.enum,optionLabels:q.enumLabels||q.enum,dependsOn:q.dependsOn}))},G=e.computed(()=>{if(!y.value)return o.value;const _=y.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(_)||p(c.type).toLowerCase().includes(_))}),p=_=>ca[_]||_;return{models:o,loading:t,error:d,searchKeyword:y,filteredModels:G,loadSmallModels:n,reloadSmallModels:C,getModelConfig:T,getTypeLabel:p,getDefaultArguments:D,getSchemaFields:z,validateArguments:(_,c)=>{const N=T(_);if(!N)return{valid:!1,errors:["模型不存在"]};const l=[],O=N.inputSchema||N.input_schema;return!O||!O.properties?{valid:!0,errors:[]}:(Object.entries(O.properties).forEach(([q,u])=>{const R=c[q];if(u.required&&(R==null||R==="")){l.push(`${u.title||q} 为必填项`);return}if(R!=null&&(u.type==="number"||u.type==="integer")){if(typeof R!="number"){l.push(`${u.title||q} 必须是数字`);return}u.minimum!==void 0&&R<u.minimum&&l.push(`${u.title||q} 不能小于 ${u.minimum}`),u.maximum!==void 0&&R>u.maximum&&l.push(`${u.title||q} 不能大于 ${u.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(a,{emit:o}){const t=a,d=o,{loading:y,error:n,searchKeyword:C,filteredModels:T,loadSmallModels:D,reloadSmallModels:z,getTypeLabel:G}=Je(t.externalModels),p=c=>{d("update:modelValue",c.id),d("select",c)},b=()=>{z()},_=c=>({safety:"warning",security:"danger",traffic:"info"})[c]||"info";return e.onMounted(()=>{t.externalModels||D()}),(c,N)=>{const l=e.resolveComponent("el-input"),O=e.resolveComponent("el-icon"),q=e.resolveComponent("el-button"),u=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",da,[e.createVNode(l,{modelValue:e.unref(C),"onUpdate:modelValue":N[0]||(N[0]=R=>e.isRef(C)?C.value=R: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(O,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),N[2]||(N[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(n)?(e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(O,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(n)),1),e.createVNode(q,{type:"primary",onClick:b},{default:e.withCtx(()=>[...N[3]||(N[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),R=>(e.openBlock(),e.createElementBlock("div",{key:R.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===R.id}]),onClick:V=>p(R)},[e.createElementVNode("div",ga,[e.createElementVNode("div",ha,[e.createVNode(O,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(R.name),1)]),e.createVNode(u,{type:_(R.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(G)(R.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ya,e.toDisplayString(R.description),1),e.createElementVNode("div",_a,[R.supportDirectAlert?(e.openBlock(),e.createBlock(u,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...N[4]||(N[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,fa))),128))])):(e.openBlock(),e.createElementBlock("div",Na,[e.createVNode(O,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),N[6]||(N[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(q,{text:"",onClick:N[1]||(N[1]=R=>C.value="")},{default:e.withCtx(()=>[...N[5]||(N[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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=e.inject("editorConfig",null),C=e.computed(()=>(n?.value??n)?.smallModels??null),{models:T}=Je(C.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),z={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},G=e.computed(()=>{if(!t.value)return[];const V=t.value.data.input_schema||t.value.data.inputSchema;if(!V||!V.properties)return[];const B=V.required||[],f=t.value.data.title||"";return Object.entries(V.properties).filter(([x])=>D.has(x)).map(([x,S])=>{const r={key:x,type:S.type,label:S.title||S.label||S.description||x,description:S.description||"",default:S.default,required:B.includes(x)||S.required||!1,min:S.minimum!==void 0?S.minimum:S.min,max:S.maximum!==void 0?S.maximum:S.max,step:S.step,maxLength:S.maxLength,options:S.enum,optionLabels:S.enumLabels||S.enum,dependsOn:S.dependsOn,sort:S.sort};return x==="interval"&&(r.label="告警间隔(秒)",r.description=z[f]||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),x==="threshold"&&(r.label="小模型阈值",r.step=.01,r.precision=2),x==="targetWidth"&&(r.label="最小目标宽度",r.default=60,r.min=20,r.max=1920,r.step=1,r.precision=0),x==="targetHeight"&&(r.label="最小目标高度",r.default=60,r.min=20,r.max=1080,r.step=1,r.precision=0),x==="topScale"&&(r.label="调整目标框高度比例 (上)",r.max=10,r.step=.1,r.precision=1),x==="bottomScale"&&(r.label="调整目标框高度比例 (下)",r.max=10,r.step=.1,r.precision=1),x==="leftScale"&&(r.label="调整目标框宽度比例 (左)",r.max=10,r.step=.1,r.precision=1),x==="rightScale"&&(r.label="调整目标框宽度比例 (右)",r.max=10,r.step=.1,r.precision=1),x==="x_ratio"&&(r.label="X轴位置信息",r.step=.01,r.precision=2),x==="y_ratio"&&(r.label="Y轴位置信息",r.step=.01,r.precision=2),x==="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),x==="overloadNumber"&&(r.precision=0),x==="targetNumber"&&(r.precision=0),r}).filter(x=>!["areas","darwin","direction","lines"].includes(x.key)).filter(x=>!(x.key==="targetDuration"&&f==="NonMotorCounter")).sort((x,S)=>(x.sort??1/0)-(S.sort??1/0))}),p=["interval","targetDuration"],b=V=>{if(!t.value)return;const B=t.value.data.arguments?.[V];return p.includes(V)&&B!=null?B/1e3:B},_=(V,B)=>{if(!t.value)return;let f=B;p.includes(V)&&B!=null&&(f=B*1e3);const S={...t.value.data.arguments||{},[V]:f};o.updateNodeData(t.value.id,{arguments:S})},c=V=>{if(!V.dependsOn||!t.value)return!0;const{field:B,value:f}=V.dependsOn,x=b(B);if(typeof f=="string"&&f.startsWith("!")){const S=f.substring(1);return x!==S}return Array.isArray(f)?f.includes(x):x===f},N=V=>{const B=b(V);return Array.isArray(B)?JSON.stringify(B):""},l=(V,B)=>{try{const f=JSON.parse(B);Array.isArray(f)&&_(V,f)}catch{}},O=async V=>{if(!t.value)return;const B=V.inputSchema||V.input_schema||{},f={};B.properties&&Object.entries(B.properties).forEach(([x,S])=>{S.default!==void 0&&(f[x]=S.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:V.id||V.title,title:V.title,modelName:V.name,modelType:V.type,input_schema:B,extraConfig:V.extraConfig,supportDirectAlert:V.supportDirectAlert||!1,arguments:f})},q=()=>{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(()=>{})},u=()=>t.value?.data.modelId?T.value.find(B=>B.id===t.value.data.modelId)?.description||"暂无描述":"",R=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(V,B)=>{const f=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),S=e.resolveComponent("el-icon"),r=e.resolveComponent("el-tag"),g=e.resolveComponent("el-tooltip"),m=e.resolveComponent("el-option"),E=e.resolveComponent("el-select"),L=e.resolveComponent("el-switch"),P=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),j=e.resolveComponent("el-text"),H=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ba,[B[0]||(B[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(f,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:R},null,8,["icon"]))]),e.createVNode(x),e.createElementVNode("div",xa,[B[3]||(B[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":C.value,onSelect:O},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(S,{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(f,{key:0,type:"text",text:"",size:"small",onClick:q},{default:e.withCtx(()=>[...B[1]||(B[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Va,e.toDisplayString(u()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(r,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...B[2]||(B[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ba,[B[4]||(B[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(G.value,h=>e.withDirectives((e.openBlock(),e.createBlock(H,{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(g,{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(S,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):h.description?(e.openBlock(),e.createBlock(g,{key:1,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(S,{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(E,{key:0,"model-value":b(h.key),onChange:M=>_(h.key,M),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(M,$)=>(e.openBlock(),e.createBlock(m,{key:M,label:h.optionLabels?h.optionLabels[$]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(L,{key:1,"model-value":b(h.key),onChange:M=>_(h.key,M)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"||h.type==="float"?(e.openBlock(),e.createBlock(P,{key:2,"model-value":b(h.key),onChange:M=>_(h.key,M),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(A,{"model-value":N(h.key),onChange:M=>l(h.key,M),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(j,{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(E,{key:4,"model-value":b(h.key),onChange:M=>_(h.key,M),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(M,$)=>(e.openBlock(),e.createBlock(m,{key:M,label:h.optionLabels?h.optionLabels[$]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":b(h.key),onInput:M=>_(h.key,M)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||c(h)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Oa=(a=null)=>{const o=ae(),t=e.ref(a?a.map(p=>Ee.backendToFrontend(p)):[]),d=e.ref(!1),y=e.ref(null),n=async(p=!1)=>{if(a){t.value=a.map(b=>Ee.backendToFrontend(b));return}},C=p=>t.value.find(b=>b.title===p)||null,T=p=>{const b=C(p);return b?{targetId:b.title,targetName:b.label,threshold:b.data.threshold||.5,targetWidth:b.data.targetWidth||20,targetHeight:b.data.targetHeight||20,postmodel:b.data.postmodel||"ClipVit",areas:b.data.areas||[],expandRect:b.data.expandRect!==void 0?b.data.expandRect:!1,topScale:b.data.topScale||1.6,bottomScale:b.data.bottomScale||1.6,leftScale:b.data.leftScale||1.6,rightScale:b.data.rightScale||1.6,enableStructure:b.data.enableStructure}:{}},D=(p=null)=>o.nodes.filter(b=>b.type==="detectionTarget"&&b.id!==p).map(b=>({value:b.id,label:b.data.targetName||b.data.label})),z=(p=null)=>{const b=[{value:"original",label:"原图"}],_=D(p);return[...b,..._]},G=e.computed(()=>t.value.map(p=>({value:p.title,label:p.label,...p})));return{detectionTargets:t,loading:d,error:y,loadDetectionTargets:n,getTargetById:C,getDefaultConfig:T,getDetectionTargetNodes:D,getDetectionScopeOptions:z,getTargetOptions:G}},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=(G,p)=>{let b;return(..._)=>{clearTimeout(b),b=setTimeout(()=>G(..._),p)}},d=a,y=o,n=e.ref([]),C=()=>{const G=d.primaryValue||[],p=d.pairedValue||[],b=Math.max(G.length,p.length,1);n.value=Array.from({length:b},(_,c)=>({primary:G[c]||"",paired:p[c]!==void 0?p[c]:d.pairedField.default?.[0]||.5}))};e.watch(()=>[d.primaryValue,d.pairedValue],()=>{C()},{immediate:!0,deep:!0});const T=t((G,p)=>{y("update",G,p)},300);e.watch(n,G=>{const p=G.map(_=>_.primary),b=G.map(_=>_.paired);T(p,b)},{deep:!0});const D=()=>{n.value.length>=10||n.value.push({primary:"",paired:d.pairedField.default?.[0]||.5})},z=G=>{n.value.length>1&&n.value.splice(G,1)};return(G,p)=>{const b=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(n.value,(N,l)=>(e.openBlock(),e.createElementBlock("div",{key:l,class:"input-row"},[e.createVNode(b,{modelValue:n.value[l].primary,"onUpdate:modelValue":O=>n.value[l].primary=O,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!n.value[l].primary||n.value[l].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(_,{modelValue:n.value[l].paired,"onUpdate:modelValue":O=>n.value[l].paired=O,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(c,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:n.value.length===1,onClick:O=>z(l)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(c,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:n.value.length>=10,onClick:D},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(a.primaryField.label)+e.toDisplayString(n.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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d==="task"),n=e.inject("taskModeConfig",null),C=e.inject("echoAlgodata",null),T=e.inject("echoTaskData",null),D=e.computed(()=>{if(!t.value)return null;const h=new Set,M=[t.value.id];for(;M.length;){const $=M.shift();if(h.has($))continue;h.add($);const W=o.edges.filter(s=>s.target===$);for(const s of W){const i=o.nodes.find(w=>w.id===s.source);if(i){if(i.type==="dataSource")return i.id;M.push(i.id)}}}return null}),z=e.computed(()=>{const h=D.value;return h?(n?.value??n)?.datasource?.getDevices?.(h)??[]:[]}),G=e.computed(()=>y.value&&z.value.length>0),p=e.ref(""),b=e.ref(""),_=e.computed(()=>{const h=b.value.trim().toLowerCase();return h?z.value.filter(M=>(M.sourceName??M.name??String(M.sourceId??M.id??M)).toLowerCase().includes(h)):z.value}),c=e.computed(()=>{const h={},M=D.value,$=t.value?.id;if(!M||!$)return h;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const s of z.value){const i=String(s.sourceId??s.id??s),w=o.getTaskSourceArguments(M,i,$);if(w===null){h[i]=!1;continue}const F=new Set([...Object.keys(w),...Object.keys(W)]);let U=!1;for(const J of F)if(JSON.stringify(w[J])!==JSON.stringify(W[J])){U=!0;break}h[i]=U}return h});e.watch([z,()=>t.value?.data?.arguments?.configMode],([h])=>{h.length>0?p.value=String(h[0]?.sourceId??h[0]?.id??h[0]):p.value=""},{immediate:!0});const N=(h,M=null)=>{if(M){const i=((T?.value??T)?.graph?.sources??[]).find(w=>String(w.sourceId)===String(M));if(i?.branches)for(const w of i.branches){const F=w.nodes?.find(U=>U.toolTitle===h);if(F?.arguments)return{...F.arguments}}return null}const $=C?.value??C;if(!$?.branches)return null;for(const W of $.branches){const s=W.nodes?.find(i=>i.toolTitle===h);if(s?.arguments)return{...s.arguments}}return null},l=h=>{const M=D.value,$=t.value?.id;if(!M||!$||!h||o.getTaskSourceArguments(M,h,$)!==null)return;const W=t.value?.data?.targetId,s=W?N(W,h):null,i=t.value?.data?.arguments??{},w={...s??i};delete w.configMode,o.setTaskSourceArguments(M,h,$,w)};e.watch(p,h=>{h&&t.value?.data?.arguments?.configMode==="perDevice"&&l(h)}),e.watch(()=>t.value?.data?.arguments?.configMode,h=>{h==="perDevice"&&p.value&&l(p.value)});const O=e.inject("editorConfig",null),q=e.computed(()=>(O?.value??O)?.detection??null),{detectionTargets:u,loading:R}=Oa(q.value),V=e.computed(()=>{if(!t.value)return[];const h=t.value.data.input_schema||t.value.data.inputSchema;if(!h||!h.properties)return[];const M=h.required||[];return Object.entries(h.properties).map(([$,W])=>({key:$,type:W.type,label:W.title||W.label||W.description||$,description:W.description||"",default:W.default,required:M.includes($)||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(($,W)=>($.sort??1/0)-(W.sort??1/0))}),B=h=>h.type==="array"&&h["x-component"]==="paired-array"&&h["x-paired-with"],f=h=>{const M=h["x-paired-with"];return V.value.find($=>$.key===M)},x={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}},S=new Set(Object.keys(x)),r=e.computed(()=>{const h=t.value?.data.targetId,M=new Set;return V.value.forEach($=>{$["x-paired-with"]&&M.add($["x-paired-with"])}),V.value.filter($=>h==="traffic_accident"?$.key==="threshold":S.has($.key)&&!M.has($.key)&&!B($)).map($=>{const W=x[$.key]||{};return{...$,label:W.label||$.label,description:W.description||$.description,min:W.min??$.min,max:W.max??$.max,step:W.step??$.step,precision:W.precision,default:W.default??$.default}})}),g=e.computed(()=>V.value.filter(h=>B(h))),m=h=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const $=D.value,W=o.getTaskSourceArguments($,p.value,t.value.id);if(W!==null)return W[h]}return t.value.data.arguments?.[h]},E=(h,M)=>{if(!t.value)return;const $=t.value.data.arguments?.configMode;if(h!=="configMode"&&$==="perDevice"&&p.value){const i=D.value;o.updateTaskSourceArgument(i,p.value,t.value.id,h,M);return}const s={...t.value.data.arguments||{},[h]:M};o.updateNodeData(t.value.id,{arguments:s})},L=h=>{if(!h.dependsOn||!t.value)return!0;const{field:M,value:$}=h.dependsOn,W=m(M);if(typeof $=="string"&&$.startsWith("!")){const s=$.substring(1);return W!==s}return Array.isArray($)?$.includes(W):W===$},P=h=>{const M=m(h);return Array.isArray(M)?JSON.stringify(M):""},A=(h,M)=>{try{const $=JSON.parse(M);Array.isArray($)&&E(h,$)}catch{}},j=(h,M,$,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const F=D.value;o.updateTaskSourceArgument(F,p.value,t.value.id,h,M),o.updateTaskSourceArgument(F,p.value,t.value.id,$,W);return}const w={...t.value.data.arguments||{},[h]:M,[$]:W};o.updateNodeData(t.value.id,{arguments:w})},H=async h=>{if(!t.value||!h)return;const M=u.value.find(w=>w.title===h);if(!M)return;let $=M.inputSchema||M.input_schema||{};if(h==="other"){const w={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}}};$={...$,properties:{...$.properties,...w.properties}}}const W={};$.properties&&Object.entries($.properties).forEach(([w,F])=>{F.default!==void 0&&(W[w]=F.default)});const s=t.value.data,i={...W,target_class:M.title};o.updateNodeData(t.value.id,{...s,targetId:M.title,targetName:M.label,label:M.label,input_schema:$,inputSchema:$,extraConfig:M.extraConfig,arguments:i})},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 M=u.value.find(s=>s.title===h);if(!M)return;const $=t.value.data;if($.input_schema&&Object.keys($.input_schema).length>0)return;const W={...M.defaultArguments,...$.arguments,target_class:M.title};o.updateNodeData(t.value.id,{...$,input_schema:M.inputSchema,arguments:W})}),(h,M)=>{const $=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),s=e.resolveComponent("el-option"),i=e.resolveComponent("el-select"),w=e.resolveComponent("el-form-item"),F=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,[M[2]||(M[2]=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:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",Ra,[M[3]||(M[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:H,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(R),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(u),I=>(e.openBlock(),e.createBlock(s,{key:I.title,label:I.label,value:I.title},{default:e.withCtx(()=>[e.createElementVNode("div",$a,[e.createElementVNode("span",null,e.toDisplayString(I.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),G.value?(e.openBlock(),e.createElementBlock("div",Fa,[M[6]||(M[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:M[0]||(M[0]=I=>E("configMode",I))},{default:e.withCtx(()=>[e.createVNode(U,{value:"unified"},{default:e.withCtx(()=>[...M[4]||(M[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(U,{value:"perDevice"},{default:e.withCtx(()=>[...M[5]||(M[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),g.value.length>0?(e.openBlock(),e.createElementBlock("div",qa,[M[7]||(M[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value,I=>(e.openBlock(),e.createBlock(w,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.description?(e.openBlock(),e.createBlock(te,{key:0,content:I.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":I,"paired-field":f(I),"primary-value":m(I.key),"paired-value":m(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["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,[M[9]||(M[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:b.value,"onUpdate:modelValue":M[1]||(M[1]=I=>b.value=I),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,I=>(e.openBlock(),e.createElementBlock("div",{key:String(I.sourceId??I.id??I),class:e.normalizeClass(["device-list-item",{"is-active":p.value===String(I.sourceId??I.id??I),"has-custom":c.value[String(I.sourceId??I.id??I)]}]),onClick:K=>p.value=String(I.sourceId??I.id??I)},[e.createElementVNode("span",ja,e.toDisplayString(I.sourceName??I.name??String(I.sourceId??I.id??I)),1),c.value[String(I.sourceId??I.id??I)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...M[8]||(M[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)]),p.value?(e.openBlock(),e.createBlock(F,{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,I=>e.withDirectives((e.openBlock(),e.createBlock(w,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.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})):I.description?(e.openBlock(),e.createBlock(te,{key:1,content:I.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(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(i,{key:0,"model-value":m(I.key),onChange:K=>E(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":m(I.key),onChange:K=>E(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":m(I.key),onChange:K=>E(I.key,K),min:I.min,max:I.max,step:I.step||(I.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):B(I)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":I,"paired-field":f(I),"primary-value":m(I.key),"paired-value":m(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Ua,[e.createVNode(se,{"model-value":P(I.key),onChange:K=>A(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(i,{key:5,"model-value":m(I.key),onChange:K=>E(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":m(I.key),onInput:K=>E(I.key,K),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||L(I)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(F,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,I=>e.withDirectives((e.openBlock(),e.createBlock(w,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.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})):I.description?(e.openBlock(),e.createBlock(te,{key:1,content:I.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(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(i,{key:0,"model-value":m(I.key),onChange:K=>E(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":m(I.key),onChange:K=>E(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":m(I.key),onChange:K=>E(I.key,K),min:I.min,max:I.max,step:I.step||(I.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):B(I)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":I,"paired-field":f(I),"primary-value":m(I.key),"paired-value":m(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Wa,[e.createVNode(se,{"model-value":P(I.key),onChange:K=>A(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(i,{key:5,"model-value":m(I.key),onChange:K=>E(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":m(I.key),onInput:K=>E(I.key,K),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||L(I)]])),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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=G=>{if(!t.value)return;const p={...t.value.data.arguments,conditionRelation:G};o.updateNodeData(t.value.id,{arguments:p})},C=()=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],b={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:b})},T=(G,p,b)=>{if(!t.value)return;const _=[...t.value.data.arguments?.alertConditions||[]];_[G]={..._[G],[p]:b};const c={...t.value.data.arguments,alertConditions:_};o.updateNodeData(t.value.id,{arguments:c})},D=G=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[]];p.splice(G,1);const b={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:b})},z=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(G,p)=>{const b=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),c=e.resolveComponent("el-text"),N=e.resolveComponent("el-option"),l=e.resolveComponent("el-select"),O=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-radio"),u=e.resolveComponent("el-radio-group"),R=e.resolveComponent("el-form-item"),V=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ya,[p[1]||(p[1]=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:z},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Xa,[p[9]||(p[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(V,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(R,null,{label:e.withCtx(()=>[p[3]||(p[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(c,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(c,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...p[4]||(p[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(B,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(l,{"model-value":B.operator,onChange:x=>T(f,"operator",x),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(N,{label:"等于 =",value:"="}),e.createVNode(N,{label:"大于 >",value:">"}),e.createVNode(N,{label:"小于 <",value:"<"}),e.createVNode(N,{label:"大于等于 ≥",value:">="}),e.createVNode(N,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(O,{"model-value":B.value,onChange:x=>T(f,"value",x),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(b,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:x=>D(f)},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(()=>[...p[5]||(p[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(u,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:p[0]||(p[0]=B=>n(B))},{default:e.withCtx(()=>[e.createVNode(q,{value:"OR"},{default:e.withCtx(()=>[...p[6]||(p[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(q,{value:"AND"},{default:e.withCtx(()=>[...p[7]||(p[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(b,{type:"text",link:"",icon:e.unref(X.Plus),onClick:C},{default:e.withCtx(()=>[...p[8]||(p[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),d=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>d===ee.TASK),n=N=>{if(!t.value)return;const l={...t.value.data.arguments,duration:N};o.updateNodeData(t.value.id,{arguments:l})},C=N=>{if(!t.value)return;const l={...t.value.data.arguments,similarity_enabled:N};o.updateNodeData(t.value.id,{arguments:l})},T=N=>{if(!t.value)return;const l={...t.value.data.arguments,similarity_threshold:N};o.updateNodeData(t.value.id,{arguments:l})},D=N=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_enabled:N};o.updateNodeData(t.value.id,{arguments:l})},z=N=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_operator:N};o.updateNodeData(t.value.id,{arguments:l})},G=N=>{if(!t.value)return;const l={...t.value.data.arguments,hit_rate_threshold:N};o.updateNodeData(t.value.id,{arguments:l})},p=N=>{if(!t.value)return;const l=t.value.data.arguments?.overlap_detection||{},O={...t.value.data.arguments,overlap_detection:{operator:l.operator??"gt",threshold:l.threshold??90,...l,enabled:N}};o.updateNodeData(t.value.id,{arguments:O})},b=N=>{if(!t.value)return;const l={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:N}};o.updateNodeData(t.value.id,{arguments:l})},_=N=>{if(!t.value)return;const l={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:N}};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(N,l)=>{const O=e.resolveComponent("el-button"),q=e.resolveComponent("el-divider"),u=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-text"),V=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-switch"),f=e.resolveComponent("el-icon"),x=e.resolveComponent("el-tooltip"),S=e.resolveComponent("el-slider"),r=e.resolveComponent("el-option"),g=e.resolveComponent("el-select"),m=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Za,[l[9]||(l[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(O,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",va,[l[13]||(l[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(m,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":t.value?.data.arguments?.duration??30,onChange:l[0]||(l[0]=E=>n(E)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(R,{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(V,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(B,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:l[1]||(l[1]=E=>C(E))},null,8,["model-value"]),e.createVNode(x,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(f,{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(V,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(S,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:l[2]||(l[2]=E=>T(E)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(R,{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(V,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(B,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:l[3]||(l[3]=E=>D(E))},null,8,["model-value"]),e.createVNode(x,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(f,{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(V,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:l[4]||(l[4]=E=>z(E)),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(V,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:l[5]||(l[5]=E=>G(E)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(R,{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(V,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(B,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:l[6]||(l[6]=E=>p(E))},null,8,["model-value"]),e.createVNode(x,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(f,{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(V,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:l[7]||(l[7]=E=>b(E)),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(V,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:l[8]||(l[8]=E=>_(E)),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},d=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(T=>T.id===y.source)?.data?.enableBranch&&t.edge||null;const n=o.selectedNode;return n&&t[n.type]||null});return(y,n)=>(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: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,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));const y=e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig);e.provide("editorConfig",y),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const n=ae(d),{copyToClipboard:C,downloadJSON:T,exportToJSON:D}=_t(t.mode,n,y),{runValidation:z}=Ct(t.mode,n,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{at(d)});const G=e.computed(()=>{if(n.selectedNodeId)return!0;const b=n.selectedEdge;return b?!!n.nodes.find(c=>c.id===b.source)?.data?.enableBranch:!1});return o({reset:()=>{n.resetWorkflow()},runTest:z,copyJSON:C,exportJSON:D}),(b,_)=>(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(()=>[G.value?(e.openBlock(),e.createBlock(rl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ye=oe(cl,[["__scopeId","data-v-adb6277c"]]),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"}})}));