aiflowui 1.0.14 → 1.0.15
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.
- package/dist-lib/aiflowui.es.js +2040 -2107
- package/dist-lib/aiflowui.umd.js +1 -1
- package/dist-lib/style.css +1 -1
- package/package.json +1 -1
package/dist-lib/aiflowui.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(se,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):(se=typeof globalThis<"u"?globalThis:se||self,e(se.AIFlowUI={},se.Vue,se.ElementPlusIconsVue,se.ElementPlus,se.Pinia,se.VueFlowCore,se.VueFlowBackground,se.VueFlowControls,se.VueFlowNodeResizer))})(this,(function(se,e,K,v,et,ee,tt,ot,nt){"use strict";const C={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"},at={[C.DETECTION_TARGET]:"检测目标",[C.CLASSIFICATION_MODEL]:"分类模型",[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时",[C.FACE_RECOGNITION]:"人脸识别",[C.SMALL_MODEL]:"小模型"},lt={cls:C.CLASSIFICATION_MODEL,ocr:C.OCR,license_plate:C.LICENSE_PLATE,target_count:C.TARGET_COUNT,timer_target:C.TIMER_TARGET,face:C.FACE_RECOGNITION,face_recognition:C.FACE_RECOGNITION},oe={ALGORITHM:"algorithm",TASK:"task"},Ne={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=l=>`${l}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ae=l=>({id:me("start"),type:"start",position:l,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),Ee=l=>({id:me("end"),type:"end",position:l,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}}}),we=l=>({id:me("dataSource"),type:"dataSource",position:l,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"}}),De=(l,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:l,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Le=(l,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:l,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Oe=(l,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:l,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Me=l=>({id:me("ocr"),type:"ocr",position:l,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Ie=l=>({id:me("licensePlate"),type:"licensePlate",position:l,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Re=l=>({id:me("targetCount"),type:"targetCount",position:l,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"}}}}),$e=l=>({id:me("timerTarget"),type:"timerTarget",position:l,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:{}}}),rt=(l,o={width:300,height:160},t="and",c=null)=>({id:me("group"),type:"group",position:l,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:c},selectable:!0,deletable:!1,zIndex:-1}),Fe=l=>({id:me("faceRecognition"),type:"faceRecognition",position:l,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ye=new Map,qe=()=>{const l=Ae({x:80,y:300}),o=we({x:320,y:300}),t=Ee({x:1e3,y:300}),c={id:`e_${l.id}_${o.id}`,source:l.id,target:o.id,data:{branchOrder:1}};return{nodes:[l,o,t],edges:[c]}},st=l=>et.defineStore(`aiflow-workflow-${l}`,()=>{const o=qe(),t=e.ref(o.nodes),c=e.ref(o.edges),y=e.ref(null),n=e.ref(null),N=e.ref(new Set),x=e.ref(new Set),D=e.ref({}),P=(V,d,T,U)=>{D.value[V]||(D.value[V]={}),D.value[V][d]||(D.value[V][d]={}),D.value[V][d][T]={...U}},R=(V,d,T,U,X)=>{D.value[V]||(D.value[V]={}),D.value[V][d]||(D.value[V][d]={}),D.value[V][d][T]||(D.value[V][d][T]={}),D.value[V][d][T][U]=X},m=(V,d,T)=>D.value[V]?.[d]?.[T]??null,E=()=>{D.value={}},w=e.computed(()=>y.value?t.value.find(V=>V.id===y.value):null),s=e.computed(()=>n.value?c.value.find(V=>V.id===n.value):null),g=V=>t.value.filter(d=>d.type===V).length,r=()=>{const V=t.value.filter(d=>d.type===C.DATA_SOURCE);V.length!==0&&(V.length===1?V[0].data.label="数据源":V.forEach((d,T)=>{d.data.label=`数据源 ${T+1}`}))},L=()=>t.value.filter(V=>V.type===C.DATA_SOURCE).length,q=()=>t.value.filter(d=>d.type===C.DATA_SOURCE).some(d=>d.data.arguments?.needCooperativeDetection===!0),p=()=>{const V=L(),d=q();return!(V>1||d)},O=V=>{t.value.push(V),V.type===C.DATA_SOURCE&&r()},b=V=>{const d=t.value.find(U=>U.id===V),T=d?.type===C.DATA_SOURCE;if(d?.type==="group"){k(V),c.value=c.value.filter(U=>U.source!==V&&U.target!==V),y.value===V&&(y.value=null);return}t.value=t.value.filter(U=>U.id!==V),c.value=c.value.filter(U=>U.source!==V&&U.target!==V),y.value===V&&(y.value=null),T&&r()},S=(V,d)=>{const T=t.value.find(U=>U.id===V);T&&(T.data={...T.data,...d})},i=(V,d)=>{const T=t.value.find(U=>U.id===V);T&&(T.position=d)},_=V=>{const d=t.value.find(T=>T.id===V.source);if(d&&(d.type===C.START||d.type===C.DATA_SOURCE)&&d.data?.enableBranch===!0){const U=c.value.filter(X=>X.source===V.source).length+1;V={...V,data:{...V.data,branchOrder:U}}}c.value=ee.addEdge(V,c.value)},B=V=>{const d=c.value.find(T=>T.id===V);if(c.value=c.value.filter(T=>T.id!==V),n.value===V&&(n.value=null),d&&d.data?.branchOrder!==void 0){const T=t.value.find(U=>U.id===d.source);T&&(T.type===C.START||T.type===C.DATA_SOURCE)&&c.value.filter(X=>X.source===d.source).sort((X,W)=>(X.data?.branchOrder||0)-(W.data?.branchOrder||0)).forEach((X,W)=>{X.data?X.data.branchOrder=W+1:X.data={branchOrder:W+1}})}},a=(V,d="and",T=null)=>{const U=rt(V,{width:300,height:160},d,T);return t.value.unshift(U),U.id},h=(V,d)=>{const T=t.value.find(W=>W.id===V),U=t.value.find(W=>W.id===d);if(!T||!U||T.parentNode===d)return;T.parentNode&&u(V);const X=t.value.find(W=>W.id===V);X&&(t.value=t.value.map(W=>W.id!==V?W:{...W,position:{x:X.position.x-U.position.x,y:X.position.y-U.position.y},parentNode:d,extent:"parent"}))},u=V=>{const d=t.value.find(W=>W.id===V);if(!d||!d.parentNode)return;const T=t.value.find(W=>W.id===d.parentNode),U=T?d.position.x+T.position.x:d.position.x,X=T?d.position.y+T.position.y:d.position.y;t.value=t.value.map(W=>{if(W.id!==V)return W;const Q={...W,position:{x:U,y:X}};return delete Q.parentNode,delete Q.extent,Q})},k=V=>{const d=t.value.find(T=>T.id===V);d&&(t.value=t.value.filter(T=>T.id!==V).map(T=>{if(T.parentNode!==V)return T;const U={...T,position:{x:T.position.x+d.position.x,y:T.position.y+d.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:c,selectedNodeId:y,selectedEdgeId:n,invalidNodeIds:N,invalidEdgeIds:x,selectedNode:w,selectedEdge:s,getNodeCountByType:g,getDataSourceCount:L,hasCooperativeDetection:q,supportPatrol:p,addNode:O,removeNode:b,updateNodeData:S,updateNodePosition:i,addConnection:_,removeEdge:B,updateEdgeData:(V,d)=>{const T=c.value.find(U=>U.id===V);if(T){if(d.branchOrder!==void 0){const U=t.value.find(X=>X.id===T.source);if(U&&(U.type===C.START||U.type===C.DATA_SOURCE)){const X=T.data?.branchOrder,W=d.branchOrder;if(X!==W&&W!==null){const te=c.value.filter(le=>le.source===T.source&&le.id!==V).find(le=>le.data?.branchOrder===W);te&&(te.data?te.data.branchOrder=X:te.data={branchOrder:X})}}}T.data={...T.data,...d}}},selectNode:V=>{y.value=V,n.value=null},selectEdge:V=>{n.value=V,y.value=null},clearSelection:()=>{y.value=null,n.value=null},resetWorkflow:()=>{const V=qe();t.value=V.nodes,c.value=V.edges,y.value=null,n.value=null,E()},loadWorkflow:(V,d)=>{t.value=V,c.value=d,y.value=null,n.value=null,E()},refreshDataSourceLabels:r,createEmptyGroup:a,addNodeToGroup:h,removeNodeFromGroup:u,dissolveParallelGroup:k,initializeSubsequentFrames:V=>{t.value.find(T=>T.id===V)&&S(V,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(V,d)=>{const T=t.value.find(U=>U.id===V);!T||T.type!=="dataSource"||(T.data.subsequentFrames||(T.data.subsequentFrames=[]),T.data.subsequentFrames.push(d),S(V,{subsequentFrames:[...T.data.subsequentFrames]}))},removeSubsequentFrame:(V,d)=>{const T=t.value.find(W=>W.id===V);if(!T||T.type!=="dataSource")return;const U=T.data.subsequentFrames.find(W=>W.id===d);U&&c.value.filter(Q=>Q.source===V&&Q.sourceHandle===U.handleId).forEach(Q=>B(Q.id));const X=T.data.subsequentFrames.filter(W=>W.id!==d);X.forEach((W,Q)=>{W.id==="default-subsequent"?W.label="后续帧检测":W.label=`后续帧检测${Q+1}`}),S(V,{subsequentFrames:X})},setInvalidIds:(V,d)=>{N.value=new Set(V),x.value=new Set(d)},clearInvalidIds:()=>{N.value=new Set,x.value=new Set},taskSources:D,setTaskSourceArguments:P,updateTaskSourceArgument:R,getTaskSourceArguments:m,clearTaskSources:E}}),ae=(l=null)=>{const o=l??e.inject("workflowInstanceId","default");return ye.has(o)||ye.set(o,st(o)),ye.get(o)()},it=l=>{if(ye.has(l)){try{ye.get(l)().$dispose()}catch{}ye.delete(l)}},Ge=(l,o,t)=>{const c=[],y=[],n=l.filter(r=>r.type!=="group"),N=n.filter(r=>r.type===C.START);N.length===0?c.push("工作流必须包含一个开始节点"):N.length>1&&c.push("工作流只能包含一个开始节点");const x=n.filter(r=>r.type===C.END);x.length===0?c.push("工作流必须包含一个结束节点"):x.length>1&&c.push("工作流只能包含一个结束节点");const D=n.filter(r=>r.type===C.DATA_SOURCE);D.length===0&&c.push("工作流必须至少包含一个数据源节点"),n.filter(r=>r.type===C.DETECTION_TARGET||r.type===C.SMALL_MODEL||r.type===C.CLASSIFICATION_MODEL).length===0&&c.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),n.some(r=>r.type===C.SMALL_MODEL),D.some(r=>r.data.arguments?.needCooperativeDetection===!0),D.length>1,n.forEach(r=>{const L=o.filter(p=>p.target===r.id),q=o.filter(p=>p.source===r.id);if(r.type===C.START&&L.length>0&&y.push("开始节点不应有输入连接"),r.type===C.END&&q.length>0&&y.push("结束节点不应有输出连接"),r.type===C.START&&q.length===0&&c.push("开始节点必须有输出连接"),r.type===C.END&&L.length===0&&c.push("结束节点必须有输入连接"),r.type===C.DATA_SOURCE&&r.data.enableImageSequence)if(q.length===0)c.push({nodeId:r.id,message:`数据源节点"${r.data.label}"开启了图片时序但未连接到任何处理节点`});else{const p=q.filter(i=>i.sourceHandle==="first-frame"),O=r.data.subsequentFrames||[],b=new Set(q.map(i=>i.sourceHandle)),S=O.filter(i=>!b.has(i.handleId));p.length===0&&y.push({nodeId:r.id,message:`数据源节点"${r.data.label}"的首帧检测未连接`}),S.length>0&&y.push({nodeId:r.id,message:`数据源节点"${r.data.label}"有${S.length}个后续帧未连接`})}r.type!==C.START&&r.type!==C.END&&!r.parentNode&&(L.length===0||q.length===0)&&y.push(`节点 "${r.data.label}" 可能未正确连接`)});const R=new Set;o.forEach(r=>{const L=l.find(q=>q.id===r.source);L?.type==="dataSource"&&L.data?.enableImageSequence===!0&&r.sourceHandle!=="first-frame"&&(!r.data?.timeWindowSeconds||r.data.timeWindowSeconds<1)&&c.push({edgeId:r.id,message:`分支"${r.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),R.add(r.source),R.add(r.target)}),n.forEach(r=>{r.parentNode||!R.has(r.id)&&n.length>1&&y.push(`节点 "${r.data.label}" 未连接到工作流`)});const m=ct(n,o);c.push(...m);const E=mt(n,o);c.push(...E);const w=dt(n);c.push(...w);const s=pt(n,o);c.push(...s);const g=ut(n,o);return c.push(...g),t==="task"&&n.filter(L=>L.type===C.FACE_RECOGNITION).forEach(L=>{(!L.data.arguments?.repositoryId||Array.isArray(L.data.arguments.repositoryId)&&L.data.arguments.repositoryId.length===0)&&c.push({nodeId:L.id,message:`人脸识别节点"${L.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:c.length===0,errors:c,warnings:y}},ct=(l,o)=>{const t=[],c=l.find(N=>N.type===C.START);if(!c)return t;const y=new Set,n=(N,x,D,P)=>{if(x.includes(N))return;const R=l.find(g=>g.id===N);if(!R)return;const m=[...x,N];let E=[...D],w=[...P];if(R.type===C.TARGET_COUNT&&E.push(R),R.type===C.TIMER_TARGET&&w.push(R),R.type===C.END){const g=m.join("->");y.has(g)||(y.add(g),E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(r=>`"${r.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),w.length>1&&t.push(`工作流分支中存在多个目标计时节点(${w.map(r=>`"${r.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const s=o.filter(g=>g.source===N);s.length===0?(E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(g=>`"${g.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),w.length>1&&t.push(`工作流分支中存在多个目标计时节点(${w.map(g=>`"${g.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):s.forEach(g=>{n(g.target,m,E,w)})};return n(c.id,[],[],[]),t},dt=l=>{const o=[],t=l.filter(y=>y.type===C.DATA_SOURCE),c=l.filter(y=>y.type===C.SMALL_MODEL);return c.length>0&&t.length>1&&c.forEach(y=>{o.push({nodeId:y.id,message:`小模型节点"${y.data.label||y.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},mt=(l,o)=>{const t=[];return l.filter(y=>y.type===C.DATA_SOURCE).forEach(y=>{const n=o.filter(N=>N.source===y.id);if(n.length>1){const N=n.map(P=>P.target),D=l.filter(P=>N.includes(P.id)).filter(P=>P.type===C.SMALL_MODEL);if(D.length>0){const P=D.map(R=>`"${R.data.label||R.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${P})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},pt=(l,o)=>{const t=[],c=[C.TARGET_COUNT,C.TIMER_TARGET],y={[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时"};return l.filter(N=>N.type===C.SMALL_MODEL).forEach(N=>{o.filter(D=>D.source===N.id).forEach(D=>{const P=l.find(R=>R.id===D.target);if(P&&c.includes(P.type)){const R=y[P.type]||P.type;t.push(`小模型节点"${N.data.label||N.data.modelName}"不能直接连接${R}节点"${P.data.label}",请先连接检测目标节点`)}})}),t},ut=(l,o)=>{const t=[],c=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION],y={[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.FACE_RECOGNITION]:"人脸识别"};return l.filter(N=>c.includes(N.type)).forEach(N=>{const x=o.filter(R=>R.source===N.id),D=c.filter(R=>R!==N.type).concat(C.END),P=N.data.label||y[N.type];x.forEach(R=>{const m=l.find(E=>E.id===R.target);m&&!D.includes(m.type)&&t.push(`${P}节点"${P}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${m.data.label||m.type}"节点`)}),x.length===0&&t.push(`${P}节点"${P}"必须连接到其他辅助节点或结束节点`)}),t},He=l=>{const o=new Map;return l.forEach(t=>o.set(t.id,t)),o},ue=(l,o,t)=>(l[o]||[]).map(c=>t.get(c)).filter(Boolean),je=(l,o)=>{const t={},c=new Set(l.filter(n=>n.type==="group").map(n=>n.id));return[...o].sort((n,N)=>{const x=n.data?.branchOrder??1/0,D=N.data?.branchOrder??1/0;return x-D}).forEach(n=>{if(c.has(n.source)&&c.has(n.target))return;let N=n.source,x=n.target;if(c.has(N)){const D=o.find(P=>P.target===N&&!c.has(P.source));if(!D)return;N=D.source}if(c.has(x)){const D=o.find(P=>P.source===x&&!c.has(P.target));if(!D)return;x=D.target}t[N]||(t[N]=[]),t[N].includes(x)||t[N].push(x)}),t},Pe=(l,o)=>{const t=[...o.values()].find(N=>N.type===C.START);if(!t)return[];const c=new Set,y=[],n=N=>{if(c.has(N))return;c.add(N);const x=o.get(N);if(!x)return;x.type!==C.START&&x.type!==C.END&&x.type!=="group"&&y.push(x),(l[N]||[]).forEach(P=>n(P))};return n(t.id),y},ft=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],be=(l,o,t,c)=>{const y=l.nodes.findIndex(N=>N.toolTitle===o);if(y===-1)return;const n=l.nodes[y];n.arguments?.[t]&&(l[c]=n.arguments[t]),l.nodes=l.nodes.filter((N,x)=>x!==y),l.nodes.forEach((N,x)=>{N.sortOrder=x+1})},gt=l=>{const o=l.alertConditions||[];return{targetCount:{logic:l.conditionRelation||"AND",rules:o.map(c=>({op:c.operator,value:c.value}))}}},ht=l=>{const o={op:">",value:l.duration??30,unit:"seconds"};if(l.hit_rate_enabled&&l.hit_rate_threshold!==void 0){const c={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:c[l.hit_rate_operator||"gte"]||">=",value:l.hit_rate_threshold}}const t=l.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const c=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[c]||">",value:t.threshold,matchFrames:3}}return l.similarity_enabled&&l.similarity_threshold!==void 0&&(o.similarity={op:">",value:l.similarity_threshold,matchFrames:3}),{duration:o}},yt={[C.TARGET_COUNT]:gt,[C.TIMER_TARGET]:ht},Ce=(l,o)=>{if(!l)return{};const t=yt[o];if(t)return t(l);const c={...l};return ft.forEach(y=>{delete c[y]}),Object.keys(c).forEach(y=>{const n=c[y];(n==null||n==="")&&delete c[y]}),o===C.FACE_RECOGNITION&&c.repositoryId!==void 0&&(Array.isArray(c.repositoryId)||(c.repositoryId=[c.repositoryId]),c.repositoryId.length===0&&delete c.repositoryId),c},_t=l=>{switch(l.type){case C.DETECTION_TARGET:return l.data.targetId||"";case C.CLASSIFICATION_MODEL:return"cls";case C.OCR:return"ocr";case C.LICENSE_PLATE:return"license_plate";case C.SMALL_MODEL:return l.data.title||l.data.modelName||"";case C.TARGET_COUNT:return"target_count";case C.TIMER_TARGET:return"timer_target";case C.FACE_RECOGNITION:return"face";default:return l.data.label||""}},Nt=(l,o,t,c,y=null)=>{const n={toolTitle:_t(l),nodeName:l.data.label||l.data.targetName||"",sortOrder:o,arguments:Ce(y??l.data.arguments,l.type)};if(l.data.enableBranch&&l.data.branchLogic&&(n.branchLogic=l.data.branchLogic),t){const N=c.find(x=>x.source===t&&x.target===l.id);N?.data?.branchOrder!==void 0&&N?.data?.branchOrder!==null&&(n.branchOrder=N.data.branchOrder)}return n},ze=(l,o,t,c,y,n=null,N=[])=>{const x=[],D=Array.isArray(l)?[...l]:[l],P=new Set;let R=1;for(;D.length>0;){const m=[...D];D.length=0;const E=[];m.forEach(w=>{if(P.has(w))return;P.add(w);const s=c.get(w);!s||s.type===C.END||s.type===C.START||s.type===C.DATA_SOURCE||((t[w]||[]).forEach(r=>{const L=c.get(r);L&&L.type!==C.END&&D.push(r)}),N.includes(s.type))||E.push(s)}),E.length>0&&(E.forEach(w=>{const s=n?.(w.id)??null,g=Nt(w,R,o,y,s);E.length>1&&(g.nodeLogic="or"),x.push(g)}),R++)}return x},Ct=(l=null,o=null)=>{const t=l??ae(),c=e.inject("editorMode",oe.ALGORITHM);e.inject("pageMode",Ne.CREATE);const y=o??e.inject("editorConfig",null),n=e.computed(()=>Ge(t.nodes,t.edges,c)),N=(a,h,u,k)=>{if(u){const I=ue(a,u.id,h).find(z=>z.type===C.SMALL_MODEL);if(I)return I}return k.find(I=>I.type===C.SMALL_MODEL)||null},x=(a,h,u)=>{const I=ue(h,a.id,u).find(A=>A.type===C.SMALL_MODEL);return I?ue(h,I.id,u).filter(A=>A.type!==C.END&&A.type!==C.START&&A.type!==C.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},D=(a,h,u,k,I)=>{if(h===de.SMALL_MODEL||h===de.SMALL_MODEL_BRANCH){const A=N(k,I,u,a);return A?{toolTitle:A.data.title||A.data.modelName||"",toolType:"small",arguments:Ce(A.data.arguments,C.SMALL_MODEL)}:null}const z=a.find(A=>A.type===C.DETECTION_TARGET);return z?{toolTitle:z.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:Ce(z.data.arguments,C.DETECTION_TARGET)}:null},P=()=>{const a=t.nodes.find(k=>k.type===C.END);if(!a||!a.data.arguments)return{};const h=a.data.arguments,u={};return h.reportFrequency==="interval"&&h.reportInterval&&(u.interval={value:h.reportInterval}),h.enableDeduplication&&h.similarityThreshold!==void 0&&(u.dedup={value:h.similarityThreshold}),u},R=a=>{if(a.length<=1)return;const h=a.map(k=>k.sortOrder);if(new Set(h).size!==h.length){const k=h.filter((I,z)=>h.indexOf(I)!==z);throw new Error(`分支执行顺序存在重复:${[...new Set(k)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},m=(a,h,u,k,I)=>{let z=[],A;if(a===de.IMAGE_BRANCH)h&&(z=ue(k,h.id,I).filter(G=>G.type!==C.END)),A=h?.id||u.find(G=>G.type===C.DATA_SOURCE)?.id;else if(a===de.SMALL_MODEL_BRANCH){const G=N(k,I,h,u);G&&(z=ue(k,G.id,I).filter($=>$.type!==C.END),A=G.id)}return{branchStartNodes:z,sourceNodeId:A}},E=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]),w=(a,h,u)=>{const k=new Set,I=[],z=A=>{if(k.has(A))return;k.add(A);const G=u.get(A);if(!G||G.type===C.END)return;E.has(G.type)&&I.push(G),(h[A]||[]).forEach(Y=>z(Y))};return z(a),I.length>0?I[I.length-1]:null},s=(a,h,u,k,I)=>{const z=`分支${I+1}`,A=w(h,u,k);if(!A)return a?.data?.nodeName||z;if(A.type===C.DETECTION_TARGET&&A.data?.targetId==="other"){const $=A.data?.arguments?.object;if(Array.isArray($)&&$.length>0){const Y=$.join(",");return Y.length>32?Y.slice(0,32):Y}}if(A.type===C.CLASSIFICATION_MODEL){const $=A.data?.arguments?.modelName||A.data?.label;if(!$)return z;const Y=A.data?.arguments?.resultNegate?"(取反)":"";return $+Y}return A.data?.label||A.data?.targetName||z},g=(a,h,u,k,I,z)=>{const{branchStartNodes:A,sourceNodeId:G}=m(h,u,a,k,I);if(A.length===0)return[];const $=[];return A.forEach((Y,f)=>{const M=ze([Y.id],G,k,I,z);if(M.length===0)return;const H=G?z.find(d=>d.source===G&&d.target===Y.id):null,J=H?.data||{},j=J.branchOrder!==void 0&&J.branchOrder!==null?J.branchOrder:f+1,V={branchName:J.branchName||s(Y,Y.id,k,I,f),sortOrder:j,nodes:M};H?.sourceHandle&&(V.sourceHandle=H.sourceHandle),be(V,"target_count","targetCount","targetCount"),be(V,"timer_target","duration","duration"),J.timeWindowSeconds!==void 0&&J.timeWindowSeconds!==null&&(V.timeWindowSeconds=J.timeWindowSeconds),J.branchDescription&&(V.description=J.branchDescription),$.push(V)}),R($),$},r=()=>{const a=n.value;if(a.errors.length>0){const h=a.errors.map(u=>typeof u=="object"?u.message:u);return v.ElMessage.error(`验证失败: ${h.join(", ")}`),!1}return a.warnings.length>0&&v.ElMessage.warning(`警告: ${a.warnings.join(", ")}`),!0},L=()=>{const a=t.nodes,h=t.edges,u=He(a),k=je(a,h),I=Pe(k,u),z=[...u.values()].find(A=>A.type===C.START);return{allNodes:a,edges:h,nodeMap:u,adj:k,orderedNodes:I,startNode:z}},q=a=>{const h={ruleName:a?.data?.algorithmName||"",description:"",webhookUrl:""},u=P();Object.keys(u).length>0&&(h.extraConfig=u);const I=(y?.value??y)?.platform;return h.attach=I?{platform:I}:{},h},p=(a,h)=>{const u=a.filter(k=>k.type===C.DATA_SOURCE);if(u.length===0){const k=h.find(I=>I.type===C.DATA_SOURCE);k&&u.push(k)}return u},O=a=>a?.data?.enableImageSequence||a?.data?.arguments?.enableImageSequence||!1?"order":a?.data?.enableBranch&&a.data.branchLogic||"and",b=(a,h,u,k)=>{const{orderedNodes:I,adj:z,nodeMap:A,edges:G}=h,$=x(a,z,A),Y=!!a.data.arguments?.needCooperativeDetection,f=G.find(V=>V.target===a.id),M=f?.data?.branchOrder!==void 0&&f?.data?.branchOrder!==null?f.data.branchOrder:k+1,H={sourceGroupId:null,name:a.data.label||"数据源",sort:M,synEnabled:Y};if(Y&&(H.windowSeconds=a.data.arguments?.windowSeconds||5),$===de.SMALL_MODEL){const V=D(I,$,a,z,A);return V&&(H.streamConfig=V),H.logic="and",H.children=[],H}if($===de.SMALL_MODEL_BRANCH){const V=D(I,$,a,z,A);V&&(H.streamConfig=V)}H.logic=O(a);const J=g(I,$,a,z,A,G),j=u.length;return H.children=J.map((V,d)=>({name:V.branchName,branchRefs:[j+d]})),u.push(...J),H},S=(a,h)=>{const k={groupLogic:a?.data?.enableBranch&&a.data.branchLogic||"and",sourceGroups:h};return h.length>=2&&(k.groupWindowSeconds=a.data.groupWindowSeconds),k},i=()=>{if(!r())return null;try{const a=L(),h=q(a.startNode),u=p(a.orderedNodes,a.allNodes),k=[],I=u.map((z,A)=>b(z,a,k,A));return h.ruleSchema=S(a.startNode,I),k.length>0&&(h.branches=k),h}catch(a){return v.ElMessage.error(a.message||"导出失败"),null}};return{validation:n,exportToJSON:i,copyToClipboard:()=>{try{const a=i();if(!a)return;const h=JSON.stringify(a,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(h).then(()=>{v.ElMessage.success("已复制到剪贴板")}).catch(()=>{v.ElMessage.error("复制失败")});else{const u=document.createElement("textarea");u.value=h,u.style.position="fixed",u.style.opacity="0",document.body.appendChild(u),u.select(),document.execCommand("copy"),document.body.removeChild(u),v.ElMessage.success("已复制到剪贴板")}}catch(a){console.error("复制JSON失败:",a),v.ElMessage.error(`复制失败: ${a.message}`)}},downloadJSON:()=>{const a=i();if(!a)return;const h=JSON.stringify(a,null,2),u=new Blob([h],{type:"application/json"}),k=URL.createObjectURL(u),I=document.createElement("a");I.href=k,I.download=`workflow_${Date.now()}.json`,I.click(),URL.revokeObjectURL(k),v.ElMessage.success("导出成功")}}},kt=(l=null,o=null)=>{const t=l??ae();e.inject("editorMode",oe.TASK),e.inject("pageMode",Ne.CREATE);const c=e.inject("editorConfig",null),y=e.inject("taskModeConfig",null),n=o??c,N=o??y,x=e.inject("echoTaskData",null),D=e.computed(()=>({errors:[],warnings:[]})),P=(q,p)=>{const O={},b=p?.data?.arguments??{};b.reportFrequency==="interval"&&b.reportInterval&&(O.interval={value:b.reportInterval}),b.enableDeduplication&&b.similarityThreshold!==void 0&&(O.dedup={value:b.similarityThreshold}),t.nodes.filter(_=>_.type===C.DATA_SOURCE).length>=2&&q?.data?.groupWindowSeconds!==void 0&&(O.groupWindowSeconds=q.data.groupWindowSeconds),O.enableVideo=!!q?.data?.enableAlertVideo;const i=q?.data?.schedule;return Array.isArray(i)&&i.length>0?O.schedule=i:O.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],O},R=(q,p,O,b,S="image")=>{const i=ue(p,q.id,O).find(_=>_.type===C.SMALL_MODEL);if(i){const _=q.data?.arguments??{};return{toolTitle:i.data.title||i.data.modelName||"",toolType:"small",arguments:Ce(i.data.arguments,C.SMALL_MODEL),decoder:m(_,!0)}}if(S==="stream"){const _=b.find(a=>a.type===C.DETECTION_TARGET);if(!_)return null;const B=q.data?.arguments??{};return{toolTitle:_.data.targetId||"",toolType:"stream",arguments:Ce(_.data.arguments,C.DETECTION_TARGET),decoder:m(B,!1)}}return null},m=(q,p)=>{const O=q.mode??(p?3:0),b=q.interval??0,S=q.sw_decoding??(p?"CPU":"GPU");let i=0,_=0;return p?O===3?(i=0,_=0):O===2?(i=1,_=0):O===1&&(i=0,_=b):O===0?(i=0,_=b*25):O===1?(i=0,_=b):O===2&&(i=1,_=0),{sw_decoding:S==="CPU",mode:i,interval:_}},E=(q,p,O,b,S=null)=>{let i=q.id,_=ue(p,q.id,O).filter(h=>h.type!==C.END&&h.type!==C.START);_.length===1&&_[0].type===C.SMALL_MODEL&&(i=_[0].id,_=ue(p,i,O).filter(h=>h.type!==C.END&&h.type!==C.START));const B=_;if(B.length===0)return[];const a=S?h=>t.getTaskSourceArguments(q.id,S,h):null;return B.map((h,u)=>{const k=ze([h.id],i,p,O,b,a,[C.SMALL_MODEL]),I=b.find(Y=>Y.source===i&&Y.target===h.id),z=I?.data??{},A=z.branchOrder??u+1,G=z.branchId??null,$={branchId:G,id:G,branchName:z.branchName||h.data?.label||`分支${u+1}`,sortOrder:A,nodes:k};return I?.sourceHandle&&($.sourceHandle=I.sourceHandle),z.timeWindowSeconds!==void 0&&z.timeWindowSeconds!==null&&($.timeWindowSeconds=z.timeWindowSeconds),z.branchDescription&&($.description=z.branchDescription),be($,"target_count","targetCount","targetCount"),be($,"timer_target","duration","duration"),$})},w=(q,p,O,b,S=null,i=null,_=null,B=1,a=!1,h=!1)=>{const u=S??q.deviceType??"",k=u==="1400"||u==="2",I=k?"1400":"camera",z=p==="stream"?2:1,A=k&&i!==null?i==="device"?1:2:q.detectionType??2,$=(x?.value??x)?.graph?.sources??[],Y=String(q.sourceId??q.id??""),M=$.find(J=>String(J.sourceId)===Y)?.attach??{},H={deviceType:I,detectionType:A,dataSourceType:z,sourceOrder:O,timeTemplateId:M.timeTemplateId??"",timeTemplateName:M.timeTemplateName??"",platform:b?.platform??"TAI"};if(!k){const J=_?.mode??0;J===3?(H.frameExtractionType=0,H.frameInterval=0):J===2?(H.frameExtractionType=h?1:3,H.frameInterval=0):(H.frameExtractionType=J+1,H.frameInterval=_?.interval??30);const j=_?.sw_decoding??"CPU";H.frameExtractionSourceType=j==="GPU"?2:1,B===1&&p==="image"&&!a&&!!_?.enablePatrol?H.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,_?.patrolGroupSize??1)),pollingInterval:"0"}:H.pollingConfig={enablePolling:0},H.thirdId=q.thirdId??""}return H},s=(q,p,O,b,S,i,_)=>{const B=N?.value??N,a=B?.value??B,h=a?.datasource?.getDevices?.(q.id)??[],u=q.data?.sourceGroupId??null,k=!!q.data?.arguments?.needCooperativeDetection,I=k?q.data?.arguments?.windowSeconds??5:void 0,z=p?.data?.streamType??"image",A=ue(O,q.id,b).some(V=>V.type===C.SMALL_MODEL),G=A?"small":z,$=R(q,O,b,_,z),Y=q.data?.arguments?.deviceType??null,f=q.data?.arguments?.detectionMode??null,M=q.data?.arguments??null,H=t.getDataSourceCount();if(h.length>0)return h.map((V,d)=>{const T=String(V.sourceId??V.id??""),U=E(q,O,b,S,T),X={sourceId:V.sourceId??V.id??"",sourceName:V.sourceName??V.name??"",sourceType:G,sourceGroupId:u,areas:V.area??V.areas??[],lines:V.lines??null,direction:V.direction??null,branches:U,attach:w(V,z,d,a,Y,f,M,H,k,A),synEnabled:k,...I!==void 0&&{windowSeconds:I}};return $&&(X.streamConfig=$,X.streamUrl="rtsp"),X});const J=E(q,O,b,S),j={sourceId:"",sourceName:q.data?.label??"数据源",sourceType:G,sourceGroupId:u,areas:[],branches:J,attach:w({},z,0,a,Y,f,M,H,k,A),synEnabled:k};return $&&(j.streamConfig=$,j.streamUrl="rtsp"),[j]},g=()=>{try{const q=t.nodes,p=t.edges,O=He(q),b=je(q,p),S=[...O.values()].find(I=>I.type===C.START),i=[...O.values()].find(I=>I.type===C.END),_=n?.value??n,B=_?.value??_,a=Pe(b,O);let h=a.filter(I=>I.type===C.DATA_SOURCE);h.length===0&&(h=q.filter(I=>I.type===C.DATA_SOURCE));const u=h.flatMap((I,z)=>s(I,S,b,O,p,z,a)),k={workflowName:S?.data?.taskName??"",ruleId:B?.ruleId??"",sources:u,extraConfig:P(S,i),description:""};if((B?.platform??"TAI")==="THIRD"){const z=h[0]?.data?.arguments??{},A=z.mode??0,G=z.interval??0;let $,Y,f;return A===0?($="time",Y=G,f=0):($="frame",Y=0,A===3?f=0:A===2?f=-1:f=G),{name:k.workflowName,type:"simple",plan:k.extraConfig.schedule??[],inferStrategy:$,timeInterval:Y,frameInterval:f,mps:k.extraConfig.enableVideo??!1,graph:k}}return k}catch(q){return v.ElMessage.error(q.message||"导出失败"),null}};return{validation:D,exportToJSON:g,copyToClipboard:()=>{const q=g();if(!q)return;const p=JSON.stringify(q,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(p).then(()=>v.ElMessage.success("已复制到剪贴板")).catch(()=>v.ElMessage.error("复制失败"));else{const O=document.createElement("textarea");O.value=p,O.style.position="fixed",O.style.opacity="0",document.body.appendChild(O),O.select(),document.execCommand("copy"),document.body.removeChild(O),v.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const q=g();if(!q)return;const p=JSON.stringify(q,null,2),O=new Blob([p],{type:"application/json"}),b=URL.createObjectURL(O),S=document.createElement("a");S.href=b,S.download=`task_workflow_${Date.now()}.json`,S.click(),URL.revokeObjectURL(b),v.ElMessage.success("导出成功")}}},Ue=(l=null,o=null,t=null)=>{const c=e.inject("editorMode",oe.ALGORITHM);return(l??c)===oe.TASK?kt(o,t):Ct(o,t)},bt=l=>{if(!l)return null;const o=l.indexOf("{");if(o===-1)return null;try{return JSON.parse(l.slice(o))}catch{return null}};function We(l=null,o=null,t=null){const c=o??ae(),y=e.inject("editorMode",oe.ALGORITHM),n=l??y,N=e.inject("taskModeConfig",null),x=t??N,D=m=>{const{type:E,data:w}=m,s=w.arguments||{},g=[];switch(E){case C.START:if(n===oe.TASK)if(w.taskName?.trim()||g.push("任务名称"),!w.executionTime?.trim())g.push("任务执行时间");else{const r=bt(w.executionTime);(!r||!Array.isArray(r.plan)||r.plan.length===0)&&g.push("任务执行时间(计划为空)")}else w.algorithmName?.trim()||g.push("算法名称");break;case C.SMALL_MODEL:w.modelId||g.push("模型选择");break;case C.DETECTION_TARGET:w.targetId||g.push("检测目标选择");break;case C.CLASSIFICATION_MODEL:s.modelId||g.push("分类模型选择");break;case C.DATA_SOURCE:n===oe.TASK&&((x?.value??x)?.datasource?.getDevices?.(m.id)??[]).length===0&&g.push("设备选择");break;case C.TARGET_COUNT:break;case C.TIMER_TARGET:(!s.duration||s.duration<1)&&g.push("持续时间");break}return g},P=m=>{const E=c.nodes.find(s=>s.id===m.source);if(!E)return[];const w=[];return E.type===C.DATA_SOURCE&&E.data?.enableImageSequence===!0&&m.sourceHandle!=="first-frame"&&(!m.data?.timeWindowSeconds||m.data.timeWindowSeconds<1)&&w.push("后续检测帧的持续时间"),w};return{runValidation:()=>{const{nodes:m,edges:E}=c;c.clearInvalidIds();const w=Ge(m,E,n),s=w.errors,g=[],r=[],L=[];m.filter(i=>i.type!=="group").forEach(i=>{const _=D(i);_.length>0&&(g.push(i.id),L.push(`节点"${i.data.label}"缺少必填参数:${_.join("、")}`))}),E.forEach(i=>{const _=P(i);_.length>0&&(r.push(i.id),L.push(`分支"${i.data?.branchName||"未命名"}"缺少:${_.join("、")}`))}),s.forEach(i=>{typeof i=="object"&&(i.nodeId&&g.push(i.nodeId),i.edgeId&&r.push(i.edgeId))}),(g.length>0||r.length>0)&&(c.setInvalidIds(g,r),setTimeout(()=>{c.clearInvalidIds()},5e3));const p=s.map(i=>typeof i=="object"?i.message:i),O=w.warnings.map(i=>typeof i=="object"?i.message:i),b=[...p.map(i=>({msg:i,type:"error"})),...L.map(i=>({msg:i,type:"warning"})),...O.map(i=>({msg:i,type:"warning"}))],S=p.length===0&&L.length===0;if(S&&O.length===0)v.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(b.length>0){const i=b[0];v.ElMessage[i.type](i.msg)}return{passed:S,errors:[...p,...L],warnings:O}}}}const ne=(l,o)=>{const t=l.__vccOpts||l;for(const[c,y]of o)t[c]=y;return t},xt={class:"toolbar"},Et={class:"toolbar-right"},wt=ne({__name:"WorkflowToolbar",setup(l){const o=ae(),{copyToClipboard:t,downloadJSON:c}=Ue(),{runValidation:y}=We(),n=()=>{o.resetWorkflow()},N=()=>{y()},x=()=>{t()},D=()=>{c()};return(P,R)=>{const m=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",xt,[R[4]||(R[4]=e.createElementVNode("div",{class:"toolbar-left"},[e.createElementVNode("h2",null,"AIPass 算法编排系统")],-1)),e.createElementVNode("div",Et,[e.createVNode(m,{type:"info",icon:e.unref(K.RefreshLeft),onClick:n},{default:e.withCtx(()=>[...R[0]||(R[0]=[e.createTextVNode(" 重置 ",-1)])]),_:1},8,["icon"]),e.createVNode(m,{type:"danger",icon:e.unref(K.CircleCheck),onClick:N},{default:e.withCtx(()=>[...R[1]||(R[1]=[e.createTextVNode(" 运行测试 ",-1)])]),_:1},8,["icon"]),e.createVNode(m,{type:"success",icon:e.unref(K.CopyDocument),onClick:x},{default:e.withCtx(()=>[...R[2]||(R[2]=[e.createTextVNode(" 复制JSON ",-1)])]),_:1},8,["icon"]),e.createVNode(m,{type:"warning",icon:e.unref(K.Download),onClick:D},{default:e.withCtx(()=>[...R[3]||(R[3]=[e.createTextVNode(" 导出JSON ",-1)])]),_:1},8,["icon"])])])}}},[["__scopeId","data-v-17ee463c"]]),Tt={key:0},St={class:"node-list"},Vt={class:"node-list"},Bt={class:"node-list"},At={class:"node-list"},Dt=ne({__name:"NodeToolbox",setup(l){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),c=(y,n)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",n),y.dataTransfer.effectAllowed="move")};return(y,n)=>{const N=e.resolveComponent("el-icon"),x=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),P=e.resolveComponent("el-collapse-item"),R=e.resolveComponent("FolderOpened"),m=e.resolveComponent("Cpu"),E=e.resolveComponent("View"),w=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]=s=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",Tt,"节点工具箱")):(e.openBlock(),e.createBlock(N,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(N,{key:2,class:"toggle-btn",onClick:n[0]||(n[0]=e.withModifiers(s=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(K.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(w,{key:0,modelValue:t.value,"onUpdate:modelValue":n[13]||(n[13]=s=>t.value=s),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(P,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",St,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[2]||(n[2]=s=>c(s,"start"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),n[14]||(n[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[3]||(n[3]=s=>c(s,"end"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),n[15]||(n[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(P,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",Vt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[4]||(n[4]=s=>c(s,"dataSource"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(R)]),_:1}),n[16]||(n[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[5]||(n[5]=s=>c(s,"smallModel"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),n[17]||(n[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[6]||(n[6]=s=>c(s,"detectionTarget"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),n[18]||(n[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[7]||(n[7]=s=>c(s,"classificationModel"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Grid))]),_:1}),n[19]||(n[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(P,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[8]||(n[8]=s=>c(s,"targetCount"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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]=s=>c(s,"timerTarget"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Timer))]),_:1}),n[21]||(n[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(P,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",At,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[10]||(n[10]=s=>c(s,"ocr"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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]=s=>c(s,"licensePlate"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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]=s=>c(s,"faceRecognition"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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 Te{static backendToFrontend(o){const{id:t,title:c,name:y,inputSchema:n,extraConfig:N}=o,x={id:t,title:c,label:y,type:"DETECTION_TARGET",inputSchema:n,extraConfig:N,data:{targetId:c,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:N?.showStruct!==void 0?!1:void 0}};return Object.keys(x.data).forEach(D=>{x.data[D]===void 0&&delete x.data[D]}),x}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Je=l=>at[l]||l,he=(l,o,t={})=>({id:me(l),type:l,position:{...o},data:{label:t.label||Je(l),...t}}),ke=(l,o,t={})=>{const{sourceHandle:c,...y}=t,n={id:`e_${l}_${o}`,source:l,target:o};return c&&(n.sourceHandle=c),Object.keys(y).length>0&&(n.data=y),n},Lt=l=>{if(!l)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=l.rules||[],t=l.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(c=>({operator:c.op,value:c.value}))}},Ot=l=>{if(!l)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:l.value??30,condition_type:l.similarity?"similarity":"hit_rate",similarity_enabled:!!l.similarity,similarity_threshold:l.similarity?.value??90,hit_rate_enabled:!!l.hitCount,hit_rate_operator:o[l.hitCount?.op]||"gt",hit_rate_threshold:l.hitCount?.value??2,overlap_detection:l.overlap?{enabled:!0,operator:o[l.overlap.op]||"gt",threshold:l.overlap.value}:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1}},Mt=l=>{if(!l)return{};const o={};return l.interval&&(o.reportFrequency="interval",o.reportInterval=l.interval.value),l.dedup&&(o.enableDeduplication=!0,o.similarityThreshold=l.dedup.value),o},It=()=>({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"]}),Rt=()=>({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:[]}),$t=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,l=>{const o=Math.random()*16|0;return(l==="x"?o:o&3|8).toString(16)}),Ye=()=>{const l=ae(),o=e.inject("editorConfig",null),t=p=>lt[p]||C.DETECTION_TARGET,c=(p,O)=>p?.find(b=>b.id===String(O))??p?.[O],y=(p,O)=>p.streamConfig?(p.children||[]).some(i=>(i.branchRefs||[]).some(_=>c(O.branches,_)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,n=p=>!p||typeof p!="object"?"无效的JSON格式":!p.ruleName&&p.ruleName!==""?"缺少 ruleName 字段":p.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",N=p=>{const O=o?.value??o;return p==="small"?O?.smallModels||[]:p==="detection"?O?.detection||[]:p==="classification"?O?.classification?.models||[]:[]},x=()=>{},D=(p,O)=>{p.modelName=O||"",p.title=O||"",p.modelId=O||null;const S=N("small").find(i=>i.title===O);S&&(p.input_schema=S.inputSchema||S.input_schema||{},p.modelId=S.id||S.title,p.modelName=S.name||O,p.modelType=S.type,p.supportDirectAlert=S.supportDirectAlert||!1,p.extraConfig=S.extraConfig)},P=async(p,O)=>{const b=t(p.toolTitle),S={label:p.nodeName||Je(b),arguments:p.arguments||{},input_schema:{}};switch(b){case C.DETECTION_TARGET:S.targetId=p.toolTitle,S.targetName=p.nodeName||"检测目标";{const _=N("detection").find(B=>B.title===p.toolTitle);if(_){let a=Te.backendToFrontend(_).inputSchema||{};if(p.toolTitle==="other"){const h={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}}};a={...a,properties:{...a.properties,...h.properties}}}S.input_schema=a}}break;case C.CLASSIFICATION_MODEL:S.modelName=p.nodeName||"分类模型";break;case C.SMALL_MODEL:D(S,p.toolTitle);break}return p.branchLogic&&(S.enableBranch=!0,S.branchLogic=p.branchLogic),he(b,O,S)},R=(p,O,b,S)=>{const i={label:"小模型",input_schema:{},arguments:p.arguments||{}};return D(i,p.toolTitle),O===de.SMALL_MODEL_BRANCH&&(i.enableBranch=!0,i.branchLogic=b.logic||"and"),he("smallModel",S,i)},m=async(p,O,b,S,i,_)=>{let B=O,a=S;const h={branchOrder:p.sortOrder??1,branchName:p.branchName||"",branchId:p.id??null};p.sourceHandle&&(h.sourceHandle=p.sourceHandle);const u=p.timeWindowSeconds??p.extraConfig?.timeWindowSeconds;u!==void 0&&(h.timeWindowSeconds=u),p.description&&(h.branchDescription=p.description);const k=[...p.nodes||[]].sort((f,M)=>(f.sortOrder??0)-(M.sortOrder??0)),I=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]);let z=-1;k.forEach((f,M)=>{I.has(t(f.toolTitle))&&(z=M)});const A=k.map(f=>({kind:"regular",data:f})),G=p.targetCount??p.extraConfig?.targetCount,$=p.duration??p.extraConfig?.duration,Y=[];G&&Y.push({kind:"targetCount",data:G}),$&&Y.push({kind:"timerTarget",data:$}),Y.length>0&&A.splice(z+1,0,...Y);for(let f=0;f<A.length;f++){const M=A[f];let H;if(M.kind==="regular")H=await P(M.data,{x:a,y:b});else if(M.kind==="targetCount"){const J=Lt(M.data);H=he("targetCount",{x:a,y:b},{label:"目标计数",arguments:J,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const J=Ot(M.data);H=he("timerTarget",{x:a,y:b},{label:"目标计时",arguments:J,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"}}})}i.push(H),_.push(ke(B,H.id,f===0?h:void 0)),B=H.id,a+=ie.H_GAP}return{lastNodeId:B,endX:a}},E=p=>{const O=p.ruleSchema.sourceGroups||[],b=p.ruleSchema.groupLogic||"and",S=O.length>1;return he("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:p.ruleName||"",enableBranch:S?!0:b!=="and",branchLogic:b,groupWindowSeconds:p.ruleSchema.groupWindowSeconds??null})},w=p=>{const O=Mt(p.extraConfig);return he("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:It(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...O}})},s=(p,O)=>[...p||[]].sort((b,S)=>(b.sort??0)-(S.sort??0)).map(b=>{const S=y(b,O),i=[];return(b.children||[]).forEach(_=>{(_.branchRefs||[]).forEach(B=>{const a=c(O.branches,B);a&&i.push(a)})}),i.sort((_,B)=>(_.sortOrder??0)-(B.sortOrder??0)),{sg:b,mode:S,refBranches:i}}),g=p=>{const b=(p.reduce((S,i)=>S+Math.max(i.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-b/2},r=async(p,O,b,S,i,_)=>{const{sg:B,mode:a,refBranches:h}=p,u=Math.max(h.length,1),k=b+(u-1)*ie.V_GAP/2;let I=ie.START_X+ie.H_GAP,z=ie.START_X;const A=B.logic==="order",G=he("dataSource",{x:I,y:k},{label:B.name||"数据源",sourceGroupId:B.sourceGroupId??null,enableImageSequence:A,input_schema:Rt(),arguments:{needCooperativeDetection:!!B.synEnabled,windowSeconds:B.windowSeconds||5,enableImageSequence:A},enableBranch:!0,branchLogic:A?"order":B.logic||"and"});S.push(G),i.push(ke(O.id,G.id,{branchOrder:B.sort??null,branchName:B.name||""})),A&&h.forEach((f,M)=>{f.sourceHandle||(f.sourceHandle=M===0?"first-frame":$t())});const $=A?{dataSourceNode:G,refBranches:h}:null;let Y=G.id;if(a===de.SMALL_MODEL||a===de.SMALL_MODEL_BRANCH){I+=ie.H_GAP;const f=R(B.streamConfig,a,B,{x:I,y:k});S.push(f),i.push(ke(G.id,f.id)),Y=f.id}if(h.length>0)for(let f=0;f<h.length;f++){const M=b+f*ie.V_GAP,{lastNodeId:H,endX:J}=await m(h[f],Y,M,I+ie.H_GAP,S,i);i.push(ke(H,_.id)),J>z&&(z=J)}else{i.push(ke(Y,_.id));const f=I+ie.H_GAP;f>z&&(z=f)}return{branchY:b+u*ie.V_GAP,maxX:z,imageSequenceInfo:$}},L=p=>{for(const{dataSourceNode:O,refBranches:b}of p){const S=b.filter(i=>i.sourceHandle&&i.sourceHandle!=="first-frame");S.length>0&&(O.data.subsequentFrames=S.map((i,_)=>({id:_===0?"default-subsequent":`subsequent-${Date.now()}-${_}`,label:_===0?"后续帧检测":`后续帧检测${_+1}`,handleId:i.sourceHandle})))}};return{importFromJSON:async p=>{const O=n(p);if(O)return v.ElMessage.error(O),!1;try{x();const b=[],S=[],i=E(p),_=w(p);b.push(i);const B=s(p.ruleSchema.sourceGroups,p);let a=g(B),h=ie.START_X;const u=[];for(const k of B){const I=await r(k,i,a,b,S,_);a=I.branchY,I.maxX>h&&(h=I.maxX),I.imageSequenceInfo&&u.push(I.imageSequenceInfo)}return _.position.x=h+ie.H_GAP,b.push(_),L(u),l.loadWorkflow(b,S),v.ElMessage.success("导入成功"),!0}catch(b){return v.ElMessage.error("导入失败: "+(b.message||"未知错误")),!1}},validateImportJSON:n}},Ft=()=>{const l=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:c,validateImportJSON:y}=Ye(),n=(s,g)=>{const r=s.mode??0,L=s.interval??0,q=s.sw_decoding===!1?"GPU":"CPU";let p,O;return g?r===1?(p=2,O=0):r===0&&L===0?(p=3,O=0):(p=1,O=L):r===1?(p=2,O=0):L===0?(p=0,O=30):(p=0,O=L),{mode:p,interval:O,sw_decoding:q}},N=(s,g)=>{const r=s.frameExtractionType??1,L=s.frameInterval??0,p=(s.frameExtractionSourceType??1)===2?"GPU":"CPU";let O,b;return r===0?(O=3,b=0):r===1&&L===0?(O=g?2:0,b=30):r===1?(O=0,b=L):r===2?(O=1,b=L):r===3?(O=2,b=0):(O=g?3:0,b=30),{mode:O,interval:b,sw_decoding:p}},x=s=>s===1?"device":"platform",D=s=>!s||s.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(s.pollingAmount??1)},P=(s,g,r)=>{if(g){const L=s.find(q=>q.sourceGroupId===g);if(L)return L}return s[r]??null},R=(s,g)=>{if(!s?.branches)return null;for(const r of s.branches){const L=r.nodes?.find(q=>q.toolTitle===g);if(L?.arguments)return{...L.arguments}}return null},m=s=>{if(!Array.isArray(s)||s.length===0)return{timeZone:"",planType:0};const g=s.map(L=>({dayType:Number(L.dayType??0),timePeriod:(L.timePeriod??[]).map(q=>({startTime:q.startTime,endTime:q.endTime}))})),r=g.some(L=>L.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:g}),planType:r}},E=async()=>{const s=l?.value??l;if(!s||typeof s!="object"||Object.keys(s).length===0)return;const g=s.graph??{},r=g.sources??[],L=g.extraConfig??{},q=t.nodes.find(i=>i.type===C.START);if(q){const i=s.name??g.workflowName??"",_=!!L.enableVideo,B=L.schedule??[],{timeZone:a,planType:h}=m(B);t.updateNodeData(q.id,{taskName:i,enableAlertVideo:_,schedule:B,timeZone:a,planType:h,...a?{executionTime:a}:{}})}const p=t.nodes.filter(i=>i.type===C.DATA_SOURCE),O=t.nodes.some(i=>i.type===C.SMALL_MODEL);return p.forEach((i,_)=>{const B=i.data?.sourceGroupId??null,a=P(r,B,_);if(!a)return;const h=a.attach??{},u=a.streamConfig?.decoder??null,k=h.deviceType==="1400"?"1400":"camera",I=k==="camera"?u?n(u,O):N(h,O):{},z=k==="camera"?D(h.pollingConfig):{},A=k==="1400"?{detectionMode:x(h.detectionType)}:{},G=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...G,deviceType:k,...I,...z,...A}});const $=o?.value??o;if($?.datasource?.setDevices){const f=(B?r.filter(M=>M.sourceGroupId===B):[a]).map(M=>({sourceId:M.sourceId??"",sourceName:M.sourceName??"",thirdId:M.attach?.thirdId??"",area:M.areas??[],lines:M.lines??[],direction:M.direction??[]}));$.datasource.setDevices(i.id,f)}}),t.nodes.filter(i=>i.type===C.DETECTION_TARGET).forEach(i=>{const _=new Set,B=[i.id];let a=null;for(;B.length&&!a;){const $=B.shift();if(_.has($))continue;_.add($);const Y=t.edges.filter(f=>f.target===$);for(const f of Y){const M=t.nodes.find(H=>H.id===f.source);if(M){if(M.type===C.DATA_SOURCE){a=M.id;break}B.push(M.id)}}}if(!a)return;const u=(o?.value??o)?.datasource?.getDevices?.(a)??[];if(u.length<=1)return;const k=i.data?.targetId;if(!k)return;const I=u.map($=>{const Y=String($.sourceId??$.id??""),f=r.find(M=>String(M.sourceId)===Y);if(!f?.branches)return{deviceId:Y,args:null};for(const M of f.branches){const H=M.nodes?.find(J=>J.toolTitle===k);if(H?.arguments)return{deviceId:Y,args:{...H.arguments}}}return{deviceId:Y,args:null}}),z=I.filter($=>$.args!==null);if(z.length===0)return;const A=JSON.stringify(z[0].args);if(z.some($=>JSON.stringify($.args)!==A)){const $=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...$,configMode:"perDevice"}}),I.forEach(({deviceId:Y,args:f})=>{f&&t.setTaskSourceArguments(a,Y,i.id,f)})}}),t.nodes.filter(i=>i.type===C.FACE_RECOGNITION).forEach(i=>{const _=new Set,B=[i.id];let a=null;for(;B.length&&!a;){const G=B.shift();if(_.has(G))continue;_.add(G);const $=t.edges.filter(Y=>Y.target===G);for(const Y of $){const f=t.nodes.find(M=>M.id===Y.source);if(f){if(f.type===C.DATA_SOURCE){a=f.id;break}B.push(f.id)}}}const u=(a?t.nodes.find(G=>G.id===a):null)?.data?.sourceGroupId??null,k=p.findIndex(G=>G.id===a),I=P(r,u,k>=0?k:0);if(!I)return;const z=R(I,"face");if(!z?.repositoryId)return;const A=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...A,repositoryId:Array.isArray(z.repositoryId)?z.repositoryId:[z.repositoryId]}})}),!0};return{importFromJSON:async s=>{const g=y(s);return g?(v.ElMessage.error(g),!1):await c(s)?(await E(),!0):!1},applyTaskData:E,validateImportJSON:y}},qt=()=>{if(e.inject("editorMode",oe.ALGORITHM)===oe.TASK)return Ft();const{importFromJSON:o,validateImportJSON:t}=Ye();return{importFromJSON:o,validateImportJSON:t,applyTaskData:async()=>{}}},Gt={class:"node-content"},Ht={class:"node-label"},jt=ne({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("VideoPlay"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",Gt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",Ht,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Pt={class:"node-content"},zt={class:"node-label"},Ut=ne({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("CircleClose"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Pt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",zt,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Wt={class:"node-content"},Jt={class:"node-info"},Yt={class:"node-label"},Xt={key:1,class:"sequence-handles"},Qt={class:"handle-item"},Kt={class:"handle-label"},Zt={key:0,class:"handle-item add-button-item"},vt=ne({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=ae(),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,R=>{const m=Math.random()*16|0;return(R==="x"?m:m&3|8).toString(16)}),N=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let x=!1;const D=()=>{if(x)return;x=!0;const R=o.data.subsequentFrames||[],m={id:n(),label:`后续帧检测${R.length+1}`,handleId:n()};t.addSubsequentFrame(o.id,m),setTimeout(()=>{x=!1},300)},P=async R=>{const m=o.data.subsequentFrames.find(w=>w.id===R);if(t.edges.some(w=>w.source===o.id&&w.sourceHandle===m.handleId))try{await v.ElMessageBox.confirm(`删除"${m.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,R)};return(R,m)=>{const E=e.resolveComponent("FolderOpened"),w=e.resolveComponent("el-icon"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["data-source-node",{"sequence-mode":l.data.enableImageSequence,selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Wt,[e.createVNode(w,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",Jt,[e.createElementVNode("div",Yt,e.toDisplayString(l.data.label),1)])]),l.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(ee.Handle),{key:0,type:"source",position:e.unref(ee.Position).Right},null,8,["position"])),l.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",Xt,[e.createElementVNode("div",Qt,[m[0]||(m[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,g=>(e.openBlock(),e.createElementBlock("div",{key:g.id,class:"handle-item"},[e.createElementVNode("span",Kt,e.toDisplayString(g.label),1),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:g.handleId,class:"handle-right"},null,8,["position","id"]),g.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(w,{key:0,class:"delete-icon",onClick:e.withModifiers(r=>P(g.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Zt,[e.createVNode(s,{size:"small",type:"primary",icon:e.unref(K.Plus),circle:"",onClick:e.withModifiers(D,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),eo={class:"node-content"},to={class:"node-info"},oo={class:"node-label"},no={key:0,class:"node-model"},ao={key:1,class:"node-placeholder"},lo={key:0,class:"direct-alert-badge"},ro=ne({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("Cpu"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",eo,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",to,[e.createElementVNode("div",oo,e.toDisplayString(l.data.label),1),l.data.modelName?(e.openBlock(),e.createElementBlock("div",no,e.toDisplayString(l.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",ao,"未选择模型"))])]),l.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",lo,[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),so={class:"node-content"},io={class:"node-info"},co={class:"node-target"},mo={class:"node-params"},po=ne({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=()=>o.data.targetName||o.data.label||"检测目标",c=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(x=>x&&x.trim()!=="").length}return null});return(n,N)=>{const x=e.resolveComponent("View"),D=e.resolveComponent("el-icon"),P=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",so,[e.createVNode(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",io,[N[1]||(N[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",co,e.toDisplayString(t()),1),e.createElementVNode("div",mo,[y.value?(e.openBlock(),e.createBlock(P,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(P,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.targetHeight&&l.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(P,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(l.data.arguments.targetWidth)+"x"+e.toDisplayString(l.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(P,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...N[0]||(N[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),uo={class:"node-content"},fo={class:"node-info"},go={class:"node-label"},ho={key:0,class:"node-model"},yo={key:1,class:"node-placeholder"},_o={key:2,class:"node-stats"},No=ne({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=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:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",uo,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",fo,[e.createElementVNode("div",go,e.toDisplayString(l.data.label),1),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",ho,e.toDisplayString(l.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",yo,"未选择模型")),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",_o,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(n,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.categories?.length>0?(e.openBlock(),e.createBlock(n,{key:1,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.data.arguments.categories.length)+" 类 ",1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.topK?(e.openBlock(),e.createBlock(n,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" Top-"+e.toDisplayString(l.data.arguments.topK),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),Co={class:"node-content"},ko={class:"node-info"},bo={class:"node-label"},xo={class:"node-params"},Eo=ne({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return ae(),(o,t)=>{const c=e.resolveComponent("el-icon"),y=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Co,[e.createVNode(c,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Document))]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(l.data.label),1),e.createElementVNode("div",xo,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(y,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),wo={class:"node-content"},To={class:"node-info"},So={class:"node-label"},Vo={class:"node-scope"},Bo={class:"node-params"},Ao=ne({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=ae(),c=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(N=>N.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const N=e.resolveComponent("Document"),x=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",wo,[e.createVNode(x,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(N)]),_:1}),e.createElementVNode("div",To,[e.createElementVNode("div",So,e.toDisplayString(l.data.label),1),e.createElementVNode("div",Vo,e.toDisplayString(c()),1),e.createElementVNode("div",Bo,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.minPlateWidth!==void 0&&l.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(D,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(l.data.arguments.minPlateWidth)+"×"+e.toDisplayString(l.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),Do={class:"node-content"},Lo={class:"node-info"},Oo={class:"node-params"},Mo=ne({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},c=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const N=y[0];return`数量 ${t[N.operator]||N.operator} ${N.value}`}const n=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${n})`});return(y,n)=>{const N=e.resolveComponent("el-icon"),x=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Do,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.DataAnalysis))]),_:1}),e.createElementVNode("div",Lo,[n[0]||(n[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Oo,[c.value?(e.openBlock(),e.createBlock(x,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Io={class:"node-content"},Ro={class:"node-info"},$o={class:"node-label"},Fo={class:"node-params"},qo=ne({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=e.computed(()=>o.data.description||"目标计时"),c=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,N)=>{const x=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Io,[e.createVNode(x,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Timer))]),_:1}),e.createElementVNode("div",Ro,[e.createElementVNode("div",$o,e.toDisplayString(t.value),1),e.createElementVNode("div",Fo,[e.createVNode(D,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Go={class:"group-label"},Ho=ne({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={and:"ALL",or:"SOME"},c=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),n={width:"8px",height:"8px",borderRadius:"2px"},N={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(x,D)=>{const P=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",Go,[e.createVNode(P,{type:y.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1},8,["type"]),D[0]||(D[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(nt.NodeResizer),{"min-width":200,"min-height":100,"handle-style":n,"line-style":N})],2)}}},[["__scopeId","data-v-adf6607d"]]),jo={class:"node-content"},Po={class:"node-info"},zo={class:"node-label"},Uo={class:"node-scope"},Wo={class:"node-params"},Jo=ne({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=ae(),c=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(N=>N.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const N=e.resolveComponent("el-icon"),x=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",jo,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.User))]),_:1}),e.createElementVNode("div",Po,[e.createElementVNode("div",zo,e.toDisplayString(l.data.label),1),e.createElementVNode("div",Uo,e.toDisplayString(c()),1),e.createElementVNode("div",Wo,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(x,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.minFaceWidth!==void 0&&l.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(x,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(l.data.arguments.minFaceWidth)+"×"+e.toDisplayString(l.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),Yo={class:"quick-add-menu__list"},Xo=["onClick"],Qo={class:"quick-add-menu__icon"},Ko={class:"quick-add-menu__label"},Zo={key:0,class:"quick-add-menu__empty"},fe=8,vo=ne({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(l){const o=l,t=e.ref(null),c=e.ref({x:0,y:0});e.watch(()=>o.visible,async x=>{if(!x||(c.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const D=t.value.getBoundingClientRect(),P=window.innerWidth,R=window.innerHeight;let{x:m,y:E}=o.position;m+D.width>P-fe&&(m=P-D.width-fe),E+D.height>R-fe&&(E=R-D.height-fe),m<fe&&(m=fe),E<fe&&(E=fe),c.value={x:m,y:E}});const y=e.computed(()=>({left:c.value.x+"px",top:c.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:"🏁"}],N=e.computed(()=>{switch(o.sourceNodeType){case"start":return n.filter(x=>x.type==="dataSource");case"dataSource":return n.filter(x=>x.type==="smallModel"||x.type==="detectionTarget"||x.type==="classificationModel");case"smallModel":return n.filter(x=>x.type!=="dataSource"&&x.type!=="smallModel"&&x.type!=="targetCount"&&x.type!=="timerTarget");case"detectionTarget":case"classificationModel":return n.filter(x=>x.type!=="dataSource"&&x.type!=="smallModel");case"timerTarget":return n.filter(x=>["ocr","faceRecognition","licensePlate","end"].includes(x.type));case"targetCount":return n.filter(x=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(x.type));case"ocr":return n.filter(x=>["licensePlate","faceRecognition","end"].includes(x.type));case"licensePlate":return n.filter(x=>["ocr","faceRecognition","end"].includes(x.type));case"faceRecognition":return n.filter(x=>["ocr","licensePlate","end"].includes(x.type));default:return[]}});return(x,D)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[l.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",Yo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,P=>(e.openBlock(),e.createElementBlock("li",{key:P.type,class:"quick-add-menu__item",onClick:R=>x.$emit("select",P.type)},[e.createElementVNode("span",Qo,e.toDisplayString(P.icon),1),e.createElementVNode("span",Ko,e.toDisplayString(P.label),1)],8,Xo))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("li",Zo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),l.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:D[0]||(D[0]=P=>x.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),en={class:"workflow-canvas"},Xe=5,tn=ne({__name:"WorkflowCanvas",setup(l){const o=ae(),{screenToFlowCoordinate:t,findNode:c,onConnectStart:y,onConnectEnd:n}=ee.useVueFlow(),N=e.inject("editorConfig",null),x=e.inject("editorMode",oe.ALGORITHM),D=e.computed(()=>x===oe.TASK),P=e.inject("echoAlgodata",null),R=e.inject("echoTaskData",null),{importFromJSON:m,applyTaskData:E}=qt();e.watch(P,async d=>{if(d&&Object.keys(d).length>0&&(await e.nextTick(),await m(d),D.value)){const T=d?.ruleSchema?.sourceGroups??[];let U=null;if(T.some(X=>X.streamConfig)?U="stream":(T.length>1||T.some(X=>(X.children??[]).length>1))&&(U="image"),U){const X=o.nodes.find(W=>W.type===C.START);X&&o.updateNodeData(X.id,{streamType:U})}}},{immediate:!0}),e.watch(R,async d=>{D.value&&(!d||typeof d!="object"||Object.keys(d).length===0||o.nodes.length!==0&&await E())},{immediate:!1});const w=(d,T)=>{if(!T?.properties)return d;const U={};return Object.entries(T.properties).forEach(([X,W])=>{W.default!==void 0&&(U[X]=W.default)}),d.data.arguments={...U,...d.data.arguments},d},s=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),g=()=>{s.visible=!1,s.sourceNodeId=null,s.sourceNodeType=null,s.sourceHandleId=null,O=!1};let r=null,L=!1,q=null,p=null,O=!1;const b=()=>{q&&(document.removeEventListener("mousemove",q),q=null),p&&(document.removeEventListener("mouseup",p),p=null)};e.onUnmounted(()=>{b()}),y(({nodeId:d,handleId:T,handleType:U,event:X})=>{if(U!=="source")return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线");return}const W=o.nodes.find(Z=>Z.id===d);if(!W||W.type==="end")return;if(W.type===C.DATA_SOURCE&&W.data?.enableImageSequence){if(T&&o.edges.filter(re=>re.source===d&&re.sourceHandle===T).length>=1)return}else if(W.type!==C.START&&W.type!==C.DATA_SOURCE&&o.edges.filter(re=>re.source===d).length>=1)return;const Q=X?.target;let te=0,le=0;if(Q){const Z=Q.getBoundingClientRect();te=Z.right+12,le=Z.top-8}r={nodeId:d,sourceNodeType:W.type,handleId:T,menuX:te,menuY:le,flowPos:{...W.position}},L=!1;const pe=X?.clientX??0,F=X?.clientY??0;b(),q=Z=>{(Math.abs(Z.clientX-pe)>Xe||Math.abs(Z.clientY-F)>Xe)&&(L=!0,b())},p=()=>{if(b(),!L&&r){O=!0;const Z=r;s.visible=!0,s.screenPos={x:Z.menuX,y:Z.menuY},s.sourceNodeId=Z.nodeId,s.sourceNodeType=Z.sourceNodeType,s.sourceHandleId=Z.handleId,s.flowPos=Z.flowPos}r=null},document.addEventListener("mousemove",q),document.addEventListener("mouseup",p)});const S=d=>{const T=s.sourceNodeId,U=o.nodes.find(ce=>ce.id===T);if(!U){g();return}if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点"),g();return}const X=U.position.x+250,W=U.position.y;let Q={x:X,y:W};const te=60,le=80;let pe=0,F=!0;for(;F;){F=!1;const ce=W+pe;for(const ge of o.nodes)if(Math.abs(ge.position.x-X)<100&&Math.abs(ge.position.y-ce)<te+20){F=!0,pe+=le;break}}if(Q.y=W+pe,d==="end"){const ce=o.nodes.find(ge=>ge.type==="end");if(ce){if(o.edges.some(xe=>xe.source===T&&xe.target===ce.id)){v.ElMessage.warning("已经连接到结束节点"),g();return}const _e=_(U,ce);if(!_e.valid){v.ElMessage.warning(_e.message),g();return}o.addConnection({source:T,target:ce.id,sourceHandle:s.sourceHandleId||null,targetHandle:null}),G(),g(),v.ElMessage.success("已连接到结束节点");return}}let Z;switch(d){case"end":Z=Ee(Q);break;case"dataSource":Z=we(Q);break;case"smallModel":Z=De(Q);break;case"detectionTarget":Z=Le(Q);break;case"classificationModel":Z=Oe(Q);break;case"ocr":{const ce=N?.value??N;Z=w(Me(Q),ce?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const ce=N?.value??N;Z=w(Ie(Q),ce?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const ce=N?.value??N;Z=w(Fe(Q),ce?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":Z=Re(Q);break;case"timerTarget":Z=$e(Q);break;default:g();return}const re=_(U,Z);if(!re.valid){v.ElMessage.warning(re.message),g();return}o.addNode(Z),o.addConnection({source:T,target:Z.id,sourceHandle:s.sourceHandleId||null,targetHandle:null}),G(),g(),v.ElMessage.success(`已添加${Z.data.label}并连接`)},i=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],_=(d,T)=>{if(d?.parentNode&&T?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(T?.parentNode&&d?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(d?.type===C.START){if(T?.type!==C.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(W=>W.source===d.id).some(W=>o.nodes.find(te=>te.id===W.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(T?.type===C.SMALL_MODEL){if(d?.type!==C.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(Q=>Q.source===d.id).some(Q=>o.nodes.find(le=>le.id===Q.target)?.type!==C.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(d?.type===C.DATA_SOURCE){if(T?.type!==C.SMALL_MODEL&&T?.type!==C.DETECTION_TARGET&&T?.type!==C.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(Q=>Q.source===d.id).some(Q=>o.nodes.find(le=>le.id===Q.target)?.type===C.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(d?.type===C.SMALL_MODEL&&(T?.type===C.TARGET_COUNT||T?.type===C.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(d?.type===C.TARGET_COUNT&&![C.TIMER_TARGET,C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(T?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(d?.type===C.TIMER_TARGET&&![C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(T?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const U=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION];return U.includes(d?.type)&&!U.filter(W=>W!==d.type).concat(C.END).includes(T?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:T?.type!==C.END&&o.edges.filter(W=>W.target===T?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},B=e.markRaw({start:jt,end:Ut,dataSource:vt,smallModel:ro,detectionTarget:po,classificationModel:No,ocr:Eo,licensePlate:Ao,targetCount:Mo,timerTarget:qo,group:Ho,faceRecognition:Jo}),a=e.computed({get:()=>o.nodes,set:d=>{o.nodes=d}}),h=e.computed({get:()=>o.edges,set:d=>{o.edges=d}}),u=d=>{d.forEach(T=>{if(T.type==="position"&&T.position)o.updateNodePosition(T.id,T.position);else if(T.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除节点");return}const U=o.nodes.find(W=>W.id===T.id);if(U&&U.type===C.START){v.ElMessage.warning("开始节点不可删除");return}if(U&&U.type===C.END){v.ElMessage.warning("结束节点不可删除");return}if(U&&U.type==="group"){v.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const X=U?.parentNode;o.removeNode(T.id),X&&o.nodes.filter(Q=>Q.parentNode===X).length===0&&o.dissolveParallelGroup(X)}})},k=d=>{d.forEach(T=>{if(T.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(T.id)}})},I=d=>{if(O)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线"),g();return}const T=o.nodes.find(W=>W.id===d.source),U=o.nodes.find(W=>W.id===d.target),X=_(T,U);if(!X.valid){v.ElMessage.warning(X.message),g();return}if(T?.type===C.DATA_SOURCE&&T.data.enableImageSequence&&d.sourceHandle&&o.edges.filter(Q=>Q.source===d.source&&Q.sourceHandle===d.sourceHandle).length>=1){const Q=d.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";v.ElMessage.warning(`${Q}连接点只能连接一个节点`);return}if(i.includes(T?.type)&&!T.data.enableBranch&&o.edges.filter(Q=>Q.source===d.source).length>=1){v.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(d),G(),g()},z=d=>({and:"ALL",or:"SOME"})[d]||"ALL",A=d=>{const T=o.nodes.find(U=>U.id===d.source);if(!T)return"";if(T.type===C.START){const U=T.data.branchLogic||"and",X=z(U),W=d.data?.branchOrder;return W!=null?`${X} - 执行顺序 ${W}`:X}if(T.type===C.DATA_SOURCE){if(T.data?.enableImageSequence){const Q=d.sourceHandle==="first-frame"?"首帧":"后续帧",te=d.data?.branchOrder;return te!=null?`${Q} - 执行顺序 ${te}`:Q}const U=T.data.branchLogic||"and",X=z(U),W=d.data?.branchOrder;return W!=null?`${X} - 执行顺序 ${W}`:X}return""},G=()=>{o.edges.forEach(d=>{const T=A(d);d.label!==T&&(d.label=T,d.labelStyle=T?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,d.labelBgStyle=T?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,d.labelBgPadding=T?[4,6]:void 0)})},$=()=>{o.nodes.forEach(d=>{if(d.type!=="group")return;const T=d.data.sourceNodeId;if(!T)return;const U=o.nodes.find(X=>X.id===T);U?.data?.enableBranch&&U.data.branchLogic!==d.data.branchLogic&&o.updateNodeData(d.id,{branchLogic:U.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(d=>i.includes(d.type)).map(d=>({id:d.id,enableBranch:d.data.enableBranch,branchLogic:d.data.branchLogic})),(d,T)=>{T&&d.forEach(U=>{const X=T.find(W=>W.id===U.id);if(X){if(U.enableBranch&&!X.enableBranch){const W=o.nodes.find(Q=>Q.id===U.id);if(!W)return;o.createEmptyGroup({x:W.position.x+200,y:W.position.y-30},W.data.branchLogic||"and",U.id)}else if(!U.enableBranch&&X.enableBranch){const W=o.nodes.find(Q=>Q.type==="group"&&Q.data.sourceNodeId===U.id);W&&o.dissolveParallelGroup(W.id)}if(U.enableBranch&&X.branchLogic!==U.branchLogic){const W=o.nodes.find(Q=>Q.type==="group"&&Q.data.sourceNodeId===U.id);W&&o.updateNodeData(W.id,{branchLogic:U.branchLogic})}}})}),e.watch(()=>o.nodes.filter(d=>d.type!=="group").map(d=>({id:d.id,enableBranch:d.data.enableBranch,branchLogic:d.data.branchLogic,branchOrder:d.data.branchOrder})),()=>{G(),$()},{deep:!0}),e.watch(()=>o.edges.map(d=>({id:d.id,branchOrder:d.data?.branchOrder})),(d,T)=>{G(),T&&d.forEach(U=>{const X=T.find(W=>W.id===U.id);if(X&&X.branchOrder!==U.branchOrder&&U.branchOrder!==void 0){const W=o.edges.find(Q=>Q.id===U.id);if(W){const Q=o.nodes.find(te=>te.id===W.source);Q&&Q.type===C.DATA_SOURCE&&o.updateNodePosition(Q.id,{x:Q.position.x,y:Q.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([d,T])=>{o.nodes.forEach(U=>{d.has(U.id)?U.class="invalid-node":U.class==="invalid-node"&&(U.class="")}),o.edges.forEach(U=>{T.has(U.id)?U.class="invalid-edge":U.class==="invalid-edge"&&(U.class="")})},{deep:!0});const Y=d=>{d.event?.target?.closest(".vue-flow__handle")||o.selectNode(d.node.id)},f=d=>{o.selectEdge(d.edge.id)},M=d=>{if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(d.edge.id)},H=()=>{o.clearSelection()},J=({node:d})=>{if(d.type==="group"||!i.includes(d.type))return;const T=o.nodes.filter(X=>X.type==="group");let U=null;for(const X of T){const W=c(X.id);if(!W)continue;const Q=W.dimensions?.width||parseInt(X.style?.width)||300,te=W.dimensions?.height||parseInt(X.style?.height)||160;let le=d.position.x,pe=d.position.y;if(d.parentNode){const _e=o.nodes.find(xe=>xe.id===d.parentNode);_e&&(le+=_e.position.x,pe+=_e.position.y)}const F=c(d.id),Z=F?.dimensions?.width||160,re=F?.dimensions?.height||60,ce=le+Z/2,ge=pe+re/2;if(ce>=X.position.x&&ce<=X.position.x+Q&&ge>=X.position.y&&ge<=X.position.y+te){U=X.id;break}}U?d.parentNode!==U&&o.addNodeToGroup(d.id,U):d.parentNode&&o.removeNodeFromGroup(d.id)},j=d=>{d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move")},V=d=>{d.preventDefault();const T=d.dataTransfer?.getData("application/vueflow");if(!T)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点");return}if(T===C.START&&o.getNodeCountByType(C.START)>=1){v.ElMessage.warning("工作流只能有一个开始节点");return}if(T===C.END&&o.getNodeCountByType(C.END)>=1){v.ElMessage.warning("工作流只能有一个结束节点");return}const U=160,X=60,W=t({x:d.clientX,y:d.clientY}),Q={x:W.x-U/2,y:W.y-X/2};let te;switch(T){case C.START:te=Ae(Q);break;case C.END:te=Ee(Q);break;case C.DATA_SOURCE:te=we(Q);break;case C.SMALL_MODEL:te=De(Q);break;case C.DETECTION_TARGET:te=Le(Q);break;case C.CLASSIFICATION_MODEL:te=Oe(Q);break;case C.OCR:{const le=N?.value??N;te=w(Me(Q),le?.ocr?.[0]?.inputSchema);break}case C.LICENSE_PLATE:{const le=N?.value??N;te=w(Ie(Q),le?.license_plate?.[0]?.inputSchema);break}case C.TARGET_COUNT:te=Re(Q);break;case C.TIMER_TARGET:te=$e(Q);break;case C.FACE_RECOGNITION:{const le=N?.value??N;te=w(Fe(Q),le?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(te),v.ElMessage.success("节点已添加")};return(d,T)=>(e.openBlock(),e.createElementBlock("div",en,[e.createVNode(e.unref(ee.VueFlow),{nodes:a.value,"onUpdate:nodes":T[0]||(T[0]=U=>a.value=U),edges:h.value,"onUpdate:edges":T[1]||(T[1]=U=>h.value=U),"node-types":e.unref(B),onNodesChange:u,onEdgesChange:k,onConnect:I,onNodeClick:Y,onEdgeClick:f,onEdgeDoubleClick:M,onPaneClick:H,onDrop:V,onDragover:j,onNodeDragStop:J,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(tt.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(ot.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(vo,{visible:s.visible,position:s.screenPos,"source-node-type":s.sourceNodeType,onSelect:S,onClose:g},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-e813f8fb"]]),on={class:"config-header"},nn={key:0,class:"config-section"},an={key:1,class:"config-section"},ln=ne({__name:"EdgeConfig",setup(l){const o=ae(),t=e.inject("editorMode",oe.ALGORITHM),c=e.computed(()=>t===oe.TASK),y=e.computed(()=>{const R=o.selectedEdge;return R&&o.nodes.find(E=>E.id===R.source)?.data?.enableBranch?R:null}),n=e.computed(()=>y.value&&o.nodes.find(m=>m.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),N=e.computed(()=>{if(!y.value)return!1;const R=o.nodes.find(m=>m.id===y.value.source);return(R?.type==="dataSource"||R?.type==="start")&&R?.data?.enableBranch}),x=e.computed(()=>{if(!y.value)return 1;const R=o.nodes.find(m=>m.id===y.value.source);return R?o.edges.filter(m=>m.source===R.id).length:1}),D=e.computed(()=>{if(!y.value)return!1;const R=o.nodes.find(m=>m.id===y.value.source);return R?R.type==="dataSource"&&R.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),P=R=>{y.value&&o.updateEdgeData(y.value.id,R)};return(R,m)=>{const E=e.resolveComponent("el-divider"),w=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-text"),g=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),q=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",on,[e.createElementVNode("h3",null,e.toDisplayString(n.value),1)]),e.createVNode(E),D.value?(e.openBlock(),e.createElementBlock("div",nn,[m[3]||(m[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(w,{"model-value":y.value?.data?.timeWindowSeconds??null,onChange:m[0]||(m[0]=p=>P({timeWindowSeconds:p})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(s,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...m[2]||(m[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),N.value?(e.openBlock(),e.createElementBlock("div",an,[m[5]||(m[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":y.value?.data?.branchOrder??null,disabled:c.value,onChange:m[1]||(m[1]=p=>P({branchOrder:p})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,p=>(e.openBlock(),e.createBlock(L,{key:p,label:`执行顺序 ${p}`,value:p},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(s,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...m[4]||(m[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),rn={class:"config-section"},sn=ne({__name:"GroupNodeConfig",setup(l){return(o,t)=>{const c=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(c),e.createElementVNode("div",rn,[e.createVNode(y,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),cn={class:"time-init-container"},dn={key:0,class:"time-header flex-x-start"},mn={class:"tab-type flex-x"},pn={class:"time-content"},un={id:"time-content-table-body"},fn=["onClick"],gn=["onClick"],hn=["data-sort","data-value","data-day","data-type","onMousedown"],yn={key:1},_n=["data-sort","data-value","data-type","onMousedown"],Nn={class:"time-list"},Cn={key:0,class:"time-list-title"},kn={key:1,style:{"margin-right":"10px"}},bn=ne({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(l,{expose:o}){const t=l,c=e.ref(0);let y,n,N,x,D;const P=e.ref(new Map),R=e.ref(new Map),m=e.computed(()=>c.value===0?P.value:R.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",r)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",r)});const E=u=>{c.value!==u&&(c.value=u,e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),n.forEach(I=>I.classList.remove("selected")),(u===0?P.value:R.value).forEach((I,z)=>{I.origin.forEach(A=>{Array.from(n).forEach(G=>{Number(G.dataset.sort)==A.sort&&Number(G.dataset.value)==A.value&&Number(G.dataset.day)==z&&G.classList.add("selected")})})})}))},w=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}]),s=(u,k,I)=>{t.operationType!=3&&I.which==1&&(x=u,N=Number(I.target.dataset.value),I.target.classList.contains("selected")?(I.target.classList.remove("selected"),D=""):(D="selected",I.target.classList.add("selected")),g(),b())},g=()=>{n.forEach(u=>{u.addEventListener("mouseover",L,!1,{once:!0})})},r=()=>{n.forEach(u=>{u.removeEventListener("mouseover",L)})},L=u=>{u.target.classList.remove("selected"),D&&u.target.classList.add(D);let k=Number(u.target.dataset.value),I=Number(u.target.dataset.day),z=I>x?I:x,A=I<x?I:x,G=k>N?k:N,$=k<N?k:N;for(let Y=A;Y<=z;Y++)for(let f=$;f<=G;f++){let M=document.querySelector(`td[data-value="${f}"][data-day="${Y}"]`);M.classList.remove("selected"),D&&M.classList.add(D)}b()},q=u=>{if(t.operationType==3)return;let k=[];n.forEach(I=>{Number(I.dataset.day)==u&&k.push(I)}),k.find(I=>!I.classList.contains("selected"))?k.forEach(I=>I.classList.add("selected")):k.forEach(I=>I.classList.remove("selected")),b()},p=u=>{if(t.operationType==3)return;let k=[];n.forEach(I=>{Number(I.dataset.sort)==u&&k.push(I)}),k.find(I=>!I.classList.contains("selected"))?k.forEach(I=>I.classList.add("selected")):k.forEach(I=>I.classList.remove("selected")),b()},O=()=>{n.forEach(k=>{k.classList.remove("selected")}),(c.value===0?P:R).value.clear()},b=()=>{const u=c.value===0?P:R;u.value.clear(),n.forEach(k=>{if(k.classList.contains("selected")){let I=k.dataset.day,z=k.dataset.sort,A=k.dataset.value;u.value.get(I)?u.value.get(I).origin.push({sort:Number(z),value:Number(A)}):u.value.set(I,{origin:[{sort:Number(z),value:Number(A)}],timeList:[]})}})},S=u=>{let z=m.value.get(u).origin.map(A=>A.value).reduce((A,G,$,Y)=>($==0?A.push([G]):G==Y[$-1]+1?A[A.length-1].push(G):A.push([G]),A),[]);return z=z.map(A=>{let G=Math.max(...A)+1,$=Math.min(...A)+1,Y=$%2==0?30:0,f=G%2==0?0:30,M=i(Math.ceil($/2)-1),H=i(Math.ceil(G/2)-(f==0?0:1));return{dayType:u,startTime:M+":"+(Y==0?"00":Y),endTime:H+":"+(f==0?"00":f)}}),m.value.get(u).timeList=z,z.map(A=>A.startTime+"-"+A.endTime).join()};function i(u){return u<10?"0"+u:u}const _=(u,k)=>{P.value.clear(),R.value.clear(),n.forEach(G=>G.classList.remove("selected")),c.value=k;const I=k===0?P:R,z=JSON.parse(u);let A=[];z.plan.forEach(G=>{G.timePeriod.forEach($=>{A.push({...$,dayType:G.dayType})})}),e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),A.forEach(G=>{I.value.get(G.dayType)?I.value.get(G.dayType).timeList.push(G):I.value.set(G.dayType,{origin:[],timeList:[{...G}]})}),I.value.forEach((G,$)=>{G.timeList.forEach(Y=>{let f=Number(Y.startTime.split(":")[1]),M=Number(Y.endTime.split(":")[1]),H=Number(Y.startTime.split(":")[0]),J=Number(Y.endTime.split(":")[0]);if(H==J){G.origin.push({sort:H,value:2*H});return}for(let j=H;j<=J;j++)if(j==H)f==0?(G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1})):G.origin.push({sort:j,value:2*j+1});else if(j>H&&j<J)G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1});else if(M==0){if(j==J)return;G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1})}else G.origin.push({sort:j,value:2*j})}),G.origin.forEach(Y=>{Array.from(n).find(f=>{Number(f.dataset.sort)==Y.sort&&Number(f.dataset.value)==Y.value&&Number(f.dataset.day)==$&&f.classList.add("selected")})})})})},B=(u,k)=>u.map(A=>A.value).sort((A,G)=>A-G).reduce((A,G,$,Y)=>($==0?A.push([G]):G==Y[$-1]+1?A[A.length-1].push(G):A.push([G]),A),[]).map(A=>{let G=Math.max(...A)+1,$=Math.min(...A)+1,Y=$%2==0?30:0,f=G%2==0?0:30,M=i(Math.ceil($/2)-1),H=i(Math.ceil(G/2)-(f==0?0:1));return{dayType:k,startTime:M+":"+(Y==0?"00":Y),endTime:H+":"+(f==0?"00":f)}});return o({getTimeData:()=>{(c.value===0?R:P).value.clear();let k=[];m.value.forEach((A,G)=>{const $=B(A.origin,G);k=k.concat($)});let I={plan:[]},z=k.map(A=>A.dayType).filter((A,G,$)=>$.indexOf(A)===G);return z.length?(z.forEach(A=>{I.plan.push({dayType:A,timePeriod:k.filter(G=>G.dayType===A).map(G=>({startTime:G.startTime,endTime:G.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(I),planType:c.value}):{validTime:!1}},revertByTime:_,resetFn:()=>{c.value=0,P.value.clear(),R.value.clear(),e.nextTick(()=>{n.forEach(u=>{u.classList.remove("selected")}),n=y.querySelectorAll("td.sel-able[data-type]")})}}),(u,k)=>{const I=e.resolveComponent("el-icon"),z=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",cn,[l.operationType!=3?(e.openBlock(),e.createElementBlock("div",dn,[e.createElementVNode("div",mn,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==0}]),onClick:k[0]||(k[0]=A=>E(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==1}]),onClick:k[1]||(k[1]=A=>E(1))}," 日计划 ",2)]),e.createVNode(z,{class:"rm-icon",link:"",type:"danger",onClick:O},{default:e.withCtx(()=>[e.createVNode(I,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",pn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:k[3]||(k[3]=A=>A.preventDefault())},[k[5]||(k[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",un,[e.createElementVNode("tr",null,[k[4]||(k[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:G=>p(A-1)},e.toDisplayString(A-1),9,fn)),64))]),c.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(w.value.filter(A=>A.value!=0),A=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:G=>q(A.value)},e.toDisplayString(A.name),9,gn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,G=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((G-1)/2),"data-value":G-1,"data-day":A.value,"data-type":c.value,onMousedown:$=>s(A.value,G,$)},null,40,hn)),64))]))),256)):e.createCommentVNode("",!0),c.value==1?(e.openBlock(),e.createElementBlock("tr",yn,[e.createElementVNode("th",{onClick:k[2]||(k[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":c.value,onMousedown:G=>s(0,A,G)},null,40,_n)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",Nn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value.keys(),A=>(e.openBlock(),e.createElementBlock("div",null,[c.value==0?(e.openBlock(),e.createElementBlock("span",Cn,[k[6]||(k[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(w.value.find(G=>G.value==A).name),1)])):(e.openBlock(),e.createElementBlock("span",kn,e.toDisplayString(w.value.find(G=>G.value==A).name),1)),e.createTextVNode(" ("+e.toDisplayString(S(A))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),xn={class:"time-template-dialog"},En={class:"time-editor-panel"},wn=ne({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(l,{expose:o,emit:t}){const c=l,y=t,n=e.ref(null),N=e.ref(""),x=e.ref(""),D=e.ref(c.modelValue?.timeTemplateName||""),P=e.ref([]);return e.computed(()=>N.value?P.value.filter(E=>E.name.toLowerCase().includes(N.value.toLowerCase())):P.value),e.watch(D,E=>{y("update:modelValue",{...c.modelValue,timeTemplateName:E})}),o({getFormData:()=>{const E=n.value?.getTimeData();return{timeTemplateId:x.value,timeTemplateName:D.value,...E}},revertByTime:(E,w)=>{n.value?.revertByTime(E,w)}}),(E,w)=>(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",xn,[e.createCommentVNode("",!0),e.createElementVNode("div",En,[e.createCommentVNode("",!0),e.createVNode(bn,{ref_key:"timeInitRef",ref:n},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),Tn={class:"config-section"},Sn={key:0,class:"config-section"},Vn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},Bn={class:"config-section"},An=ne({__name:"StartNodeConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("echoAlgodata",null),N=e.computed(()=>{const s=(n?.value??n)?.ruleSchema?.sourceGroups??[];if(s.some(L=>L.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const g=s.length>1,r=s.some(L=>(L.children??[]).length>1);return g||r?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(N,w=>{w.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:w.value})},{immediate:!0});const x=e.ref(!1),D=e.ref(null),P=()=>{const w=D.value?.getFormData();if(w?.validTime){const g=(JSON.parse(w.timeZone)?.plan??[]).map(r=>({dayType:String(r.dayType),timePeriod:r.timePeriod.map(L=>({startTime:L.startTime,endTime:L.endTime}))}));o.updateNodeData(t.value.id,{executionTime:w.timeZone,schedule:g,timeZone:w.timeZone,planType:w.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});x.value=!1},R=()=>{const w=t.value?.data;w?.timeZone&&D.value?.revertByTime(w.timeZone,w.planType??0)},m=e.computed(()=>t.value?o.edges.filter(s=>s.source===t.value.id).length>=2:!1),E=w=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:w})};return(w,s)=>{const g=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input"),L=e.resolveComponent("el-form-item"),q=e.resolveComponent("el-form"),p=e.resolveComponent("el-option"),O=e.resolveComponent("el-select"),b=e.resolveComponent("el-switch"),S=e.resolveComponent("el-button"),i=e.resolveComponent("el-dialog"),_=e.resolveComponent("el-icon"),B=e.resolveComponent("el-tooltip"),a=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[s[15]||(s[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(g),e.createElementVNode("div",Tn,[s[9]||(s[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(r,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:s[0]||(s[0]=h=>E(h)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",Sn,[s[10]||(s[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(r,{"model-value":t.value?.data.taskName,onInput:s[1]||(s[1]=h=>e.unref(o).updateNodeData(t.value.id,{taskName:h})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":N.value.locked?N.value.value:t.value?.data.streamType||"image",disabled:N.value.locked,onChange:s[2]||(s[2]=h=>e.unref(o).updateNodeData(t.value.id,{streamType:h})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(p,{label:"图片流",value:"image"}),e.createVNode(p,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),N.value.locked?(e.openBlock(),e.createElementBlock("div",Vn,e.toDisplayString(N.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(L,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(b,{"model-value":t.value?.data.enableAlertVideo,onChange:s[3]||(s[3]=h=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:h}))},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:s[4]||(s[4]=h=>x.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(i,{modelValue:x.value,"onUpdate:modelValue":s[6]||(s[6]=h=>x.value=h),title:"执行时段",width:"1200px","append-to-body":"",onOpened:R},{footer:e.withCtx(()=>[e.createVNode(S,{onClick:s[5]||(s[5]=h=>x.value=!1)},{default:e.withCtx(()=>[...s[11]||(s[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(S,{type:"primary",onClick:P},{default:e.withCtx(()=>[...s[12]||(s[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(wn,{ref_key:"timeTemplateRef",ref:D},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",Bn,[s[14]||(s[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(O,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:s[7]||(s[7]=h=>e.unref(o).updateNodeData(t.value.id,{branchLogic:h})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(p,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(p,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),m.value?(e.openBlock(),e.createBlock(L,{key:0},{label:e.withCtx(()=>[s[13]||(s[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(B,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(_,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(a,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:s[8]||(s[8]=h=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:h})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),Dn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Ln=["smallModel","detectionTarget"],Se=()=>({schemaLoading:e.ref(!1),getToolType:n=>Dn[n]||null,needsToolSelection:n=>Ln.includes(n),fetchToolSchema:async(n,N="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(n,N="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),On={key:0,class:"config-section"},Mn={key:3,class:"array-input"},In={key:1,class:"config-section"},Rn=ne({__name:"EndNodeConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:c,fetchSchemaForNodeType:y}=Se(),n=e.computed(()=>{if(!t.value)return[];const m=t.value.data.input_schema||t.value.data.inputSchema;if(!m||!m.properties)return[];const E=m.required||[];return Object.entries(m.properties).map(([w,s])=>({key:w,type:s.type,label:s.title||s.label||s.description||w,description:s.description||"",default:s.default,required:E.includes(w)||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}))}),N=m=>{if(t.value)return t.value.data.arguments?.[m]},x=(m,E)=>{if(!t.value)return;const s={...t.value.data.arguments||{},[m]:E};o.updateNodeData(t.value.id,{arguments:s})},D=m=>{if(!m.dependsOn||!t.value)return!0;const{field:E,value:w}=m.dependsOn,s=N(E);if(typeof w=="string"&&w.startsWith("!")){const g=w.substring(1);return s!==g}return Array.isArray(w)?w.includes(s):s===w},P=m=>{const E=N(m);return Array.isArray(E)?JSON.stringify(E):""},R=(m,E)=>{try{const w=JSON.parse(E);Array.isArray(w)&&x(m,w)}catch{}};return e.watch(()=>t.value?.id,async m=>{if(!m||!t.value)return;const E=t.value.type,w=t.value.data,s=w.input_schema||w.inputSchema;if(s&&s.properties&&Object.keys(s.properties).length>0)return;const g=await y(E);if(!g)return;const r=t.value?.data;r&&o.updateNodeData(t.value.id,{...r,input_schema:g.inputSchema,extraConfig:g.extraConfig,arguments:{...g.arguments,...r.arguments}})},{immediate:!0}),(m,E)=>{const w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-icon"),g=e.resolveComponent("el-tooltip"),r=e.resolveComponent("el-option"),L=e.resolveComponent("el-select"),q=e.resolveComponent("el-switch"),p=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-input"),b=e.resolveComponent("el-form-item"),S=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[E[2]||(E[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(w),n.value.length>0?(e.openBlock(),e.createElementBlock("div",On,[E[0]||(E[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,i=>e.withDirectives((e.openBlock(),e.createBlock(b,{key:i.key,required:i.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(i.label),1),i.description?(e.openBlock(),e.createBlock(g,{key:0,content:i.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(s,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[i.options&&i.type==="string"?(e.openBlock(),e.createBlock(L,{key:0,"model-value":N(i.key),onChange:_=>x(i.key,_),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.options,(_,B)=>(e.openBlock(),e.createBlock(r,{key:_,label:i.optionLabels?i.optionLabels[B]:_,value:_},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):i.type==="boolean"?(e.openBlock(),e.createBlock(q,{key:1,"model-value":N(i.key),onChange:_=>x(i.key,_)},null,8,["model-value","onChange"])):i.type==="number"||i.type==="integer"?(e.openBlock(),e.createBlock(p,{key:2,"model-value":N(i.key),onChange:_=>x(i.key,_),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"])):i.type==="array"&&!i.options?(e.openBlock(),e.createElementBlock("div",Mn,[e.createVNode(O,{"model-value":P(i.key),onChange:_=>R(i.key,_),type:"textarea",rows:3,placeholder:i.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):i.type==="array"&&i.options?(e.openBlock(),e.createBlock(L,{key:4,"model-value":N(i.key),onChange:_=>x(i.key,_),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.options,(_,B)=>(e.openBlock(),e.createBlock(r,{key:_,label:i.optionLabels?i.optionLabels[B]:_,value:_},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(O,{key:5,"model-value":N(i.key),onInput:_=>x(i.key,_),maxlength:i.maxLength,"show-word-limit":!!i.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!i.dependsOn||D(i)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(c)&&n.value.length===0?(e.openBlock(),e.createElementBlock("div",In,[...E[1]||(E[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),$n={class:"config-header"},Fn={class:"config-section"},qn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Gn={key:0,class:"config-section"},Hn={key:3,class:"array-input"},jn={key:1,class:"config-section"},Pn={key:2,class:"config-section"},zn=ne({__name:"ClassificationModelConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.classification?.models??[]),x=e.computed(()=>(n?.value??n)?.classification?.modelParams??null),D=e.ref([]),P=e.ref(!1),R=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:b=>{t.value&&b&&r("modelId",b)}}),m=()=>{D.value=N.value},E=async b=>{if(!t.value||!b)return;const S=D.value.find(a=>a.id===b);if(!S)return;const i=t.value?.data;if(!i)return;const _=S.inputSchema||S.input_schema||x.value?.inputSchema||{},B={};_.properties&&Object.entries(_.properties).forEach(([a,h])=>{h.default!==void 0&&(B[a]=h.default)}),o.updateNodeData(t.value.id,{...i,input_schema:_,extraConfig:S.extraConfig||null,arguments:{...B,modelId:S.id,modelName:S.name}})},w=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},s=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(([i,_])=>({key:i,type:_.type,label:_.title||_.label||_.description||i,description:_.description||"",default:_.default,required:S.includes(i)||_.required||!1,min:_.minimum!==void 0?_.minimum:_.min,max:_.maximum!==void 0?_.maximum:_.max,step:_.step,maxLength:_.maxLength,options:_.enum,optionLabels:_.enumLabels||_.enum,dependsOn:_.dependsOn,sort:_.sort,hidden:_["x-hidden"]||!1})).filter(i=>!i.hidden).sort((i,_)=>(i.sort??1/0)-(_.sort??1/0))}),g=b=>{if(t.value)return t.value.data.arguments?.[b]},r=(b,S)=>{if(!t.value)return;const _={...t.value.data.arguments||{},[b]:S};o.updateNodeData(t.value.id,{arguments:_})},L=b=>{if(!b.dependsOn||!t.value)return!0;const{field:S,value:i}=b.dependsOn,_=g(S);if(typeof i=="string"&&i.startsWith("!")){const B=i.substring(1);return _!==B}return Array.isArray(i)?i.includes(_):_===i},q=b=>{const S=g(b);return Array.isArray(S)?JSON.stringify(S):""},p=(b,S)=>{try{const i=JSON.parse(S);Array.isArray(i)&&r(b,i)}catch{}},O=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async b=>{if(!b||!t.value)return;D.value.length===0&&m();const S=t.value.data,i=S.input_schema||S.inputSchema,_=S.arguments?.modelId;if(_&&i&&i.properties&&Object.keys(i.properties).length>0||!_)return;const B=D.value.find(k=>k.id===_);if(!B)return;const a=B.inputSchema||B.input_schema||x.value?.inputSchema||{},h={};a.properties&&Object.entries(a.properties).forEach(([k,I])=>{I.default!==void 0&&(h[k]=I.default)});const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:a,extraConfig:B.extraConfig||null,arguments:{...h,...u.arguments}})},{immediate:!0}),(b,S)=>{const i=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),B=e.resolveComponent("el-option"),a=e.resolveComponent("el-select"),h=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form"),k=e.resolveComponent("el-icon"),I=e.resolveComponent("el-tooltip"),z=e.resolveComponent("el-switch"),A=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",$n,[S[1]||(S[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Fn,[S[2]||(S[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(a,{modelValue:R.value,"onUpdate:modelValue":S[0]||(S[0]=$=>R.value=$),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:P.value,disabled:y.value,onChange:E,onClear:w},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,$=>(e.openBlock(),e.createBlock(B,{key:$.id,label:$.name,value:$.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),D.value.length===0&&!P.value?(e.openBlock(),e.createElementBlock("div",qn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),R.value&&s.value.length>0?(e.openBlock(),e.createElementBlock("div",Gn,[S[3]||(S[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,$=>e.withDirectives((e.openBlock(),e.createBlock(h,{key:$.key,required:$.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString($.label),1),$.description?(e.openBlock(),e.createBlock(I,{key:0,content:$.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[$.options&&$.type==="string"?(e.openBlock(),e.createBlock(a,{key:0,"model-value":g($.key),disabled:y.value&&$.key!=="threshold",onChange:Y=>r($.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(Y,f)=>(e.openBlock(),e.createBlock(B,{key:Y,label:$.optionLabels?$.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):$.type==="boolean"?(e.openBlock(),e.createBlock(z,{key:1,"model-value":g($.key),disabled:y.value&&$.key!=="threshold",onChange:Y=>r($.key,Y)},null,8,["model-value","disabled","onChange"])):$.type==="number"||$.type==="integer"?(e.openBlock(),e.createBlock(A,{key:2,"model-value":g($.key),disabled:y.value&&$.key!=="threshold",onChange:Y=>r($.key,Y),min:$.min,max:$.max,step:$.step||($.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):$.type==="array"&&!$.options?(e.openBlock(),e.createElementBlock("div",Hn,[e.createVNode(G,{"model-value":q($.key),disabled:y.value&&$.key!=="threshold",onChange:Y=>p($.key,Y),type:"textarea",rows:3,placeholder:$.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):$.type==="array"&&$.options?(e.openBlock(),e.createBlock(a,{key:4,"model-value":g($.key),disabled:y.value&&$.key!=="threshold",onChange:Y=>r($.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(Y,f)=>(e.openBlock(),e.createBlock(B,{key:Y,label:$.optionLabels?$.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":g($.key),disabled:y.value&&$.key!=="threshold",onInput:Y=>r($.key,Y),maxlength:$.maxLength,"show-word-limit":!!$.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!$.dependsOn||L($)]])),128))]),_:1})])):e.createCommentVNode("",!0),R.value&&P.value&&s.value.length===0?(e.openBlock(),e.createElementBlock("div",jn,[...S[4]||(S[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!R.value&&!P.value?(e.openBlock(),e.createElementBlock("div",Pn,[...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"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn=ne({__name:"OcrConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.ocr?.[0]?.inputSchema??null),x=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(R,m)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[R]:m}})},P=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,R=>{if(!R||!t.value)return;const m=N.value,E=t.value.data.arguments||{},w={};m?.properties&&Object.entries(m.properties).forEach(([s,g])=>{g.default!==void 0&&(w[s]=g.default)}),o.updateNodeData(t.value.id,{arguments:{...w,...E}})},{immediate:!0}),(R,m)=>{const E=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[m[1]||(m[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:P},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",Wn,[m[2]||(m[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":x.value,onChange:m[0]||(m[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Yn={class:"config-header"},Xn={class:"config-section"},Qn=ne({__name:"LicensePlateConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.license_plate?.[0]?.inputSchema??null),x=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(R,m)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[R]:m}})},P=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,R=>{if(!R||!t.value)return;const m=N.value,E=t.value.data.arguments||{},w={};m?.properties&&Object.entries(m.properties).forEach(([s,g])=>{g.default!==void 0&&(w[s]=g.default)}),o.updateNodeData(t.value.id,{arguments:{...w,...E}})},{immediate:!0}),(R,m)=>{const E=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yn,[m[1]||(m[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:P},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",Xn,[m[2]||(m[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":x.value,onChange:m[0]||(m[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Kn={class:"config-header"},Zn={class:"config-section"},vn={key:0,class:"config-section"},Qe=ne({__name:"FaceConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.face?.faceRepos??[]),x=e.ref(null),D=e.computed(()=>({repositoryId:E.value})),P={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},R=e.computed(()=>t.value?.data.arguments?.threshold??.5),m=g=>t.value?.data.arguments?.[g],E=e.computed(()=>{const g=m("repositoryId");return g?Array.isArray(g)?g:[g]:[]}),w=(g,r)=>{if(!t.value)return;const L=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...L,[g]:r}})},s=()=>{t.value&&v.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 L=(n?.value??n)?.face?.faceParams?.[0]?.inputSchema??null,q=t.value.data.arguments||{},p={};L?.properties&&Object.entries(L.properties).forEach(([O,b])=>{b.default!==void 0&&(p[O]=b.default)}),o.updateNodeData(t.value.id,{arguments:{...p,...q}})},{immediate:!0}),(g,r)=>{const L=e.resolveComponent("el-button"),q=e.resolveComponent("el-divider"),p=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-form-item"),b=e.resolveComponent("el-form"),S=e.resolveComponent("el-option"),i=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Kn,[r[2]||(r[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",Zn,[r[3]||(r[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(b,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":R.value,onChange:r[0]||(r[0]=_=>w("threshold",_)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(c)==="task"?(e.openBlock(),e.createElementBlock("div",vn,[r[4]||(r[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(b,{model:D.value,rules:P,ref_key:"faceFormRef",ref:x,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":E.value,onChange:r[1]||(r[1]=_=>w("repositoryId",_)),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(N.value,_=>(e.openBlock(),e.createBlock(S,{key:_.id,label:_.name,value:_.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),ea={class:"config-header"},ta={key:0,class:"config-section"},oa={key:3,class:"array-input"},na={key:1,class:"config-section"},aa=ne({__name:"StreamConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),{schemaLoading:n,fetchSchemaForNodeType:N}=Se(),x=e.computed(()=>{if(!t.value)return[];const s=t.value.data.input_schema||t.value.data.inputSchema;if(!s||!s.properties)return[];const g=s.required||[];return Object.entries(s.properties).map(([r,L])=>({key:r,type:L.type,label:L.title||L.label||L.description||r,description:L.description||"",default:L.default,required:g.includes(r)||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((r,L)=>(r.sort??1/0)-(L.sort??1/0))}),D=s=>{if(t.value)return t.value.data.arguments?.[s]},P=(s,g)=>{if(!t.value)return;const L={...t.value.data.arguments||{},[s]:g};o.updateNodeData(t.value.id,{arguments:L})},R=s=>{if(!s.dependsOn||!t.value)return!0;const{field:g,value:r}=s.dependsOn,L=D(g);if(typeof r=="string"&&r.startsWith("!")){const q=r.substring(1);return L!==q}return Array.isArray(r)?r.includes(L):L===r},m=s=>{const g=D(s);return Array.isArray(g)?JSON.stringify(g):""},E=(s,g)=>{try{const r=JSON.parse(g);Array.isArray(r)&&P(s,r)}catch{}},w=()=>{t.value&&v.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 g=t.value.type,r=t.value.data,L=r.input_schema||r.inputSchema;if(L&&L.properties&&Object.keys(L.properties).length>0)return;const q=await N(g);if(!q)return;const p=t.value?.data;p&&o.updateNodeData(t.value.id,{...p,input_schema:q.inputSchema,extraConfig:q.extraConfig,arguments:{...q.arguments,...p.arguments}})},{immediate:!0}),(s,g)=>{const r=e.resolveComponent("el-button"),L=e.resolveComponent("el-divider"),q=e.resolveComponent("el-icon"),p=e.resolveComponent("el-tooltip"),O=e.resolveComponent("el-option"),b=e.resolveComponent("el-select"),S=e.resolveComponent("el-switch"),i=e.resolveComponent("el-input-number"),_=e.resolveComponent("el-input"),B=e.resolveComponent("el-form-item"),a=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ea,[g[0]||(g[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(r,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:w},null,8,["icon"]))]),e.createVNode(L),x.value.length>0?(e.openBlock(),e.createElementBlock("div",ta,[g[1]||(g[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,h=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.description?(e.openBlock(),e.createBlock(p,{key:0,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(b,{key:0,"model-value":D(h.key),onChange:u=>P(h.key,u),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(u,k)=>(e.openBlock(),e.createBlock(O,{key:u,label:h.optionLabels?h.optionLabels[k]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(S,{key:1,"model-value":D(h.key),onChange:u=>P(h.key,u)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"?(e.openBlock(),e.createBlock(i,{key:2,"model-value":D(h.key),onChange:u=>P(h.key,u),min:h.min,max:h.max,step:h.step||(h.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",oa,[e.createVNode(_,{"model-value":m(h.key),onChange:u=>E(h.key,u),type:"textarea",rows:3,placeholder:h.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(b,{key:4,"model-value":D(h.key),onChange:u=>P(h.key,u),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(u,k)=>(e.openBlock(),e.createBlock(O,{key:u,label:h.optionLabels?h.optionLabels[k]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(_,{key:5,"model-value":D(h.key),onInput:u=>P(h.key,u),maxlength:h.maxLength,"show-word-limit":!!h.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||R(h)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(n)&&x.value.length===0?(e.openBlock(),e.createElementBlock("div",na,[...g[2]||(g[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),la={class:"config-header"},ra={class:"config-section"},sa={key:0,class:"config-section"},ia={key:1,class:"config-section"},ca={key:0,class:"el-form-item__error"},da={key:2,class:"config-section"},ma={key:3,class:"config-section"},pa={key:4,class:"config-section"},ua=ne({__name:"DataSourceConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.inject("taskModeConfig",null),n=e.computed(()=>c==="task"),N=e.computed(()=>r("deviceType")??"camera"),x=e.computed(()=>{const B=o.nodes.find(h=>h.type===C.START);return B?.data?.streamType?B.data.streamType:(y?.value??y)?.streamType??"image"}),D=e.computed(()=>{const B=y?.value??y,a=t.value?.id;return B?.datasource?.getDevices?.(a)?.length??0}),P=()=>{const B=y?.value??y,a=t.value?.id,h=t.value?.data?.label??"",u=B?.datasource?.getDevices?.(a)??[],k=o.nodes.filter(z=>z.type===C.DATA_SOURCE).findIndex(z=>z.id===a),I=t.value?.data?.sourceGroupId??B?.datasource?.getSourceGroupIdByIndex?.(k)??a;B?.datasource?.onDeviceClick?.(a,h,I,u,N.value)},{fetchSchemaForNodeType:R}=Se(),m=e.computed(()=>o.nodes.some(B=>B.type===C.SMALL_MODEL)),E=e.computed(()=>o.getDataSourceCount()>=2),w=e.computed(()=>!o.supportPatrol()),s=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),g=e.computed(()=>{if(!t.value)return[];const B=t.value.data.input_schema||t.value.data.inputSchema;if(!B||!B.properties)return[];const a=B.required||[];return Object.entries(B.properties).map(([h,u])=>({key:h,type:u.type,label:u.title||u.label||u.description||h,description:u.description||"",default:u.default,required:a.includes(h)||u.required||!1,min:u.minimum!==void 0?u.minimum:u.min,max:u.maximum!==void 0?u.maximum:u.max,step:u.step,maxLength:u.maxLength,options:u.enum,optionLabels:u.enumLabels||u.enum,dependsOn:u.dependsOn}))}),r=B=>{if(t.value)return t.value.data.arguments?.[B]},L=e.computed(()=>!!r("enableImageSequence")),q=e.computed(()=>!!r("needCooperativeDetection")),p=(B,a)=>{if(!t.value)return;const u={...t.value.data.arguments||{},[B]:a};o.updateNodeData(t.value.id,{arguments:u})},O=async B=>{if(!t.value)return;if(o.edges.some(h=>h.source===t.value.id))try{await v.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(u=>u.source===t.value.id).forEach(u=>{o.removeEdge(u.id)}),B&&p("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:B}),p("enableImageSequence",B),B&&o.initializeSubsequentFrames(t.value.id)}catch{return}else B&&p("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:B}),p("enableImageSequence",B),B&&o.initializeSubsequentFrames(t.value.id)},b=B=>{t.value&&(B&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),p("enableImageSequence",!1),p("enablePatrol",!1)),p("needCooperativeDetection",B))};e.watch(x,B=>{B==="stream"&&t.value&&r("deviceType")==="1400"&&p("deviceType","camera")},{immediate:!0});const S=e.computed(()=>n.value&&N.value==="camera"&&x.value!=="stream"&&o.supportPatrol());e.watch(S,B=>{!B&&t.value&&r("enablePatrol")&&p("enablePatrol",!1)}),e.watch(D,B=>{B>0&&r("enablePatrol")&&(r("patrolGroupSize")??1)>B&&p("patrolGroupSize",B)});const i=B=>{if(!B.dependsOn||!t.value)return!0;const{field:a,value:h}=B.dependsOn,u=r(a);if(typeof h=="string"&&h.startsWith("!")){const k=h.substring(1);return u!==k}return Array.isArray(h)?h.includes(u):u===h},_=()=>{t.value&&v.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;const a=t.value.type,h=t.value.data;if(a==="dataSource"&&n.value){const z=h.arguments||{},A={},G=o.nodes.some($=>$.type===C.SMALL_MODEL);z.mode===void 0&&(A.mode=G?3:0),z.interval===void 0&&(A.interval=30),x.value==="stream"&&z.sw_decoding===void 0&&(A.sw_decoding="CPU"),Object.keys(A).length>0&&o.updateNodeData(B,{arguments:{...z,...A}})}const u=h.input_schema||h.inputSchema;if(a==="dataSource"&&u&&u.properties&&!u.properties.windowSeconds){u.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},h.arguments.windowSeconds||o.updateNodeData(t.value.id,{...h,input_schema:u,arguments:{...h.arguments,windowSeconds:5}});return}if(u&&u.properties&&Object.keys(u.properties).length>0)return;const k=await R(a);if(!k)return;const I=t.value?.data;I&&o.updateNodeData(t.value.id,{...I,input_schema:k.inputSchema,extraConfig:k.extraConfig,arguments:{...k.arguments,...I.arguments}})},{immediate:!0}),(B,a)=>{const h=e.resolveComponent("el-button"),u=e.resolveComponent("el-divider"),k=e.resolveComponent("el-icon"),I=e.resolveComponent("el-tooltip"),z=e.resolveComponent("el-option"),A=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),$=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),f=e.resolveComponent("el-form-item"),M=e.resolveComponent("el-form"),H=e.resolveComponent("el-radio"),J=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",la,[a[11]||(a[11]=e.createElementVNode("h3",null,"节点配置",-1)),n.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(h,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:_},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",ra,[a[12]||(a[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(g.value,j=>e.withDirectives((e.openBlock(),e.createBlock(f,{key:j.key,required:j.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(j.label),1),j.description?(e.openBlock(),e.createBlock(I,{key:0,content:j.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[j.options&&j.type==="string"?(e.openBlock(),e.createBlock(A,{key:0,"model-value":r(j.key),onChange:V=>p(j.key,V),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(j.options,(V,d)=>(e.openBlock(),e.createBlock(z,{key:V,label:j.optionLabels?j.optionLabels[d]:V,value:V},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):j.type==="boolean"?(e.openBlock(),e.createBlock(I,{key:1,content:n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":j.key==="needCooperativeDetection"&&L.value?"已开启图片时序,无法同时开启协同检测":j.key==="enableImageSequence"&&q.value?"已开启协同检测,无法同时开启图片时序":j.key==="enableImageSequence"&&E.value?"多数据源场景下不允许开启图片时序":"",disabled:!(n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence"))&&!(j.key==="needCooperativeDetection"&&L.value)&&!(j.key==="enableImageSequence"&&q.value)&&!(j.key==="enableImageSequence"&&E.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":r(j.key),disabled:n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence")||j.key==="needCooperativeDetection"&&L.value||j.key==="enableImageSequence"&&q.value||j.key==="enableImageSequence"&&E.value,onChange:V=>j.key==="enableImageSequence"?O(V):j.key==="needCooperativeDetection"?b(V):p(j.key,V)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):j.type==="number"||j.type==="integer"?(e.openBlock(),e.createBlock($,{key:2,"model-value":r(j.key),onChange:V=>p(j.key,V),min:j.min,max:j.max,step:j.step||(j.type==="integer"?1:.1),precision:j.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":r(j.key),onInput:V=>p(j.key,V),maxlength:j.maxLength,"show-word-limit":!!j.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!j.dependsOn||i(j)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",sa,[a[13]||(a[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":t.value?.data.branchLogic||"and",disabled:n.value,onChange:a[0]||(a[0]=j=>e.unref(o).updateNodeData(t.value.id,{branchLogic:j})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(z,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(z,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),n.value?(e.openBlock(),e.createElementBlock("div",ia,[a[16]||(a[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":r("deviceType")??"camera",onChange:a[1]||(a[1]=j=>p("deviceType",j))},{default:e.withCtx(()=>[e.createVNode(H,{value:"camera"},{default:e.withCtx(()=>[...a[14]||(a[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(H,{value:"1400",disabled:x.value==="stream"},{default:e.withCtx(()=>[...a[15]||(a[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(f,{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:P},null,8,["model-value","class"]),D.value===0?(e.openBlock(),e.createElementBlock("div",ca,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&N.value==="1400"?(e.openBlock(),e.createElementBlock("div",da,[a[19]||(a[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":r("detectionMode")??"platform",onChange:a[2]||(a[2]=j=>p("detectionMode",j))},{default:e.withCtx(()=>[e.createVNode(H,{value:"platform"},{default:e.withCtx(()=>[...a[17]||(a[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(H,{value:"device"},{default:e.withCtx(()=>[...a[18]||(a[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&N.value==="camera"&&x.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ma,[a[21]||(a[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(I,{disabled:!w.value,content:s.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":w.value?!1:r("enablePatrol"),disabled:w.value,onChange:a[3]||(a[3]=j=>p("enablePatrol",j))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),r("enablePatrol")?(e.openBlock(),e.createBlock(f,{key:0},{label:e.withCtx(()=>[a[20]||(a[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(I,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode($,{"model-value":r("patrolGroupSize")??1,onChange:a[4]||(a[4]=j=>p("patrolGroupSize",j)),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&&N.value==="camera"?(e.openBlock(),e.createElementBlock("div",pa,[a[22]||(a[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"抽帧策略"},{default:e.withCtx(()=>[x.value==="image"?(e.openBlock(),e.createBlock(A,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"按时间间隔抽帧",value:0})]),_:1})):m.value?(e.openBlock(),e.createBlock(A,{key:1,"model-value":r("mode")??3,onChange:a[5]||(a[5]=j=>{p("mode",j),j===1&&p("interval",m.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"每一帧都检测",value:3}),e.createVNode(z,{label:"跳帧检测",value:1}),e.createVNode(z,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(A,{key:2,"model-value":r("mode")??0,onChange:a[6]||(a[6]=j=>{p("mode",j),j===0&&p("interval",30),j===1&&p("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"按时间间隔抽帧",value:0}),e.createVNode(z,{label:"跳帧检测",value:1}),e.createVNode(z,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),x.value==="image"||x.value==="stream"&&(r("mode")??0)===0?(e.openBlock(),e.createBlock(f,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":r("interval")??30,onChange:a[7]||(a[7]=j=>p("interval",j)),min:1,max:x.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),x.value==="stream"&&(r("mode")??0)===1?(e.openBlock(),e.createBlock(f,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[m.value?(e.openBlock(),e.createBlock($,{key:0,"model-value":r("interval")??5,onChange:a[8]||(a[8]=j=>p("interval",j)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(A,{key:1,"model-value":r("interval")??25,onChange:a[9]||(a[9]=j=>p("interval",j)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:25,value:25}),e.createVNode(z,{label:50,value:50}),e.createVNode(z,{label:75,value:75}),e.createVNode(z,{label:125,value:125}),e.createVNode(z,{label:250,value:250}),e.createVNode(z,{label:375,value:375}),e.createVNode(z,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),x.value==="stream"?(e.openBlock(),e.createBlock(f,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":r("sw_decoding")??"CPU",onChange:a[10]||(a[10]=j=>p("sw_decoding",j)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"GPU",value:"GPU"}),e.createVNode(z,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),fa={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Ke=(l=null)=>{const o=e.ref(l||[]),t=e.ref(!1),c=e.ref(null),y=e.ref(""),n=async(w=!1)=>{if(l){o.value=l;return}},N=async()=>{o.value=[],await n(!0)},x=w=>o.value.find(s=>s.id===w||s.title===w),D=w=>{const s=x(w);if(!s)return{};const g=s.inputSchema||s.input_schema;if(!g||!g.properties)return{};const r={};return Object.entries(g.properties).forEach(([L,q])=>{q.default!==void 0&&(r[L]=q.default)}),r},P=w=>{const s=x(w);if(!s)return[];const g=s.inputSchema||s.input_schema;if(!g||!g.properties)return[];const r=g.required||[];return Object.entries(g.properties).map(([L,q])=>({key:L,type:q.type,label:q.title||q.description||L,description:q.description||"",default:q.default,required:r.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}))},R=e.computed(()=>{if(!y.value)return o.value;const w=y.value.toLowerCase();return o.value.filter(s=>s.name?.toLowerCase().includes(w)||s.type?.toLowerCase().includes(w)||s.title?.toLowerCase().includes(w)||s.description&&s.description.toLowerCase().includes(w)||m(s.type).toLowerCase().includes(w))}),m=w=>fa[w]||w;return{models:o,loading:t,error:c,searchKeyword:y,filteredModels:R,loadSmallModels:n,reloadSmallModels:N,getModelConfig:x,getTypeLabel:m,getDefaultArguments:D,getSchemaFields:P,validateArguments:(w,s)=>{const g=x(w);if(!g)return{valid:!1,errors:["模型不存在"]};const r=[],L=g.inputSchema||g.input_schema;return!L||!L.properties?{valid:!0,errors:[]}:(Object.entries(L.properties).forEach(([q,p])=>{const O=s[q];if(p.required&&(O==null||O==="")){r.push(`${p.title||q} 为必填项`);return}if(O!=null&&(p.type==="number"||p.type==="integer")){if(typeof O!="number"){r.push(`${p.title||q} 必须是数字`);return}p.minimum!==void 0&&O<p.minimum&&r.push(`${p.title||q} 不能小于 ${p.minimum}`),p.maximum!==void 0&&O>p.maximum&&r.push(`${p.title||q} 不能大于 ${p.maximum}`)}}),{valid:r.length===0,errors:r})}}},ga={class:"small-model-selector"},ha={key:0,class:"loading-state"},ya={key:1,class:"error-state"},_a={key:2,class:"model-list"},Na=["onClick"],Ca={class:"model-header"},ka={class:"model-name"},ba={class:"model-description"},xa={class:"model-meta"},Ea={key:3,class:"empty-state"},wa=ne({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(l,{emit:o}){const t=l,c=o,{loading:y,error:n,searchKeyword:N,filteredModels:x,loadSmallModels:D,reloadSmallModels:P,getTypeLabel:R}=Ke(t.externalModels),m=s=>{c("update:modelValue",s.id),c("select",s)},E=()=>{P()},w=s=>({safety:"warning",security:"danger",traffic:"info"})[s]||"info";return e.onMounted(()=>{t.externalModels||D()}),(s,g)=>{const r=e.resolveComponent("el-input"),L=e.resolveComponent("el-icon"),q=e.resolveComponent("el-button"),p=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",ga,[e.createVNode(r,{modelValue:e.unref(N),"onUpdate:modelValue":g[0]||(g[0]=O=>e.isRef(N)?N.value=O:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(K.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(y)?(e.openBlock(),e.createElementBlock("div",ha,[e.createVNode(L,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Loading))]),_:1}),g[2]||(g[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(n)?(e.openBlock(),e.createElementBlock("div",ya,[e.createVNode(L,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(n)),1),e.createVNode(q,{type:"primary",onClick:E},{default:e.withCtx(()=>[...g[3]||(g[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(x).length>0?(e.openBlock(),e.createElementBlock("div",_a,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(x),O=>(e.openBlock(),e.createElementBlock("div",{key:O.id,class:e.normalizeClass(["model-item",{selected:l.modelValue===O.id}]),onClick:b=>m(O)},[e.createElementVNode("div",Ca,[e.createElementVNode("div",ka,[e.createVNode(L,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(O.name),1)]),e.createVNode(p,{type:w(O.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(R)(O.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ba,e.toDisplayString(O.description),1),e.createElementVNode("div",xa,[O.supportDirectAlert?(e.openBlock(),e.createBlock(p,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...g[4]||(g[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,Na))),128))])):(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(L,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Search))]),_:1}),g[6]||(g[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(q,{text:"",onClick:g[1]||(g[1]=O=>N.value="")},{default:e.withCtx(()=>[...g[5]||(g[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),Ta={class:"position-tooltip"},Ve=ne({__name:"PositionTooltip",setup(l){return(o,t)=>(e.openBlock(),e.createElementBlock("div",Ta,[...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"]]),Sa={class:"config-header"},Va={class:"config-section"},Ba={key:0,class:"model-selector-wrapper"},Aa={key:1,class:"selected-model-info"},Da={class:"model-info-header"},La={class:"model-info-name"},Oa={class:"model-info-description"},Ma={key:0,class:"config-section"},Ia={key:3,class:"array-input"},Ra="检测到事件后,连续两次告警上报的时间间隔",$a=ne({__name:"SmallModelConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.smallModels??null),{models:x}=Ke(N.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),P={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},R=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||[],i=t.value.data.title||"";return Object.entries(b.properties).filter(([_])=>D.has(_)).map(([_,B])=>{const a={key:_,type:B.type,label:B.title||B.label||B.description||_,description:B.description||"",default:B.default,required:S.includes(_)||B.required||!1,min:B.minimum!==void 0?B.minimum:B.min,max:B.maximum!==void 0?B.maximum:B.max,step:B.step,maxLength:B.maxLength,options:B.enum,optionLabels:B.enumLabels||B.enum,dependsOn:B.dependsOn,sort:B.sort};return _==="interval"&&(a.label="告警间隔(秒)",a.description=P[i]||Ra,a.isInterval=!0,a.default=a.default!=null?a.default/1e3:10,a.min=a.min!=null?a.min/1e3:1,a.max=a.max!=null?a.max/1e3:void 0,a.step=1,a.precision=0),_==="threshold"&&(a.label="小模型阈值",a.step=.01,a.precision=2),_==="targetWidth"&&(a.label="最小目标宽度",a.default=60,a.min=20,a.max=1920,a.step=1,a.precision=0),_==="targetHeight"&&(a.label="最小目标高度",a.default=60,a.min=20,a.max=1080,a.step=1,a.precision=0),_==="topScale"&&(a.label="调整目标框高度比例 (上)",a.max=10,a.step=.1,a.precision=1),_==="bottomScale"&&(a.label="调整目标框高度比例 (下)",a.max=10,a.step=.1,a.precision=1),_==="leftScale"&&(a.label="调整目标框宽度比例 (左)",a.max=10,a.step=.1,a.precision=1),_==="rightScale"&&(a.label="调整目标框宽度比例 (右)",a.max=10,a.step=.1,a.precision=1),_==="x_ratio"&&(a.label="X轴位置信息",a.step=.01,a.precision=2),_==="y_ratio"&&(a.label="Y轴位置信息",a.step=.01,a.precision=2),_==="targetDuration"&&(a.label="目标持续时间(秒)",a.default=a.default!=null?a.default/1e3:1,a.min=a.min!=null?a.min/1e3:1,a.max=a.max!=null?a.max/1e3:void 0,a.step=.01,a.precision=2),_==="overloadNumber"&&(a.precision=0),_==="targetNumber"&&(a.precision=0),a}).filter(_=>!["areas","darwin","direction","lines"].includes(_.key)).filter(_=>!(_.key==="targetDuration"&&i==="NonMotorCounter")).sort((_,B)=>(_.sort??1/0)-(B.sort??1/0))}),m=["interval","targetDuration"],E=b=>{if(!t.value)return;const S=t.value.data.arguments?.[b];return m.includes(b)&&S!=null?S/1e3:S},w=(b,S)=>{if(!t.value)return;let i=S;m.includes(b)&&S!=null&&(i=S*1e3);const B={...t.value.data.arguments||{},[b]:i};o.updateNodeData(t.value.id,{arguments:B})},s=b=>{if(!b.dependsOn||!t.value)return!0;const{field:S,value:i}=b.dependsOn,_=E(S);if(typeof i=="string"&&i.startsWith("!")){const B=i.substring(1);return _!==B}return Array.isArray(i)?i.includes(_):_===i},g=b=>{const S=E(b);return Array.isArray(S)?JSON.stringify(S):""},r=(b,S)=>{try{const i=JSON.parse(S);Array.isArray(i)&&w(b,i)}catch{}},L=async b=>{if(!t.value)return;const S=b.inputSchema||b.input_schema||{},i={};S.properties&&Object.entries(S.properties).forEach(([_,B])=>{B.default!==void 0&&(i[_]=B.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:i})},q=()=>{t.value&&v.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},p=()=>t.value?.data.modelId?x.value.find(S=>S.id===t.value.data.modelId)?.description||"暂无描述":"",O=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(b,S)=>{const i=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),B=e.resolveComponent("el-icon"),a=e.resolveComponent("el-tag"),h=e.resolveComponent("el-tooltip"),u=e.resolveComponent("el-option"),k=e.resolveComponent("el-select"),I=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),G=e.resolveComponent("el-text"),$=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Sa,[S[0]||(S[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",Va,[S[3]||(S[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!y.value?(e.openBlock(),e.createElementBlock("div",Ba,[e.createVNode(wa,{"model-value":t.value?.data.modelId,"external-models":N.value,onSelect:L},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Aa,[e.createElementVNode("div",Da,[e.createElementVNode("div",La,[e.createVNode(B,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"text",text:"",size:"small",onClick:q},{default:e.withCtx(()=>[...S[1]||(S[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Oa,e.toDisplayString(p()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(a,{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",Ma,[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(R.value,f=>e.withDirectives((e.openBlock(),e.createBlock($,{key:f.key,required:f.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(f.label),1),f.key==="x_ratio"||f.key==="y_ratio"?(e.openBlock(),e.createBlock(h,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(B,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):f.description?(e.openBlock(),e.createBlock(h,{key:1,content:f.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[f.options&&f.type==="string"?(e.openBlock(),e.createBlock(k,{key:0,"model-value":E(f.key),onChange:M=>w(f.key,M),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(M,H)=>(e.openBlock(),e.createBlock(u,{key:M,label:f.optionLabels?f.optionLabels[H]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):f.type==="boolean"?(e.openBlock(),e.createBlock(I,{key:1,"model-value":E(f.key),onChange:M=>w(f.key,M)},null,8,["model-value","onChange"])):f.type==="number"||f.type==="integer"||f.type==="float"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":E(f.key),onChange:M=>w(f.key,M),min:f.min,max:f.max,step:f.step||(f.type==="integer"||f.type==="number"?1:.01),precision:f.precision??(f.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):f.type==="array"&&!f.options?(e.openBlock(),e.createElementBlock("div",Ia,[e.createVNode(A,{"model-value":g(f.key),onChange:M=>r(f.key,M),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(G,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):f.type==="array"&&f.options?(e.openBlock(),e.createBlock(k,{key:4,"model-value":E(f.key),onChange:M=>w(f.key,M),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(M,H)=>(e.openBlock(),e.createBlock(u,{key:M,label:f.optionLabels?f.optionLabels[H]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":E(f.key),onInput:M=>w(f.key,M)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!f.dependsOn||s(f)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Fa=(l=null)=>{const o=ae(),t=e.ref(l?l.map(m=>Te.backendToFrontend(m)):[]),c=e.ref(!1),y=e.ref(null),n=async(m=!1)=>{if(l){t.value=l.map(E=>Te.backendToFrontend(E));return}},N=m=>t.value.find(E=>E.title===m)||null,x=m=>{const E=N(m);return E?{targetId:E.title,targetName:E.label,threshold:E.data.threshold||.5,targetWidth:E.data.targetWidth||20,targetHeight:E.data.targetHeight||20,postmodel:E.data.postmodel||"ClipVit",areas:E.data.areas||[],expandRect:E.data.expandRect!==void 0?E.data.expandRect:!1,topScale:E.data.topScale||1.6,bottomScale:E.data.bottomScale||1.6,leftScale:E.data.leftScale||1.6,rightScale:E.data.rightScale||1.6,enableStructure:E.data.enableStructure}:{}},D=(m=null)=>o.nodes.filter(E=>E.type==="detectionTarget"&&E.id!==m).map(E=>({value:E.id,label:E.data.targetName||E.data.label})),P=(m=null)=>{const E=[{value:"original",label:"原图"}],w=D(m);return[...E,...w]},R=e.computed(()=>t.value.map(m=>({value:m.title,label:m.label,...m})));return{detectionTargets:t,loading:c,error:y,loadDetectionTargets:n,getTargetById:N,getDefaultConfig:x,getDetectionTargetNodes:D,getDetectionScopeOptions:P,getTargetOptions:R}},qa={class:"paired-array-input"},Be=ne({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(l,{emit:o}){const t=(R,m)=>{let E;return(...w)=>{clearTimeout(E),E=setTimeout(()=>R(...w),m)}},c=l,y=o,n=e.ref([]),N=()=>{const R=c.primaryValue||[],m=c.pairedValue||[],E=Math.max(R.length,m.length,1);n.value=Array.from({length:E},(w,s)=>({primary:R[s]||"",paired:m[s]!==void 0?m[s]:c.pairedField.default?.[0]||.5}))};e.watch(()=>[c.primaryValue,c.pairedValue],()=>{N()},{immediate:!0,deep:!0});const x=t((R,m)=>{y("update",R,m)},300);e.watch(n,R=>{const m=R.map(w=>w.primary),E=R.map(w=>w.paired);x(m,E)},{deep:!0});const D=()=>{n.value.length>=10||n.value.push({primary:"",paired:c.pairedField.default?.[0]||.5})},P=R=>{n.value.length>1&&n.value.splice(R,1)};return(R,m)=>{const E=e.resolveComponent("el-input"),w=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",qa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,(g,r)=>(e.openBlock(),e.createElementBlock("div",{key:r,class:"input-row"},[e.createVNode(E,{modelValue:n.value[r].primary,"onUpdate:modelValue":L=>n.value[r].primary=L,placeholder:l.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!n.value[r].primary||n.value[r].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(w,{modelValue:n.value[r].paired,"onUpdate:modelValue":L=>n.value[r].paired=L,min:l.pairedField.min||0,max:l.pairedField.max||1,step:l.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(s,{type:"danger",icon:e.unref(K.Delete),circle:"",size:"small",disabled:n.value.length===1,onClick:L=>P(r)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(s,{type:"primary",icon:e.unref(K.Plus),size:"small",disabled:n.value.length>=10,onClick:D},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(l.primaryField.label)+e.toDisplayString(n.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),Ga={class:"config-header"},Ha={class:"config-section"},ja={class:"flex items-center justify-between"},Pa={key:0,class:"config-section"},za={key:1,class:"config-section"},Ua={key:2,class:"config-section"},Wa={class:"device-list"},Ja=["onClick"],Ya={class:"device-name"},Xa={key:0,class:"device-list-empty"},Qa={key:4,class:"array-input"},Ka={key:4,class:"array-input"},Za=ne({__name:"DetectionTargetConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c==="task"),n=e.inject("taskModeConfig",null),N=e.inject("echoAlgodata",null),x=e.inject("echoTaskData",null),D=e.computed(()=>{if(!t.value)return null;const f=new Set,M=[t.value.id];for(;M.length;){const H=M.shift();if(f.has(H))continue;f.add(H);const J=o.edges.filter(j=>j.target===H);for(const j of J){const V=o.nodes.find(d=>d.id===j.source);if(V){if(V.type==="dataSource")return V.id;M.push(V.id)}}}return null}),P=e.computed(()=>{const f=D.value;return f?(n?.value??n)?.datasource?.getDevices?.(f)??[]:[]}),R=e.computed(()=>y.value&&P.value.length>0),m=e.ref(""),E=e.ref(""),w=e.computed(()=>{const f=E.value.trim().toLowerCase();return f?P.value.filter(M=>(M.sourceName??M.name??String(M.sourceId??M.id??M)).toLowerCase().includes(f)):P.value}),s=e.computed(()=>{const f={},M=D.value,H=t.value?.id;if(!M||!H)return f;const J={...t.value?.data?.arguments??{}};delete J.configMode;for(const j of P.value){const V=String(j.sourceId??j.id??j),d=o.getTaskSourceArguments(M,V,H);if(d===null){f[V]=!1;continue}const T=new Set([...Object.keys(d),...Object.keys(J)]);let U=!1;for(const X of T)if(JSON.stringify(d[X])!==JSON.stringify(J[X])){U=!0;break}f[V]=U}return f});e.watch([P,()=>t.value?.data?.arguments?.configMode],([f])=>{f.length>0?m.value=String(f[0]?.sourceId??f[0]?.id??f[0]):m.value=""},{immediate:!0});const g=(f,M=null)=>{if(M){const V=((x?.value??x)?.graph?.sources??[]).find(d=>String(d.sourceId)===String(M));if(V?.branches)for(const d of V.branches){const T=d.nodes?.find(U=>U.toolTitle===f);if(T?.arguments)return{...T.arguments}}return null}const H=N?.value??N;if(!H?.branches)return null;for(const J of H.branches){const j=J.nodes?.find(V=>V.toolTitle===f);if(j?.arguments)return{...j.arguments}}return null},r=f=>{const M=D.value,H=t.value?.id;if(!M||!H||!f||o.getTaskSourceArguments(M,f,H)!==null)return;const J=t.value?.data?.targetId,j=J?g(J,f):null,V=t.value?.data?.arguments??{},d={...j??V};delete d.configMode,o.setTaskSourceArguments(M,f,H,d)};e.watch(m,f=>{f&&t.value?.data?.arguments?.configMode==="perDevice"&&r(f)}),e.watch(()=>t.value?.data?.arguments?.configMode,f=>{f==="perDevice"&&m.value&&r(m.value)});const L=e.inject("editorConfig",null),q=e.computed(()=>(L?.value??L)?.detection??null),{detectionTargets:p,loading:O}=Fa(q.value),b=e.computed(()=>{if(!t.value)return[];const f=t.value.data.input_schema||t.value.data.inputSchema;if(!f||!f.properties)return[];const M=f.required||[];return Object.entries(f.properties).map(([H,J])=>({key:H,type:J.type,label:J.title||J.label||J.description||H,description:J.description||"",default:J.default,required:M.includes(H)||J.required||!1,min:J.minimum!==void 0?J.minimum:J.min,max:J.maximum!==void 0?J.maximum:J.max,step:J.step,maxLength:J.maxLength,options:J.enum,optionLabels:J.enumLabels||J.enum,dependsOn:J.dependsOn,"x-component":J["x-component"],"x-paired-with":J["x-paired-with"],sort:J.sort})).sort((H,J)=>(H.sort??1/0)-(J.sort??1/0))}),S=f=>f.type==="array"&&f["x-component"]==="paired-array"&&f["x-paired-with"],i=f=>{const M=f["x-paired-with"];return b.value.find(H=>H.key===M)},_={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}},B=new Set(Object.keys(_)),a=e.computed(()=>{const f=t.value?.data.targetId,M=new Set;return b.value.forEach(H=>{H["x-paired-with"]&&M.add(H["x-paired-with"])}),b.value.filter(H=>f==="traffic_accident"?H.key==="threshold":B.has(H.key)&&!M.has(H.key)&&!S(H)).map(H=>{const J=_[H.key]||{};return{...H,label:J.label||H.label,description:J.description||H.description,min:J.min??H.min,max:J.max??H.max,step:J.step??H.step,precision:J.precision,default:J.default??H.default}})}),h=e.computed(()=>b.value.filter(f=>S(f))),u=f=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&m.value){const H=D.value,J=o.getTaskSourceArguments(H,m.value,t.value.id);if(J!==null)return J[f]}return t.value.data.arguments?.[f]},k=(f,M)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(f!=="configMode"&&H==="perDevice"&&m.value){const V=D.value;o.updateTaskSourceArgument(V,m.value,t.value.id,f,M);return}const j={...t.value.data.arguments||{},[f]:M};o.updateNodeData(t.value.id,{arguments:j})},I=f=>{if(!f.dependsOn||!t.value)return!0;const{field:M,value:H}=f.dependsOn,J=u(M);if(typeof H=="string"&&H.startsWith("!")){const j=H.substring(1);return J!==j}return Array.isArray(H)?H.includes(J):J===H},z=f=>{const M=u(f);return Array.isArray(M)?JSON.stringify(M):""},A=(f,M)=>{try{const H=JSON.parse(M);Array.isArray(H)&&k(f,H)}catch{}},G=(f,M,H,J)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&m.value){const T=D.value;o.updateTaskSourceArgument(T,m.value,t.value.id,f,M),o.updateTaskSourceArgument(T,m.value,t.value.id,H,J);return}const d={...t.value.data.arguments||{},[f]:M,[H]:J};o.updateNodeData(t.value.id,{arguments:d})},$=async f=>{if(!t.value||!f)return;const M=p.value.find(d=>d.title===f);if(!M)return;let H=M.inputSchema||M.input_schema||{};if(f==="other"){const d={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}}};H={...H,properties:{...H.properties,...d.properties}}}const J={};H.properties&&Object.entries(H.properties).forEach(([d,T])=>{T.default!==void 0&&(J[d]=T.default)});const j=t.value.data,V={...J,target_class:M.title};o.updateNodeData(t.value.id,{...j,targetId:M.title,targetName:M.label,label:M.label,input_schema:H,inputSchema:H,extraConfig:M.extraConfig,arguments:V})},Y=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,f=>{if(!f||!t.value)return;const M=p.value.find(j=>j.title===f);if(!M)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const J={...M.defaultArguments,...H.arguments,target_class:M.title};o.updateNodeData(t.value.id,{...H,input_schema:M.inputSchema,arguments:J})}),(f,M)=>{const H=e.resolveComponent("el-button"),J=e.resolveComponent("el-divider"),j=e.resolveComponent("el-option"),V=e.resolveComponent("el-select"),d=e.resolveComponent("el-form-item"),T=e.resolveComponent("el-form"),U=e.resolveComponent("el-radio"),X=e.resolveComponent("el-radio-group"),W=e.resolveComponent("el-icon"),Q=e.resolveComponent("el-tooltip"),te=e.resolveComponent("el-input"),le=e.resolveComponent("el-switch"),pe=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ga,[M[2]||(M[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(H,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(J),e.createElementVNode("div",Ha,[M[3]||(M[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(d,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(V,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:$,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(O),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(p),F=>(e.openBlock(),e.createBlock(j,{key:F.title,label:F.label,value:F.title},{default:e.withCtx(()=>[e.createElementVNode("div",ja,[e.createElementVNode("span",null,e.toDisplayString(F.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),R.value?(e.openBlock(),e.createElementBlock("div",Pa,[M[6]||(M[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(d,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(X,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:M[0]||(M[0]=F=>k("configMode",F))},{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),h.value.length>0?(e.openBlock(),e.createElementBlock("div",za,[M[7]||(M[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,F=>(e.openBlock(),e.createBlock(d,{key:F.key,required:F.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(F.label),1),F.description?(e.openBlock(),e.createBlock(Q,{key:0,content:F.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Be,{"primary-field":F,"paired-field":i(F),"primary-value":u(F.key),"paired-value":u(F["x-paired-with"]),onUpdate:(Z,re)=>G(F.key,Z,F["x-paired-with"],re)},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",Ua,[M[9]||(M[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&P.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(te,{modelValue:E.value,"onUpdate:modelValue":M[1]||(M[1]=F=>E.value=F),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(W,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Wa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(w.value,F=>(e.openBlock(),e.createElementBlock("div",{key:String(F.sourceId??F.id??F),class:e.normalizeClass(["device-list-item",{"is-active":m.value===String(F.sourceId??F.id??F),"has-custom":s.value[String(F.sourceId??F.id??F)]}]),onClick:Z=>m.value=String(F.sourceId??F.id??F)},[e.createElementVNode("span",Ya,e.toDisplayString(F.sourceName??F.name??String(F.sourceId??F.id??F)),1),s.value[String(F.sourceId??F.id??F)]?(e.openBlock(),e.createBlock(Q,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...M[8]||(M[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Ja))),128)),w.value.length===0?(e.openBlock(),e.createElementBlock("div",Xa," 无匹配设备 ")):e.createCommentVNode("",!0)]),m.value?(e.openBlock(),e.createBlock(T,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,F=>e.withDirectives((e.openBlock(),e.createBlock(d,{key:F.key,required:F.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(F.label),1),F.key==="x_ratio"||F.key==="y_ratio"?(e.openBlock(),e.createBlock(Q,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):F.description?(e.openBlock(),e.createBlock(Q,{key:1,content:F.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[F.options&&F.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":u(F.key),onChange:Z=>k(F.key,Z),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(Z,re)=>(e.openBlock(),e.createBlock(j,{key:Z,label:F.optionLabels?F.optionLabels[re]:Z,value:Z},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):F.type==="boolean"?(e.openBlock(),e.createBlock(le,{key:1,"model-value":u(F.key),onChange:Z=>k(F.key,Z)},null,8,["model-value","onChange"])):F.type==="number"||F.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":u(F.key),onChange:Z=>k(F.key,Z),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"])):S(F)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":F,"paired-field":i(F),"primary-value":u(F.key),"paired-value":u(F["x-paired-with"]),onUpdate:(Z,re)=>G(F.key,Z,F["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):F.type==="array"&&!F.options?(e.openBlock(),e.createElementBlock("div",Qa,[e.createVNode(te,{"model-value":z(F.key),onChange:Z=>A(F.key,Z),type:"textarea",rows:3,placeholder:F.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):F.type==="array"&&F.options?(e.openBlock(),e.createBlock(V,{key:5,"model-value":u(F.key),onChange:Z=>k(F.key,Z),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(Z,re)=>(e.openBlock(),e.createBlock(j,{key:Z,label:F.optionLabels?F.optionLabels[re]:Z,value:Z},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":u(F.key),onInput:Z=>k(F.key,Z),maxlength:F.maxLength,"show-word-limit":!!F.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!F.dependsOn||I(F)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(T,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,F=>e.withDirectives((e.openBlock(),e.createBlock(d,{key:F.key,required:F.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(F.label),1),F.key==="x_ratio"||F.key==="y_ratio"?(e.openBlock(),e.createBlock(Q,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):F.description?(e.openBlock(),e.createBlock(Q,{key:1,content:F.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[F.options&&F.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":u(F.key),onChange:Z=>k(F.key,Z),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(Z,re)=>(e.openBlock(),e.createBlock(j,{key:Z,label:F.optionLabels?F.optionLabels[re]:Z,value:Z},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):F.type==="boolean"?(e.openBlock(),e.createBlock(le,{key:1,"model-value":u(F.key),onChange:Z=>k(F.key,Z)},null,8,["model-value","onChange"])):F.type==="number"||F.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":u(F.key),onChange:Z=>k(F.key,Z),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"])):S(F)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":F,"paired-field":i(F),"primary-value":u(F.key),"paired-value":u(F["x-paired-with"]),onUpdate:(Z,re)=>G(F.key,Z,F["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):F.type==="array"&&!F.options?(e.openBlock(),e.createElementBlock("div",Ka,[e.createVNode(te,{"model-value":z(F.key),onChange:Z=>A(F.key,Z),type:"textarea",rows:3,placeholder:F.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):F.type==="array"&&F.options?(e.openBlock(),e.createBlock(V,{key:5,"model-value":u(F.key),onChange:Z=>k(F.key,Z),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(Z,re)=>(e.openBlock(),e.createBlock(j,{key:Z,label:F.optionLabels?F.optionLabels[re]:Z,value:Z},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":u(F.key),onInput:Z=>k(F.key,Z),maxlength:F.maxLength,"show-word-limit":!!F.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!F.dependsOn||I(F)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),va={class:"config-header"},el={class:"config-section"},tl={key:0,style:{"margin-bottom":"8px"}},ol=ne({__name:"TargetCountConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=R=>{if(!t.value)return;const m={...t.value.data.arguments,conditionRelation:R};o.updateNodeData(t.value.id,{arguments:m})},N=()=>{if(!t.value)return;const m=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],E={...t.value.data.arguments,alertConditions:m};o.updateNodeData(t.value.id,{arguments:E})},x=(R,m,E)=>{if(!t.value)return;const w=[...t.value.data.arguments?.alertConditions||[]];w[R]={...w[R],[m]:E};const s={...t.value.data.arguments,alertConditions:w};o.updateNodeData(t.value.id,{arguments:s})},D=R=>{if(!t.value)return;const m=[...t.value.data.arguments?.alertConditions||[]];m.splice(R,1);const E={...t.value.data.arguments,alertConditions:m};o.updateNodeData(t.value.id,{arguments:E})},P=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(R,m)=>{const E=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-text"),g=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),L=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-radio"),p=e.resolveComponent("el-radio-group"),O=e.resolveComponent("el-form-item"),b=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",va,[m[1]||(m[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:P},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",el,[m[9]||(m[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(b,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,null,{label:e.withCtx(()=>[m[3]||(m[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(s,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...m[2]||(m[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(s,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...m[4]||(m[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(S,i)=>(e.openBlock(),e.createElementBlock("div",{key:i,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(r,{"model-value":S.operator,onChange:_=>x(i,"operator",_),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"等于 =",value:"="}),e.createVNode(g,{label:"大于 >",value:">"}),e.createVNode(g,{label:"小于 <",value:"<"}),e.createVNode(g,{label:"大于等于 ≥",value:">="}),e.createVNode(g,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(L,{"model-value":S.value,onChange:_=>x(i,"value",_),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(E,{key:0,type:"danger",icon:e.unref(K.Delete),circle:"",size:"small",onClick:_=>D(i)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",tl,[e.createVNode(s,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...m[5]||(m[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(p,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:m[0]||(m[0]=S=>n(S))},{default:e.withCtx(()=>[e.createVNode(q,{value:"OR"},{default:e.withCtx(()=>[...m[6]||(m[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(q,{value:"AND"},{default:e.withCtx(()=>[...m[7]||(m[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(E,{type:"text",link:"",icon:e.unref(K.Plus),onClick:N},{default:e.withCtx(()=>[...m[8]||(m[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),nl={class:"config-header"},al={class:"config-section"},ll={style:{display:"flex","align-items":"center",gap:"8px"}},rl={style:{display:"flex","align-items":"center",gap:"8px"}},sl={style:{display:"flex","align-items":"center",gap:"8px"}},il=ne({__name:"TimerTargetConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=g=>{if(!t.value)return;const r={...t.value.data.arguments,duration:g};o.updateNodeData(t.value.id,{arguments:r})},N=g=>{if(!t.value)return;const r={...t.value.data.arguments,similarity_enabled:g};o.updateNodeData(t.value.id,{arguments:r})},x=g=>{if(!t.value)return;const r={...t.value.data.arguments,similarity_threshold:g};o.updateNodeData(t.value.id,{arguments:r})},D=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_enabled:g};o.updateNodeData(t.value.id,{arguments:r})},P=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_operator:g};o.updateNodeData(t.value.id,{arguments:r})},R=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_threshold:g};o.updateNodeData(t.value.id,{arguments:r})},m=g=>{if(!t.value)return;const r=t.value.data.arguments?.overlap_detection||{},L={...t.value.data.arguments,overlap_detection:{operator:r.operator??"gt",threshold:r.threshold??90,...r,enabled:g}};o.updateNodeData(t.value.id,{arguments:L})},E=g=>{if(!t.value)return;const r={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:g}};o.updateNodeData(t.value.id,{arguments:r})},w=g=>{if(!t.value)return;const r={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:g}};o.updateNodeData(t.value.id,{arguments:r})},s=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(g,r)=>{const L=e.resolveComponent("el-button"),q=e.resolveComponent("el-divider"),p=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-text"),b=e.resolveComponent("el-form-item"),S=e.resolveComponent("el-switch"),i=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tooltip"),B=e.resolveComponent("el-slider"),a=e.resolveComponent("el-option"),h=e.resolveComponent("el-select"),u=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",nl,[r[9]||(r[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(q),e.createElementVNode("div",al,[r[13]||(r[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(b,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.arguments?.duration??30,onChange:r[0]||(r[0]=k=>n(k)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[10]||(r[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(b,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",ll,[e.createVNode(S,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:r[1]||(r[1]=k=>N(k))},null,8,["model-value"]),e.createVNode(_,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(b,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(B,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:r[2]||(r[2]=k=>x(k)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[11]||(r[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",rl,[e.createVNode(S,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:r[3]||(r[3]=k=>D(k))},null,8,["model-value"]),e.createVNode(_,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.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(h,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:r[4]||(r[4]=k=>P(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(a,{label:"大于 >",value:"gt"}),e.createVNode(a,{label:"大于等于 >=",value:"gte"}),e.createVNode(a,{label:"等于 =",value:"eq"}),e.createVNode(a,{label:"小于等于 <=",value:"lte"}),e.createVNode(a,{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(p,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:r[5]||(r[5]=k=>R(k)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[12]||(r[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",sl,[e.createVNode(S,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:r[6]||(r[6]=k=>m(k))},null,8,["model-value"]),e.createVNode(_,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.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(h,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:r[7]||(r[7]=k=>E(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(a,{label:"大于 >",value:"gt"}),e.createVNode(a,{label:"等于 =",value:"eq"}),e.createVNode(a,{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(p,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:r[8]||(r[8]=k=>w(k)),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"]]),cl={class:"node-config-panel"},dl={class:"config-content"},ml=ne({__name:"NodeConfigPanel",setup(l){const o=ae(),t={edge:ln,group:sn,start:An,end:Rn,classificationModel:zn,ocr:Jn,licensePlate:Qn,face:Qe,stream:aa,dataSource:ua,smallModel:$a,detectionTarget:Za,targetCount:ol,timerTarget:il,faceRecognition:Qe},c=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(x=>x.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",cl,[e.createElementVNode("div",dl,[c.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),pl={class:"workflow-editor",id:"workflow-editor"},ul={class:"editor-content"},fl={__name:"WorkflowEditor",props:{mode:{type:String,default:oe.ALGORITHM,validator:l=>Object.values(oe).includes(l)},pageMode:{type:String,default:Ne.CREATE,validator:l=>Object.values(Ne).includes(l)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(l,{expose:o}){const t=l,c=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",c),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(c),{copyToClipboard:N,downloadJSON:x,exportToJSON:D}=Ue(t.mode,n,y),{runValidation:P}=We(t.mode,n,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{it(c)});const R=e.computed(()=>{if(n.selectedNodeId)return!0;const E=n.selectedEdge;return E?!!n.nodes.find(s=>s.id===E.source)?.data?.enableBranch:!1});return o({reset:()=>{n.resetWorkflow()},runTest:P,copyJSON:N,exportJSON:D}),(E,w)=>(e.openBlock(),e.createElementBlock("div",pl,[e.createVNode(wt),e.createElementVNode("div",ul,[e.createVNode(Dt),e.createVNode(tn),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[R.value?(e.openBlock(),e.createBlock(ml,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ze=ne(fl,[["__scopeId","data-v-85b6cc80"]]),gl={Box:K.Box,CircleCheck:K.CircleCheck,CircleClose:K.CircleClose,Close:K.Close,CopyDocument:K.CopyDocument,Cpu:K.Cpu,DArrowLeft:K.DArrowLeft,DataAnalysis:K.DataAnalysis,Delete:K.Delete,Document:K.Document,Download:K.Download,FolderOpened:K.FolderOpened,Grid:K.Grid,Loading:K.Loading,Plus:K.Plus,QuestionFilled:K.QuestionFilled,RefreshLeft:K.RefreshLeft,Search:K.Search,Timer:K.Timer,Upload:K.Upload,User:K.User,View:K.View,VideoPlay:K.VideoPlay,Warning:K.Warning},ve=l=>{Object.entries(gl).forEach(([o,t])=>{l.component(o,t)}),l.component("WorkflowEditor",Ze)},hl={install:ve};se.EditorMode=oe,se.NodeType=C,se.PageMode=Ne,se.WorkflowEditor=Ze,se.default=hl,se.install=ve,Object.defineProperties(se,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
1
|
+
(function(se,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):(se=typeof globalThis<"u"?globalThis:se||self,e(se.AIFlowUI={},se.Vue,se.ElementPlusIconsVue,se.ElementPlus,se.Pinia,se.VueFlowCore,se.VueFlowBackground,se.VueFlowControls,se.VueFlowNodeResizer))})(this,(function(se,e,Z,v,Ze,ee,ve,et,tt){"use strict";const C={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={[C.DETECTION_TARGET]:"检测目标",[C.CLASSIFICATION_MODEL]:"分类模型",[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时",[C.FACE_RECOGNITION]:"人脸识别",[C.SMALL_MODEL]:"小模型"},nt={cls:C.CLASSIFICATION_MODEL,ocr:C.OCR,license_plate:C.LICENSE_PLATE,target_count:C.TARGET_COUNT,timer_target:C.TIMER_TARGET,face:C.FACE_RECOGNITION,face_recognition:C.FACE_RECOGNITION},oe={ALGORITHM:"algorithm",TASK:"task"},Ne={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=l=>`${l}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ae=l=>({id:me("start"),type:"start",position:l,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),Ee=l=>({id:me("end"),type:"end",position:l,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}}}),we=l=>({id:me("dataSource"),type:"dataSource",position:l,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"}}),De=(l,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:l,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Le=(l,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:l,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Oe=(l,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:l,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Me=l=>({id:me("ocr"),type:"ocr",position:l,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Ie=l=>({id:me("licensePlate"),type:"licensePlate",position:l,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Re=l=>({id:me("targetCount"),type:"targetCount",position:l,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"}}}}),$e=l=>({id:me("timerTarget"),type:"timerTarget",position:l,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=(l,o={width:300,height:160},t="and",c=null)=>({id:me("group"),type:"group",position:l,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:c},selectable:!0,deletable:!1,zIndex:-1}),Fe=l=>({id:me("faceRecognition"),type:"faceRecognition",position:l,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ye=new Map,qe=()=>{const l=Ae({x:80,y:300}),o=we({x:320,y:300}),t=Ee({x:1e3,y:300}),c={id:`e_${l.id}_${o.id}`,source:l.id,target:o.id,data:{branchOrder:1}};return{nodes:[l,o,t],edges:[c]}},lt=l=>Ze.defineStore(`aiflow-workflow-${l}`,()=>{const o=qe(),t=e.ref(o.nodes),c=e.ref(o.edges),y=e.ref(null),n=e.ref(null),N=e.ref(new Set),E=e.ref(new Set),L=e.ref({}),z=(V,d,T,U)=>{L.value[V]||(L.value[V]={}),L.value[V][d]||(L.value[V][d]={}),L.value[V][d][T]={...U}},q=(V,d,T,U,X)=>{L.value[V]||(L.value[V]={}),L.value[V][d]||(L.value[V][d]={}),L.value[V][d][T]||(L.value[V][d][T]={}),L.value[V][d][T][U]=X},p=(V,d,T)=>L.value[V]?.[d]?.[T]??null,x=()=>{L.value={}},w=e.computed(()=>y.value?t.value.find(V=>V.id===y.value):null),s=e.computed(()=>n.value?c.value.find(V=>V.id===n.value):null),g=V=>t.value.filter(d=>d.type===V).length,r=()=>{const V=t.value.filter(d=>d.type===C.DATA_SOURCE);V.length!==0&&(V.length===1?V[0].data.label="数据源":V.forEach((d,T)=>{d.data.label=`数据源 ${T+1}`}))},D=()=>t.value.filter(V=>V.type===C.DATA_SOURCE).length,F=()=>t.value.filter(d=>d.type===C.DATA_SOURCE).some(d=>d.data.arguments?.needCooperativeDetection===!0),m=()=>{const V=D(),d=F();return!(V>1||d)},O=V=>{t.value.push(V),V.type===C.DATA_SOURCE&&r()},b=V=>{const d=t.value.find(U=>U.id===V),T=d?.type===C.DATA_SOURCE;if(d?.type==="group"){k(V),c.value=c.value.filter(U=>U.source!==V&&U.target!==V),y.value===V&&(y.value=null);return}t.value=t.value.filter(U=>U.id!==V),c.value=c.value.filter(U=>U.source!==V&&U.target!==V),y.value===V&&(y.value=null),T&&r()},S=(V,d)=>{const T=t.value.find(U=>U.id===V);T&&(T.data={...T.data,...d})},i=(V,d)=>{const T=t.value.find(U=>U.id===V);T&&(T.position=d)},_=V=>{const d=t.value.find(T=>T.id===V.source);if(d&&(d.type===C.START||d.type===C.DATA_SOURCE)&&d.data?.enableBranch===!0){const U=c.value.filter(X=>X.source===V.source).length+1;V={...V,data:{...V.data,branchOrder:U}}}c.value=ee.addEdge(V,c.value)},B=V=>{const d=c.value.find(T=>T.id===V);if(c.value=c.value.filter(T=>T.id!==V),n.value===V&&(n.value=null),d&&d.data?.branchOrder!==void 0){const T=t.value.find(U=>U.id===d.source);T&&(T.type===C.START||T.type===C.DATA_SOURCE)&&c.value.filter(X=>X.source===d.source).sort((X,W)=>(X.data?.branchOrder||0)-(W.data?.branchOrder||0)).forEach((X,W)=>{X.data?X.data.branchOrder=W+1:X.data={branchOrder:W+1}})}},a=(V,d="and",T=null)=>{const U=at(V,{width:300,height:160},d,T);return t.value.unshift(U),U.id},h=(V,d)=>{const T=t.value.find(W=>W.id===V),U=t.value.find(W=>W.id===d);if(!T||!U||T.parentNode===d)return;T.parentNode&&u(V);const X=t.value.find(W=>W.id===V);X&&(t.value=t.value.map(W=>W.id!==V?W:{...W,position:{x:X.position.x-U.position.x,y:X.position.y-U.position.y},parentNode:d,extent:"parent"}))},u=V=>{const d=t.value.find(W=>W.id===V);if(!d||!d.parentNode)return;const T=t.value.find(W=>W.id===d.parentNode),U=T?d.position.x+T.position.x:d.position.x,X=T?d.position.y+T.position.y:d.position.y;t.value=t.value.map(W=>{if(W.id!==V)return W;const Q={...W,position:{x:U,y:X}};return delete Q.parentNode,delete Q.extent,Q})},k=V=>{const d=t.value.find(T=>T.id===V);d&&(t.value=t.value.filter(T=>T.id!==V).map(T=>{if(T.parentNode!==V)return T;const U={...T,position:{x:T.position.x+d.position.x,y:T.position.y+d.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:c,selectedNodeId:y,selectedEdgeId:n,invalidNodeIds:N,invalidEdgeIds:E,selectedNode:w,selectedEdge:s,getNodeCountByType:g,getDataSourceCount:D,hasCooperativeDetection:F,supportPatrol:m,addNode:O,removeNode:b,updateNodeData:S,updateNodePosition:i,addConnection:_,removeEdge:B,updateEdgeData:(V,d)=>{const T=c.value.find(U=>U.id===V);if(T){if(d.branchOrder!==void 0){const U=t.value.find(X=>X.id===T.source);if(U&&(U.type===C.START||U.type===C.DATA_SOURCE)){const X=T.data?.branchOrder,W=d.branchOrder;if(X!==W&&W!==null){const te=c.value.filter(ae=>ae.source===T.source&&ae.id!==V).find(ae=>ae.data?.branchOrder===W);te&&(te.data?te.data.branchOrder=X:te.data={branchOrder:X})}}}T.data={...T.data,...d}}},selectNode:V=>{y.value=V,n.value=null},selectEdge:V=>{n.value=V,y.value=null},clearSelection:()=>{y.value=null,n.value=null},resetWorkflow:()=>{const V=qe();t.value=V.nodes,c.value=V.edges,y.value=null,n.value=null,x()},loadWorkflow:(V,d)=>{t.value=V,c.value=d,y.value=null,n.value=null,x()},refreshDataSourceLabels:r,createEmptyGroup:a,addNodeToGroup:h,removeNodeFromGroup:u,dissolveParallelGroup:k,initializeSubsequentFrames:V=>{t.value.find(T=>T.id===V)&&S(V,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(V,d)=>{const T=t.value.find(U=>U.id===V);!T||T.type!=="dataSource"||(T.data.subsequentFrames||(T.data.subsequentFrames=[]),T.data.subsequentFrames.push(d),S(V,{subsequentFrames:[...T.data.subsequentFrames]}))},removeSubsequentFrame:(V,d)=>{const T=t.value.find(W=>W.id===V);if(!T||T.type!=="dataSource")return;const U=T.data.subsequentFrames.find(W=>W.id===d);U&&c.value.filter(Q=>Q.source===V&&Q.sourceHandle===U.handleId).forEach(Q=>B(Q.id));const X=T.data.subsequentFrames.filter(W=>W.id!==d);X.forEach((W,Q)=>{W.id==="default-subsequent"?W.label="后续帧检测":W.label=`后续帧检测${Q+1}`}),S(V,{subsequentFrames:X})},setInvalidIds:(V,d)=>{N.value=new Set(V),E.value=new Set(d)},clearInvalidIds:()=>{N.value=new Set,E.value=new Set},taskSources:L,setTaskSourceArguments:z,updateTaskSourceArgument:q,getTaskSourceArguments:p,clearTaskSources:x}}),le=(l=null)=>{const o=l??e.inject("workflowInstanceId","default");return ye.has(o)||ye.set(o,lt(o)),ye.get(o)()},rt=l=>{if(ye.has(l)){try{ye.get(l)().$dispose()}catch{}ye.delete(l)}},Ge=(l,o,t)=>{const c=[],y=[],n=l.filter(r=>r.type!=="group"),N=n.filter(r=>r.type===C.START);N.length===0?c.push("工作流必须包含一个开始节点"):N.length>1&&c.push("工作流只能包含一个开始节点");const E=n.filter(r=>r.type===C.END);E.length===0?c.push("工作流必须包含一个结束节点"):E.length>1&&c.push("工作流只能包含一个结束节点");const L=n.filter(r=>r.type===C.DATA_SOURCE);L.length===0&&c.push("工作流必须至少包含一个数据源节点"),n.filter(r=>r.type===C.DETECTION_TARGET||r.type===C.SMALL_MODEL||r.type===C.CLASSIFICATION_MODEL).length===0&&c.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),n.some(r=>r.type===C.SMALL_MODEL),L.some(r=>r.data.arguments?.needCooperativeDetection===!0),L.length>1,n.forEach(r=>{const D=o.filter(m=>m.target===r.id),F=o.filter(m=>m.source===r.id);if(r.type===C.START&&D.length>0&&y.push("开始节点不应有输入连接"),r.type===C.END&&F.length>0&&y.push("结束节点不应有输出连接"),r.type===C.START&&F.length===0&&c.push("开始节点必须有输出连接"),r.type===C.END&&D.length===0&&c.push("结束节点必须有输入连接"),r.type===C.DATA_SOURCE&&r.data.enableImageSequence)if(F.length===0)c.push({nodeId:r.id,message:`数据源节点"${r.data.label}"开启了图片时序但未连接到任何处理节点`});else{const m=F.filter(i=>i.sourceHandle==="first-frame"),O=r.data.subsequentFrames||[],b=new Set(F.map(i=>i.sourceHandle)),S=O.filter(i=>!b.has(i.handleId));m.length===0&&y.push({nodeId:r.id,message:`数据源节点"${r.data.label}"的首帧检测未连接`}),S.length>0&&y.push({nodeId:r.id,message:`数据源节点"${r.data.label}"有${S.length}个后续帧未连接`})}r.type!==C.START&&r.type!==C.END&&!r.parentNode&&(D.length===0||F.length===0)&&y.push(`节点 "${r.data.label}" 可能未正确连接`)});const q=new Set;o.forEach(r=>{const D=l.find(F=>F.id===r.source);D?.type==="dataSource"&&D.data?.enableImageSequence===!0&&r.sourceHandle!=="first-frame"&&(!r.data?.timeWindowSeconds||r.data.timeWindowSeconds<1)&&c.push({edgeId:r.id,message:`分支"${r.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),q.add(r.source),q.add(r.target)}),n.forEach(r=>{r.parentNode||!q.has(r.id)&&n.length>1&&y.push(`节点 "${r.data.label}" 未连接到工作流`)});const p=st(n,o);c.push(...p);const x=ct(n,o);c.push(...x);const w=it(n);c.push(...w);const s=dt(n,o);c.push(...s);const g=mt(n,o);return c.push(...g),t==="task"&&n.filter(D=>D.type===C.FACE_RECOGNITION).forEach(D=>{(!D.data.arguments?.repositoryId||Array.isArray(D.data.arguments.repositoryId)&&D.data.arguments.repositoryId.length===0)&&c.push({nodeId:D.id,message:`人脸识别节点"${D.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:c.length===0,errors:c,warnings:y}},st=(l,o)=>{const t=[],c=l.find(N=>N.type===C.START);if(!c)return t;const y=new Set,n=(N,E,L,z)=>{if(E.includes(N))return;const q=l.find(g=>g.id===N);if(!q)return;const p=[...E,N];let x=[...L],w=[...z];if(q.type===C.TARGET_COUNT&&x.push(q),q.type===C.TIMER_TARGET&&w.push(q),q.type===C.END){const g=p.join("->");y.has(g)||(y.add(g),x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(r=>`"${r.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),w.length>1&&t.push(`工作流分支中存在多个目标计时节点(${w.map(r=>`"${r.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const s=o.filter(g=>g.source===N);s.length===0?(x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(g=>`"${g.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),w.length>1&&t.push(`工作流分支中存在多个目标计时节点(${w.map(g=>`"${g.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):s.forEach(g=>{n(g.target,p,x,w)})};return n(c.id,[],[],[]),t},it=l=>{const o=[],t=l.filter(y=>y.type===C.DATA_SOURCE),c=l.filter(y=>y.type===C.SMALL_MODEL);return c.length>0&&t.length>1&&c.forEach(y=>{o.push({nodeId:y.id,message:`小模型节点"${y.data.label||y.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},ct=(l,o)=>{const t=[];return l.filter(y=>y.type===C.DATA_SOURCE).forEach(y=>{const n=o.filter(N=>N.source===y.id);if(n.length>1){const N=n.map(z=>z.target),L=l.filter(z=>N.includes(z.id)).filter(z=>z.type===C.SMALL_MODEL);if(L.length>0){const z=L.map(q=>`"${q.data.label||q.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${z})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},dt=(l,o)=>{const t=[],c=[C.TARGET_COUNT,C.TIMER_TARGET],y={[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时"};return l.filter(N=>N.type===C.SMALL_MODEL).forEach(N=>{o.filter(L=>L.source===N.id).forEach(L=>{const z=l.find(q=>q.id===L.target);if(z&&c.includes(z.type)){const q=y[z.type]||z.type;t.push(`小模型节点"${N.data.label||N.data.modelName}"不能直接连接${q}节点"${z.data.label}",请先连接检测目标节点`)}})}),t},mt=(l,o)=>{const t=[],c=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION],y={[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.FACE_RECOGNITION]:"人脸识别"};return l.filter(N=>c.includes(N.type)).forEach(N=>{const E=o.filter(q=>q.source===N.id),L=c.filter(q=>q!==N.type).concat(C.END),z=N.data.label||y[N.type];E.forEach(q=>{const p=l.find(x=>x.id===q.target);p&&!L.includes(p.type)&&t.push(`${z}节点"${z}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${p.data.label||p.type}"节点`)}),E.length===0&&t.push(`${z}节点"${z}"必须连接到其他辅助节点或结束节点`)}),t},He=l=>{const o=new Map;return l.forEach(t=>o.set(t.id,t)),o},ue=(l,o,t)=>(l[o]||[]).map(c=>t.get(c)).filter(Boolean),je=(l,o)=>{const t={},c=new Set(l.filter(n=>n.type==="group").map(n=>n.id));return[...o].sort((n,N)=>{const E=n.data?.branchOrder??1/0,L=N.data?.branchOrder??1/0;return E-L}).forEach(n=>{if(c.has(n.source)&&c.has(n.target))return;let N=n.source,E=n.target;if(c.has(N)){const L=o.find(z=>z.target===N&&!c.has(z.source));if(!L)return;N=L.source}if(c.has(E)){const L=o.find(z=>z.source===E&&!c.has(z.target));if(!L)return;E=L.target}t[N]||(t[N]=[]),t[N].includes(E)||t[N].push(E)}),t},Pe=(l,o)=>{const t=[...o.values()].find(N=>N.type===C.START);if(!t)return[];const c=new Set,y=[],n=N=>{if(c.has(N))return;c.add(N);const E=o.get(N);if(!E)return;E.type!==C.START&&E.type!==C.END&&E.type!=="group"&&y.push(E),(l[N]||[]).forEach(z=>n(z))};return n(t.id),y},pt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],be=(l,o,t,c)=>{const y=l.nodes.findIndex(N=>N.toolTitle===o);if(y===-1)return;const n=l.nodes[y];n.arguments?.[t]&&(l[c]=n.arguments[t]),l.nodes=l.nodes.filter((N,E)=>E!==y),l.nodes.forEach((N,E)=>{N.sortOrder=E+1})},ut=l=>{const o=l.alertConditions||[];return{targetCount:{logic:l.conditionRelation||"AND",rules:o.map(c=>({op:c.operator,value:c.value}))}}},ft=l=>{const o={op:">",value:l.duration??30,unit:"seconds"};if(l.hit_rate_enabled&&l.hit_rate_threshold!==void 0){const c={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:c[l.hit_rate_operator||"gte"]||">=",value:l.hit_rate_threshold}}const t=l.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const c=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[c]||">",value:t.threshold,matchFrames:3}}return l.similarity_enabled&&l.similarity_threshold!==void 0&&(o.similarity={op:">",value:l.similarity_threshold,matchFrames:3}),{duration:o}},gt={[C.TARGET_COUNT]:ut,[C.TIMER_TARGET]:ft},Ce=(l,o)=>{if(!l)return{};const t=gt[o];if(t)return t(l);const c={...l};return pt.forEach(y=>{delete c[y]}),Object.keys(c).forEach(y=>{const n=c[y];(n==null||n==="")&&delete c[y]}),o===C.FACE_RECOGNITION&&c.repositoryId!==void 0&&(Array.isArray(c.repositoryId)||(c.repositoryId=[c.repositoryId]),c.repositoryId.length===0&&delete c.repositoryId),c},ht=l=>{switch(l.type){case C.DETECTION_TARGET:return l.data.targetId||"";case C.CLASSIFICATION_MODEL:return"cls";case C.OCR:return"ocr";case C.LICENSE_PLATE:return"license_plate";case C.SMALL_MODEL:return l.data.title||l.data.modelName||"";case C.TARGET_COUNT:return"target_count";case C.TIMER_TARGET:return"timer_target";case C.FACE_RECOGNITION:return"face";default:return l.data.label||""}},yt=(l,o,t,c,y=null)=>{const n={toolTitle:ht(l),nodeName:l.data.label||l.data.targetName||"",sortOrder:o,arguments:Ce(y??l.data.arguments,l.type)};if(l.data.enableBranch&&l.data.branchLogic&&(n.branchLogic=l.data.branchLogic),t){const N=c.find(E=>E.source===t&&E.target===l.id);N?.data?.branchOrder!==void 0&&N?.data?.branchOrder!==null&&(n.branchOrder=N.data.branchOrder)}return n},ze=(l,o,t,c,y,n=null,N=[])=>{const E=[],L=Array.isArray(l)?[...l]:[l],z=new Set;let q=1;for(;L.length>0;){const p=[...L];L.length=0;const x=[];p.forEach(w=>{if(z.has(w))return;z.add(w);const s=c.get(w);!s||s.type===C.END||s.type===C.START||s.type===C.DATA_SOURCE||((t[w]||[]).forEach(r=>{const D=c.get(r);D&&D.type!==C.END&&L.push(r)}),N.includes(s.type))||x.push(s)}),x.length>0&&(x.forEach(w=>{const s=n?.(w.id)??null,g=yt(w,q,o,y,s);x.length>1&&(g.nodeLogic="or"),E.push(g)}),q++)}return E},_t=(l=null,o=null)=>{const t=l??le(),c=e.inject("editorMode",oe.ALGORITHM);e.inject("pageMode",Ne.CREATE);const y=o??e.inject("editorConfig",null),n=e.computed(()=>Ge(t.nodes,t.edges,c)),N=(a,h,u,k)=>{if(u){const I=ue(a,u.id,h).find(P=>P.type===C.SMALL_MODEL);if(I)return I}return k.find(I=>I.type===C.SMALL_MODEL)||null},E=(a,h,u)=>{const I=ue(h,a.id,u).find(A=>A.type===C.SMALL_MODEL);return I?ue(h,I.id,u).filter(A=>A.type!==C.END&&A.type!==C.START&&A.type!==C.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},L=(a,h,u,k,I)=>{if(h===de.SMALL_MODEL||h===de.SMALL_MODEL_BRANCH){const A=N(k,I,u,a);return A?{toolTitle:A.data.title||A.data.modelName||"",toolType:"small",arguments:Ce(A.data.arguments,C.SMALL_MODEL)}:null}const P=a.find(A=>A.type===C.DETECTION_TARGET);return P?{toolTitle:P.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:Ce(P.data.arguments,C.DETECTION_TARGET)}:null},z=()=>{const a=t.nodes.find(k=>k.type===C.END);if(!a||!a.data.arguments)return{};const h=a.data.arguments,u={};return h.reportFrequency==="interval"&&h.reportInterval&&(u.interval={value:h.reportInterval}),h.enableDeduplication&&h.similarityThreshold!==void 0&&(u.dedup={value:h.similarityThreshold}),u},q=a=>{if(a.length<=1)return;const h=a.map(k=>k.sortOrder);if(new Set(h).size!==h.length){const k=h.filter((I,P)=>h.indexOf(I)!==P);throw new Error(`分支执行顺序存在重复:${[...new Set(k)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},p=(a,h,u,k,I)=>{let P=[],A;if(a===de.IMAGE_BRANCH)h&&(P=ue(k,h.id,I).filter(G=>G.type!==C.END)),A=h?.id||u.find(G=>G.type===C.DATA_SOURCE)?.id;else if(a===de.SMALL_MODEL_BRANCH){const G=N(k,I,h,u);G&&(P=ue(k,G.id,I).filter(R=>R.type!==C.END),A=G.id)}return{branchStartNodes:P,sourceNodeId:A}},x=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]),w=(a,h,u)=>{const k=new Set,I=[],P=A=>{if(k.has(A))return;k.add(A);const G=u.get(A);if(!G||G.type===C.END)return;x.has(G.type)&&I.push(G),(h[A]||[]).forEach(Y=>P(Y))};return P(a),I.length>0?I[I.length-1]:null},s=(a,h,u,k,I)=>{const P=`分支${I+1}`,A=w(h,u,k);if(!A)return a?.data?.nodeName||P;if(A.type===C.DETECTION_TARGET&&A.data?.targetId==="other"){const R=A.data?.arguments?.object;if(Array.isArray(R)&&R.length>0){const Y=R.join(",");return Y.length>32?Y.slice(0,32):Y}}if(A.type===C.CLASSIFICATION_MODEL){const R=A.data?.arguments?.modelName||A.data?.label;if(!R)return P;const Y=A.data?.arguments?.resultNegate?"(取反)":"";return R+Y}return A.data?.label||A.data?.targetName||P},g=(a,h,u,k,I,P)=>{const{branchStartNodes:A,sourceNodeId:G}=p(h,u,a,k,I);if(A.length===0)return[];const R=[];return A.forEach((Y,f)=>{const M=ze([Y.id],G,k,I,P);if(M.length===0)return;const H=G?P.find(d=>d.source===G&&d.target===Y.id):null,J=H?.data||{},j=J.branchOrder!==void 0&&J.branchOrder!==null?J.branchOrder:f+1,V={branchName:J.branchName||s(Y,Y.id,k,I,f),sortOrder:j,nodes:M};H?.sourceHandle&&(V.sourceHandle=H.sourceHandle),be(V,"target_count","targetCount","targetCount"),be(V,"timer_target","duration","duration"),J.timeWindowSeconds!==void 0&&J.timeWindowSeconds!==null&&(V.timeWindowSeconds=J.timeWindowSeconds),J.branchDescription&&(V.description=J.branchDescription),R.push(V)}),q(R),R},r=()=>{const a=n.value;if(a.errors.length>0){const h=a.errors.map(u=>typeof u=="object"?u.message:u);return v.ElMessage.error(`验证失败: ${h.join(", ")}`),!1}return a.warnings.length>0&&v.ElMessage.warning(`警告: ${a.warnings.join(", ")}`),!0},D=()=>{const a=t.nodes,h=t.edges,u=He(a),k=je(a,h),I=Pe(k,u),P=[...u.values()].find(A=>A.type===C.START);return{allNodes:a,edges:h,nodeMap:u,adj:k,orderedNodes:I,startNode:P}},F=a=>{const h={ruleName:a?.data?.algorithmName||"",description:"",webhookUrl:""},u=z();Object.keys(u).length>0&&(h.extraConfig=u);const I=(y?.value??y)?.platform;return h.attach=I?{platform:I}:{},h},m=(a,h)=>{const u=a.filter(k=>k.type===C.DATA_SOURCE);if(u.length===0){const k=h.find(I=>I.type===C.DATA_SOURCE);k&&u.push(k)}return u},O=a=>a?.data?.enableImageSequence||a?.data?.arguments?.enableImageSequence||!1?"order":a?.data?.enableBranch&&a.data.branchLogic||"and",b=(a,h,u,k)=>{const{orderedNodes:I,adj:P,nodeMap:A,edges:G}=h,R=E(a,P,A),Y=!!a.data.arguments?.needCooperativeDetection,f=G.find(V=>V.target===a.id),M=f?.data?.branchOrder!==void 0&&f?.data?.branchOrder!==null?f.data.branchOrder:k+1,H={sourceGroupId:null,name:a.data.label||"数据源",sort:M,synEnabled:Y};if(Y&&(H.windowSeconds=a.data.arguments?.windowSeconds||5),R===de.SMALL_MODEL){const V=L(I,R,a,P,A);return V&&(H.streamConfig=V),H.logic="and",H.children=[],H}if(R===de.SMALL_MODEL_BRANCH){const V=L(I,R,a,P,A);V&&(H.streamConfig=V)}H.logic=O(a);const J=g(I,R,a,P,A,G),j=u.length;return H.children=J.map((V,d)=>({name:V.branchName,branchRefs:[j+d]})),u.push(...J),H},S=(a,h)=>{const k={groupLogic:a?.data?.enableBranch&&a.data.branchLogic||"and",sourceGroups:h};return h.length>=2&&(k.groupWindowSeconds=a.data.groupWindowSeconds),k},i=()=>{if(!r())return null;try{const a=D(),h=F(a.startNode),u=m(a.orderedNodes,a.allNodes),k=[],I=u.map((P,A)=>b(P,a,k,A));return h.ruleSchema=S(a.startNode,I),k.length>0&&(h.branches=k),h}catch(a){return v.ElMessage.error(a.message||"导出失败"),null}};return{validation:n,exportToJSON:i,copyToClipboard:()=>{try{const a=i();if(!a)return;const h=JSON.stringify(a,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(h).then(()=>{v.ElMessage.success("已复制到剪贴板")}).catch(()=>{v.ElMessage.error("复制失败")});else{const u=document.createElement("textarea");u.value=h,u.style.position="fixed",u.style.opacity="0",document.body.appendChild(u),u.select(),document.execCommand("copy"),document.body.removeChild(u),v.ElMessage.success("已复制到剪贴板")}}catch(a){console.error("复制JSON失败:",a),v.ElMessage.error(`复制失败: ${a.message}`)}},downloadJSON:()=>{const a=i();if(!a)return;const h=JSON.stringify(a,null,2),u=new Blob([h],{type:"application/json"}),k=URL.createObjectURL(u),I=document.createElement("a");I.href=k,I.download=`workflow_${Date.now()}.json`,I.click(),URL.revokeObjectURL(k),v.ElMessage.success("导出成功")}}},Nt=(l=null,o=null)=>{const t=l??le();e.inject("editorMode",oe.TASK),e.inject("pageMode",Ne.CREATE);const c=e.inject("editorConfig",null),y=e.inject("taskModeConfig",null),n=o??c,N=o??y,E=e.inject("echoTaskData",null),L=e.computed(()=>({errors:[],warnings:[]})),z=(F,m)=>{const O={},b=m?.data?.arguments??{};b.reportFrequency==="interval"&&b.reportInterval&&(O.interval={value:b.reportInterval}),b.enableDeduplication&&b.similarityThreshold!==void 0&&(O.dedup={value:b.similarityThreshold}),t.nodes.filter(_=>_.type===C.DATA_SOURCE).length>=2&&F?.data?.groupWindowSeconds!==void 0&&(O.groupWindowSeconds=F.data.groupWindowSeconds),O.enableVideo=!!F?.data?.enableAlertVideo;const i=F?.data?.schedule;return Array.isArray(i)&&i.length>0?O.schedule=i:O.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],O},q=(F,m,O,b,S="image")=>{const i=ue(m,F.id,O).find(_=>_.type===C.SMALL_MODEL);if(i){const _=F.data?.arguments??{};return{toolTitle:i.data.title||i.data.modelName||"",toolType:"small",arguments:Ce(i.data.arguments,C.SMALL_MODEL),decoder:p(_,!0)}}if(S==="stream"){const _=b.find(a=>a.type===C.DETECTION_TARGET);if(!_)return null;const B=F.data?.arguments??{};return{toolTitle:_.data.targetId||"",toolType:"stream",arguments:Ce(_.data.arguments,C.DETECTION_TARGET),decoder:p(B,!1)}}return null},p=(F,m)=>{const O=F.mode??(m?3:0),b=F.interval??0,S=F.sw_decoding??(m?"CPU":"GPU");let i=0,_=0;return m?O===3?(i=0,_=0):O===2?(i=1,_=0):O===1&&(i=0,_=b):O===0?(i=0,_=b*25):O===1?(i=0,_=b):O===2&&(i=1,_=0),{sw_decoding:S==="CPU",mode:i,interval:_}},x=(F,m,O,b,S=null)=>{let i=F.id,_=ue(m,F.id,O).filter(h=>h.type!==C.END&&h.type!==C.START);_.length===1&&_[0].type===C.SMALL_MODEL&&(i=_[0].id,_=ue(m,i,O).filter(h=>h.type!==C.END&&h.type!==C.START));const B=_;if(B.length===0)return[];const a=S?h=>t.getTaskSourceArguments(F.id,S,h):null;return B.map((h,u)=>{const k=ze([h.id],i,m,O,b,a,[C.SMALL_MODEL]),I=b.find(Y=>Y.source===i&&Y.target===h.id),P=I?.data??{},A=P.branchOrder??u+1,G=P.branchId??null,R={branchId:G,id:G,branchName:P.branchName||h.data?.label||`分支${u+1}`,sortOrder:A,nodes:k};return I?.sourceHandle&&(R.sourceHandle=I.sourceHandle),P.timeWindowSeconds!==void 0&&P.timeWindowSeconds!==null&&(R.timeWindowSeconds=P.timeWindowSeconds),P.branchDescription&&(R.description=P.branchDescription),be(R,"target_count","targetCount","targetCount"),be(R,"timer_target","duration","duration"),R})},w=(F,m,O,b,S=null,i=null,_=null,B=1,a=!1,h=!1)=>{const u=S??F.deviceType??"",k=u==="1400"||u==="2",I=k?"1400":"camera",P=m==="stream"?2:1,A=k&&i!==null?i==="device"?1:2:F.detectionType??2,R=(E?.value??E)?.graph?.sources??[],Y=String(F.sourceId??F.id??""),M=R.find(J=>String(J.sourceId)===Y)?.attach??{},H={deviceType:I,detectionType:A,dataSourceType:P,sourceOrder:O,timeTemplateId:M.timeTemplateId??"",timeTemplateName:M.timeTemplateName??"",platform:b?.platform??"TAI"};if(!k){const J=_?.mode??0;J===3?(H.frameExtractionType=0,H.frameInterval=0):J===2?(H.frameExtractionType=h?1:3,H.frameInterval=0):(H.frameExtractionType=J+1,H.frameInterval=_?.interval??30);const j=_?.sw_decoding??"CPU";H.frameExtractionSourceType=j==="GPU"?2:1,B===1&&m==="image"&&!a&&!!_?.enablePatrol?H.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,_?.patrolGroupSize??1)),pollingInterval:"0"}:H.pollingConfig={enablePolling:0},H.thirdId=F.thirdId??""}return H},s=(F,m,O,b,S,i,_)=>{const B=N?.value??N,a=B?.value??B,h=a?.datasource?.getDevices?.(F.id)??[],u=F.data?.sourceGroupId??null,k=!!F.data?.arguments?.needCooperativeDetection,I=k?F.data?.arguments?.windowSeconds??5:void 0,P=m?.data?.streamType??"image",A=ue(O,F.id,b).some(V=>V.type===C.SMALL_MODEL),G=A?"small":P,R=q(F,O,b,_,P),Y=F.data?.arguments?.deviceType??null,f=F.data?.arguments?.detectionMode??null,M=F.data?.arguments??null,H=t.getDataSourceCount();if(h.length>0)return h.map((V,d)=>{const T=String(V.sourceId??V.id??""),U=x(F,O,b,S,T),X={sourceId:V.sourceId??V.id??"",sourceName:V.sourceName??V.name??"",sourceType:G,sourceGroupId:u,areas:V.area??V.areas??[],lines:V.lines??null,direction:V.direction??null,branches:U,attach:w(V,P,d,a,Y,f,M,H,k,A),synEnabled:k,...I!==void 0&&{windowSeconds:I}};return R&&(X.streamConfig=R,X.streamUrl="rtsp"),X});const J=x(F,O,b,S),j={sourceId:"",sourceName:F.data?.label??"数据源",sourceType:G,sourceGroupId:u,areas:[],branches:J,attach:w({},P,0,a,Y,f,M,H,k,A),synEnabled:k};return R&&(j.streamConfig=R,j.streamUrl="rtsp"),[j]},g=()=>{try{const F=t.nodes,m=t.edges,O=He(F),b=je(F,m),S=[...O.values()].find(I=>I.type===C.START),i=[...O.values()].find(I=>I.type===C.END),_=n?.value??n,B=_?.value??_,a=Pe(b,O);let h=a.filter(I=>I.type===C.DATA_SOURCE);h.length===0&&(h=F.filter(I=>I.type===C.DATA_SOURCE));const u=h.flatMap((I,P)=>s(I,S,b,O,m,P,a)),k={workflowName:S?.data?.taskName??"",ruleId:B?.ruleId??"",sources:u,extraConfig:z(S,i),description:""};if((B?.platform??"TAI")==="THIRD"){const P=h[0]?.data?.arguments??{},A=P.mode??0,G=P.interval??0;let R,Y,f;return A===0?(R="time",Y=G,f=0):(R="frame",Y=0,A===3?f=0:A===2?f=-1:f=G),{name:k.workflowName,type:"simple",plan:k.extraConfig.schedule??[],inferStrategy:R,timeInterval:Y,frameInterval:f,mps:k.extraConfig.enableVideo??!1,graph:k}}return k}catch(F){return v.ElMessage.error(F.message||"导出失败"),null}};return{validation:L,exportToJSON:g,copyToClipboard:()=>{const F=g();if(!F)return;const m=JSON.stringify(F,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(m).then(()=>v.ElMessage.success("已复制到剪贴板")).catch(()=>v.ElMessage.error("复制失败"));else{const O=document.createElement("textarea");O.value=m,O.style.position="fixed",O.style.opacity="0",document.body.appendChild(O),O.select(),document.execCommand("copy"),document.body.removeChild(O),v.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const F=g();if(!F)return;const m=JSON.stringify(F,null,2),O=new Blob([m],{type:"application/json"}),b=URL.createObjectURL(O),S=document.createElement("a");S.href=b,S.download=`task_workflow_${Date.now()}.json`,S.click(),URL.revokeObjectURL(b),v.ElMessage.success("导出成功")}}},Ct=(l=null,o=null,t=null)=>{const c=e.inject("editorMode",oe.ALGORITHM);return(l??c)===oe.TASK?Nt(o,t):_t(o,t)},kt=l=>{if(!l)return null;const o=l.indexOf("{");if(o===-1)return null;try{return JSON.parse(l.slice(o))}catch{return null}};function bt(l=null,o=null,t=null){const c=o??le(),y=e.inject("editorMode",oe.ALGORITHM),n=l??y,N=e.inject("taskModeConfig",null),E=t??N,L=p=>{const{type:x,data:w}=p,s=w.arguments||{},g=[];switch(x){case C.START:if(n===oe.TASK)if(w.taskName?.trim()||g.push("任务名称"),!w.executionTime?.trim())g.push("任务执行时间");else{const r=kt(w.executionTime);(!r||!Array.isArray(r.plan)||r.plan.length===0)&&g.push("任务执行时间(计划为空)")}else w.algorithmName?.trim()||g.push("算法名称");break;case C.SMALL_MODEL:w.modelId||g.push("模型选择");break;case C.DETECTION_TARGET:w.targetId||g.push("检测目标选择");break;case C.CLASSIFICATION_MODEL:s.modelId||g.push("分类模型选择");break;case C.DATA_SOURCE:n===oe.TASK&&((E?.value??E)?.datasource?.getDevices?.(p.id)??[]).length===0&&g.push("设备选择");break;case C.TARGET_COUNT:break;case C.TIMER_TARGET:(!s.duration||s.duration<1)&&g.push("持续时间");break}return g},z=p=>{const x=c.nodes.find(s=>s.id===p.source);if(!x)return[];const w=[];return x.type===C.DATA_SOURCE&&x.data?.enableImageSequence===!0&&p.sourceHandle!=="first-frame"&&(!p.data?.timeWindowSeconds||p.data.timeWindowSeconds<1)&&w.push("后续检测帧的持续时间"),w};return{runValidation:()=>{const{nodes:p,edges:x}=c;c.clearInvalidIds();const w=Ge(p,x,n),s=w.errors,g=[],r=[],D=[];p.filter(i=>i.type!=="group").forEach(i=>{const _=L(i);_.length>0&&(g.push(i.id),D.push(`节点"${i.data.label}"缺少必填参数:${_.join("、")}`))}),x.forEach(i=>{const _=z(i);_.length>0&&(r.push(i.id),D.push(`分支"${i.data?.branchName||"未命名"}"缺少:${_.join("、")}`))}),s.forEach(i=>{typeof i=="object"&&(i.nodeId&&g.push(i.nodeId),i.edgeId&&r.push(i.edgeId))}),(g.length>0||r.length>0)&&(c.setInvalidIds(g,r),setTimeout(()=>{c.clearInvalidIds()},5e3));const m=s.map(i=>typeof i=="object"?i.message:i),O=w.warnings.map(i=>typeof i=="object"?i.message:i),b=[...m.map(i=>({msg:i,type:"error"})),...D.map(i=>({msg:i,type:"warning"})),...O.map(i=>({msg:i,type:"warning"}))],S=m.length===0&&D.length===0;if(S&&O.length===0)v.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(b.length>0){const i=b[0];v.ElMessage[i.type](i.msg)}return{passed:S,errors:[...m,...D],warnings:O}}}}const ne=(l,o)=>{const t=l.__vccOpts||l;for(const[c,y]of o)t[c]=y;return t},xt={key:0},Et={class:"node-list"},wt={class:"node-list"},Tt={class:"node-list"},St={class:"node-list"},Vt=ne({__name:"NodeToolbox",setup(l){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),c=(y,n)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",n),y.dataTransfer.effectAllowed="move")};return(y,n)=>{const N=e.resolveComponent("el-icon"),E=e.resolveComponent("VideoPlay"),L=e.resolveComponent("CircleClose"),z=e.resolveComponent("el-collapse-item"),q=e.resolveComponent("FolderOpened"),p=e.resolveComponent("Cpu"),x=e.resolveComponent("View"),w=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]=s=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",xt,"节点工具箱")):(e.openBlock(),e.createBlock(N,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(N,{key:2,class:"toggle-btn",onClick:n[0]||(n[0]=e.withModifiers(s=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(w,{key:0,modelValue:t.value,"onUpdate:modelValue":n[13]||(n[13]=s=>t.value=s),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(z,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[2]||(n[2]=s=>c(s,"start"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),n[14]||(n[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[3]||(n[3]=s=>c(s,"end"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(L)]),_:1}),n[15]||(n[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(z,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[4]||(n[4]=s=>c(s,"dataSource"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(q)]),_:1}),n[16]||(n[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[5]||(n[5]=s=>c(s,"smallModel"))},[e.createVNode(N,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]=s=>c(s,"detectionTarget"))},[e.createVNode(N,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]=s=>c(s,"classificationModel"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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",Tt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[8]||(n[8]=s=>c(s,"targetCount"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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]=s=>c(s,"timerTarget"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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",St,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:n[10]||(n[10]=s=>c(s,"ocr"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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]=s=>c(s,"licensePlate"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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]=s=>c(s,"faceRecognition"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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 Te{static backendToFrontend(o){const{id:t,title:c,name:y,inputSchema:n,extraConfig:N}=o,E={id:t,title:c,label:y,type:"DETECTION_TARGET",inputSchema:n,extraConfig:N,data:{targetId:c,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:N?.showStruct!==void 0?!1:void 0}};return Object.keys(E.data).forEach(L=>{E.data[L]===void 0&&delete E.data[L]}),E}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Ue=l=>ot[l]||l,he=(l,o,t={})=>({id:me(l),type:l,position:{...o},data:{label:t.label||Ue(l),...t}}),ke=(l,o,t={})=>{const{sourceHandle:c,...y}=t,n={id:`e_${l}_${o}`,source:l,target:o};return c&&(n.sourceHandle=c),Object.keys(y).length>0&&(n.data=y),n},Bt=l=>{if(!l)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=l.rules||[],t=l.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(c=>({operator:c.op,value:c.value}))}},At=l=>{if(!l)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:l.value??30,condition_type:l.similarity?"similarity":"hit_rate",similarity_enabled:!!l.similarity,similarity_threshold:l.similarity?.value??90,hit_rate_enabled:!!l.hitCount,hit_rate_operator:o[l.hitCount?.op]||"gt",hit_rate_threshold:l.hitCount?.value??2,overlap_detection:l.overlap?{enabled:!0,operator:o[l.overlap.op]||"gt",threshold:l.overlap.value}:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1}},Dt=l=>{if(!l)return{};const o={};return l.interval&&(o.reportFrequency="interval",o.reportInterval=l.interval.value),l.dedup&&(o.enableDeduplication=!0,o.similarityThreshold=l.dedup.value),o},Lt=()=>({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"]}),Ot=()=>({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:[]}),Mt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,l=>{const o=Math.random()*16|0;return(l==="x"?o:o&3|8).toString(16)}),We=()=>{const l=le(),o=e.inject("editorConfig",null),t=m=>nt[m]||C.DETECTION_TARGET,c=(m,O)=>m?.find(b=>b.id===String(O))??m?.[O],y=(m,O)=>m.streamConfig?(m.children||[]).some(i=>(i.branchRefs||[]).some(_=>c(O.branches,_)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,n=m=>!m||typeof m!="object"?"无效的JSON格式":!m.ruleName&&m.ruleName!==""?"缺少 ruleName 字段":m.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",N=m=>{const O=o?.value??o;return m==="small"?O?.smallModels||[]:m==="detection"?O?.detection||[]:m==="classification"?O?.classification?.models||[]:[]},E=()=>{},L=(m,O)=>{m.modelName=O||"",m.title=O||"",m.modelId=O||null;const S=N("small").find(i=>i.title===O);S&&(m.input_schema=S.inputSchema||S.input_schema||{},m.modelId=S.id||S.title,m.modelName=S.name||O,m.modelType=S.type,m.supportDirectAlert=S.supportDirectAlert||!1,m.extraConfig=S.extraConfig)},z=async(m,O)=>{const b=t(m.toolTitle),S={label:m.nodeName||Ue(b),arguments:m.arguments||{},input_schema:{}};switch(b){case C.DETECTION_TARGET:S.targetId=m.toolTitle,S.targetName=m.nodeName||"检测目标";{const _=N("detection").find(B=>B.title===m.toolTitle);if(_){let a=Te.backendToFrontend(_).inputSchema||{};if(m.toolTitle==="other"){const h={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}}};a={...a,properties:{...a.properties,...h.properties}}}S.input_schema=a}}break;case C.CLASSIFICATION_MODEL:S.modelName=m.nodeName||"分类模型";break;case C.SMALL_MODEL:L(S,m.toolTitle);break}return m.branchLogic&&(S.enableBranch=!0,S.branchLogic=m.branchLogic),he(b,O,S)},q=(m,O,b,S)=>{const i={label:"小模型",input_schema:{},arguments:m.arguments||{}};return L(i,m.toolTitle),O===de.SMALL_MODEL_BRANCH&&(i.enableBranch=!0,i.branchLogic=b.logic||"and"),he("smallModel",S,i)},p=async(m,O,b,S,i,_)=>{let B=O,a=S;const h={branchOrder:m.sortOrder??1,branchName:m.branchName||"",branchId:m.id??null};m.sourceHandle&&(h.sourceHandle=m.sourceHandle);const u=m.timeWindowSeconds??m.extraConfig?.timeWindowSeconds;u!==void 0&&(h.timeWindowSeconds=u),m.description&&(h.branchDescription=m.description);const k=[...m.nodes||[]].sort((f,M)=>(f.sortOrder??0)-(M.sortOrder??0)),I=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]);let P=-1;k.forEach((f,M)=>{I.has(t(f.toolTitle))&&(P=M)});const A=k.map(f=>({kind:"regular",data:f})),G=m.targetCount??m.extraConfig?.targetCount,R=m.duration??m.extraConfig?.duration,Y=[];G&&Y.push({kind:"targetCount",data:G}),R&&Y.push({kind:"timerTarget",data:R}),Y.length>0&&A.splice(P+1,0,...Y);for(let f=0;f<A.length;f++){const M=A[f];let H;if(M.kind==="regular")H=await z(M.data,{x:a,y:b});else if(M.kind==="targetCount"){const J=Bt(M.data);H=he("targetCount",{x:a,y:b},{label:"目标计数",arguments:J,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const J=At(M.data);H=he("timerTarget",{x:a,y:b},{label:"目标计时",arguments:J,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"}}})}i.push(H),_.push(ke(B,H.id,f===0?h:void 0)),B=H.id,a+=ie.H_GAP}return{lastNodeId:B,endX:a}},x=m=>{const O=m.ruleSchema.sourceGroups||[],b=m.ruleSchema.groupLogic||"and",S=O.length>1;return he("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:m.ruleName||"",enableBranch:S?!0:b!=="and",branchLogic:b,groupWindowSeconds:m.ruleSchema.groupWindowSeconds??null})},w=m=>{const O=Dt(m.extraConfig);return he("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:Lt(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...O}})},s=(m,O)=>[...m||[]].sort((b,S)=>(b.sort??0)-(S.sort??0)).map(b=>{const S=y(b,O),i=[];return(b.children||[]).forEach(_=>{(_.branchRefs||[]).forEach(B=>{const a=c(O.branches,B);a&&i.push(a)})}),i.sort((_,B)=>(_.sortOrder??0)-(B.sortOrder??0)),{sg:b,mode:S,refBranches:i}}),g=m=>{const b=(m.reduce((S,i)=>S+Math.max(i.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-b/2},r=async(m,O,b,S,i,_)=>{const{sg:B,mode:a,refBranches:h}=m,u=Math.max(h.length,1),k=b+(u-1)*ie.V_GAP/2;let I=ie.START_X+ie.H_GAP,P=ie.START_X;const A=B.logic==="order",G=he("dataSource",{x:I,y:k},{label:B.name||"数据源",sourceGroupId:B.sourceGroupId??null,enableImageSequence:A,input_schema:Ot(),arguments:{needCooperativeDetection:!!B.synEnabled,windowSeconds:B.windowSeconds||5,enableImageSequence:A},enableBranch:!0,branchLogic:A?"order":B.logic||"and"});S.push(G),i.push(ke(O.id,G.id,{branchOrder:B.sort??null,branchName:B.name||""})),A&&h.forEach((f,M)=>{f.sourceHandle||(f.sourceHandle=M===0?"first-frame":Mt())});const R=A?{dataSourceNode:G,refBranches:h}:null;let Y=G.id;if(a===de.SMALL_MODEL||a===de.SMALL_MODEL_BRANCH){I+=ie.H_GAP;const f=q(B.streamConfig,a,B,{x:I,y:k});S.push(f),i.push(ke(G.id,f.id)),Y=f.id}if(h.length>0)for(let f=0;f<h.length;f++){const M=b+f*ie.V_GAP,{lastNodeId:H,endX:J}=await p(h[f],Y,M,I+ie.H_GAP,S,i);i.push(ke(H,_.id)),J>P&&(P=J)}else{i.push(ke(Y,_.id));const f=I+ie.H_GAP;f>P&&(P=f)}return{branchY:b+u*ie.V_GAP,maxX:P,imageSequenceInfo:R}},D=m=>{for(const{dataSourceNode:O,refBranches:b}of m){const S=b.filter(i=>i.sourceHandle&&i.sourceHandle!=="first-frame");S.length>0&&(O.data.subsequentFrames=S.map((i,_)=>({id:_===0?"default-subsequent":`subsequent-${Date.now()}-${_}`,label:_===0?"后续帧检测":`后续帧检测${_+1}`,handleId:i.sourceHandle})))}};return{importFromJSON:async m=>{const O=n(m);if(O)return v.ElMessage.error(O),!1;try{E();const b=[],S=[],i=x(m),_=w(m);b.push(i);const B=s(m.ruleSchema.sourceGroups,m);let a=g(B),h=ie.START_X;const u=[];for(const k of B){const I=await r(k,i,a,b,S,_);a=I.branchY,I.maxX>h&&(h=I.maxX),I.imageSequenceInfo&&u.push(I.imageSequenceInfo)}return _.position.x=h+ie.H_GAP,b.push(_),D(u),l.loadWorkflow(b,S),v.ElMessage.success("导入成功"),!0}catch(b){return v.ElMessage.error("导入失败: "+(b.message||"未知错误")),!1}},validateImportJSON:n}},It=()=>{const l=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=le(),{importFromJSON:c,validateImportJSON:y}=We(),n=(s,g)=>{const r=s.mode??0,D=s.interval??0,F=s.sw_decoding===!1?"GPU":"CPU";let m,O;return g?r===1?(m=2,O=0):r===0&&D===0?(m=3,O=0):(m=1,O=D):r===1?(m=2,O=0):D===0?(m=0,O=30):(m=0,O=D),{mode:m,interval:O,sw_decoding:F}},N=(s,g)=>{const r=s.frameExtractionType??1,D=s.frameInterval??0,m=(s.frameExtractionSourceType??1)===2?"GPU":"CPU";let O,b;return r===0?(O=3,b=0):r===1&&D===0?(O=g?2:0,b=30):r===1?(O=0,b=D):r===2?(O=1,b=D):r===3?(O=2,b=0):(O=g?3:0,b=30),{mode:O,interval:b,sw_decoding:m}},E=s=>s===1?"device":"platform",L=s=>!s||s.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(s.pollingAmount??1)},z=(s,g,r)=>{if(g){const D=s.find(F=>F.sourceGroupId===g);if(D)return D}return s[r]??null},q=(s,g)=>{if(!s?.branches)return null;for(const r of s.branches){const D=r.nodes?.find(F=>F.toolTitle===g);if(D?.arguments)return{...D.arguments}}return null},p=s=>{if(!Array.isArray(s)||s.length===0)return{timeZone:"",planType:0};const g=s.map(D=>({dayType:Number(D.dayType??0),timePeriod:(D.timePeriod??[]).map(F=>({startTime:F.startTime,endTime:F.endTime}))})),r=g.some(D=>D.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:g}),planType:r}},x=async()=>{const s=l?.value??l;if(!s||typeof s!="object"||Object.keys(s).length===0)return;const g=s.graph??{},r=g.sources??[],D=g.extraConfig??{},F=t.nodes.find(i=>i.type===C.START);if(F){const i=s.name??g.workflowName??"",_=!!D.enableVideo,B=D.schedule??[],{timeZone:a,planType:h}=p(B);t.updateNodeData(F.id,{taskName:i,enableAlertVideo:_,schedule:B,timeZone:a,planType:h,...a?{executionTime:a}:{}})}const m=t.nodes.filter(i=>i.type===C.DATA_SOURCE),O=t.nodes.some(i=>i.type===C.SMALL_MODEL);return m.forEach((i,_)=>{const B=i.data?.sourceGroupId??null,a=z(r,B,_);if(!a)return;const h=a.attach??{},u=a.streamConfig?.decoder??null,k=h.deviceType==="1400"?"1400":"camera",I=k==="camera"?u?n(u,O):N(h,O):{},P=k==="camera"?L(h.pollingConfig):{},A=k==="1400"?{detectionMode:E(h.detectionType)}:{},G=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...G,deviceType:k,...I,...P,...A}});const R=o?.value??o;if(R?.datasource?.setDevices){const f=(B?r.filter(M=>M.sourceGroupId===B):[a]).map(M=>({sourceId:M.sourceId??"",sourceName:M.sourceName??"",thirdId:M.attach?.thirdId??"",area:M.areas??[],lines:M.lines??[],direction:M.direction??[]}));R.datasource.setDevices(i.id,f)}}),t.nodes.filter(i=>i.type===C.DETECTION_TARGET).forEach(i=>{const _=new Set,B=[i.id];let a=null;for(;B.length&&!a;){const R=B.shift();if(_.has(R))continue;_.add(R);const Y=t.edges.filter(f=>f.target===R);for(const f of Y){const M=t.nodes.find(H=>H.id===f.source);if(M){if(M.type===C.DATA_SOURCE){a=M.id;break}B.push(M.id)}}}if(!a)return;const u=(o?.value??o)?.datasource?.getDevices?.(a)??[];if(u.length<=1)return;const k=i.data?.targetId;if(!k)return;const I=u.map(R=>{const Y=String(R.sourceId??R.id??""),f=r.find(M=>String(M.sourceId)===Y);if(!f?.branches)return{deviceId:Y,args:null};for(const M of f.branches){const H=M.nodes?.find(J=>J.toolTitle===k);if(H?.arguments)return{deviceId:Y,args:{...H.arguments}}}return{deviceId:Y,args:null}}),P=I.filter(R=>R.args!==null);if(P.length===0)return;const A=JSON.stringify(P[0].args);if(P.some(R=>JSON.stringify(R.args)!==A)){const R=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...R,configMode:"perDevice"}}),I.forEach(({deviceId:Y,args:f})=>{f&&t.setTaskSourceArguments(a,Y,i.id,f)})}}),t.nodes.filter(i=>i.type===C.FACE_RECOGNITION).forEach(i=>{const _=new Set,B=[i.id];let a=null;for(;B.length&&!a;){const G=B.shift();if(_.has(G))continue;_.add(G);const R=t.edges.filter(Y=>Y.target===G);for(const Y of R){const f=t.nodes.find(M=>M.id===Y.source);if(f){if(f.type===C.DATA_SOURCE){a=f.id;break}B.push(f.id)}}}const u=(a?t.nodes.find(G=>G.id===a):null)?.data?.sourceGroupId??null,k=m.findIndex(G=>G.id===a),I=z(r,u,k>=0?k:0);if(!I)return;const P=q(I,"face");if(!P?.repositoryId)return;const A=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...A,repositoryId:Array.isArray(P.repositoryId)?P.repositoryId:[P.repositoryId]}})}),!0};return{importFromJSON:async s=>{const g=y(s);return g?(v.ElMessage.error(g),!1):await c(s)?(await x(),!0):!1},applyTaskData:x,validateImportJSON:y}},Rt=()=>{if(e.inject("editorMode",oe.ALGORITHM)===oe.TASK)return It();const{importFromJSON:o,validateImportJSON:t}=We();return{importFromJSON:o,validateImportJSON:t,applyTaskData:async()=>{}}},$t={class:"node-content"},Ft={class:"node-label"},qt=ne({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("VideoPlay"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",$t,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",Ft,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Gt={class:"node-content"},Ht={class:"node-label"},jt=ne({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("CircleClose"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Gt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",Ht,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Pt={class:"node-content"},zt={class:"node-info"},Ut={class:"node-label"},Wt={key:1,class:"sequence-handles"},Jt={class:"handle-item"},Yt={class:"handle-label"},Xt={key:0,class:"handle-item add-button-item"},Qt=ne({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=le(),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,q=>{const p=Math.random()*16|0;return(q==="x"?p:p&3|8).toString(16)}),N=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let E=!1;const L=()=>{if(E)return;E=!0;const q=o.data.subsequentFrames||[],p={id:n(),label:`后续帧检测${q.length+1}`,handleId:n()};t.addSubsequentFrame(o.id,p),setTimeout(()=>{E=!1},300)},z=async q=>{const p=o.data.subsequentFrames.find(w=>w.id===q);if(t.edges.some(w=>w.source===o.id&&w.sourceHandle===p.handleId))try{await v.ElMessageBox.confirm(`删除"${p.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,q)};return(q,p)=>{const x=e.resolveComponent("FolderOpened"),w=e.resolveComponent("el-icon"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["data-source-node",{"sequence-mode":l.data.enableImageSequence,selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Pt,[e.createVNode(w,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",zt,[e.createElementVNode("div",Ut,e.toDisplayString(l.data.label),1)])]),l.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(ee.Handle),{key:0,type:"source",position:e.unref(ee.Position).Right},null,8,["position"])),l.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",Wt,[e.createElementVNode("div",Jt,[p[0]||(p[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,g=>(e.openBlock(),e.createElementBlock("div",{key:g.id,class:"handle-item"},[e.createElementVNode("span",Yt,e.toDisplayString(g.label),1),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:g.handleId,class:"handle-right"},null,8,["position","id"]),g.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(w,{key:0,class:"delete-icon",onClick:e.withModifiers(r=>z(g.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Xt,[e.createVNode(s,{size:"small",type:"primary",icon:e.unref(Z.Plus),circle:"",onClick:e.withModifiers(L,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Kt={class:"node-content"},Zt={class:"node-info"},vt={class:"node-label"},eo={key:0,class:"node-model"},to={key:1,class:"node-placeholder"},oo={key:0,class:"direct-alert-badge"},no=ne({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=e.resolveComponent("Cpu"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Kt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",Zt,[e.createElementVNode("div",vt,e.toDisplayString(l.data.label),1),l.data.modelName?(e.openBlock(),e.createElementBlock("div",eo,e.toDisplayString(l.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",to,"未选择模型"))])]),l.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",oo,[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),ao={class:"node-content"},lo={class:"node-info"},ro={class:"node-target"},so={class:"node-params"},io=ne({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=()=>o.data.targetName||o.data.label||"检测目标",c=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(E=>E&&E.trim()!=="").length}return null});return(n,N)=>{const E=e.resolveComponent("View"),L=e.resolveComponent("el-icon"),z=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",ao,[e.createVNode(L,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",lo,[N[1]||(N[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",ro,e.toDisplayString(t()),1),e.createElementVNode("div",so,[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),c.value?(e.openBlock(),e.createBlock(z,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.targetHeight&&l.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(z,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(l.data.arguments.targetWidth)+"x"+e.toDisplayString(l.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(z,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...N[0]||(N[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),co={class:"node-content"},mo={class:"node-info"},po={class:"node-label"},uo={key:0,class:"node-model"},fo={key:1,class:"node-placeholder"},go={key:2,class:"node-stats"},ho=ne({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const c=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:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",co,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",mo,[e.createElementVNode("div",po,e.toDisplayString(l.data.label),1),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",uo,e.toDisplayString(l.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",fo,"未选择模型")),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",go,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(n,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.categories?.length>0?(e.openBlock(),e.createBlock(n,{key:1,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.data.arguments.categories.length)+" 类 ",1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.topK?(e.openBlock(),e.createBlock(n,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" Top-"+e.toDisplayString(l.data.arguments.topK),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),yo={class:"node-content"},_o={class:"node-info"},No={class:"node-label"},Co={class:"node-params"},ko=ne({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return le(),(o,t)=>{const c=e.resolveComponent("el-icon"),y=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",yo,[e.createVNode(c,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Document))]),_:1}),e.createElementVNode("div",_o,[e.createElementVNode("div",No,e.toDisplayString(l.data.label),1),e.createElementVNode("div",Co,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(y,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),bo={class:"node-content"},xo={class:"node-info"},Eo={class:"node-label"},wo={class:"node-scope"},To={class:"node-params"},So=ne({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=le(),c=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(N=>N.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const N=e.resolveComponent("Document"),E=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",bo,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(N)]),_:1}),e.createElementVNode("div",xo,[e.createElementVNode("div",Eo,e.toDisplayString(l.data.label),1),e.createElementVNode("div",wo,e.toDisplayString(c()),1),e.createElementVNode("div",To,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(L,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.minPlateWidth!==void 0&&l.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(L,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(l.data.arguments.minPlateWidth)+"×"+e.toDisplayString(l.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),Vo={class:"node-content"},Bo={class:"node-info"},Ao={class:"node-params"},Do=ne({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},c=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const N=y[0];return`数量 ${t[N.operator]||N.operator} ${N.value}`}const n=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${n})`});return(y,n)=>{const N=e.resolveComponent("el-icon"),E=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Vo,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.DataAnalysis))]),_:1}),e.createElementVNode("div",Bo,[n[0]||(n[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Ao,[c.value?(e.openBlock(),e.createBlock(E,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Lo={class:"node-content"},Oo={class:"node-info"},Mo={class:"node-label"},Io={class:"node-params"},Ro=ne({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=e.computed(()=>o.data.description||"目标计时"),c=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,N)=>{const E=e.resolveComponent("el-icon"),L=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Lo,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Timer))]),_:1}),e.createElementVNode("div",Oo,[e.createElementVNode("div",Mo,e.toDisplayString(t.value),1),e.createElementVNode("div",Io,[e.createVNode(L,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1}),y.value?(e.openBlock(),e.createBlock(L,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),$o={class:"group-label"},Fo=ne({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={and:"ALL",or:"SOME"},c=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),n={width:"8px",height:"8px",borderRadius:"2px"},N={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(E,L)=>{const z=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",$o,[e.createVNode(z,{type:y.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1},8,["type"]),L[0]||(L[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(tt.NodeResizer),{"min-width":200,"min-height":100,"handle-style":n,"line-style":N})],2)}}},[["__scopeId","data-v-adf6607d"]]),qo={class:"node-content"},Go={class:"node-info"},Ho={class:"node-label"},jo={class:"node-scope"},Po={class:"node-params"},zo=ne({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=le(),c=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const n=t.nodes.find(N=>N.id===y);return n?n.data.label:"检测范围"};return(y,n)=>{const N=e.resolveComponent("el-icon"),E=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:l.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",qo,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.User))]),_:1}),e.createElementVNode("div",Go,[e.createElementVNode("div",Ho,e.toDisplayString(l.data.label),1),e.createElementVNode("div",jo,e.toDisplayString(c()),1),e.createElementVNode("div",Po,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(E,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(l.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),l.data.arguments?.minFaceWidth!==void 0&&l.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(E,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(l.data.arguments.minFaceWidth)+"×"+e.toDisplayString(l.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),Uo={class:"quick-add-menu__list"},Wo=["onClick"],Jo={class:"quick-add-menu__icon"},Yo={class:"quick-add-menu__label"},Xo={key:0,class:"quick-add-menu__empty"},fe=8,Qo=ne({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(l){const o=l,t=e.ref(null),c=e.ref({x:0,y:0});e.watch(()=>o.visible,async E=>{if(!E||(c.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const L=t.value.getBoundingClientRect(),z=window.innerWidth,q=window.innerHeight;let{x:p,y:x}=o.position;p+L.width>z-fe&&(p=z-L.width-fe),x+L.height>q-fe&&(x=q-L.height-fe),p<fe&&(p=fe),x<fe&&(x=fe),c.value={x:p,y:x}});const y=e.computed(()=>({left:c.value.x+"px",top:c.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:"🏁"}],N=e.computed(()=>{switch(o.sourceNodeType){case"start":return n.filter(E=>E.type==="dataSource");case"dataSource":return n.filter(E=>E.type==="smallModel"||E.type==="detectionTarget"||E.type==="classificationModel");case"smallModel":return n.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel"&&E.type!=="targetCount"&&E.type!=="timerTarget");case"detectionTarget":case"classificationModel":return n.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel");case"timerTarget":return n.filter(E=>["ocr","faceRecognition","licensePlate","end"].includes(E.type));case"targetCount":return n.filter(E=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(E.type));case"ocr":return n.filter(E=>["licensePlate","faceRecognition","end"].includes(E.type));case"licensePlate":return n.filter(E=>["ocr","faceRecognition","end"].includes(E.type));case"faceRecognition":return n.filter(E=>["ocr","licensePlate","end"].includes(E.type));default:return[]}});return(E,L)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[l.visible?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRef",ref:t,class:"quick-add-menu",style:e.normalizeStyle(y.value)},[L[1]||(L[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Uo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,z=>(e.openBlock(),e.createElementBlock("li",{key:z.type,class:"quick-add-menu__item",onClick:q=>E.$emit("select",z.type)},[e.createElementVNode("span",Jo,e.toDisplayString(z.icon),1),e.createElementVNode("span",Yo,e.toDisplayString(z.label),1)],8,Wo))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("li",Xo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),l.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:L[0]||(L[0]=z=>E.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Ko={class:"workflow-canvas"},Je=5,Zo=ne({__name:"WorkflowCanvas",setup(l){const o=le(),{screenToFlowCoordinate:t,findNode:c,onConnectStart:y,onConnectEnd:n}=ee.useVueFlow(),N=e.inject("editorConfig",null),E=e.inject("editorMode",oe.ALGORITHM),L=e.computed(()=>E===oe.TASK),z=e.inject("echoAlgodata",null),q=e.inject("echoTaskData",null),{importFromJSON:p,applyTaskData:x}=Rt();e.watch(z,async d=>{if(d&&Object.keys(d).length>0&&(await e.nextTick(),await p(d),L.value)){const T=d?.ruleSchema?.sourceGroups??[];let U=null;if(T.some(X=>X.streamConfig)?U="stream":(T.length>1||T.some(X=>(X.children??[]).length>1))&&(U="image"),U){const X=o.nodes.find(W=>W.type===C.START);X&&o.updateNodeData(X.id,{streamType:U})}}},{immediate:!0}),e.watch(q,async d=>{L.value&&(!d||typeof d!="object"||Object.keys(d).length===0||o.nodes.length!==0&&await x())},{immediate:!1});const w=(d,T)=>{if(!T?.properties)return d;const U={};return Object.entries(T.properties).forEach(([X,W])=>{W.default!==void 0&&(U[X]=W.default)}),d.data.arguments={...U,...d.data.arguments},d},s=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),g=()=>{s.visible=!1,s.sourceNodeId=null,s.sourceNodeType=null,s.sourceHandleId=null,O=!1};let r=null,D=!1,F=null,m=null,O=!1;const b=()=>{F&&(document.removeEventListener("mousemove",F),F=null),m&&(document.removeEventListener("mouseup",m),m=null)};e.onUnmounted(()=>{b()}),y(({nodeId:d,handleId:T,handleType:U,event:X})=>{if(U!=="source")return;if(L.value){v.ElMessage.warning("算法任务模式下不允许添加连接线");return}const W=o.nodes.find(K=>K.id===d);if(!W||W.type==="end")return;if(W.type===C.DATA_SOURCE&&W.data?.enableImageSequence){if(T&&o.edges.filter(re=>re.source===d&&re.sourceHandle===T).length>=1)return}else if(W.type!==C.START&&W.type!==C.DATA_SOURCE&&o.edges.filter(re=>re.source===d).length>=1)return;const Q=X?.target;let te=0,ae=0;if(Q){const K=Q.getBoundingClientRect();te=K.right+12,ae=K.top-8}r={nodeId:d,sourceNodeType:W.type,handleId:T,menuX:te,menuY:ae,flowPos:{...W.position}},D=!1;const pe=X?.clientX??0,$=X?.clientY??0;b(),F=K=>{(Math.abs(K.clientX-pe)>Je||Math.abs(K.clientY-$)>Je)&&(D=!0,b())},m=()=>{if(b(),!D&&r){O=!0;const K=r;s.visible=!0,s.screenPos={x:K.menuX,y:K.menuY},s.sourceNodeId=K.nodeId,s.sourceNodeType=K.sourceNodeType,s.sourceHandleId=K.handleId,s.flowPos=K.flowPos}r=null},document.addEventListener("mousemove",F),document.addEventListener("mouseup",m)});const S=d=>{const T=s.sourceNodeId,U=o.nodes.find(ce=>ce.id===T);if(!U){g();return}if(L.value){v.ElMessage.warning("算法任务模式下不允许添加节点"),g();return}const X=U.position.x+250,W=U.position.y;let Q={x:X,y:W};const te=60,ae=80;let pe=0,$=!0;for(;$;){$=!1;const ce=W+pe;for(const ge of o.nodes)if(Math.abs(ge.position.x-X)<100&&Math.abs(ge.position.y-ce)<te+20){$=!0,pe+=ae;break}}if(Q.y=W+pe,d==="end"){const ce=o.nodes.find(ge=>ge.type==="end");if(ce){if(o.edges.some(xe=>xe.source===T&&xe.target===ce.id)){v.ElMessage.warning("已经连接到结束节点"),g();return}const _e=_(U,ce);if(!_e.valid){v.ElMessage.warning(_e.message),g();return}o.addConnection({source:T,target:ce.id,sourceHandle:s.sourceHandleId||null,targetHandle:null}),G(),g(),v.ElMessage.success("已连接到结束节点");return}}let K;switch(d){case"end":K=Ee(Q);break;case"dataSource":K=we(Q);break;case"smallModel":K=De(Q);break;case"detectionTarget":K=Le(Q);break;case"classificationModel":K=Oe(Q);break;case"ocr":{const ce=N?.value??N;K=w(Me(Q),ce?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const ce=N?.value??N;K=w(Ie(Q),ce?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const ce=N?.value??N;K=w(Fe(Q),ce?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":K=Re(Q);break;case"timerTarget":K=$e(Q);break;default:g();return}const re=_(U,K);if(!re.valid){v.ElMessage.warning(re.message),g();return}o.addNode(K),o.addConnection({source:T,target:K.id,sourceHandle:s.sourceHandleId||null,targetHandle:null}),G(),g(),v.ElMessage.success(`已添加${K.data.label}并连接`)},i=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],_=(d,T)=>{if(d?.parentNode&&T?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(T?.parentNode&&d?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(d?.type===C.START){if(T?.type!==C.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(W=>W.source===d.id).some(W=>o.nodes.find(te=>te.id===W.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(T?.type===C.SMALL_MODEL){if(d?.type!==C.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(Q=>Q.source===d.id).some(Q=>o.nodes.find(ae=>ae.id===Q.target)?.type!==C.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(d?.type===C.DATA_SOURCE){if(T?.type!==C.SMALL_MODEL&&T?.type!==C.DETECTION_TARGET&&T?.type!==C.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(Q=>Q.source===d.id).some(Q=>o.nodes.find(ae=>ae.id===Q.target)?.type===C.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(d?.type===C.SMALL_MODEL&&(T?.type===C.TARGET_COUNT||T?.type===C.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(d?.type===C.TARGET_COUNT&&![C.TIMER_TARGET,C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(T?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(d?.type===C.TIMER_TARGET&&![C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(T?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const U=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION];return U.includes(d?.type)&&!U.filter(W=>W!==d.type).concat(C.END).includes(T?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:T?.type!==C.END&&o.edges.filter(W=>W.target===T?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},B=e.markRaw({start:qt,end:jt,dataSource:Qt,smallModel:no,detectionTarget:io,classificationModel:ho,ocr:ko,licensePlate:So,targetCount:Do,timerTarget:Ro,group:Fo,faceRecognition:zo}),a=e.computed({get:()=>o.nodes,set:d=>{o.nodes=d}}),h=e.computed({get:()=>o.edges,set:d=>{o.edges=d}}),u=d=>{d.forEach(T=>{if(T.type==="position"&&T.position)o.updateNodePosition(T.id,T.position);else if(T.type==="remove"){if(L.value){v.ElMessage.warning("算法任务模式下不允许删除节点");return}const U=o.nodes.find(W=>W.id===T.id);if(U&&U.type===C.START){v.ElMessage.warning("开始节点不可删除");return}if(U&&U.type===C.END){v.ElMessage.warning("结束节点不可删除");return}if(U&&U.type==="group"){v.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const X=U?.parentNode;o.removeNode(T.id),X&&o.nodes.filter(Q=>Q.parentNode===X).length===0&&o.dissolveParallelGroup(X)}})},k=d=>{d.forEach(T=>{if(T.type==="remove"){if(L.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(T.id)}})},I=d=>{if(O)return;if(L.value){v.ElMessage.warning("算法任务模式下不允许添加连接线"),g();return}const T=o.nodes.find(W=>W.id===d.source),U=o.nodes.find(W=>W.id===d.target),X=_(T,U);if(!X.valid){v.ElMessage.warning(X.message),g();return}if(T?.type===C.DATA_SOURCE&&T.data.enableImageSequence&&d.sourceHandle&&o.edges.filter(Q=>Q.source===d.source&&Q.sourceHandle===d.sourceHandle).length>=1){const Q=d.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";v.ElMessage.warning(`${Q}连接点只能连接一个节点`);return}if(i.includes(T?.type)&&!T.data.enableBranch&&o.edges.filter(Q=>Q.source===d.source).length>=1){v.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(d),G(),g()},P=d=>({and:"ALL",or:"SOME"})[d]||"ALL",A=d=>{const T=o.nodes.find(U=>U.id===d.source);if(!T)return"";if(T.type===C.START){const U=T.data.branchLogic||"and",X=P(U),W=d.data?.branchOrder;return W!=null?`${X} - 执行顺序 ${W}`:X}if(T.type===C.DATA_SOURCE){if(T.data?.enableImageSequence){const Q=d.sourceHandle==="first-frame"?"首帧":"后续帧",te=d.data?.branchOrder;return te!=null?`${Q} - 执行顺序 ${te}`:Q}const U=T.data.branchLogic||"and",X=P(U),W=d.data?.branchOrder;return W!=null?`${X} - 执行顺序 ${W}`:X}return""},G=()=>{o.edges.forEach(d=>{const T=A(d);d.label!==T&&(d.label=T,d.labelStyle=T?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,d.labelBgStyle=T?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,d.labelBgPadding=T?[4,6]:void 0)})},R=()=>{o.nodes.forEach(d=>{if(d.type!=="group")return;const T=d.data.sourceNodeId;if(!T)return;const U=o.nodes.find(X=>X.id===T);U?.data?.enableBranch&&U.data.branchLogic!==d.data.branchLogic&&o.updateNodeData(d.id,{branchLogic:U.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(d=>i.includes(d.type)).map(d=>({id:d.id,enableBranch:d.data.enableBranch,branchLogic:d.data.branchLogic})),(d,T)=>{T&&d.forEach(U=>{const X=T.find(W=>W.id===U.id);if(X){if(U.enableBranch&&!X.enableBranch){const W=o.nodes.find(Q=>Q.id===U.id);if(!W)return;o.createEmptyGroup({x:W.position.x+200,y:W.position.y-30},W.data.branchLogic||"and",U.id)}else if(!U.enableBranch&&X.enableBranch){const W=o.nodes.find(Q=>Q.type==="group"&&Q.data.sourceNodeId===U.id);W&&o.dissolveParallelGroup(W.id)}if(U.enableBranch&&X.branchLogic!==U.branchLogic){const W=o.nodes.find(Q=>Q.type==="group"&&Q.data.sourceNodeId===U.id);W&&o.updateNodeData(W.id,{branchLogic:U.branchLogic})}}})}),e.watch(()=>o.nodes.filter(d=>d.type!=="group").map(d=>({id:d.id,enableBranch:d.data.enableBranch,branchLogic:d.data.branchLogic,branchOrder:d.data.branchOrder})),()=>{G(),R()},{deep:!0}),e.watch(()=>o.edges.map(d=>({id:d.id,branchOrder:d.data?.branchOrder})),(d,T)=>{G(),T&&d.forEach(U=>{const X=T.find(W=>W.id===U.id);if(X&&X.branchOrder!==U.branchOrder&&U.branchOrder!==void 0){const W=o.edges.find(Q=>Q.id===U.id);if(W){const Q=o.nodes.find(te=>te.id===W.source);Q&&Q.type===C.DATA_SOURCE&&o.updateNodePosition(Q.id,{x:Q.position.x,y:Q.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([d,T])=>{o.nodes.forEach(U=>{d.has(U.id)?U.class="invalid-node":U.class==="invalid-node"&&(U.class="")}),o.edges.forEach(U=>{T.has(U.id)?U.class="invalid-edge":U.class==="invalid-edge"&&(U.class="")})},{deep:!0});const Y=d=>{d.event?.target?.closest(".vue-flow__handle")||o.selectNode(d.node.id)},f=d=>{o.selectEdge(d.edge.id)},M=d=>{if(L.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(d.edge.id)},H=()=>{o.clearSelection()},J=({node:d})=>{if(d.type==="group"||!i.includes(d.type))return;const T=o.nodes.filter(X=>X.type==="group");let U=null;for(const X of T){const W=c(X.id);if(!W)continue;const Q=W.dimensions?.width||parseInt(X.style?.width)||300,te=W.dimensions?.height||parseInt(X.style?.height)||160;let ae=d.position.x,pe=d.position.y;if(d.parentNode){const _e=o.nodes.find(xe=>xe.id===d.parentNode);_e&&(ae+=_e.position.x,pe+=_e.position.y)}const $=c(d.id),K=$?.dimensions?.width||160,re=$?.dimensions?.height||60,ce=ae+K/2,ge=pe+re/2;if(ce>=X.position.x&&ce<=X.position.x+Q&&ge>=X.position.y&&ge<=X.position.y+te){U=X.id;break}}U?d.parentNode!==U&&o.addNodeToGroup(d.id,U):d.parentNode&&o.removeNodeFromGroup(d.id)},j=d=>{d.preventDefault(),d.dataTransfer&&(d.dataTransfer.dropEffect="move")},V=d=>{d.preventDefault();const T=d.dataTransfer?.getData("application/vueflow");if(!T)return;if(L.value){v.ElMessage.warning("算法任务模式下不允许添加节点");return}if(T===C.START&&o.getNodeCountByType(C.START)>=1){v.ElMessage.warning("工作流只能有一个开始节点");return}if(T===C.END&&o.getNodeCountByType(C.END)>=1){v.ElMessage.warning("工作流只能有一个结束节点");return}const U=160,X=60,W=t({x:d.clientX,y:d.clientY}),Q={x:W.x-U/2,y:W.y-X/2};let te;switch(T){case C.START:te=Ae(Q);break;case C.END:te=Ee(Q);break;case C.DATA_SOURCE:te=we(Q);break;case C.SMALL_MODEL:te=De(Q);break;case C.DETECTION_TARGET:te=Le(Q);break;case C.CLASSIFICATION_MODEL:te=Oe(Q);break;case C.OCR:{const ae=N?.value??N;te=w(Me(Q),ae?.ocr?.[0]?.inputSchema);break}case C.LICENSE_PLATE:{const ae=N?.value??N;te=w(Ie(Q),ae?.license_plate?.[0]?.inputSchema);break}case C.TARGET_COUNT:te=Re(Q);break;case C.TIMER_TARGET:te=$e(Q);break;case C.FACE_RECOGNITION:{const ae=N?.value??N;te=w(Fe(Q),ae?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(te),v.ElMessage.success("节点已添加")};return(d,T)=>(e.openBlock(),e.createElementBlock("div",Ko,[e.createVNode(e.unref(ee.VueFlow),{nodes:a.value,"onUpdate:nodes":T[0]||(T[0]=U=>a.value=U),edges:h.value,"onUpdate:edges":T[1]||(T[1]=U=>h.value=U),"node-types":e.unref(B),onNodesChange:u,onEdgesChange:k,onConnect:I,onNodeClick:Y,onEdgeClick:f,onEdgeDoubleClick:M,onPaneClick:H,onDrop:V,onDragover:j,onNodeDragStop:J,"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(Qo,{visible:s.visible,position:s.screenPos,"source-node-type":s.sourceNodeType,onSelect:S,onClose:g},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-e813f8fb"]]),vo={class:"config-header"},en={key:0,class:"config-section"},tn={key:1,class:"config-section"},on=ne({__name:"EdgeConfig",setup(l){const o=le(),t=e.inject("editorMode",oe.ALGORITHM),c=e.computed(()=>t===oe.TASK),y=e.computed(()=>{const q=o.selectedEdge;return q&&o.nodes.find(x=>x.id===q.source)?.data?.enableBranch?q:null}),n=e.computed(()=>y.value&&o.nodes.find(p=>p.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),N=e.computed(()=>{if(!y.value)return!1;const q=o.nodes.find(p=>p.id===y.value.source);return(q?.type==="dataSource"||q?.type==="start")&&q?.data?.enableBranch}),E=e.computed(()=>{if(!y.value)return 1;const q=o.nodes.find(p=>p.id===y.value.source);return q?o.edges.filter(p=>p.source===q.id).length:1}),L=e.computed(()=>{if(!y.value)return!1;const q=o.nodes.find(p=>p.id===y.value.source);return q?q.type==="dataSource"&&q.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),z=q=>{y.value&&o.updateEdgeData(y.value.id,q)};return(q,p)=>{const x=e.resolveComponent("el-divider"),w=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-text"),g=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form"),D=e.resolveComponent("el-option"),F=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",vo,[e.createElementVNode("h3",null,e.toDisplayString(n.value),1)]),e.createVNode(x),L.value?(e.openBlock(),e.createElementBlock("div",en,[p[3]||(p[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(w,{"model-value":y.value?.data?.timeWindowSeconds??null,onChange:p[0]||(p[0]=m=>z({timeWindowSeconds:m})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(s,{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),N.value?(e.openBlock(),e.createElementBlock("div",tn,[p[5]||(p[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(F,{"model-value":y.value?.data?.branchOrder??null,disabled:c.value,onChange:p[1]||(p[1]=m=>z({branchOrder:m})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.value,m=>(e.openBlock(),e.createBlock(D,{key:m,label:`执行顺序 ${m}`,value:m},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(s,{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"]]),nn={class:"config-section"},an=ne({__name:"GroupNodeConfig",setup(l){return(o,t)=>{const c=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(c),e.createElementVNode("div",nn,[e.createVNode(y,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),ln={class:"time-init-container"},rn={key:0,class:"time-header flex-x-start"},sn={class:"tab-type flex-x"},cn={class:"time-content"},dn={id:"time-content-table-body"},mn=["onClick"],pn=["onClick"],un=["data-sort","data-value","data-day","data-type","onMousedown"],fn={key:1},gn=["data-sort","data-value","data-type","onMousedown"],hn={class:"time-list"},yn={key:0,class:"time-list-title"},_n={key:1,style:{"margin-right":"10px"}},Nn=ne({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(l,{expose:o}){const t=l,c=e.ref(0);let y,n,N,E,L;const z=e.ref(new Map),q=e.ref(new Map),p=e.computed(()=>c.value===0?z.value:q.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",r)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",r)});const x=u=>{c.value!==u&&(c.value=u,e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),n.forEach(I=>I.classList.remove("selected")),(u===0?z.value:q.value).forEach((I,P)=>{I.origin.forEach(A=>{Array.from(n).forEach(G=>{Number(G.dataset.sort)==A.sort&&Number(G.dataset.value)==A.value&&Number(G.dataset.day)==P&&G.classList.add("selected")})})})}))},w=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}]),s=(u,k,I)=>{t.operationType!=3&&I.which==1&&(E=u,N=Number(I.target.dataset.value),I.target.classList.contains("selected")?(I.target.classList.remove("selected"),L=""):(L="selected",I.target.classList.add("selected")),g(),b())},g=()=>{n.forEach(u=>{u.addEventListener("mouseover",D,!1,{once:!0})})},r=()=>{n.forEach(u=>{u.removeEventListener("mouseover",D)})},D=u=>{u.target.classList.remove("selected"),L&&u.target.classList.add(L);let k=Number(u.target.dataset.value),I=Number(u.target.dataset.day),P=I>E?I:E,A=I<E?I:E,G=k>N?k:N,R=k<N?k:N;for(let Y=A;Y<=P;Y++)for(let f=R;f<=G;f++){let M=document.querySelector(`td[data-value="${f}"][data-day="${Y}"]`);M.classList.remove("selected"),L&&M.classList.add(L)}b()},F=u=>{if(t.operationType==3)return;let k=[];n.forEach(I=>{Number(I.dataset.day)==u&&k.push(I)}),k.find(I=>!I.classList.contains("selected"))?k.forEach(I=>I.classList.add("selected")):k.forEach(I=>I.classList.remove("selected")),b()},m=u=>{if(t.operationType==3)return;let k=[];n.forEach(I=>{Number(I.dataset.sort)==u&&k.push(I)}),k.find(I=>!I.classList.contains("selected"))?k.forEach(I=>I.classList.add("selected")):k.forEach(I=>I.classList.remove("selected")),b()},O=()=>{n.forEach(k=>{k.classList.remove("selected")}),(c.value===0?z:q).value.clear()},b=()=>{const u=c.value===0?z:q;u.value.clear(),n.forEach(k=>{if(k.classList.contains("selected")){let I=k.dataset.day,P=k.dataset.sort,A=k.dataset.value;u.value.get(I)?u.value.get(I).origin.push({sort:Number(P),value:Number(A)}):u.value.set(I,{origin:[{sort:Number(P),value:Number(A)}],timeList:[]})}})},S=u=>{let P=p.value.get(u).origin.map(A=>A.value).reduce((A,G,R,Y)=>(R==0?A.push([G]):G==Y[R-1]+1?A[A.length-1].push(G):A.push([G]),A),[]);return P=P.map(A=>{let G=Math.max(...A)+1,R=Math.min(...A)+1,Y=R%2==0?30:0,f=G%2==0?0:30,M=i(Math.ceil(R/2)-1),H=i(Math.ceil(G/2)-(f==0?0:1));return{dayType:u,startTime:M+":"+(Y==0?"00":Y),endTime:H+":"+(f==0?"00":f)}}),p.value.get(u).timeList=P,P.map(A=>A.startTime+"-"+A.endTime).join()};function i(u){return u<10?"0"+u:u}const _=(u,k)=>{z.value.clear(),q.value.clear(),n.forEach(G=>G.classList.remove("selected")),c.value=k;const I=k===0?z:q,P=JSON.parse(u);let A=[];P.plan.forEach(G=>{G.timePeriod.forEach(R=>{A.push({...R,dayType:G.dayType})})}),e.nextTick(()=>{n=y.querySelectorAll("td.sel-able[data-type]"),A.forEach(G=>{I.value.get(G.dayType)?I.value.get(G.dayType).timeList.push(G):I.value.set(G.dayType,{origin:[],timeList:[{...G}]})}),I.value.forEach((G,R)=>{G.timeList.forEach(Y=>{let f=Number(Y.startTime.split(":")[1]),M=Number(Y.endTime.split(":")[1]),H=Number(Y.startTime.split(":")[0]),J=Number(Y.endTime.split(":")[0]);if(H==J){G.origin.push({sort:H,value:2*H});return}for(let j=H;j<=J;j++)if(j==H)f==0?(G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1})):G.origin.push({sort:j,value:2*j+1});else if(j>H&&j<J)G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1});else if(M==0){if(j==J)return;G.origin.push({sort:j,value:2*j}),G.origin.push({sort:j,value:2*j+1})}else G.origin.push({sort:j,value:2*j})}),G.origin.forEach(Y=>{Array.from(n).find(f=>{Number(f.dataset.sort)==Y.sort&&Number(f.dataset.value)==Y.value&&Number(f.dataset.day)==R&&f.classList.add("selected")})})})})},B=(u,k)=>u.map(A=>A.value).sort((A,G)=>A-G).reduce((A,G,R,Y)=>(R==0?A.push([G]):G==Y[R-1]+1?A[A.length-1].push(G):A.push([G]),A),[]).map(A=>{let G=Math.max(...A)+1,R=Math.min(...A)+1,Y=R%2==0?30:0,f=G%2==0?0:30,M=i(Math.ceil(R/2)-1),H=i(Math.ceil(G/2)-(f==0?0:1));return{dayType:k,startTime:M+":"+(Y==0?"00":Y),endTime:H+":"+(f==0?"00":f)}});return o({getTimeData:()=>{(c.value===0?q:z).value.clear();let k=[];p.value.forEach((A,G)=>{const R=B(A.origin,G);k=k.concat(R)});let I={plan:[]},P=k.map(A=>A.dayType).filter((A,G,R)=>R.indexOf(A)===G);return P.length?(P.forEach(A=>{I.plan.push({dayType:A,timePeriod:k.filter(G=>G.dayType===A).map(G=>({startTime:G.startTime,endTime:G.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(I),planType:c.value}):{validTime:!1}},revertByTime:_,resetFn:()=>{c.value=0,z.value.clear(),q.value.clear(),e.nextTick(()=>{n.forEach(u=>{u.classList.remove("selected")}),n=y.querySelectorAll("td.sel-able[data-type]")})}}),(u,k)=>{const I=e.resolveComponent("el-icon"),P=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",ln,[l.operationType!=3?(e.openBlock(),e.createElementBlock("div",rn,[e.createElementVNode("div",sn,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==0}]),onClick:k[0]||(k[0]=A=>x(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==1}]),onClick:k[1]||(k[1]=A=>x(1))}," 日计划 ",2)]),e.createVNode(P,{class:"rm-icon",link:"",type:"danger",onClick:O},{default:e.withCtx(()=>[e.createVNode(I,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",cn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:k[3]||(k[3]=A=>A.preventDefault())},[k[5]||(k[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",dn,[e.createElementVNode("tr",null,[k[4]||(k[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:G=>m(A-1)},e.toDisplayString(A-1),9,mn)),64))]),c.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(w.value.filter(A=>A.value!=0),A=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:G=>F(A.value)},e.toDisplayString(A.name),9,pn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,G=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((G-1)/2),"data-value":G-1,"data-day":A.value,"data-type":c.value,onMousedown:R=>s(A.value,G,R)},null,40,un)),64))]))),256)):e.createCommentVNode("",!0),c.value==1?(e.openBlock(),e.createElementBlock("tr",fn,[e.createElementVNode("th",{onClick:k[2]||(k[2]=A=>F(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":c.value,onMousedown:G=>s(0,A,G)},null,40,gn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",hn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value.keys(),A=>(e.openBlock(),e.createElementBlock("div",null,[c.value==0?(e.openBlock(),e.createElementBlock("span",yn,[k[6]||(k[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(w.value.find(G=>G.value==A).name),1)])):(e.openBlock(),e.createElementBlock("span",_n,e.toDisplayString(w.value.find(G=>G.value==A).name),1)),e.createTextVNode(" ("+e.toDisplayString(S(A))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),Cn={class:"time-template-dialog"},kn={class:"time-editor-panel"},bn=ne({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(l,{expose:o,emit:t}){const c=l,y=t,n=e.ref(null),N=e.ref(""),E=e.ref(""),L=e.ref(c.modelValue?.timeTemplateName||""),z=e.ref([]);return e.computed(()=>N.value?z.value.filter(x=>x.name.toLowerCase().includes(N.value.toLowerCase())):z.value),e.watch(L,x=>{y("update:modelValue",{...c.modelValue,timeTemplateName:x})}),o({getFormData:()=>{const x=n.value?.getTimeData();return{timeTemplateId:E.value,timeTemplateName:L.value,...x}},revertByTime:(x,w)=>{n.value?.revertByTime(x,w)}}),(x,w)=>(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",Cn,[e.createCommentVNode("",!0),e.createElementVNode("div",kn,[e.createCommentVNode("",!0),e.createVNode(Nn,{ref_key:"timeInitRef",ref:n},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),xn={class:"config-section"},En={key:0,class:"config-section"},wn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},Tn={class:"config-section"},Sn=ne({__name:"StartNodeConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("echoAlgodata",null),N=e.computed(()=>{const s=(n?.value??n)?.ruleSchema?.sourceGroups??[];if(s.some(D=>D.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const g=s.length>1,r=s.some(D=>(D.children??[]).length>1);return g||r?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(N,w=>{w.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:w.value})},{immediate:!0});const E=e.ref(!1),L=e.ref(null),z=()=>{const w=L.value?.getFormData();if(w?.validTime){const g=(JSON.parse(w.timeZone)?.plan??[]).map(r=>({dayType:String(r.dayType),timePeriod:r.timePeriod.map(D=>({startTime:D.startTime,endTime:D.endTime}))}));o.updateNodeData(t.value.id,{executionTime:w.timeZone,schedule:g,timeZone:w.timeZone,planType:w.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});E.value=!1},q=()=>{const w=t.value?.data;w?.timeZone&&L.value?.revertByTime(w.timeZone,w.planType??0)},p=e.computed(()=>t.value?o.edges.filter(s=>s.source===t.value.id).length>=2:!1),x=w=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:w})};return(w,s)=>{const g=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input"),D=e.resolveComponent("el-form-item"),F=e.resolveComponent("el-form"),m=e.resolveComponent("el-option"),O=e.resolveComponent("el-select"),b=e.resolveComponent("el-switch"),S=e.resolveComponent("el-button"),i=e.resolveComponent("el-dialog"),_=e.resolveComponent("el-icon"),B=e.resolveComponent("el-tooltip"),a=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[s[15]||(s[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(g),e.createElementVNode("div",xn,[s[9]||(s[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(D,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:s[0]||(s[0]=h=>x(h)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",En,[s[10]||(s[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(D,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.taskName,onInput:s[1]||(s[1]=h=>e.unref(o).updateNodeData(t.value.id,{taskName:h})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(D,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":N.value.locked?N.value.value:t.value?.data.streamType||"image",disabled:N.value.locked,onChange:s[2]||(s[2]=h=>e.unref(o).updateNodeData(t.value.id,{streamType:h})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"图片流",value:"image"}),e.createVNode(m,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),N.value.locked?(e.openBlock(),e.createElementBlock("div",wn,e.toDisplayString(N.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(D,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(b,{"model-value":t.value?.data.enableAlertVideo,onChange:s[3]||(s[3]=h=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:h}))},null,8,["model-value"])]),_:1}),e.createVNode(D,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:s[4]||(s[4]=h=>E.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(i,{modelValue:E.value,"onUpdate:modelValue":s[6]||(s[6]=h=>E.value=h),title:"执行时段",width:"1200px","append-to-body":"",onOpened:q},{footer:e.withCtx(()=>[e.createVNode(S,{onClick:s[5]||(s[5]=h=>E.value=!1)},{default:e.withCtx(()=>[...s[11]||(s[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(S,{type:"primary",onClick:z},{default:e.withCtx(()=>[...s[12]||(s[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(bn,{ref_key:"timeTemplateRef",ref:L},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",Tn,[s[14]||(s[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(F,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(D,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:s[7]||(s[7]=h=>e.unref(o).updateNodeData(t.value.id,{branchLogic:h})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(m,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),p.value?(e.openBlock(),e.createBlock(D,{key:0},{label:e.withCtx(()=>[s[13]||(s[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(B,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(_,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(a,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:s[8]||(s[8]=h=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:h})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),Vn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Bn=["smallModel","detectionTarget"],Se=()=>({schemaLoading:e.ref(!1),getToolType:n=>Vn[n]||null,needsToolSelection:n=>Bn.includes(n),fetchToolSchema:async(n,N="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(n,N="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),An={key:0,class:"config-section"},Dn={key:3,class:"array-input"},Ln={key:1,class:"config-section"},On=ne({__name:"EndNodeConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),{schemaLoading:c,fetchSchemaForNodeType:y}=Se(),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(([w,s])=>({key:w,type:s.type,label:s.title||s.label||s.description||w,description:s.description||"",default:s.default,required:x.includes(w)||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}))}),N=p=>{if(t.value)return t.value.data.arguments?.[p]},E=(p,x)=>{if(!t.value)return;const s={...t.value.data.arguments||{},[p]:x};o.updateNodeData(t.value.id,{arguments:s})},L=p=>{if(!p.dependsOn||!t.value)return!0;const{field:x,value:w}=p.dependsOn,s=N(x);if(typeof w=="string"&&w.startsWith("!")){const g=w.substring(1);return s!==g}return Array.isArray(w)?w.includes(s):s===w},z=p=>{const x=N(p);return Array.isArray(x)?JSON.stringify(x):""},q=(p,x)=>{try{const w=JSON.parse(x);Array.isArray(w)&&E(p,w)}catch{}};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const x=t.value.type,w=t.value.data,s=w.input_schema||w.inputSchema;if(s&&s.properties&&Object.keys(s.properties).length>0)return;const g=await y(x);if(!g)return;const r=t.value?.data;r&&o.updateNodeData(t.value.id,{...r,input_schema:g.inputSchema,extraConfig:g.extraConfig,arguments:{...g.arguments,...r.arguments}})},{immediate:!0}),(p,x)=>{const w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-icon"),g=e.resolveComponent("el-tooltip"),r=e.resolveComponent("el-option"),D=e.resolveComponent("el-select"),F=e.resolveComponent("el-switch"),m=e.resolveComponent("el-input-number"),O=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(w),n.value.length>0?(e.openBlock(),e.createElementBlock("div",An,[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,i=>e.withDirectives((e.openBlock(),e.createBlock(b,{key:i.key,required:i.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(i.label),1),i.description?(e.openBlock(),e.createBlock(g,{key:0,content:i.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(s,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[i.options&&i.type==="string"?(e.openBlock(),e.createBlock(D,{key:0,"model-value":N(i.key),onChange:_=>E(i.key,_),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.options,(_,B)=>(e.openBlock(),e.createBlock(r,{key:_,label:i.optionLabels?i.optionLabels[B]:_,value:_},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):i.type==="boolean"?(e.openBlock(),e.createBlock(F,{key:1,"model-value":N(i.key),onChange:_=>E(i.key,_)},null,8,["model-value","onChange"])):i.type==="number"||i.type==="integer"?(e.openBlock(),e.createBlock(m,{key:2,"model-value":N(i.key),onChange:_=>E(i.key,_),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"])):i.type==="array"&&!i.options?(e.openBlock(),e.createElementBlock("div",Dn,[e.createVNode(O,{"model-value":z(i.key),onChange:_=>q(i.key,_),type:"textarea",rows:3,placeholder:i.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):i.type==="array"&&i.options?(e.openBlock(),e.createBlock(D,{key:4,"model-value":N(i.key),onChange:_=>E(i.key,_),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.options,(_,B)=>(e.openBlock(),e.createBlock(r,{key:_,label:i.optionLabels?i.optionLabels[B]:_,value:_},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(O,{key:5,"model-value":N(i.key),onInput:_=>E(i.key,_),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),e.unref(c)&&n.value.length===0?(e.openBlock(),e.createElementBlock("div",Ln,[...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"]]),Mn={class:"config-header"},In={class:"config-section"},Rn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},$n={key:0,class:"config-section"},Fn={key:3,class:"array-input"},qn={key:1,class:"config-section"},Gn={key:2,class:"config-section"},Hn=ne({__name:"ClassificationModelConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.classification?.models??[]),E=e.computed(()=>(n?.value??n)?.classification?.modelParams??null),L=e.ref([]),z=e.ref(!1),q=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:b=>{t.value&&b&&r("modelId",b)}}),p=()=>{L.value=N.value},x=async b=>{if(!t.value||!b)return;const S=L.value.find(a=>a.id===b);if(!S)return;const i=t.value?.data;if(!i)return;const _=S.inputSchema||S.input_schema||E.value?.inputSchema||{},B={};_.properties&&Object.entries(_.properties).forEach(([a,h])=>{h.default!==void 0&&(B[a]=h.default)}),o.updateNodeData(t.value.id,{...i,input_schema:_,extraConfig:S.extraConfig||null,arguments:{...B,modelId:S.id,modelName:S.name}})},w=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},s=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(([i,_])=>({key:i,type:_.type,label:_.title||_.label||_.description||i,description:_.description||"",default:_.default,required:S.includes(i)||_.required||!1,min:_.minimum!==void 0?_.minimum:_.min,max:_.maximum!==void 0?_.maximum:_.max,step:_.step,maxLength:_.maxLength,options:_.enum,optionLabels:_.enumLabels||_.enum,dependsOn:_.dependsOn,sort:_.sort,hidden:_["x-hidden"]||!1})).filter(i=>!i.hidden).sort((i,_)=>(i.sort??1/0)-(_.sort??1/0))}),g=b=>{if(t.value)return t.value.data.arguments?.[b]},r=(b,S)=>{if(!t.value)return;const _={...t.value.data.arguments||{},[b]:S};o.updateNodeData(t.value.id,{arguments:_})},D=b=>{if(!b.dependsOn||!t.value)return!0;const{field:S,value:i}=b.dependsOn,_=g(S);if(typeof i=="string"&&i.startsWith("!")){const B=i.substring(1);return _!==B}return Array.isArray(i)?i.includes(_):_===i},F=b=>{const S=g(b);return Array.isArray(S)?JSON.stringify(S):""},m=(b,S)=>{try{const i=JSON.parse(S);Array.isArray(i)&&r(b,i)}catch{}},O=()=>{t.value&&v.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;L.value.length===0&&p();const S=t.value.data,i=S.input_schema||S.inputSchema,_=S.arguments?.modelId;if(_&&i&&i.properties&&Object.keys(i.properties).length>0||!_)return;const B=L.value.find(k=>k.id===_);if(!B)return;const a=B.inputSchema||B.input_schema||E.value?.inputSchema||{},h={};a.properties&&Object.entries(a.properties).forEach(([k,I])=>{I.default!==void 0&&(h[k]=I.default)});const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:a,extraConfig:B.extraConfig||null,arguments:{...h,...u.arguments}})},{immediate:!0}),(b,S)=>{const i=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),B=e.resolveComponent("el-option"),a=e.resolveComponent("el-select"),h=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form"),k=e.resolveComponent("el-icon"),I=e.resolveComponent("el-tooltip"),P=e.resolveComponent("el-switch"),A=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Mn,[S[1]||(S[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",In,[S[2]||(S[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(a,{modelValue:q.value,"onUpdate:modelValue":S[0]||(S[0]=R=>q.value=R),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:z.value,disabled:y.value,onChange:x,onClear:w},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(L.value,R=>(e.openBlock(),e.createBlock(B,{key:R.id,label:R.name,value:R.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),L.value.length===0&&!z.value?(e.openBlock(),e.createElementBlock("div",Rn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),q.value&&s.value.length>0?(e.openBlock(),e.createElementBlock("div",$n,[S[3]||(S[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,R=>e.withDirectives((e.openBlock(),e.createBlock(h,{key:R.key,required:R.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(R.label),1),R.description?(e.openBlock(),e.createBlock(I,{key:0,content:R.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[R.options&&R.type==="string"?(e.openBlock(),e.createBlock(a,{key:0,"model-value":g(R.key),disabled:y.value&&R.key!=="threshold",onChange:Y=>r(R.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(R.options,(Y,f)=>(e.openBlock(),e.createBlock(B,{key:Y,label:R.optionLabels?R.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):R.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":g(R.key),disabled:y.value&&R.key!=="threshold",onChange:Y=>r(R.key,Y)},null,8,["model-value","disabled","onChange"])):R.type==="number"||R.type==="integer"?(e.openBlock(),e.createBlock(A,{key:2,"model-value":g(R.key),disabled:y.value&&R.key!=="threshold",onChange:Y=>r(R.key,Y),min:R.min,max:R.max,step:R.step||(R.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):R.type==="array"&&!R.options?(e.openBlock(),e.createElementBlock("div",Fn,[e.createVNode(G,{"model-value":F(R.key),disabled:y.value&&R.key!=="threshold",onChange:Y=>m(R.key,Y),type:"textarea",rows:3,placeholder:R.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):R.type==="array"&&R.options?(e.openBlock(),e.createBlock(a,{key:4,"model-value":g(R.key),disabled:y.value&&R.key!=="threshold",onChange:Y=>r(R.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(R.options,(Y,f)=>(e.openBlock(),e.createBlock(B,{key:Y,label:R.optionLabels?R.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":g(R.key),disabled:y.value&&R.key!=="threshold",onInput:Y=>r(R.key,Y),maxlength:R.maxLength,"show-word-limit":!!R.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!R.dependsOn||D(R)]])),128))]),_:1})])):e.createCommentVNode("",!0),q.value&&z.value&&s.value.length===0?(e.openBlock(),e.createElementBlock("div",qn,[...S[4]||(S[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!q.value&&!z.value?(e.openBlock(),e.createElementBlock("div",Gn,[...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"},Pn={class:"config-section"},zn=ne({__name:"OcrConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.ocr?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(q,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[q]:p}})},z=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,q=>{if(!q||!t.value)return;const p=N.value,x=t.value.data.arguments||{},w={};p?.properties&&Object.entries(p.properties).forEach(([s,g])=>{g.default!==void 0&&(w[s]=g.default)}),o.updateNodeData(t.value.id,{arguments:{...w,...x}})},{immediate:!0}),(q,p)=>{const x=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-form-item"),r=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(x,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",Pn,[p[2]||(p[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":E.value,onChange:p[0]||(p[0]=D=>L("threshold",D)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn=ne({__name:"LicensePlateConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.license_plate?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(q,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[q]:p}})},z=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,q=>{if(!q||!t.value)return;const p=N.value,x=t.value.data.arguments||{},w={};p?.properties&&Object.entries(p.properties).forEach(([s,g])=>{g.default!==void 0&&(w[s]=g.default)}),o.updateNodeData(t.value.id,{arguments:{...w,...x}})},{immediate:!0}),(q,p)=>{const x=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",Wn,[p[2]||(p[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(g,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":E.value,onChange:p[0]||(p[0]=D=>L("threshold",D)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Yn={class:"config-header"},Xn={class:"config-section"},Qn={key:0,class:"config-section"},Ye=ne({__name:"FaceConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.face?.faceRepos??[]),E=e.ref(null),L=e.computed(()=>({repositoryId:x.value})),z={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},q=e.computed(()=>t.value?.data.arguments?.threshold??.5),p=g=>t.value?.data.arguments?.[g],x=e.computed(()=>{const g=p("repositoryId");return g?Array.isArray(g)?g:[g]:[]}),w=(g,r)=>{if(!t.value)return;const D=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...D,[g]:r}})},s=()=>{t.value&&v.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 D=(n?.value??n)?.face?.faceParams?.[0]?.inputSchema??null,F=t.value.data.arguments||{},m={};D?.properties&&Object.entries(D.properties).forEach(([O,b])=>{b.default!==void 0&&(m[O]=b.default)}),o.updateNodeData(t.value.id,{arguments:{...m,...F}})},{immediate:!0}),(g,r)=>{const D=e.resolveComponent("el-button"),F=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-form-item"),b=e.resolveComponent("el-form"),S=e.resolveComponent("el-option"),i=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yn,[r[2]||(r[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(D,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(F),e.createElementVNode("div",Xn,[r[3]||(r[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(b,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":q.value,onChange:r[0]||(r[0]=_=>w("threshold",_)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(c)==="task"?(e.openBlock(),e.createElementBlock("div",Qn,[r[4]||(r[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(b,{model:L.value,rules:z,ref_key:"faceFormRef",ref:E,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":x.value,onChange:r[1]||(r[1]=_=>w("repositoryId",_)),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(N.value,_=>(e.openBlock(),e.createBlock(S,{key:_.id,label:_.name,value:_.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Kn={class:"config-header"},Zn={key:0,class:"config-section"},vn={key:3,class:"array-input"},ea={key:1,class:"config-section"},ta=ne({__name:"StreamConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),{schemaLoading:n,fetchSchemaForNodeType:N}=Se(),E=e.computed(()=>{if(!t.value)return[];const s=t.value.data.input_schema||t.value.data.inputSchema;if(!s||!s.properties)return[];const g=s.required||[];return Object.entries(s.properties).map(([r,D])=>({key:r,type:D.type,label:D.title||D.label||D.description||r,description:D.description||"",default:D.default,required:g.includes(r)||D.required||!1,min:D.minimum!==void 0?D.minimum:D.min,max:D.maximum!==void 0?D.maximum:D.max,step:D.step,maxLength:D.maxLength,options:D.enum,optionLabels:D.enumLabels||D.enum,dependsOn:D.dependsOn,sort:D.sort})).sort((r,D)=>(r.sort??1/0)-(D.sort??1/0))}),L=s=>{if(t.value)return t.value.data.arguments?.[s]},z=(s,g)=>{if(!t.value)return;const D={...t.value.data.arguments||{},[s]:g};o.updateNodeData(t.value.id,{arguments:D})},q=s=>{if(!s.dependsOn||!t.value)return!0;const{field:g,value:r}=s.dependsOn,D=L(g);if(typeof r=="string"&&r.startsWith("!")){const F=r.substring(1);return D!==F}return Array.isArray(r)?r.includes(D):D===r},p=s=>{const g=L(s);return Array.isArray(g)?JSON.stringify(g):""},x=(s,g)=>{try{const r=JSON.parse(g);Array.isArray(r)&&z(s,r)}catch{}},w=()=>{t.value&&v.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 g=t.value.type,r=t.value.data,D=r.input_schema||r.inputSchema;if(D&&D.properties&&Object.keys(D.properties).length>0)return;const F=await N(g);if(!F)return;const m=t.value?.data;m&&o.updateNodeData(t.value.id,{...m,input_schema:F.inputSchema,extraConfig:F.extraConfig,arguments:{...F.arguments,...m.arguments}})},{immediate:!0}),(s,g)=>{const r=e.resolveComponent("el-button"),D=e.resolveComponent("el-divider"),F=e.resolveComponent("el-icon"),m=e.resolveComponent("el-tooltip"),O=e.resolveComponent("el-option"),b=e.resolveComponent("el-select"),S=e.resolveComponent("el-switch"),i=e.resolveComponent("el-input-number"),_=e.resolveComponent("el-input"),B=e.resolveComponent("el-form-item"),a=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Kn,[g[0]||(g[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(r,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:w},null,8,["icon"]))]),e.createVNode(D),E.value.length>0?(e.openBlock(),e.createElementBlock("div",Zn,[g[1]||(g[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.value,h=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.description?(e.openBlock(),e.createBlock(m,{key:0,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(F,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(b,{key:0,"model-value":L(h.key),onChange:u=>z(h.key,u),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(u,k)=>(e.openBlock(),e.createBlock(O,{key:u,label:h.optionLabels?h.optionLabels[k]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(S,{key:1,"model-value":L(h.key),onChange:u=>z(h.key,u)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"?(e.openBlock(),e.createBlock(i,{key:2,"model-value":L(h.key),onChange:u=>z(h.key,u),min:h.min,max:h.max,step:h.step||(h.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",vn,[e.createVNode(_,{"model-value":p(h.key),onChange:u=>x(h.key,u),type:"textarea",rows:3,placeholder:h.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(b,{key:4,"model-value":L(h.key),onChange:u=>z(h.key,u),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(u,k)=>(e.openBlock(),e.createBlock(O,{key:u,label:h.optionLabels?h.optionLabels[k]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(_,{key:5,"model-value":L(h.key),onInput:u=>z(h.key,u),maxlength:h.maxLength,"show-word-limit":!!h.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||q(h)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(n)&&E.value.length===0?(e.openBlock(),e.createElementBlock("div",ea,[...g[2]||(g[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),oa={class:"config-header"},na={class:"config-section"},aa={key:0,class:"config-section"},la={key:1,class:"config-section"},ra={key:0,class:"el-form-item__error"},sa={key:2,class:"config-section"},ia={key:3,class:"config-section"},ca={key:4,class:"config-section"},da=ne({__name:"DataSourceConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.inject("taskModeConfig",null),n=e.computed(()=>c==="task"),N=e.computed(()=>r("deviceType")??"camera"),E=e.computed(()=>{const B=o.nodes.find(h=>h.type===C.START);return B?.data?.streamType?B.data.streamType:(y?.value??y)?.streamType??"image"}),L=e.computed(()=>{const B=y?.value??y,a=t.value?.id;return B?.datasource?.getDevices?.(a)?.length??0}),z=()=>{const B=y?.value??y,a=t.value?.id,h=t.value?.data?.label??"",u=B?.datasource?.getDevices?.(a)??[],k=o.nodes.filter(P=>P.type===C.DATA_SOURCE).findIndex(P=>P.id===a),I=t.value?.data?.sourceGroupId??B?.datasource?.getSourceGroupIdByIndex?.(k)??a;B?.datasource?.onDeviceClick?.(a,h,I,u,N.value)},{fetchSchemaForNodeType:q}=Se(),p=e.computed(()=>o.nodes.some(B=>B.type===C.SMALL_MODEL)),x=e.computed(()=>o.getDataSourceCount()>=2),w=e.computed(()=>!o.supportPatrol()),s=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),g=e.computed(()=>{if(!t.value)return[];const B=t.value.data.input_schema||t.value.data.inputSchema;if(!B||!B.properties)return[];const a=B.required||[];return Object.entries(B.properties).map(([h,u])=>({key:h,type:u.type,label:u.title||u.label||u.description||h,description:u.description||"",default:u.default,required:a.includes(h)||u.required||!1,min:u.minimum!==void 0?u.minimum:u.min,max:u.maximum!==void 0?u.maximum:u.max,step:u.step,maxLength:u.maxLength,options:u.enum,optionLabels:u.enumLabels||u.enum,dependsOn:u.dependsOn}))}),r=B=>{if(t.value)return t.value.data.arguments?.[B]},D=e.computed(()=>!!r("enableImageSequence")),F=e.computed(()=>!!r("needCooperativeDetection")),m=(B,a)=>{if(!t.value)return;const u={...t.value.data.arguments||{},[B]:a};o.updateNodeData(t.value.id,{arguments:u})},O=async B=>{if(!t.value)return;if(o.edges.some(h=>h.source===t.value.id))try{await v.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(u=>u.source===t.value.id).forEach(u=>{o.removeEdge(u.id)}),B&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:B}),m("enableImageSequence",B),B&&o.initializeSubsequentFrames(t.value.id)}catch{return}else B&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:B}),m("enableImageSequence",B),B&&o.initializeSubsequentFrames(t.value.id)},b=B=>{t.value&&(B&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),m("enableImageSequence",!1),m("enablePatrol",!1)),m("needCooperativeDetection",B))};e.watch(E,B=>{B==="stream"&&t.value&&r("deviceType")==="1400"&&m("deviceType","camera")},{immediate:!0});const S=e.computed(()=>n.value&&N.value==="camera"&&E.value!=="stream"&&o.supportPatrol());e.watch(S,B=>{!B&&t.value&&r("enablePatrol")&&m("enablePatrol",!1)}),e.watch(L,B=>{B>0&&r("enablePatrol")&&(r("patrolGroupSize")??1)>B&&m("patrolGroupSize",B)});const i=B=>{if(!B.dependsOn||!t.value)return!0;const{field:a,value:h}=B.dependsOn,u=r(a);if(typeof h=="string"&&h.startsWith("!")){const k=h.substring(1);return u!==k}return Array.isArray(h)?h.includes(u):u===h},_=()=>{t.value&&v.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;const a=t.value.type,h=t.value.data;if(a==="dataSource"&&n.value){const P=h.arguments||{},A={},G=o.nodes.some(R=>R.type===C.SMALL_MODEL);P.mode===void 0&&(A.mode=G?3:0),P.interval===void 0&&(A.interval=30),E.value==="stream"&&P.sw_decoding===void 0&&(A.sw_decoding="CPU"),Object.keys(A).length>0&&o.updateNodeData(B,{arguments:{...P,...A}})}const u=h.input_schema||h.inputSchema;if(a==="dataSource"&&u&&u.properties&&!u.properties.windowSeconds){u.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},h.arguments.windowSeconds||o.updateNodeData(t.value.id,{...h,input_schema:u,arguments:{...h.arguments,windowSeconds:5}});return}if(u&&u.properties&&Object.keys(u.properties).length>0)return;const k=await q(a);if(!k)return;const I=t.value?.data;I&&o.updateNodeData(t.value.id,{...I,input_schema:k.inputSchema,extraConfig:k.extraConfig,arguments:{...k.arguments,...I.arguments}})},{immediate:!0}),(B,a)=>{const h=e.resolveComponent("el-button"),u=e.resolveComponent("el-divider"),k=e.resolveComponent("el-icon"),I=e.resolveComponent("el-tooltip"),P=e.resolveComponent("el-option"),A=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),R=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),f=e.resolveComponent("el-form-item"),M=e.resolveComponent("el-form"),H=e.resolveComponent("el-radio"),J=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",oa,[a[11]||(a[11]=e.createElementVNode("h3",null,"节点配置",-1)),n.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(h,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:_},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",na,[a[12]||(a[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(g.value,j=>e.withDirectives((e.openBlock(),e.createBlock(f,{key:j.key,required:j.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(j.label),1),j.description?(e.openBlock(),e.createBlock(I,{key:0,content:j.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[j.options&&j.type==="string"?(e.openBlock(),e.createBlock(A,{key:0,"model-value":r(j.key),onChange:V=>m(j.key,V),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(j.options,(V,d)=>(e.openBlock(),e.createBlock(P,{key:V,label:j.optionLabels?j.optionLabels[d]:V,value:V},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):j.type==="boolean"?(e.openBlock(),e.createBlock(I,{key:1,content:n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":j.key==="needCooperativeDetection"&&D.value?"已开启图片时序,无法同时开启协同检测":j.key==="enableImageSequence"&&F.value?"已开启协同检测,无法同时开启图片时序":j.key==="enableImageSequence"&&x.value?"多数据源场景下不允许开启图片时序":"",disabled:!(n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence"))&&!(j.key==="needCooperativeDetection"&&D.value)&&!(j.key==="enableImageSequence"&&F.value)&&!(j.key==="enableImageSequence"&&x.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":r(j.key),disabled:n.value&&(j.key==="needCooperativeDetection"||j.key==="enableImageSequence")||j.key==="needCooperativeDetection"&&D.value||j.key==="enableImageSequence"&&F.value||j.key==="enableImageSequence"&&x.value,onChange:V=>j.key==="enableImageSequence"?O(V):j.key==="needCooperativeDetection"?b(V):m(j.key,V)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):j.type==="number"||j.type==="integer"?(e.openBlock(),e.createBlock(R,{key:2,"model-value":r(j.key),onChange:V=>m(j.key,V),min:j.min,max:j.max,step:j.step||(j.type==="integer"?1:.1),precision:j.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":r(j.key),onInput:V=>m(j.key,V),maxlength:j.maxLength,"show-word-limit":!!j.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!j.dependsOn||i(j)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",aa,[a[13]||(a[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":t.value?.data.branchLogic||"and",disabled:n.value,onChange:a[0]||(a[0]=j=>e.unref(o).updateNodeData(t.value.id,{branchLogic:j})),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",la,[a[16]||(a[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":r("deviceType")??"camera",onChange:a[1]||(a[1]=j=>m("deviceType",j))},{default:e.withCtx(()=>[e.createVNode(H,{value:"camera"},{default:e.withCtx(()=>[...a[14]||(a[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(H,{value:"1400",disabled:E.value==="stream"},{default:e.withCtx(()=>[...a[15]||(a[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(f,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${L.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":L.value===0}),onClick:z},null,8,["model-value","class"]),L.value===0?(e.openBlock(),e.createElementBlock("div",ra,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&N.value==="1400"?(e.openBlock(),e.createElementBlock("div",sa,[a[19]||(a[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":r("detectionMode")??"platform",onChange:a[2]||(a[2]=j=>m("detectionMode",j))},{default:e.withCtx(()=>[e.createVNode(H,{value:"platform"},{default:e.withCtx(()=>[...a[17]||(a[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(H,{value:"device"},{default:e.withCtx(()=>[...a[18]||(a[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),n.value&&N.value==="camera"&&E.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ia,[a[21]||(a[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(I,{disabled:!w.value,content:s.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":w.value?!1:r("enablePatrol"),disabled:w.value,onChange:a[3]||(a[3]=j=>m("enablePatrol",j))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),r("enablePatrol")?(e.openBlock(),e.createBlock(f,{key:0},{label:e.withCtx(()=>[a[20]||(a[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(I,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(R,{"model-value":r("patrolGroupSize")??1,onChange:a[4]||(a[4]=j=>m("patrolGroupSize",j)),min:1,max:L.value>0?L.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),n.value&&N.value==="camera"?(e.openBlock(),e.createElementBlock("div",ca,[a[22]||(a[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(M,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"抽帧策略"},{default:e.withCtx(()=>[E.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":r("mode")??3,onChange:a[5]||(a[5]=j=>{m("mode",j),j===1&&m("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":r("mode")??0,onChange:a[6]||(a[6]=j=>{m("mode",j),j===0&&m("interval",30),j===1&&m("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}),E.value==="image"||E.value==="stream"&&(r("mode")??0)===0?(e.openBlock(),e.createBlock(f,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":r("interval")??30,onChange:a[7]||(a[7]=j=>m("interval",j)),min:1,max:E.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),E.value==="stream"&&(r("mode")??0)===1?(e.openBlock(),e.createBlock(f,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[p.value?(e.openBlock(),e.createBlock(R,{key:0,"model-value":r("interval")??5,onChange:a[8]||(a[8]=j=>m("interval",j)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(A,{key:1,"model-value":r("interval")??25,onChange:a[9]||(a[9]=j=>m("interval",j)),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),E.value==="stream"?(e.openBlock(),e.createBlock(f,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(A,{"model-value":r("sw_decoding")??"CPU",onChange:a[10]||(a[10]=j=>m("sw_decoding",j)),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"]]),ma={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Xe=(l=null)=>{const o=e.ref(l||[]),t=e.ref(!1),c=e.ref(null),y=e.ref(""),n=async(w=!1)=>{if(l){o.value=l;return}},N=async()=>{o.value=[],await n(!0)},E=w=>o.value.find(s=>s.id===w||s.title===w),L=w=>{const s=E(w);if(!s)return{};const g=s.inputSchema||s.input_schema;if(!g||!g.properties)return{};const r={};return Object.entries(g.properties).forEach(([D,F])=>{F.default!==void 0&&(r[D]=F.default)}),r},z=w=>{const s=E(w);if(!s)return[];const g=s.inputSchema||s.input_schema;if(!g||!g.properties)return[];const r=g.required||[];return Object.entries(g.properties).map(([D,F])=>({key:D,type:F.type,label:F.title||F.description||D,description:F.description||"",default:F.default,required:r.includes(D)||F.required||!1,min:F.minimum,max:F.maximum,step:F.step,options:F.enum,optionLabels:F.enumLabels||F.enum,dependsOn:F.dependsOn}))},q=e.computed(()=>{if(!y.value)return o.value;const w=y.value.toLowerCase();return o.value.filter(s=>s.name?.toLowerCase().includes(w)||s.type?.toLowerCase().includes(w)||s.title?.toLowerCase().includes(w)||s.description&&s.description.toLowerCase().includes(w)||p(s.type).toLowerCase().includes(w))}),p=w=>ma[w]||w;return{models:o,loading:t,error:c,searchKeyword:y,filteredModels:q,loadSmallModels:n,reloadSmallModels:N,getModelConfig:E,getTypeLabel:p,getDefaultArguments:L,getSchemaFields:z,validateArguments:(w,s)=>{const g=E(w);if(!g)return{valid:!1,errors:["模型不存在"]};const r=[],D=g.inputSchema||g.input_schema;return!D||!D.properties?{valid:!0,errors:[]}:(Object.entries(D.properties).forEach(([F,m])=>{const O=s[F];if(m.required&&(O==null||O==="")){r.push(`${m.title||F} 为必填项`);return}if(O!=null&&(m.type==="number"||m.type==="integer")){if(typeof O!="number"){r.push(`${m.title||F} 必须是数字`);return}m.minimum!==void 0&&O<m.minimum&&r.push(`${m.title||F} 不能小于 ${m.minimum}`),m.maximum!==void 0&&O>m.maximum&&r.push(`${m.title||F} 不能大于 ${m.maximum}`)}}),{valid:r.length===0,errors:r})}}},pa={class:"small-model-selector"},ua={key:0,class:"loading-state"},fa={key:1,class:"error-state"},ga={key:2,class:"model-list"},ha=["onClick"],ya={class:"model-header"},_a={class:"model-name"},Na={class:"model-description"},Ca={class:"model-meta"},ka={key:3,class:"empty-state"},ba=ne({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(l,{emit:o}){const t=l,c=o,{loading:y,error:n,searchKeyword:N,filteredModels:E,loadSmallModels:L,reloadSmallModels:z,getTypeLabel:q}=Xe(t.externalModels),p=s=>{c("update:modelValue",s.id),c("select",s)},x=()=>{z()},w=s=>({safety:"warning",security:"danger",traffic:"info"})[s]||"info";return e.onMounted(()=>{t.externalModels||L()}),(s,g)=>{const r=e.resolveComponent("el-input"),D=e.resolveComponent("el-icon"),F=e.resolveComponent("el-button"),m=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(r,{modelValue:e.unref(N),"onUpdate:modelValue":g[0]||(g[0]=O=>e.isRef(N)?N.value=O:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(Z.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(y)?(e.openBlock(),e.createElementBlock("div",ua,[e.createVNode(D,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Loading))]),_:1}),g[2]||(g[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(n)?(e.openBlock(),e.createElementBlock("div",fa,[e.createVNode(D,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(n)),1),e.createVNode(F,{type:"primary",onClick:x},{default:e.withCtx(()=>[...g[3]||(g[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(E).length>0?(e.openBlock(),e.createElementBlock("div",ga,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(E),O=>(e.openBlock(),e.createElementBlock("div",{key:O.id,class:e.normalizeClass(["model-item",{selected:l.modelValue===O.id}]),onClick:b=>p(O)},[e.createElementVNode("div",ya,[e.createElementVNode("div",_a,[e.createVNode(D,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(O.name),1)]),e.createVNode(m,{type:w(O.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(q)(O.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",Na,e.toDisplayString(O.description),1),e.createElementVNode("div",Ca,[O.supportDirectAlert?(e.openBlock(),e.createBlock(m,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...g[4]||(g[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ha))),128))])):(e.openBlock(),e.createElementBlock("div",ka,[e.createVNode(D,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Search))]),_:1}),g[6]||(g[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(F,{text:"",onClick:g[1]||(g[1]=O=>N.value="")},{default:e.withCtx(()=>[...g[5]||(g[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),xa={class:"position-tooltip"},Ve=ne({__name:"PositionTooltip",setup(l){return(o,t)=>(e.openBlock(),e.createElementBlock("div",xa,[...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"]]),Ea={class:"config-header"},wa={class:"config-section"},Ta={key:0,class:"model-selector-wrapper"},Sa={key:1,class:"selected-model-info"},Va={class:"model-info-header"},Ba={class:"model-info-name"},Aa={class:"model-info-description"},Da={key:0,class:"config-section"},La={key:3,class:"array-input"},Oa="检测到事件后,连续两次告警上报的时间间隔",Ma=ne({__name:"SmallModelConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=e.inject("editorConfig",null),N=e.computed(()=>(n?.value??n)?.smallModels??null),{models:E}=Xe(N.value),L=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),z={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},q=e.computed(()=>{if(!t.value)return[];const b=t.value.data.input_schema||t.value.data.inputSchema;if(!b||!b.properties)return[];const S=b.required||[],i=t.value.data.title||"";return Object.entries(b.properties).filter(([_])=>L.has(_)).map(([_,B])=>{const a={key:_,type:B.type,label:B.title||B.label||B.description||_,description:B.description||"",default:B.default,required:S.includes(_)||B.required||!1,min:B.minimum!==void 0?B.minimum:B.min,max:B.maximum!==void 0?B.maximum:B.max,step:B.step,maxLength:B.maxLength,options:B.enum,optionLabels:B.enumLabels||B.enum,dependsOn:B.dependsOn,sort:B.sort};return _==="interval"&&(a.label="告警间隔(秒)",a.description=z[i]||Oa,a.isInterval=!0,a.default=a.default!=null?a.default/1e3:10,a.min=a.min!=null?a.min/1e3:1,a.max=a.max!=null?a.max/1e3:void 0,a.step=1,a.precision=0),_==="threshold"&&(a.label="小模型阈值",a.step=.01,a.precision=2),_==="targetWidth"&&(a.label="最小目标宽度",a.default=60,a.min=20,a.max=1920,a.step=1,a.precision=0),_==="targetHeight"&&(a.label="最小目标高度",a.default=60,a.min=20,a.max=1080,a.step=1,a.precision=0),_==="topScale"&&(a.label="调整目标框高度比例 (上)",a.max=10,a.step=.1,a.precision=1),_==="bottomScale"&&(a.label="调整目标框高度比例 (下)",a.max=10,a.step=.1,a.precision=1),_==="leftScale"&&(a.label="调整目标框宽度比例 (左)",a.max=10,a.step=.1,a.precision=1),_==="rightScale"&&(a.label="调整目标框宽度比例 (右)",a.max=10,a.step=.1,a.precision=1),_==="x_ratio"&&(a.label="X轴位置信息",a.step=.01,a.precision=2),_==="y_ratio"&&(a.label="Y轴位置信息",a.step=.01,a.precision=2),_==="targetDuration"&&(a.label="目标持续时间(秒)",a.default=a.default!=null?a.default/1e3:1,a.min=a.min!=null?a.min/1e3:1,a.max=a.max!=null?a.max/1e3:void 0,a.step=.01,a.precision=2),_==="overloadNumber"&&(a.precision=0),_==="targetNumber"&&(a.precision=0),a}).filter(_=>!["areas","darwin","direction","lines"].includes(_.key)).filter(_=>!(_.key==="targetDuration"&&i==="NonMotorCounter")).sort((_,B)=>(_.sort??1/0)-(B.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},w=(b,S)=>{if(!t.value)return;let i=S;p.includes(b)&&S!=null&&(i=S*1e3);const B={...t.value.data.arguments||{},[b]:i};o.updateNodeData(t.value.id,{arguments:B})},s=b=>{if(!b.dependsOn||!t.value)return!0;const{field:S,value:i}=b.dependsOn,_=x(S);if(typeof i=="string"&&i.startsWith("!")){const B=i.substring(1);return _!==B}return Array.isArray(i)?i.includes(_):_===i},g=b=>{const S=x(b);return Array.isArray(S)?JSON.stringify(S):""},r=(b,S)=>{try{const i=JSON.parse(S);Array.isArray(i)&&w(b,i)}catch{}},D=async b=>{if(!t.value)return;const S=b.inputSchema||b.input_schema||{},i={};S.properties&&Object.entries(S.properties).forEach(([_,B])=>{B.default!==void 0&&(i[_]=B.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:i})},F=()=>{t.value&&v.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},m=()=>t.value?.data.modelId?E.value.find(S=>S.id===t.value.data.modelId)?.description||"暂无描述":"",O=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(b,S)=>{const i=e.resolveComponent("el-button"),_=e.resolveComponent("el-divider"),B=e.resolveComponent("el-icon"),a=e.resolveComponent("el-tag"),h=e.resolveComponent("el-tooltip"),u=e.resolveComponent("el-option"),k=e.resolveComponent("el-select"),I=e.resolveComponent("el-switch"),P=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),G=e.resolveComponent("el-text"),R=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ea,[S[0]||(S[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(_),e.createElementVNode("div",wa,[S[3]||(S[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!y.value?(e.openBlock(),e.createElementBlock("div",Ta,[e.createVNode(ba,{"model-value":t.value?.data.modelId,"external-models":N.value,onSelect:D},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Sa,[e.createElementVNode("div",Va,[e.createElementVNode("div",Ba,[e.createVNode(B,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(i,{key:0,type:"text",text:"",size:"small",onClick:F},{default:e.withCtx(()=>[...S[1]||(S[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Aa,e.toDisplayString(m()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(a,{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",Da,[S[4]||(S[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(Y,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(q.value,f=>e.withDirectives((e.openBlock(),e.createBlock(R,{key:f.key,required:f.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(f.label),1),f.key==="x_ratio"||f.key==="y_ratio"?(e.openBlock(),e.createBlock(h,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(B,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})):f.description?(e.openBlock(),e.createBlock(h,{key:1,content:f.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[f.options&&f.type==="string"?(e.openBlock(),e.createBlock(k,{key:0,"model-value":x(f.key),onChange:M=>w(f.key,M),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(M,H)=>(e.openBlock(),e.createBlock(u,{key:M,label:f.optionLabels?f.optionLabels[H]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):f.type==="boolean"?(e.openBlock(),e.createBlock(I,{key:1,"model-value":x(f.key),onChange:M=>w(f.key,M)},null,8,["model-value","onChange"])):f.type==="number"||f.type==="integer"||f.type==="float"?(e.openBlock(),e.createBlock(P,{key:2,"model-value":x(f.key),onChange:M=>w(f.key,M),min:f.min,max:f.max,step:f.step||(f.type==="integer"||f.type==="number"?1:.01),precision:f.precision??(f.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):f.type==="array"&&!f.options?(e.openBlock(),e.createElementBlock("div",La,[e.createVNode(A,{"model-value":g(f.key),onChange:M=>r(f.key,M),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(G,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):f.type==="array"&&f.options?(e.openBlock(),e.createBlock(k,{key:4,"model-value":x(f.key),onChange:M=>w(f.key,M),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(M,H)=>(e.openBlock(),e.createBlock(u,{key:M,label:f.optionLabels?f.optionLabels[H]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":x(f.key),onInput:M=>w(f.key,M)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!f.dependsOn||s(f)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Ia=(l=null)=>{const o=le(),t=e.ref(l?l.map(p=>Te.backendToFrontend(p)):[]),c=e.ref(!1),y=e.ref(null),n=async(p=!1)=>{if(l){t.value=l.map(x=>Te.backendToFrontend(x));return}},N=p=>t.value.find(x=>x.title===p)||null,E=p=>{const x=N(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}:{}},L=(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:"原图"}],w=L(p);return[...x,...w]},q=e.computed(()=>t.value.map(p=>({value:p.title,label:p.label,...p})));return{detectionTargets:t,loading:c,error:y,loadDetectionTargets:n,getTargetById:N,getDefaultConfig:E,getDetectionTargetNodes:L,getDetectionScopeOptions:z,getTargetOptions:q}},Ra={class:"paired-array-input"},Be=ne({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(l,{emit:o}){const t=(q,p)=>{let x;return(...w)=>{clearTimeout(x),x=setTimeout(()=>q(...w),p)}},c=l,y=o,n=e.ref([]),N=()=>{const q=c.primaryValue||[],p=c.pairedValue||[],x=Math.max(q.length,p.length,1);n.value=Array.from({length:x},(w,s)=>({primary:q[s]||"",paired:p[s]!==void 0?p[s]:c.pairedField.default?.[0]||.5}))};e.watch(()=>[c.primaryValue,c.pairedValue],()=>{N()},{immediate:!0,deep:!0});const E=t((q,p)=>{y("update",q,p)},300);e.watch(n,q=>{const p=q.map(w=>w.primary),x=q.map(w=>w.paired);E(p,x)},{deep:!0});const L=()=>{n.value.length>=10||n.value.push({primary:"",paired:c.pairedField.default?.[0]||.5})},z=q=>{n.value.length>1&&n.value.splice(q,1)};return(q,p)=>{const x=e.resolveComponent("el-input"),w=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Ra,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,(g,r)=>(e.openBlock(),e.createElementBlock("div",{key:r,class:"input-row"},[e.createVNode(x,{modelValue:n.value[r].primary,"onUpdate:modelValue":D=>n.value[r].primary=D,placeholder:l.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!n.value[r].primary||n.value[r].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(w,{modelValue:n.value[r].paired,"onUpdate:modelValue":D=>n.value[r].paired=D,min:l.pairedField.min||0,max:l.pairedField.max||1,step:l.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(s,{type:"danger",icon:e.unref(Z.Delete),circle:"",size:"small",disabled:n.value.length===1,onClick:D=>z(r)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(s,{type:"primary",icon:e.unref(Z.Plus),size:"small",disabled:n.value.length>=10,onClick:L},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(l.primaryField.label)+e.toDisplayString(n.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),$a={class:"config-header"},Fa={class:"config-section"},qa={class:"flex items-center justify-between"},Ga={key:0,class:"config-section"},Ha={key:1,class:"config-section"},ja={key:2,class:"config-section"},Pa={class:"device-list"},za=["onClick"],Ua={class:"device-name"},Wa={key:0,class:"device-list-empty"},Ja={key:4,class:"array-input"},Ya={key:4,class:"array-input"},Xa=ne({__name:"DetectionTargetConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c==="task"),n=e.inject("taskModeConfig",null),N=e.inject("echoAlgodata",null),E=e.inject("echoTaskData",null),L=e.computed(()=>{if(!t.value)return null;const f=new Set,M=[t.value.id];for(;M.length;){const H=M.shift();if(f.has(H))continue;f.add(H);const J=o.edges.filter(j=>j.target===H);for(const j of J){const V=o.nodes.find(d=>d.id===j.source);if(V){if(V.type==="dataSource")return V.id;M.push(V.id)}}}return null}),z=e.computed(()=>{const f=L.value;return f?(n?.value??n)?.datasource?.getDevices?.(f)??[]:[]}),q=e.computed(()=>y.value&&z.value.length>0),p=e.ref(""),x=e.ref(""),w=e.computed(()=>{const f=x.value.trim().toLowerCase();return f?z.value.filter(M=>(M.sourceName??M.name??String(M.sourceId??M.id??M)).toLowerCase().includes(f)):z.value}),s=e.computed(()=>{const f={},M=L.value,H=t.value?.id;if(!M||!H)return f;const J={...t.value?.data?.arguments??{}};delete J.configMode;for(const j of z.value){const V=String(j.sourceId??j.id??j),d=o.getTaskSourceArguments(M,V,H);if(d===null){f[V]=!1;continue}const T=new Set([...Object.keys(d),...Object.keys(J)]);let U=!1;for(const X of T)if(JSON.stringify(d[X])!==JSON.stringify(J[X])){U=!0;break}f[V]=U}return f});e.watch([z,()=>t.value?.data?.arguments?.configMode],([f])=>{f.length>0?p.value=String(f[0]?.sourceId??f[0]?.id??f[0]):p.value=""},{immediate:!0});const g=(f,M=null)=>{if(M){const V=((E?.value??E)?.graph?.sources??[]).find(d=>String(d.sourceId)===String(M));if(V?.branches)for(const d of V.branches){const T=d.nodes?.find(U=>U.toolTitle===f);if(T?.arguments)return{...T.arguments}}return null}const H=N?.value??N;if(!H?.branches)return null;for(const J of H.branches){const j=J.nodes?.find(V=>V.toolTitle===f);if(j?.arguments)return{...j.arguments}}return null},r=f=>{const M=L.value,H=t.value?.id;if(!M||!H||!f||o.getTaskSourceArguments(M,f,H)!==null)return;const J=t.value?.data?.targetId,j=J?g(J,f):null,V=t.value?.data?.arguments??{},d={...j??V};delete d.configMode,o.setTaskSourceArguments(M,f,H,d)};e.watch(p,f=>{f&&t.value?.data?.arguments?.configMode==="perDevice"&&r(f)}),e.watch(()=>t.value?.data?.arguments?.configMode,f=>{f==="perDevice"&&p.value&&r(p.value)});const D=e.inject("editorConfig",null),F=e.computed(()=>(D?.value??D)?.detection??null),{detectionTargets:m,loading:O}=Ia(F.value),b=e.computed(()=>{if(!t.value)return[];const f=t.value.data.input_schema||t.value.data.inputSchema;if(!f||!f.properties)return[];const M=f.required||[];return Object.entries(f.properties).map(([H,J])=>({key:H,type:J.type,label:J.title||J.label||J.description||H,description:J.description||"",default:J.default,required:M.includes(H)||J.required||!1,min:J.minimum!==void 0?J.minimum:J.min,max:J.maximum!==void 0?J.maximum:J.max,step:J.step,maxLength:J.maxLength,options:J.enum,optionLabels:J.enumLabels||J.enum,dependsOn:J.dependsOn,"x-component":J["x-component"],"x-paired-with":J["x-paired-with"],sort:J.sort})).sort((H,J)=>(H.sort??1/0)-(J.sort??1/0))}),S=f=>f.type==="array"&&f["x-component"]==="paired-array"&&f["x-paired-with"],i=f=>{const M=f["x-paired-with"];return b.value.find(H=>H.key===M)},_={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}},B=new Set(Object.keys(_)),a=e.computed(()=>{const f=t.value?.data.targetId,M=new Set;return b.value.forEach(H=>{H["x-paired-with"]&&M.add(H["x-paired-with"])}),b.value.filter(H=>f==="traffic_accident"?H.key==="threshold":B.has(H.key)&&!M.has(H.key)&&!S(H)).map(H=>{const J=_[H.key]||{};return{...H,label:J.label||H.label,description:J.description||H.description,min:J.min??H.min,max:J.max??H.max,step:J.step??H.step,precision:J.precision,default:J.default??H.default}})}),h=e.computed(()=>b.value.filter(f=>S(f))),u=f=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const H=L.value,J=o.getTaskSourceArguments(H,p.value,t.value.id);if(J!==null)return J[f]}return t.value.data.arguments?.[f]},k=(f,M)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(f!=="configMode"&&H==="perDevice"&&p.value){const V=L.value;o.updateTaskSourceArgument(V,p.value,t.value.id,f,M);return}const j={...t.value.data.arguments||{},[f]:M};o.updateNodeData(t.value.id,{arguments:j})},I=f=>{if(!f.dependsOn||!t.value)return!0;const{field:M,value:H}=f.dependsOn,J=u(M);if(typeof H=="string"&&H.startsWith("!")){const j=H.substring(1);return J!==j}return Array.isArray(H)?H.includes(J):J===H},P=f=>{const M=u(f);return Array.isArray(M)?JSON.stringify(M):""},A=(f,M)=>{try{const H=JSON.parse(M);Array.isArray(H)&&k(f,H)}catch{}},G=(f,M,H,J)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const T=L.value;o.updateTaskSourceArgument(T,p.value,t.value.id,f,M),o.updateTaskSourceArgument(T,p.value,t.value.id,H,J);return}const d={...t.value.data.arguments||{},[f]:M,[H]:J};o.updateNodeData(t.value.id,{arguments:d})},R=async f=>{if(!t.value||!f)return;const M=m.value.find(d=>d.title===f);if(!M)return;let H=M.inputSchema||M.input_schema||{};if(f==="other"){const d={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}}};H={...H,properties:{...H.properties,...d.properties}}}const J={};H.properties&&Object.entries(H.properties).forEach(([d,T])=>{T.default!==void 0&&(J[d]=T.default)});const j=t.value.data,V={...J,target_class:M.title};o.updateNodeData(t.value.id,{...j,targetId:M.title,targetName:M.label,label:M.label,input_schema:H,inputSchema:H,extraConfig:M.extraConfig,arguments:V})},Y=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,f=>{if(!f||!t.value)return;const M=m.value.find(j=>j.title===f);if(!M)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const J={...M.defaultArguments,...H.arguments,target_class:M.title};o.updateNodeData(t.value.id,{...H,input_schema:M.inputSchema,arguments:J})}),(f,M)=>{const H=e.resolveComponent("el-button"),J=e.resolveComponent("el-divider"),j=e.resolveComponent("el-option"),V=e.resolveComponent("el-select"),d=e.resolveComponent("el-form-item"),T=e.resolveComponent("el-form"),U=e.resolveComponent("el-radio"),X=e.resolveComponent("el-radio-group"),W=e.resolveComponent("el-icon"),Q=e.resolveComponent("el-tooltip"),te=e.resolveComponent("el-input"),ae=e.resolveComponent("el-switch"),pe=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",$a,[M[2]||(M[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(H,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(J),e.createElementVNode("div",Fa,[M[3]||(M[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(d,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(V,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:R,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(O),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(m),$=>(e.openBlock(),e.createBlock(j,{key:$.title,label:$.label,value:$.title},{default:e.withCtx(()=>[e.createElementVNode("div",qa,[e.createElementVNode("span",null,e.toDisplayString($.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),q.value?(e.openBlock(),e.createElementBlock("div",Ga,[M[6]||(M[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(d,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(X,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:M[0]||(M[0]=$=>k("configMode",$))},{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),h.value.length>0?(e.openBlock(),e.createElementBlock("div",Ha,[M[7]||(M[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,$=>(e.openBlock(),e.createBlock(d,{key:$.key,required:$.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString($.label),1),$.description?(e.openBlock(),e.createBlock(Q,{key:0,content:$.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Be,{"primary-field":$,"paired-field":i($),"primary-value":u($.key),"paired-value":u($["x-paired-with"]),onUpdate:(K,re)=>G($.key,K,$["x-paired-with"],re)},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,[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(te,{modelValue:x.value,"onUpdate:modelValue":M[1]||(M[1]=$=>x.value=$),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(W,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Z.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Pa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(w.value,$=>(e.openBlock(),e.createElementBlock("div",{key:String($.sourceId??$.id??$),class:e.normalizeClass(["device-list-item",{"is-active":p.value===String($.sourceId??$.id??$),"has-custom":s.value[String($.sourceId??$.id??$)]}]),onClick:K=>p.value=String($.sourceId??$.id??$)},[e.createElementVNode("span",Ua,e.toDisplayString($.sourceName??$.name??String($.sourceId??$.id??$)),1),s.value[String($.sourceId??$.id??$)]?(e.openBlock(),e.createBlock(Q,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...M[8]||(M[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,za))),128)),w.value.length===0?(e.openBlock(),e.createElementBlock("div",Wa," 无匹配设备 ")):e.createCommentVNode("",!0)]),p.value?(e.openBlock(),e.createBlock(T,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,$=>e.withDirectives((e.openBlock(),e.createBlock(d,{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(Q,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})):$.description?(e.openBlock(),e.createBlock(Q,{key:1,content:$.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[$.options&&$.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":u($.key),onChange:K=>k($.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(K,re)=>(e.openBlock(),e.createBlock(j,{key:K,label:$.optionLabels?$.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):$.type==="boolean"?(e.openBlock(),e.createBlock(ae,{key:1,"model-value":u($.key),onChange:K=>k($.key,K)},null,8,["model-value","onChange"])):$.type==="number"||$.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":u($.key),onChange:K=>k($.key,K),min:$.min,max:$.max,step:$.step||($.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S($)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":$,"paired-field":i($),"primary-value":u($.key),"paired-value":u($["x-paired-with"]),onUpdate:(K,re)=>G($.key,K,$["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):$.type==="array"&&!$.options?(e.openBlock(),e.createElementBlock("div",Ja,[e.createVNode(te,{"model-value":P($.key),onChange:K=>A($.key,K),type:"textarea",rows:3,placeholder:$.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):$.type==="array"&&$.options?(e.openBlock(),e.createBlock(V,{key:5,"model-value":u($.key),onChange:K=>k($.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(K,re)=>(e.openBlock(),e.createBlock(j,{key:K,label:$.optionLabels?$.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":u($.key),onInput:K=>k($.key,K),maxlength:$.maxLength,"show-word-limit":!!$.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!$.dependsOn||I($)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(T,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(a.value,$=>e.withDirectives((e.openBlock(),e.createBlock(d,{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(Q,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})):$.description?(e.openBlock(),e.createBlock(Q,{key:1,content:$.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[$.options&&$.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":u($.key),onChange:K=>k($.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(K,re)=>(e.openBlock(),e.createBlock(j,{key:K,label:$.optionLabels?$.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):$.type==="boolean"?(e.openBlock(),e.createBlock(ae,{key:1,"model-value":u($.key),onChange:K=>k($.key,K)},null,8,["model-value","onChange"])):$.type==="number"||$.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":u($.key),onChange:K=>k($.key,K),min:$.min,max:$.max,step:$.step||($.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S($)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":$,"paired-field":i($),"primary-value":u($.key),"paired-value":u($["x-paired-with"]),onUpdate:(K,re)=>G($.key,K,$["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):$.type==="array"&&!$.options?(e.openBlock(),e.createElementBlock("div",Ya,[e.createVNode(te,{"model-value":P($.key),onChange:K=>A($.key,K),type:"textarea",rows:3,placeholder:$.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):$.type==="array"&&$.options?(e.openBlock(),e.createBlock(V,{key:5,"model-value":u($.key),onChange:K=>k($.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(K,re)=>(e.openBlock(),e.createBlock(j,{key:K,label:$.optionLabels?$.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":u($.key),onInput:K=>k($.key,K),maxlength:$.maxLength,"show-word-limit":!!$.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!$.dependsOn||I($)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Qa={class:"config-header"},Ka={class:"config-section"},Za={key:0,style:{"margin-bottom":"8px"}},va=ne({__name:"TargetCountConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=q=>{if(!t.value)return;const p={...t.value.data.arguments,conditionRelation:q};o.updateNodeData(t.value.id,{arguments:p})},N=()=>{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})},E=(q,p,x)=>{if(!t.value)return;const w=[...t.value.data.arguments?.alertConditions||[]];w[q]={...w[q],[p]:x};const s={...t.value.data.arguments,alertConditions:w};o.updateNodeData(t.value.id,{arguments:s})},L=q=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[]];p.splice(q,1);const x={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:x})},z=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(q,p)=>{const x=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),s=e.resolveComponent("el-text"),g=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),D=e.resolveComponent("el-input-number"),F=e.resolveComponent("el-radio"),m=e.resolveComponent("el-radio-group"),O=e.resolveComponent("el-form-item"),b=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Qa,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:z},null,8,["icon"]))]),e.createVNode(w),e.createElementVNode("div",Ka,[p[9]||(p[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(b,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,null,{label:e.withCtx(()=>[p[3]||(p[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(s,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(s,{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,i)=>(e.openBlock(),e.createElementBlock("div",{key:i,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(r,{"model-value":S.operator,onChange:_=>E(i,"operator",_),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"等于 =",value:"="}),e.createVNode(g,{label:"大于 >",value:">"}),e.createVNode(g,{label:"小于 <",value:"<"}),e.createVNode(g,{label:"大于等于 ≥",value:">="}),e.createVNode(g,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(D,{"model-value":S.value,onChange:_=>E(i,"value",_),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(Z.Delete),circle:"",size:"small",onClick:_=>L(i)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Za,[e.createVNode(s,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...p[5]||(p[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(m,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:p[0]||(p[0]=S=>n(S))},{default:e.withCtx(()=>[e.createVNode(F,{value:"OR"},{default:e.withCtx(()=>[...p[6]||(p[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(F,{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(Z.Plus),onClick:N},{default:e.withCtx(()=>[...p[8]||(p[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),el={class:"config-header"},tl={class:"config-section"},ol={style:{display:"flex","align-items":"center",gap:"8px"}},nl={style:{display:"flex","align-items":"center",gap:"8px"}},al={style:{display:"flex","align-items":"center",gap:"8px"}},ll=ne({__name:"TimerTargetConfig",setup(l){const o=le(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),y=e.computed(()=>c===oe.TASK),n=g=>{if(!t.value)return;const r={...t.value.data.arguments,duration:g};o.updateNodeData(t.value.id,{arguments:r})},N=g=>{if(!t.value)return;const r={...t.value.data.arguments,similarity_enabled:g};o.updateNodeData(t.value.id,{arguments:r})},E=g=>{if(!t.value)return;const r={...t.value.data.arguments,similarity_threshold:g};o.updateNodeData(t.value.id,{arguments:r})},L=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_enabled:g};o.updateNodeData(t.value.id,{arguments:r})},z=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_operator:g};o.updateNodeData(t.value.id,{arguments:r})},q=g=>{if(!t.value)return;const r={...t.value.data.arguments,hit_rate_threshold:g};o.updateNodeData(t.value.id,{arguments:r})},p=g=>{if(!t.value)return;const r=t.value.data.arguments?.overlap_detection||{},D={...t.value.data.arguments,overlap_detection:{operator:r.operator??"gt",threshold:r.threshold??90,...r,enabled:g}};o.updateNodeData(t.value.id,{arguments:D})},x=g=>{if(!t.value)return;const r={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:g}};o.updateNodeData(t.value.id,{arguments:r})},w=g=>{if(!t.value)return;const r={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:g}};o.updateNodeData(t.value.id,{arguments:r})},s=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(g,r)=>{const D=e.resolveComponent("el-button"),F=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-text"),b=e.resolveComponent("el-form-item"),S=e.resolveComponent("el-switch"),i=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tooltip"),B=e.resolveComponent("el-slider"),a=e.resolveComponent("el-option"),h=e.resolveComponent("el-select"),u=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",el,[r[9]||(r[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(D,{key:0,type:"danger",size:"small",icon:e.unref(Z.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(F),e.createElementVNode("div",tl,[r[13]||(r[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(b,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.duration??30,onChange:r[0]||(r[0]=k=>n(k)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[10]||(r[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(b,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(S,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:r[1]||(r[1]=k=>N(k))},null,8,["model-value"]),e.createVNode(_,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(b,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(B,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:r[2]||(r[2]=k=>E(k)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[11]||(r[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(b,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",nl,[e.createVNode(S,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:r[3]||(r[3]=k=>L(k))},null,8,["model-value"]),e.createVNode(_,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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(h,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:r[4]||(r[4]=k=>z(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(a,{label:"大于 >",value:"gt"}),e.createVNode(a,{label:"大于等于 >=",value:"gte"}),e.createVNode(a,{label:"等于 =",value:"eq"}),e.createVNode(a,{label:"小于等于 <=",value:"lte"}),e.createVNode(a,{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(m,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:r[5]||(r[5]=k=>q(k)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(O,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...r[12]||(r[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-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?.overlap_detection?.enabled||!1,onChange:r[6]||(r[6]=k=>p(k))},null,8,["model-value"]),e.createVNode(_,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Z.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(h,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:r[7]||(r[7]=k=>x(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(a,{label:"大于 >",value:"gt"}),e.createVNode(a,{label:"等于 =",value:"eq"}),e.createVNode(a,{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(m,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:r[8]||(r[8]=k=>w(k)),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"]]),rl={class:"node-config-panel"},sl={class:"config-content"},il=ne({__name:"NodeConfigPanel",setup(l){const o=le(),t={edge:on,group:an,start:Sn,end:On,classificationModel:Hn,ocr:zn,licensePlate:Jn,face:Ye,stream:ta,dataSource:da,smallModel:Ma,detectionTarget:Xa,targetCount:va,timerTarget:ll,faceRecognition:Ye},c=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(E=>E.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",rl,[e.createElementVNode("div",sl,[c.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),cl={class:"workflow-editor",id:"workflow-editor"},dl={class:"editor-content"},ml={__name:"WorkflowEditor",props:{mode:{type:String,default:oe.ALGORITHM,validator:l=>Object.values(oe).includes(l)},pageMode:{type:String,default:Ne.CREATE,validator:l=>Object.values(Ne).includes(l)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(l,{expose:o}){const t=l,c=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",c),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=le(c),{copyToClipboard:N,downloadJSON:E,exportToJSON:L}=Ct(t.mode,n,y),{runValidation:z}=bt(t.mode,n,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{rt(c)});const q=e.computed(()=>{if(n.selectedNodeId)return!0;const x=n.selectedEdge;return x?!!n.nodes.find(s=>s.id===x.source)?.data?.enableBranch:!1});return o({reset:()=>{n.resetWorkflow()},runTest:z,copyJSON:N,exportJSON:L}),(x,w)=>(e.openBlock(),e.createElementBlock("div",cl,[e.createElementVNode("div",dl,[e.createVNode(Vt),e.createVNode(Zo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[q.value?(e.openBlock(),e.createBlock(il,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Qe=ne(ml,[["__scopeId","data-v-adb6277c"]]),pl={Box:Z.Box,CircleCheck:Z.CircleCheck,CircleClose:Z.CircleClose,Close:Z.Close,CopyDocument:Z.CopyDocument,Cpu:Z.Cpu,DArrowLeft:Z.DArrowLeft,DataAnalysis:Z.DataAnalysis,Delete:Z.Delete,Document:Z.Document,Download:Z.Download,FolderOpened:Z.FolderOpened,Grid:Z.Grid,Loading:Z.Loading,Plus:Z.Plus,QuestionFilled:Z.QuestionFilled,RefreshLeft:Z.RefreshLeft,Search:Z.Search,Timer:Z.Timer,Upload:Z.Upload,User:Z.User,View:Z.View,VideoPlay:Z.VideoPlay,Warning:Z.Warning},Ke=l=>{Object.entries(pl).forEach(([o,t])=>{l.component(o,t)}),l.component("WorkflowEditor",Qe)},ul={install:Ke};se.EditorMode=oe,se.NodeType=C,se.PageMode=Ne,se.WorkflowEditor=Qe,se.default=ul,se.install=Ke,Object.defineProperties(se,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|