aiflowui 1.0.6 → 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- (function(re,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(re=typeof globalThis<"u"?globalThis:re||self,e(re.AIFlowUI={},re.Vue,re.ElementPlusIconsVue,re.ElementPlus,re.Pinia,re.VueFlowCore,re.VueFlowBackground,re.VueFlowControls,re.VueFlowNodeResizer))})(this,(function(re,e,X,K,Xe,Z,Qe,Ke,Ze){"use strict";const b={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},ce={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},ve={[b.DETECTION_TARGET]:"检测目标",[b.CLASSIFICATION_MODEL]:"分类模型",[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时",[b.FACE_RECOGNITION]:"人脸识别",[b.SMALL_MODEL]:"小模型"},et={cls:b.CLASSIFICATION_MODEL,ocr:b.OCR,license_plate:b.LICENSE_PLATE,target_count:b.TARGET_COUNT,timer_target:b.TIMER_TARGET,face:b.FACE_RECOGNITION,face_recognition:b.FACE_RECOGNITION},ee={ALGORITHM:"algorithm",TASK:"task"},he={CREATE:"create",EDIT:"edit",DETAIL:"detail"},de=l=>`${l}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Se=l=>({id:de("start"),type:"start",position:l,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),ke=l=>({id:de("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}}}),be=l=>({id:de("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"}}),Ve=(l,o="默认模型")=>({id:de("smallModel"),type:"smallModel",position:l,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Be=(l,o="检测目标")=>({id:de("detectionTarget"),type:"detectionTarget",position:l,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Ae=(l,o="分类模型")=>({id:de("classificationModel"),type:"classificationModel",position:l,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),De=l=>({id:de("ocr"),type:"ocr",position:l,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Le=l=>({id:de("licensePlate"),type:"licensePlate",position:l,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Oe=l=>({id:de("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"}}}}),Me=l=>({id:de("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:{}}}),tt=(l,o={width:300,height:160},t="and",f=null)=>({id:de("group"),type:"group",position:l,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:f},selectable:!0,deletable:!1,zIndex:-1}),Ie=l=>({id:de("faceRecognition"),type:"faceRecognition",position:l,data:{label:"人脸识别",input_schema:{},arguments:{}}}),Re=()=>{const l=Se({x:80,y:300}),o=be({x:320,y:300}),t=ke({x:1e3,y:300}),f={id:`e_${l.id}_${o.id}`,source:l.id,target:o.id,data:{branchOrder:1}};return{nodes:[l,o,t],edges:[f]}},ae=Xe.defineStore("aiflow-workflow",()=>{const l=Re(),o=e.ref(l.nodes),t=e.ref(l.edges),f=e.ref(null),_=e.ref(null),r=e.ref(new Set),y=e.ref(new Set),k=e.ref({}),L=(n,C,S,j)=>{k.value[n]||(k.value[n]={}),k.value[n][C]||(k.value[n][C]={}),k.value[n][C][S]={...j}},F=(n,C,S,j,J)=>{k.value[n]||(k.value[n]={}),k.value[n][C]||(k.value[n][C]={}),k.value[n][C][S]||(k.value[n][C][S]={}),k.value[n][C][S][j]=J},D=(n,C,S)=>k.value[n]?.[C]?.[S]??null,p=()=>{k.value={}},E=e.computed(()=>f.value?o.value.find(n=>n.id===f.value):null),x=e.computed(()=>_.value?t.value.find(n=>n.id===_.value):null),s=n=>o.value.filter(C=>C.type===n).length,h=()=>{const n=o.value.filter(C=>C.type===b.DATA_SOURCE);n.length!==0&&(n.length===1?n[0].data.label="数据源":n.forEach((C,S)=>{C.data.label=`数据源 ${S+1}`}))},a=()=>o.value.filter(n=>n.type===b.DATA_SOURCE).length,w=()=>o.value.filter(C=>C.type===b.DATA_SOURCE).some(C=>C.data.arguments?.needCooperativeDetection===!0),R=()=>{const n=a(),C=w();return!(n>1||C)},m=n=>{o.value.push(n),n.type===b.DATA_SOURCE&&h()},$=n=>{const C=o.value.find(j=>j.id===n),S=C?.type===b.DATA_SOURCE;if(C?.type==="group"){g(n),t.value=t.value.filter(j=>j.source!==n&&j.target!==n),f.value===n&&(f.value=null);return}o.value=o.value.filter(j=>j.id!==n),t.value=t.value.filter(j=>j.source!==n&&j.target!==n),f.value===n&&(f.value=null),S&&h()},B=(n,C)=>{const S=o.value.find(j=>j.id===n);S&&(S.data={...S.data,...C})},A=(n,C)=>{const S=o.value.find(j=>j.id===n);S&&(S.position=C)},T=n=>{const C=o.value.find(S=>S.id===n.source);if(C&&(C.type===b.START||C.type===b.DATA_SOURCE)&&C.data?.enableBranch===!0){const j=t.value.filter(J=>J.source===n.source).length+1;n={...n,data:{...n.data,branchOrder:j}}}t.value=Z.addEdge(n,t.value)},c=n=>{const C=t.value.find(S=>S.id===n);if(t.value=t.value.filter(S=>S.id!==n),_.value===n&&(_.value=null),C&&C.data?.branchOrder!==void 0){const S=o.value.find(j=>j.id===C.source);S&&(S.type===b.START||S.type===b.DATA_SOURCE)&&t.value.filter(J=>J.source===C.source).sort((J,W)=>(J.data?.branchOrder||0)-(W.data?.branchOrder||0)).forEach((J,W)=>{J.data?J.data.branchOrder=W+1:J.data={branchOrder:W+1}})}},d=(n,C="and",S=null)=>{const j=tt(n,{width:300,height:160},C,S);return o.value.unshift(j),j.id},i=(n,C)=>{const S=o.value.find(W=>W.id===n),j=o.value.find(W=>W.id===C);if(!S||!j||S.parentNode===C)return;S.parentNode&&N(n);const J=o.value.find(W=>W.id===n);J&&(o.value=o.value.map(W=>W.id!==n?W:{...W,position:{x:J.position.x-j.position.x,y:J.position.y-j.position.y},parentNode:C,extent:"parent"}))},N=n=>{const C=o.value.find(W=>W.id===n);if(!C||!C.parentNode)return;const S=o.value.find(W=>W.id===C.parentNode),j=S?C.position.x+S.position.x:C.position.x,J=S?C.position.y+S.position.y:C.position.y;o.value=o.value.map(W=>{if(W.id!==n)return W;const v={...W,position:{x:j,y:J}};return delete v.parentNode,delete v.extent,v})},g=n=>{const C=o.value.find(S=>S.id===n);C&&(o.value=o.value.filter(S=>S.id!==n).map(S=>{if(S.parentNode!==n)return S;const j={...S,position:{x:S.position.x+C.position.x,y:S.position.y+C.position.y}};return delete j.parentNode,delete j.extent,j}))};return{nodes:o,edges:t,selectedNodeId:f,selectedEdgeId:_,invalidNodeIds:r,invalidEdgeIds:y,selectedNode:E,selectedEdge:x,getNodeCountByType:s,getDataSourceCount:a,hasCooperativeDetection:w,supportPatrol:R,addNode:m,removeNode:$,updateNodeData:B,updateNodePosition:A,addConnection:T,removeEdge:c,updateEdgeData:(n,C)=>{const S=t.value.find(j=>j.id===n);if(S){if(C.branchOrder!==void 0){const j=o.value.find(J=>J.id===S.source);if(j&&(j.type===b.START||j.type===b.DATA_SOURCE)){const J=S.data?.branchOrder,W=C.branchOrder;if(J!==W&&W!==null){const ne=t.value.filter(se=>se.source===S.source&&se.id!==n).find(se=>se.data?.branchOrder===W);ne&&(ne.data?ne.data.branchOrder=J:ne.data={branchOrder:J})}}}S.data={...S.data,...C}}},selectNode:n=>{f.value=n,_.value=null},selectEdge:n=>{_.value=n,f.value=null},clearSelection:()=>{f.value=null,_.value=null},resetWorkflow:()=>{const n=Re();o.value=n.nodes,t.value=n.edges,f.value=null,_.value=null,p()},loadWorkflow:(n,C)=>{o.value=n,t.value=C,f.value=null,_.value=null,p()},refreshDataSourceLabels:h,createEmptyGroup:d,addNodeToGroup:i,removeNodeFromGroup:N,dissolveParallelGroup:g,initializeSubsequentFrames:n=>{o.value.find(S=>S.id===n)&&B(n,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(n,C)=>{const S=o.value.find(j=>j.id===n);!S||S.type!=="dataSource"||(S.data.subsequentFrames||(S.data.subsequentFrames=[]),S.data.subsequentFrames.push(C),B(n,{subsequentFrames:[...S.data.subsequentFrames]}))},removeSubsequentFrame:(n,C)=>{const S=o.value.find(W=>W.id===n);if(!S||S.type!=="dataSource")return;const j=S.data.subsequentFrames.find(W=>W.id===C);j&&t.value.filter(v=>v.source===n&&v.sourceHandle===j.handleId).forEach(v=>c(v.id));const J=S.data.subsequentFrames.filter(W=>W.id!==C);J.forEach((W,v)=>{W.id==="default-subsequent"?W.label="后续帧检测":W.label=`后续帧检测${v+1}`}),B(n,{subsequentFrames:J})},setInvalidIds:(n,C)=>{r.value=new Set(n),y.value=new Set(C)},clearInvalidIds:()=>{r.value=new Set,y.value=new Set},taskSources:k,setTaskSourceArguments:L,updateTaskSourceArgument:F,getTaskSourceArguments:D,clearTaskSources:p}}),$e=(l,o,t)=>{const f=[],_=[],r=l.filter(a=>a.type!=="group"),y=r.filter(a=>a.type===b.START);y.length===0?f.push("工作流必须包含一个开始节点"):y.length>1&&f.push("工作流只能包含一个开始节点");const k=r.filter(a=>a.type===b.END);k.length===0?f.push("工作流必须包含一个结束节点"):k.length>1&&f.push("工作流只能包含一个结束节点");const L=r.filter(a=>a.type===b.DATA_SOURCE);L.length===0&&f.push("工作流必须至少包含一个数据源节点"),r.filter(a=>a.type===b.DETECTION_TARGET||a.type===b.SMALL_MODEL||a.type===b.CLASSIFICATION_MODEL).length===0&&f.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),r.some(a=>a.type===b.SMALL_MODEL),L.some(a=>a.data.arguments?.needCooperativeDetection===!0),L.length>1,r.forEach(a=>{const w=o.filter(m=>m.target===a.id),R=o.filter(m=>m.source===a.id);if(a.type===b.START&&w.length>0&&_.push("开始节点不应有输入连接"),a.type===b.END&&R.length>0&&_.push("结束节点不应有输出连接"),a.type===b.START&&R.length===0&&f.push("开始节点必须有输出连接"),a.type===b.END&&w.length===0&&f.push("结束节点必须有输入连接"),a.type===b.DATA_SOURCE&&a.data.enableImageSequence)if(R.length===0)f.push({nodeId:a.id,message:`数据源节点"${a.data.label}"开启了图片时序但未连接到任何处理节点`});else{const m=R.filter(T=>T.sourceHandle==="first-frame"),$=a.data.subsequentFrames||[],B=new Set(R.map(T=>T.sourceHandle)),A=$.filter(T=>!B.has(T.handleId));m.length===0&&_.push({nodeId:a.id,message:`数据源节点"${a.data.label}"的首帧检测未连接`}),A.length>0&&_.push({nodeId:a.id,message:`数据源节点"${a.data.label}"有${A.length}个后续帧未连接`})}a.type!==b.START&&a.type!==b.END&&!a.parentNode&&(w.length===0||R.length===0)&&_.push(`节点 "${a.data.label}" 可能未正确连接`)});const D=new Set;o.forEach(a=>{const w=l.find(R=>R.id===a.source);w?.type==="dataSource"&&w.data?.enableImageSequence===!0&&a.sourceHandle!=="first-frame"&&(!a.data?.timeWindowSeconds||a.data.timeWindowSeconds<1)&&f.push({edgeId:a.id,message:`分支"${a.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),D.add(a.source),D.add(a.target)}),r.forEach(a=>{a.parentNode||!D.has(a.id)&&r.length>1&&_.push(`节点 "${a.data.label}" 未连接到工作流`)});const p=ot(r,o);f.push(...p);const E=at(r,o);f.push(...E);const x=nt(r);f.push(...x);const s=lt(r,o);f.push(...s);const h=rt(r,o);return f.push(...h),t==="task"&&r.filter(w=>w.type===b.FACE_RECOGNITION).forEach(w=>{(!w.data.arguments?.repositoryId||Array.isArray(w.data.arguments.repositoryId)&&w.data.arguments.repositoryId.length===0)&&f.push({nodeId:w.id,message:`人脸识别节点"${w.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:f.length===0,errors:f,warnings:_}},ot=(l,o)=>{const t=[],f=l.find(y=>y.type===b.START);if(!f)return t;const _=new Set,r=(y,k,L,F)=>{if(k.includes(y))return;const D=l.find(h=>h.id===y);if(!D)return;const p=[...k,y];let E=[...L],x=[...F];if(D.type===b.TARGET_COUNT&&E.push(D),D.type===b.TIMER_TARGET&&x.push(D),D.type===b.END){const h=p.join("->");_.has(h)||(_.add(h),E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(a=>`"${a.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),x.length>1&&t.push(`工作流分支中存在多个目标计时节点(${x.map(a=>`"${a.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const s=o.filter(h=>h.source===y);s.length===0?(E.length>1&&t.push(`工作流分支中存在多个目标计数节点(${E.map(h=>`"${h.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),x.length>1&&t.push(`工作流分支中存在多个目标计时节点(${x.map(h=>`"${h.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):s.forEach(h=>{r(h.target,p,E,x)})};return r(f.id,[],[],[]),t},nt=l=>{const o=[],t=l.filter(_=>_.type===b.DATA_SOURCE),f=l.filter(_=>_.type===b.SMALL_MODEL);return f.length>0&&t.length>1&&f.forEach(_=>{o.push({nodeId:_.id,message:`小模型节点"${_.data.label||_.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},at=(l,o)=>{const t=[];return l.filter(_=>_.type===b.DATA_SOURCE).forEach(_=>{const r=o.filter(y=>y.source===_.id);if(r.length>1){const y=r.map(F=>F.target),L=l.filter(F=>y.includes(F.id)).filter(F=>F.type===b.SMALL_MODEL);if(L.length>0){const F=L.map(D=>`"${D.data.label||D.data.modelName}"`).join("、");t.push(`数据源节点"${_.data.label}"开启了多分支,不能包含小模型节点(${F})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},lt=(l,o)=>{const t=[],f=[b.TARGET_COUNT,b.TIMER_TARGET],_={[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时"};return l.filter(y=>y.type===b.SMALL_MODEL).forEach(y=>{o.filter(L=>L.source===y.id).forEach(L=>{const F=l.find(D=>D.id===L.target);if(F&&f.includes(F.type)){const D=_[F.type]||F.type;t.push(`小模型节点"${y.data.label||y.data.modelName}"不能直接连接${D}节点"${F.data.label}",请先连接检测目标节点`)}})}),t},rt=(l,o)=>{const t=[],f=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION],_={[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.FACE_RECOGNITION]:"人脸识别"};return l.filter(y=>f.includes(y.type)).forEach(y=>{const k=o.filter(D=>D.source===y.id),L=f.filter(D=>D!==y.type).concat(b.END),F=y.data.label||_[y.type];k.forEach(D=>{const p=l.find(E=>E.id===D.target);p&&!L.includes(p.type)&&t.push(`${F}节点"${F}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${p.data.label||p.type}"节点`)}),k.length===0&&t.push(`${F}节点"${F}"必须连接到其他辅助节点或结束节点`)}),t},Fe=l=>{const o=new Map;return l.forEach(t=>o.set(t.id,t)),o},pe=(l,o,t)=>(l[o]||[]).map(f=>t.get(f)).filter(Boolean),qe=(l,o)=>{const t={},f=new Set(l.filter(r=>r.type==="group").map(r=>r.id));return[...o].sort((r,y)=>{const k=r.data?.branchOrder??1/0,L=y.data?.branchOrder??1/0;return k-L}).forEach(r=>{if(f.has(r.source)&&f.has(r.target))return;let y=r.source,k=r.target;if(f.has(y)){const L=o.find(F=>F.target===y&&!f.has(F.source));if(!L)return;y=L.source}if(f.has(k)){const L=o.find(F=>F.source===k&&!f.has(F.target));if(!L)return;k=L.target}t[y]||(t[y]=[]),t[y].includes(k)||t[y].push(k)}),t},Ge=(l,o)=>{const t=[...o.values()].find(y=>y.type===b.START);if(!t)return[];const f=new Set,_=[],r=y=>{if(f.has(y))return;f.add(y);const k=o.get(y);if(!k)return;k.type!==b.START&&k.type!==b.END&&k.type!=="group"&&_.push(k),(l[y]||[]).forEach(F=>r(F))};return r(t.id),_},st=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ne=(l,o,t,f)=>{const _=l.nodes.findIndex(y=>y.toolTitle===o);if(_===-1)return;const r=l.nodes[_];r.arguments?.[t]&&(l[f]=r.arguments[t]),l.nodes=l.nodes.filter((y,k)=>k!==_),l.nodes.forEach((y,k)=>{y.sortOrder=k+1})},it=l=>{const o=l.alertConditions||[];return{targetCount:{logic:l.conditionRelation||"AND",rules:o.map(f=>({op:f.operator,value:f.value}))}}},ct=l=>{const o={op:">",value:l.duration??30,unit:"seconds"};if(l.hit_rate_enabled&&l.hit_rate_threshold!==void 0){const f={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:f[l.hit_rate_operator||"gte"]||">=",value:l.hit_rate_threshold}}const t=l.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const f=t.operator||"gt",_={gt:">",eq:"=",lt:"<"};o.overlap={op:_[f]||">",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}},dt={[b.TARGET_COUNT]:it,[b.TIMER_TARGET]:ct},ye=(l,o)=>{if(!l)return{};const t=dt[o];if(t)return t(l);const f={...l};return st.forEach(_=>{delete f[_]}),Object.keys(f).forEach(_=>{const r=f[_];(r==null||r==="")&&delete f[_]}),o===b.FACE_RECOGNITION&&f.repositoryId!==void 0&&(Array.isArray(f.repositoryId)||(f.repositoryId=[f.repositoryId]),f.repositoryId.length===0&&delete f.repositoryId),f},mt=l=>{switch(l.type){case b.DETECTION_TARGET:return l.data.targetId||"";case b.CLASSIFICATION_MODEL:return"cls";case b.OCR:return"ocr";case b.LICENSE_PLATE:return"license_plate";case b.SMALL_MODEL:return l.data.title||l.data.modelName||"";case b.TARGET_COUNT:return"target_count";case b.TIMER_TARGET:return"timer_target";case b.FACE_RECOGNITION:return"face";default:return l.data.label||""}},pt=(l,o,t,f,_=null)=>{const r={toolTitle:mt(l),nodeName:l.data.label||l.data.targetName||"",sortOrder:o,arguments:ye(_??l.data.arguments,l.type)};if(l.data.enableBranch&&l.data.branchLogic&&(r.branchLogic=l.data.branchLogic),t){const y=f.find(k=>k.source===t&&k.target===l.id);y?.data?.branchOrder!==void 0&&y?.data?.branchOrder!==null&&(r.branchOrder=y.data.branchOrder)}return r},He=(l,o,t,f,_,r=null,y=[])=>{const k=[],L=Array.isArray(l)?[...l]:[l],F=new Set;let D=1;for(;L.length>0;){const p=[...L];L.length=0;const E=[];p.forEach(x=>{if(F.has(x))return;F.add(x);const s=f.get(x);!s||s.type===b.END||s.type===b.START||s.type===b.DATA_SOURCE||((t[x]||[]).forEach(a=>{const w=f.get(a);w&&w.type!==b.END&&L.push(a)}),y.includes(s.type))||E.push(s)}),E.length>0&&(E.forEach(x=>{const s=r?.(x.id)??null,h=pt(x,D,o,_,s);E.length>1&&(h.nodeLogic="or"),k.push(h)}),D++)}return k},ut=()=>{const l=ae(),o=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",he.CREATE);const t=e.inject("editorConfig",null),f=e.computed(()=>$e(l.nodes,l.edges,o)),_=(c,d,i,N)=>{if(i){const g=pe(c,i.id,d).find(V=>V.type===b.SMALL_MODEL);if(g)return g}return N.find(g=>g.type===b.SMALL_MODEL)||null},r=(c,d,i)=>{const g=pe(d,c.id,i).find(M=>M.type===b.SMALL_MODEL);return g?pe(d,g.id,i).filter(M=>M.type!==b.END&&M.type!==b.START&&M.type!==b.DATA_SOURCE).length>0?ce.SMALL_MODEL_BRANCH:ce.SMALL_MODEL:ce.IMAGE_BRANCH},y=(c,d,i,N,g)=>{if(d===ce.SMALL_MODEL||d===ce.SMALL_MODEL_BRANCH){const M=_(N,g,i,c);return M?{toolTitle:M.data.title||M.data.modelName||"",toolType:"small",arguments:ye(M.data.arguments,b.SMALL_MODEL)}:null}const V=c.find(M=>M.type===b.DETECTION_TARGET);return V?{toolTitle:V.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:ye(V.data.arguments,b.DETECTION_TARGET)}:null},k=()=>{const c=l.nodes.find(N=>N.type===b.END);if(!c||!c.data.arguments)return{};const d=c.data.arguments,i={};return d.reportFrequency==="interval"&&d.reportInterval&&(i.interval={value:d.reportInterval}),d.enableDeduplication&&d.similarityThreshold!==void 0&&(i.dedup={value:d.similarityThreshold}),i},L=c=>{if(c.length<=1)return;const d=c.map(N=>N.sortOrder);if(new Set(d).size!==d.length){const N=d.filter((g,V)=>d.indexOf(g)!==V);throw new Error(`分支执行顺序存在重复:${[...new Set(N)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},F=(c,d,i,N,g)=>{let V=[],M;if(c===ce.IMAGE_BRANCH)d&&(V=pe(N,d.id,g).filter(z=>z.type!==b.END)),M=d?.id||i.find(z=>z.type===b.DATA_SOURCE)?.id;else if(c===ce.SMALL_MODEL_BRANCH){const z=_(N,g,d,i);z&&(V=pe(N,z.id,g).filter(q=>q.type!==b.END),M=z.id)}return{branchStartNodes:V,sourceNodeId:M}},D=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]),p=(c,d,i)=>{const N=new Set,g=[],V=M=>{if(N.has(M))return;N.add(M);const z=i.get(M);if(!z||z.type===b.END)return;D.has(z.type)&&g.push(z),(d[M]||[]).forEach(G=>V(G))};return V(c),g.length>0?g[g.length-1]:null},E=(c,d,i,N,g)=>{const V=`分支${g+1}`,M=p(d,i,N);if(!M)return c?.data?.nodeName||V;if(M.type===b.DETECTION_TARGET&&M.data?.targetId==="other"){const q=M.data?.arguments?.object;if(Array.isArray(q)&&q.length>0){const G=q.join(",");return G.length>32?G.slice(0,32):G}}if(M.type===b.CLASSIFICATION_MODEL){const q=M.data?.arguments?.modelName||M.data?.label;if(!q)return V;const G=M.data?.arguments?.resultNegate?"(取反)":"";return q+G}return M.data?.label||M.data?.targetName||V},x=(c,d,i,N,g,V)=>{const{branchStartNodes:M,sourceNodeId:z}=F(d,i,c,N,g);if(M.length===0)return[];const q=[];return M.forEach((G,P)=>{const Y=He([G.id],z,N,g,V);if(Y.length===0)return;const u=z?V.find(n=>n.source===z&&n.target===G.id):null,O=u?.data||{},H=O.branchOrder!==void 0&&O.branchOrder!==null?O.branchOrder:P+1,U={branchName:O.branchName||E(G,G.id,N,g,P),sortOrder:H,nodes:Y};u?.sourceHandle&&(U.sourceHandle=u.sourceHandle),Ne(U,"target_count","targetCount","targetCount"),Ne(U,"timer_target","duration","duration"),O.timeWindowSeconds!==void 0&&O.timeWindowSeconds!==null&&(U.timeWindowSeconds=O.timeWindowSeconds),O.branchDescription&&(U.description=O.branchDescription),q.push(U)}),L(q),q},s=()=>{const c=f.value;if(c.errors.length>0){const d=c.errors.map(i=>typeof i=="object"?i.message:i);return K.ElMessage.error(`验证失败: ${d.join(", ")}`),!1}return c.warnings.length>0&&K.ElMessage.warning(`警告: ${c.warnings.join(", ")}`),!0},h=()=>{const c=l.nodes,d=l.edges,i=Fe(c),N=qe(c,d),g=Ge(N,i),V=[...i.values()].find(M=>M.type===b.START);return{allNodes:c,edges:d,nodeMap:i,adj:N,orderedNodes:g,startNode:V}},a=c=>{const d={ruleName:c?.data?.algorithmName||"",description:"",webhookUrl:""},i=k();Object.keys(i).length>0&&(d.extraConfig=i);const g=(t?.value??t)?.platform;return d.attach=g?{platform:g}:{},d},w=(c,d)=>{const i=c.filter(N=>N.type===b.DATA_SOURCE);if(i.length===0){const N=d.find(g=>g.type===b.DATA_SOURCE);N&&i.push(N)}return i},R=c=>c?.data?.enableImageSequence||c?.data?.arguments?.enableImageSequence||!1?"order":c?.data?.enableBranch&&c.data.branchLogic||"and",m=(c,d,i,N)=>{const{orderedNodes:g,adj:V,nodeMap:M,edges:z}=d,q=r(c,V,M),G=!!c.data.arguments?.needCooperativeDetection,P=z.find(U=>U.target===c.id),Y=P?.data?.branchOrder!==void 0&&P?.data?.branchOrder!==null?P.data.branchOrder:N+1,u={sourceGroupId:null,name:c.data.label||"数据源",sort:Y,synEnabled:G};if(G&&(u.windowSeconds=c.data.arguments?.windowSeconds||5),q===ce.SMALL_MODEL){const U=y(g,q,c,V,M);return U&&(u.streamConfig=U),u.logic="and",u.children=[],u}if(q===ce.SMALL_MODEL_BRANCH){const U=y(g,q,c,V,M);U&&(u.streamConfig=U)}u.logic=R(c);const O=x(g,q,c,V,M,z),H=i.length;return u.children=O.map((U,n)=>({name:U.branchName,branchRefs:[H+n]})),i.push(...O),u},$=(c,d)=>{const N={groupLogic:c?.data?.enableBranch&&c.data.branchLogic||"and",sourceGroups:d};return d.length>=2&&(N.groupWindowSeconds=c.data.groupWindowSeconds),N},B=()=>{if(!s())return null;try{const c=h(),d=a(c.startNode),i=w(c.orderedNodes,c.allNodes),N=[],g=i.map((V,M)=>m(V,c,N,M));return d.ruleSchema=$(c.startNode,g),N.length>0&&(d.branches=N),d}catch(c){return K.ElMessage.error(c.message||"导出失败"),null}};return{validation:f,exportToJSON:B,copyToClipboard:()=>{try{const c=B();if(!c)return;const d=JSON.stringify(c,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(d).then(()=>{K.ElMessage.success("已复制到剪贴板")}).catch(()=>{K.ElMessage.error("复制失败")});else{const i=document.createElement("textarea");i.value=d,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),K.ElMessage.success("已复制到剪贴板")}}catch(c){console.error("复制JSON失败:",c),K.ElMessage.error(`复制失败: ${c.message}`)}},downloadJSON:()=>{const c=B();if(!c)return;const d=JSON.stringify(c,null,2),i=new Blob([d],{type:"application/json"}),N=URL.createObjectURL(i),g=document.createElement("a");g.href=N,g.download=`workflow_${Date.now()}.json`,g.click(),URL.revokeObjectURL(N),K.ElMessage.success("导出成功")}}},ft=()=>{const l=ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",he.CREATE);const o=e.inject("editorConfig",null),t=e.inject("taskModeConfig",null),f=e.inject("echoTaskData",null),_=e.computed(()=>({errors:[],warnings:[]})),r=(s,h)=>{const a={},w=h?.data?.arguments??{};w.reportFrequency==="interval"&&w.reportInterval&&(a.interval={value:w.reportInterval}),w.enableDeduplication&&w.similarityThreshold!==void 0&&(a.dedup={value:w.similarityThreshold}),l.nodes.filter($=>$.type===b.DATA_SOURCE).length>=2&&s?.data?.groupWindowSeconds!==void 0&&(a.groupWindowSeconds=s.data.groupWindowSeconds),a.enableVideo=!!s?.data?.enableAlertVideo;const m=s?.data?.schedule;return Array.isArray(m)&&m.length>0?a.schedule=m:a.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],a},y=(s,h,a,w,R="image")=>{const m=pe(h,s.id,a).find($=>$.type===b.SMALL_MODEL);if(m){const $=s.data?.arguments??{};return{toolTitle:m.data.title||m.data.modelName||"",toolType:"small",arguments:ye(m.data.arguments,b.SMALL_MODEL),decoder:k($,!0)}}if(R==="stream"){const $=w.find(A=>A.type===b.DETECTION_TARGET);if(!$)return null;const B=s.data?.arguments??{};return{toolTitle:$.data.targetId||"",toolType:"stream",arguments:ye($.data.arguments,b.DETECTION_TARGET),decoder:k(B,!1)}}return null},k=(s,h)=>{const a=s.mode??(h?3:0),w=s.interval??0,R=s.sw_decoding??(h?"CPU":"GPU");let m=0,$=0;return h?a===3?(m=0,$=0):a===2?(m=1,$=0):a===1&&(m=0,$=w):a===0?(m=0,$=w*25):a===1?(m=0,$=w):a===2&&(m=1,$=0),{sw_decoding:R==="CPU",mode:m,interval:$}},L=(s,h,a,w,R=null)=>{let m=s.id,$=pe(h,s.id,a).filter(T=>T.type!==b.END&&T.type!==b.START);$.length===1&&$[0].type===b.SMALL_MODEL&&(m=$[0].id,$=pe(h,m,a).filter(T=>T.type!==b.END&&T.type!==b.START));const B=$;if(B.length===0)return[];const A=R?T=>l.getTaskSourceArguments(s.id,R,T):null;return B.map((T,c)=>{const d=He([T.id],m,h,a,w,A,[b.SMALL_MODEL]),i=w.find(z=>z.source===m&&z.target===T.id),N=i?.data??{},g=N.branchOrder??c+1,V=N.branchId??null,M={branchId:V,id:V,branchName:N.branchName||T.data?.label||`分支${c+1}`,sortOrder:g,nodes:d};return i?.sourceHandle&&(M.sourceHandle=i.sourceHandle),N.timeWindowSeconds!==void 0&&N.timeWindowSeconds!==null&&(M.timeWindowSeconds=N.timeWindowSeconds),N.branchDescription&&(M.description=N.branchDescription),Ne(M,"target_count","targetCount","targetCount"),Ne(M,"timer_target","duration","duration"),M})},F=(s,h,a,w,R=null,m=null,$=null,B=1,A=!1,T=!1)=>{const c=R??s.deviceType??"",d=c==="1400"||c==="2",i=d?"1400":"camera",N=h==="stream"?2:1,g=d&&m!==null?m==="device"?1:2:s.detectionType??2,M=(f?.value??f)?.graph?.sources??[],z=String(s.sourceId??s.id??""),G=M.find(Y=>String(Y.sourceId)===z)?.attach??{},P={deviceType:i,detectionType:g,dataSourceType:N,sourceOrder:a,timeTemplateId:G.timeTemplateId??"",timeTemplateName:G.timeTemplateName??"",platform:w?.platform??"TAI"};if(!d){const Y=$?.mode??0;Y===3?(P.frameExtractionType=0,P.frameInterval=0):Y===2?(P.frameExtractionType=T?1:3,P.frameInterval=0):(P.frameExtractionType=Y+1,P.frameInterval=$?.interval??30);const u=$?.sw_decoding??"CPU";P.frameExtractionSourceType=u==="GPU"?2:1,B===1&&h==="image"&&!A&&!!$?.enablePatrol?P.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,$?.patrolGroupSize??1)),pollingInterval:"0"}:P.pollingConfig={enablePolling:0},P.thirdId=s.thirdId??""}return P},D=(s,h,a,w,R,m,$)=>{const B=t?.value??t,A=B?.datasource?.getDevices?.(s.id)??[],T=s.data?.sourceGroupId??null,c=!!s.data?.arguments?.needCooperativeDetection,d=c?s.data?.arguments?.windowSeconds??5:void 0,i=h?.data?.streamType??"image",N=pe(a,s.id,w).some(u=>u.type===b.SMALL_MODEL),g=N?"small":i,V=y(s,a,w,$,i),M=s.data?.arguments?.deviceType??null,z=s.data?.arguments?.detectionMode??null,q=s.data?.arguments??null,G=l.getDataSourceCount();if(A.length>0)return A.map((u,O)=>{const H=String(u.sourceId??u.id??""),U=L(s,a,w,R,H),n={sourceId:u.sourceId??u.id??"",sourceName:u.sourceName??u.name??"",sourceType:g,sourceGroupId:T,areas:u.area??u.areas??[],branches:U,attach:F(u,i,O,B,M,z,q,G,c,N),synEnabled:c,...d!==void 0&&{windowSeconds:d}};return V&&(n.streamConfig=V,n.streamUrl="rtsp"),n});const P=L(s,a,w,R),Y={sourceId:"",sourceName:s.data?.label??"数据源",sourceType:g,sourceGroupId:T,areas:[],branches:P,attach:F({},i,0,B,M,z,q,G,c,N),synEnabled:c};return V&&(Y.streamConfig=V,Y.streamUrl="rtsp"),[Y]},p=()=>{try{const s=l.nodes,h=l.edges,a=Fe(s),w=qe(s,h),R=[...a.values()].find(d=>d.type===b.START),m=[...a.values()].find(d=>d.type===b.END),$=o?.value??o,B=Ge(w,a);let A=B.filter(d=>d.type===b.DATA_SOURCE);A.length===0&&(A=s.filter(d=>d.type===b.DATA_SOURCE));const T=A.flatMap((d,i)=>D(d,R,w,a,h,i,B)),c={workflowName:R?.data?.taskName??"",ruleId:$?.ruleId??"",sources:T,extraConfig:r(R,m),description:""};if(($?.platform??"TAI")==="THIRD"){const i=A[0]?.data?.arguments??{},N=i.mode??0,g=i.interval??0;let V,M,z;return N===0?(V="time",M=g,z=0):(V="frame",M=0,N===3?z=0:N===2?z=-1:z=g),{name:c.workflowName,type:"simple",plan:c.extraConfig.schedule??[],inferStrategy:V,timeInterval:M,frameInterval:z,mps:c.extraConfig.enableVideo??!1,graph:c}}return c}catch(s){return K.ElMessage.error(s.message||"导出失败"),null}};return{validation:_,exportToJSON:p,copyToClipboard:()=>{const s=p();if(!s)return;const h=JSON.stringify(s,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(h).then(()=>K.ElMessage.success("已复制到剪贴板")).catch(()=>K.ElMessage.error("复制失败"));else{const a=document.createElement("textarea");a.value=h,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a),K.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const s=p();if(!s)return;const h=JSON.stringify(s,null,2),a=new Blob([h],{type:"application/json"}),w=URL.createObjectURL(a),R=document.createElement("a");R.href=w,R.download=`task_workflow_${Date.now()}.json`,R.click(),URL.revokeObjectURL(w),K.ElMessage.success("导出成功")}}},gt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?ft():ut(),ht=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 yt(){const l=ae(),o=e.inject("editorMode",ee.ALGORITHM),t=e.inject("taskModeConfig",null),f=y=>{const{type:k,data:L}=y,F=L.arguments||{},D=[];switch(k){case b.START:if(o===ee.TASK)if(L.taskName?.trim()||D.push("任务名称"),!L.executionTime?.trim())D.push("任务执行时间");else{const p=ht(L.executionTime);(!p||!Array.isArray(p.plan)||p.plan.length===0)&&D.push("任务执行时间(计划为空)")}else L.algorithmName?.trim()||D.push("算法名称");break;case b.SMALL_MODEL:L.modelId||D.push("模型选择");break;case b.DETECTION_TARGET:L.targetId||D.push("检测目标选择");break;case b.CLASSIFICATION_MODEL:F.modelId||D.push("分类模型选择");break;case b.DATA_SOURCE:o===ee.TASK&&((t?.value??t)?.datasource?.getDevices?.(y.id)??[]).length===0&&D.push("设备选择");break;case b.TARGET_COUNT:break;case b.TIMER_TARGET:(!F.duration||F.duration<1)&&D.push("持续时间");break}return D},_=y=>{const k=l.nodes.find(F=>F.id===y.source);if(!k)return[];const L=[];return k.type===b.DATA_SOURCE&&k.data?.enableImageSequence===!0&&y.sourceHandle!=="first-frame"&&(!y.data?.timeWindowSeconds||y.data.timeWindowSeconds<1)&&L.push("后续检测帧的持续时间"),L};return{runValidation:()=>{const{nodes:y,edges:k}=l;l.clearInvalidIds();const L=$e(y,k,o),F=L.errors,D=[],p=[],E=[];y.filter(R=>R.type!=="group").forEach(R=>{const m=f(R);m.length>0&&(D.push(R.id),E.push(`节点"${R.data.label}"缺少必填参数:${m.join("、")}`))}),k.forEach(R=>{const m=_(R);m.length>0&&(p.push(R.id),E.push(`分支"${R.data?.branchName||"未命名"}"缺少:${m.join("、")}`))}),F.forEach(R=>{typeof R=="object"&&(R.nodeId&&D.push(R.nodeId),R.edgeId&&p.push(R.edgeId))}),(D.length>0||p.length>0)&&(l.setInvalidIds(D,p),setTimeout(()=>{l.clearInvalidIds()},5e3));const s=F.map(R=>typeof R=="object"?R.message:R),h=L.warnings.map(R=>typeof R=="object"?R.message:R),a=[...s.map(R=>({msg:R,type:"error"})),...E.map(R=>({msg:R,type:"warning"})),...h.map(R=>({msg:R,type:"warning"}))],w=s.length===0&&E.length===0;if(w&&h.length===0)K.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(a.length>0){const R=a[0];K.ElMessage[R.type](R.msg)}return w}}}const te=(l,o)=>{const t=l.__vccOpts||l;for(const[f,_]of o)t[f]=_;return t},_t={key:0},Nt={class:"node-list"},Ct={class:"node-list"},kt={class:"node-list"},bt={class:"node-list"},xt=te({__name:"NodeToolbox",setup(l){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),f=(_,r)=>{_.dataTransfer&&(_.dataTransfer.setData("application/vueflow",r),_.dataTransfer.effectAllowed="move")};return(_,r)=>{const y=e.resolveComponent("el-icon"),k=e.resolveComponent("VideoPlay"),L=e.resolveComponent("CircleClose"),F=e.resolveComponent("el-collapse-item"),D=e.resolveComponent("FolderOpened"),p=e.resolveComponent("Cpu"),E=e.resolveComponent("View"),x=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:r[1]||(r[1]=s=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",_t,"节点工具箱")):(e.openBlock(),e.createBlock(y,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(y,{key:2,class:"toggle-btn",onClick:r[0]||(r[0]=e.withModifiers(s=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(x,{key:0,modelValue:t.value,"onUpdate:modelValue":r[13]||(r[13]=s=>t.value=s),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(F,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",Nt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[2]||(r[2]=s=>f(s,"start"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(k)]),_:1}),r[14]||(r[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[3]||(r[3]=s=>f(s,"end"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(L)]),_:1}),r[15]||(r[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(F,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",Ct,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[4]||(r[4]=s=>f(s,"dataSource"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),r[16]||(r[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[5]||(r[5]=s=>f(s,"smallModel"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(p)]),_:1}),r[17]||(r[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[6]||(r[6]=s=>f(s,"detectionTarget"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),r[18]||(r[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[7]||(r[7]=s=>f(s,"classificationModel"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),r[19]||(r[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(F,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",kt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[8]||(r[8]=s=>f(s,"targetCount"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),r[20]||(r[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[9]||(r[9]=s=>f(s,"timerTarget"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),r[21]||(r[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(F,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[10]||(r[10]=s=>f(s,"ocr"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),r[22]||(r[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[11]||(r[11]=s=>f(s,"licensePlate"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),r[23]||(r[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:r[12]||(r[12]=s=>f(s,"faceRecognition"))},[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),r[24]||(r[24]=e.createElementVNode("span",null,"人脸识别",-1))],32)])]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-fac9714d"]]);class xe{static backendToFrontend(o){const{id:t,title:f,name:_,inputSchema:r,extraConfig:y}=o,k={id:t,title:f,label:_,type:"DETECTION_TARGET",inputSchema:r,extraConfig:y,data:{targetId:f,targetName:_,description:_,areas:r?.properties?.areas?.default||[],threshold:r?.properties?.threshold?.default||.5,targetWidth:r?.properties?.targetWidth?.default||20,targetHeight:r?.properties?.targetHeight?.default||20,postmodel:r?.properties?.postmodel?.default||"ClipVit",expandRect:r?.properties?.expandRect?.default!==void 0?r.properties.expandRect.default:!1,topScale:r?.properties?.topScale?.default||1.6,bottomScale:r?.properties?.bottomScale?.default||1.6,leftScale:r?.properties?.leftScale?.default||1.6,rightScale:r?.properties?.rightScale?.default||1.6,enableStructure:y?.showStruct!==void 0?!1:void 0}};return Object.keys(k.data).forEach(L=>{k.data[L]===void 0&&delete k.data[L]}),k}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Pe=l=>ve[l]||l,fe=(l,o,t={})=>({id:de(l),type:l,position:{...o},data:{label:t.label||Pe(l),...t}}),_e=(l,o,t={})=>{const{sourceHandle:f,..._}=t,r={id:`e_${l}_${o}`,source:l,target:o};return f&&(r.sourceHandle=f),Object.keys(_).length>0&&(r.data=_),r},Et=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(f=>({operator:f.op,value:f.value}))}},wt=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}},Tt=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},St=()=>({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"]}),Vt=()=>({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:[]}),Bt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,l=>{const o=Math.random()*16|0;return(l==="x"?o:o&3|8).toString(16)}),je=()=>{const l=ae(),o=e.inject("editorConfig",null),t=m=>et[m]||b.DETECTION_TARGET,f=(m,$)=>m?.find(B=>B.id===String($))??m?.[$],_=(m,$)=>m.streamConfig?(m.children||[]).some(T=>(T.branchRefs||[]).some(c=>f($.branches,c)))?ce.SMALL_MODEL_BRANCH:ce.SMALL_MODEL:ce.IMAGE_BRANCH,r=m=>!m||typeof m!="object"?"无效的JSON格式":!m.ruleName&&m.ruleName!==""?"缺少 ruleName 字段":m.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",y=m=>{const $=o?.value??o;return m==="small"?$?.smallModels||[]:m==="detection"?$?.detection||[]:m==="classification"?$?.classification?.models||[]:[]},k=()=>{},L=(m,$)=>{m.modelName=$||"",m.title=$||"",m.modelId=$||null;const A=y("small").find(T=>T.title===$);A&&(m.input_schema=A.inputSchema||A.input_schema||{},m.modelId=A.id||A.title,m.modelName=A.name||$,m.modelType=A.type,m.supportDirectAlert=A.supportDirectAlert||!1,m.extraConfig=A.extraConfig)},F=async(m,$)=>{const B=t(m.toolTitle),A={label:m.nodeName||Pe(B),arguments:m.arguments||{},input_schema:{}};switch(B){case b.DETECTION_TARGET:A.targetId=m.toolTitle,A.targetName=m.nodeName||"检测目标";{const c=y("detection").find(d=>d.title===m.toolTitle);if(c){let i=xe.backendToFrontend(c).inputSchema||{};if(m.toolTitle==="other"){const N={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};i={...i,properties:{...i.properties,...N.properties}}}A.input_schema=i}}break;case b.CLASSIFICATION_MODEL:A.modelName=m.nodeName||"分类模型";break;case b.SMALL_MODEL:L(A,m.toolTitle);break}return m.branchLogic&&(A.enableBranch=!0,A.branchLogic=m.branchLogic),fe(B,$,A)},D=(m,$,B,A)=>{const T={label:"小模型",input_schema:{},arguments:m.arguments||{}};return L(T,m.toolTitle),$===ce.SMALL_MODEL_BRANCH&&(T.enableBranch=!0,T.branchLogic=B.logic||"and"),fe("smallModel",A,T)},p=async(m,$,B,A,T,c)=>{let d=$,i=A;const N={branchOrder:m.sortOrder??1,branchName:m.branchName||"",branchId:m.id??null};m.sourceHandle&&(N.sourceHandle=m.sourceHandle);const g=m.timeWindowSeconds??m.extraConfig?.timeWindowSeconds;g!==void 0&&(N.timeWindowSeconds=g),m.description&&(N.branchDescription=m.description);const V=[...m.nodes||[]].sort((u,O)=>(u.sortOrder??0)-(O.sortOrder??0)),M=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]);let z=-1;V.forEach((u,O)=>{M.has(t(u.toolTitle))&&(z=O)});const q=V.map(u=>({kind:"regular",data:u})),G=m.targetCount??m.extraConfig?.targetCount,P=m.duration??m.extraConfig?.duration,Y=[];G&&Y.push({kind:"targetCount",data:G}),P&&Y.push({kind:"timerTarget",data:P}),Y.length>0&&q.splice(z+1,0,...Y);for(let u=0;u<q.length;u++){const O=q[u];let H;if(O.kind==="regular")H=await F(O.data,{x:i,y:B});else if(O.kind==="targetCount"){const U=Et(O.data);H=fe("targetCount",{x:i,y:B},{label:"目标计数",arguments:U,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const U=wt(O.data);H=fe("timerTarget",{x:i,y:B},{label:"目标计时",arguments:U,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"}}})}T.push(H),c.push(_e(d,H.id,u===0?N:void 0)),d=H.id,i+=ie.H_GAP}return{lastNodeId:d,endX:i}},E=m=>{const $=m.ruleSchema.sourceGroups||[],B=m.ruleSchema.groupLogic||"and",A=$.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:m.ruleName||"",enableBranch:A?!0:B!=="and",branchLogic:B,groupWindowSeconds:m.ruleSchema.groupWindowSeconds??null})},x=m=>{const $=Tt(m.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:St(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...$}})},s=(m,$)=>[...m||[]].sort((B,A)=>(B.sort??0)-(A.sort??0)).map(B=>{const A=_(B,$),T=[];return(B.children||[]).forEach(c=>{(c.branchRefs||[]).forEach(d=>{const i=f($.branches,d);i&&T.push(i)})}),T.sort((c,d)=>(c.sortOrder??0)-(d.sortOrder??0)),{sg:B,mode:A,refBranches:T}}),h=m=>{const B=(m.reduce((A,T)=>A+Math.max(T.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-B/2},a=async(m,$,B,A,T,c)=>{const{sg:d,mode:i,refBranches:N}=m,g=Math.max(N.length,1),V=B+(g-1)*ie.V_GAP/2;let M=ie.START_X+ie.H_GAP,z=ie.START_X;const q=d.logic==="order",G=fe("dataSource",{x:M,y:V},{label:d.name||"数据源",sourceGroupId:d.sourceGroupId??null,enableImageSequence:q,input_schema:Vt(),arguments:{needCooperativeDetection:!!d.synEnabled,windowSeconds:d.windowSeconds||5,enableImageSequence:q},enableBranch:!0,branchLogic:q?"order":d.logic||"and"});A.push(G),T.push(_e($.id,G.id,{branchOrder:d.sort??null,branchName:d.name||""})),q&&N.forEach((u,O)=>{u.sourceHandle||(u.sourceHandle=O===0?"first-frame":Bt())});const P=q?{dataSourceNode:G,refBranches:N}:null;let Y=G.id;if(i===ce.SMALL_MODEL||i===ce.SMALL_MODEL_BRANCH){M+=ie.H_GAP;const u=D(d.streamConfig,i,d,{x:M,y:V});A.push(u),T.push(_e(G.id,u.id)),Y=u.id}if(N.length>0)for(let u=0;u<N.length;u++){const O=B+u*ie.V_GAP,{lastNodeId:H,endX:U}=await p(N[u],Y,O,M+ie.H_GAP,A,T);T.push(_e(H,c.id)),U>z&&(z=U)}else{T.push(_e(Y,c.id));const u=M+ie.H_GAP;u>z&&(z=u)}return{branchY:B+g*ie.V_GAP,maxX:z,imageSequenceInfo:P}},w=m=>{for(const{dataSourceNode:$,refBranches:B}of m){const A=B.filter(T=>T.sourceHandle&&T.sourceHandle!=="first-frame");A.length>0&&($.data.subsequentFrames=A.map((T,c)=>({id:c===0?"default-subsequent":`subsequent-${Date.now()}-${c}`,label:c===0?"后续帧检测":`后续帧检测${c+1}`,handleId:T.sourceHandle})))}};return{importFromJSON:async m=>{const $=r(m);if($)return K.ElMessage.error($),!1;try{k();const B=[],A=[],T=E(m),c=x(m);B.push(T);const d=s(m.ruleSchema.sourceGroups,m);let i=h(d),N=ie.START_X;const g=[];for(const V of d){const M=await a(V,T,i,B,A,c);i=M.branchY,M.maxX>N&&(N=M.maxX),M.imageSequenceInfo&&g.push(M.imageSequenceInfo)}return c.position.x=N+ie.H_GAP,B.push(c),w(g),l.loadWorkflow(B,A),K.ElMessage.success("导入成功"),!0}catch(B){return K.ElMessage.error("导入失败: "+(B.message||"未知错误")),!1}},validateImportJSON:r}},At=()=>{const l=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:f,validateImportJSON:_}=je(),r=(x,s)=>{const h=x.mode??0,a=x.interval??0,w=x.sw_decoding===!1?"GPU":"CPU";let R,m;return s?h===1?(R=2,m=0):h===0&&a===0?(R=3,m=0):(R=1,m=a):h===1?(R=2,m=0):a===0?(R=0,m=30):(R=0,m=a),{mode:R,interval:m,sw_decoding:w}},y=(x,s)=>{const h=x.frameExtractionType??1,a=x.frameInterval??0,R=(x.frameExtractionSourceType??1)===2?"GPU":"CPU";let m,$;return h===0?(m=3,$=0):h===1&&a===0?(m=s?2:0,$=30):h===1?(m=0,$=a):h===2?(m=1,$=a):h===3?(m=2,$=0):(m=s?3:0,$=30),{mode:m,interval:$,sw_decoding:R}},k=x=>x===1?"device":"platform",L=x=>!x||x.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(x.pollingAmount??1)},F=(x,s,h)=>{if(s){const a=x.find(w=>w.sourceGroupId===s);if(a)return a}return x[h]??null},D=(x,s)=>{if(!x?.branches)return null;for(const h of x.branches){const a=h.nodes?.find(w=>w.toolTitle===s);if(a?.arguments)return{...a.arguments}}return null},p=x=>{if(!Array.isArray(x)||x.length===0)return{timeZone:"",planType:0};const s=x.map(a=>({dayType:Number(a.dayType??0),timePeriod:(a.timePeriod??[]).map(w=>({startTime:w.startTime,endTime:w.endTime}))})),h=s.some(a=>a.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:s}),planType:h}};return{importFromJSON:async x=>{const s=_(x);if(s)return K.ElMessage.error(s),!1;if(!await f(x))return!1;const a=l?.value??l;if(!a||typeof a!="object"||Object.keys(a).length===0)return!0;const w=a.graph??{},R=w.sources??[],m=w.extraConfig??{},$=t.nodes.find(d=>d.type===b.START);if($){const d=a.name??w.workflowName??"",i=!!m.enableVideo,N=m.schedule??[],{timeZone:g,planType:V}=p(N);t.updateNodeData($.id,{taskName:d,enableAlertVideo:i,schedule:N,timeZone:g,planType:V,...g?{executionTime:g}:{}})}const B=t.nodes.filter(d=>d.type===b.DATA_SOURCE),A=t.nodes.some(d=>d.type===b.SMALL_MODEL);return B.forEach((d,i)=>{const N=d.data?.sourceGroupId??null,g=F(R,N,i);if(!g)return;const V=g.attach??{},M=g.streamConfig?.decoder??null,z=V.deviceType==="1400"?"1400":"camera",q=z==="camera"?M?r(M,A):y(V,A):{},G=z==="camera"?L(V.pollingConfig):{},P=z==="1400"?{detectionMode:k(V.detectionType)}:{},Y=d.data?.arguments??{};t.updateNodeData(d.id,{arguments:{...Y,deviceType:z,...q,...G,...P}});const u=o?.value??o;if(u?.datasource?.setDevices){const H=(N?R.filter(U=>U.sourceGroupId===N):[g]).map(U=>({sourceId:U.sourceId??"",sourceName:U.sourceName??"",thirdId:U.attach?.thirdId??"",area:U.areas??[]}));u.datasource.setDevices(d.id,H)}}),t.nodes.filter(d=>d.type===b.DETECTION_TARGET).forEach(d=>{const i=new Set,N=[d.id];let g=null;for(;N.length&&!g;){const u=N.shift();if(i.has(u))continue;i.add(u);const O=t.edges.filter(H=>H.target===u);for(const H of O){const U=t.nodes.find(n=>n.id===H.source);if(U){if(U.type===b.DATA_SOURCE){g=U.id;break}N.push(U.id)}}}if(!g)return;const M=(o?.value??o)?.datasource?.getDevices?.(g)??[];if(M.length<=1)return;const z=d.data?.targetId;if(!z)return;const q=M.map(u=>{const O=String(u.sourceId??u.id??""),H=R.find(U=>String(U.sourceId)===O);if(!H?.branches)return{deviceId:O,args:null};for(const U of H.branches){const n=U.nodes?.find(C=>C.toolTitle===z);if(n?.arguments)return{deviceId:O,args:{...n.arguments}}}return{deviceId:O,args:null}}),G=q.filter(u=>u.args!==null);if(G.length===0)return;const P=JSON.stringify(G[0].args);if(G.some(u=>JSON.stringify(u.args)!==P)){const u=d.data?.arguments??{};t.updateNodeData(d.id,{arguments:{...u,configMode:"perDevice"}}),q.forEach(({deviceId:O,args:H})=>{H&&t.setTaskSourceArguments(g,O,d.id,H)})}}),t.nodes.filter(d=>d.type===b.FACE_RECOGNITION).forEach(d=>{const i=new Set,N=[d.id];let g=null;for(;N.length&&!g;){const Y=N.shift();if(i.has(Y))continue;i.add(Y);const u=t.edges.filter(O=>O.target===Y);for(const O of u){const H=t.nodes.find(U=>U.id===O.source);if(H){if(H.type===b.DATA_SOURCE){g=H.id;break}N.push(H.id)}}}const M=(g?t.nodes.find(Y=>Y.id===g):null)?.data?.sourceGroupId??null,z=B.findIndex(Y=>Y.id===g),q=F(R,M,z>=0?z:0);if(!q)return;const G=D(q,"face");if(!G?.repositoryId)return;const P=d.data?.arguments??{};t.updateNodeData(d.id,{arguments:{...P,repositoryId:Array.isArray(G.repositoryId)?G.repositoryId:[G.repositoryId]}})}),!0},validateImportJSON:_}},Dt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?At():je(),Lt={class:"node-content"},Ot={class:"node-label"},Mt=te({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const f=e.resolveComponent("VideoPlay"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"]),e.createElementVNode("div",Lt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("span",Ot,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),It={class:"node-content"},Rt={class:"node-label"},$t=te({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const f=e.resolveComponent("CircleClose"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",It,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("span",Rt,e.toDisplayString(l.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Ft={class:"node-content"},qt={class:"node-info"},Gt={class:"node-label"},Ht={key:1,class:"sequence-handles"},Pt={class:"handle-item"},jt={class:"handle-label"},zt={key:0,class:"handle-item add-button-item"},Ut=te({__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(),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,D=>{const p=Math.random()*16|0;return(D==="x"?p:p&3|8).toString(16)}),y=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let k=!1;const L=()=>{if(k)return;k=!0;const D=o.data.subsequentFrames||[],p={id:r(),label:`后续帧检测${D.length+1}`,handleId:r()};t.addSubsequentFrame(o.id,p),setTimeout(()=>{k=!1},300)},F=async D=>{const p=o.data.subsequentFrames.find(x=>x.id===D);if(t.edges.some(x=>x.source===o.id&&x.sourceHandle===p.handleId))try{await K.ElMessageBox.confirm(`删除"${p.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,D)};return(D,p)=>{const E=e.resolveComponent("FolderOpened"),x=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(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",Ft,[e.createVNode(x,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",qt,[e.createElementVNode("div",Gt,e.toDisplayString(l.data.label),1)])]),l.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(Z.Handle),{key:0,type:"source",position:e.unref(Z.Position).Right},null,8,["position"])),l.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",Ht,[e.createElementVNode("div",Pt,[p[0]||(p[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,h=>(e.openBlock(),e.createElementBlock("div",{key:h.id,class:"handle-item"},[e.createElementVNode("span",jt,e.toDisplayString(h.label),1),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right,id:h.handleId,class:"handle-right"},null,8,["position","id"]),h.id!=="default-subsequent"&&!_.value?(e.openBlock(),e.createBlock(x,{key:0,class:"delete-icon",onClick:e.withModifiers(a=>F(h.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",zt,[e.createVNode(s,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(L,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Wt={class:"node-content"},Jt={class:"node-info"},Yt={class:"node-label"},Xt={key:0,class:"node-model"},Qt={key:1,class:"node-placeholder"},Kt={key:0,class:"direct-alert-badge"},Zt=te({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const f=e.resolveComponent("Cpu"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",Wt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("div",Jt,[e.createElementVNode("div",Yt,e.toDisplayString(l.data.label),1),l.data.modelName?(e.openBlock(),e.createElementBlock("div",Xt,e.toDisplayString(l.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",Qt,"未选择模型"))])]),l.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",Kt,[e.createVNode(_,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),vt={class:"node-content"},eo={class:"node-info"},to={class:"node-target"},oo={class:"node-params"},no=te({__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||"检测目标",f=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),_=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const r=o.data.arguments.object;if(Array.isArray(r))return r.filter(k=>k&&k.trim()!=="").length}return null});return(r,y)=>{const k=e.resolveComponent("View"),L=e.resolveComponent("el-icon"),F=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",vt,[e.createVNode(L,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(k)]),_:1}),e.createElementVNode("div",eo,[y[1]||(y[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",to,e.toDisplayString(t()),1),e.createElementVNode("div",oo,[_.value?(e.openBlock(),e.createBlock(F,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),f.value?(e.openBlock(),e.createBlock(F,{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(F,{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(F,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...y[0]||(y[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),ao={class:"node-content"},lo={class:"node-info"},ro={class:"node-label"},so={key:0,class:"node-model"},io={key:1,class:"node-placeholder"},co={key:2,class:"node-stats"},mo=te({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return(o,t)=>{const f=e.resolveComponent("Grid"),_=e.resolveComponent("el-icon"),r=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["classification-model-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",ao,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("div",lo,[e.createElementVNode("div",ro,e.toDisplayString(l.data.label),1),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",so,e.toDisplayString(l.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",io,"未选择模型")),l.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",co,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(r,{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(r,{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(r,{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(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),po={class:"node-content"},uo={class:"node-info"},fo={class:"node-label"},go={class:"node-params"},ho=te({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){return ae(),(o,t)=>{const f=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",po,[e.createVNode(f,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",uo,[e.createElementVNode("div",fo,e.toDisplayString(l.data.label),1),e.createElementVNode("div",go,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(_,{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(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),yo={class:"node-content"},_o={class:"node-info"},No={class:"node-label"},Co={class:"node-scope"},ko={class:"node-params"},bo=te({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=ae(),f=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const r=t.nodes.find(y=>y.id===_);return r?r.data.label:"检测范围"};return(_,r)=>{const y=e.resolveComponent("Document"),k=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(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",yo,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(y)]),_:1}),e.createElementVNode("div",_o,[e.createElementVNode("div",No,e.toDisplayString(l.data.label),1),e.createElementVNode("div",Co,e.toDisplayString(f()),1),e.createElementVNode("div",ko,[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(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),xo={class:"node-content"},Eo={class:"node-info"},wo={class:"node-params"},To=te({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},f=e.computed(()=>{const _=o.data.arguments?.alertConditions||[];if(_.length===0)return"";if(_.length===1){const y=_[0];return`数量 ${t[y.operator]||y.operator} ${y.value}`}const r=o.data.arguments?.conditionRelation||"OR";return`${_.length} 个条件(${r})`});return(_,r)=>{const y=e.resolveComponent("el-icon"),k=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",xo,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",Eo,[r[0]||(r[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",wo,[f.value?(e.openBlock(),e.createBlock(k,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),So={class:"node-content"},Vo={class:"node-info"},Bo={class:"node-label"},Ao={class:"node-params"},Do=te({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=e.computed(()=>o.data.description||"目标计时"),f=e.computed(()=>`${o.data.arguments?.duration||30}秒`),_=e.computed(()=>{const r=o.data.arguments?.condition_type;return r==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:r==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(r,y)=>{const k=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(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",So,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Vo,[e.createElementVNode("div",Bo,e.toDisplayString(t.value),1),e.createElementVNode("div",Ao,[e.createVNode(L,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.value),1)]),_:1}),_.value?(e.openBlock(),e.createBlock(L,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Lo={class:"group-label"},Oo=te({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t={and:"ALL",or:"SOME"},f=e.computed(()=>t[o.data.branchLogic]??"ALL"),_=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),r={width:"8px",height:"8px",borderRadius:"2px"},y={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(k,L)=>{const F=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createVNode(e.unref(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"]),e.createElementVNode("div",Lo,[e.createVNode(F,{type:_.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.value),1)]),_:1},8,["type"]),L[0]||(L[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(Ze.NodeResizer),{"min-width":200,"min-height":100,"handle-style":r,"line-style":y})],2)}}},[["__scopeId","data-v-adf6607d"]]),Mo={class:"node-content"},Io={class:"node-info"},Ro={class:"node-label"},$o={class:"node-scope"},Fo={class:"node-params"},qo=te({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(l){const o=l,t=ae(),f=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const r=t.nodes.find(y=>y.id===_);return r?r.data.label:"检测范围"};return(_,r)=>{const y=e.resolveComponent("el-icon"),k=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:l.selected}])},[e.createVNode(e.unref(Z.Handle),{type:"target",position:e.unref(Z.Position).Left},null,8,["position"]),e.createElementVNode("div",Mo,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",Io,[e.createElementVNode("div",Ro,e.toDisplayString(l.data.label),1),e.createElementVNode("div",$o,e.toDisplayString(f()),1),e.createElementVNode("div",Fo,[l.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(k,{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(k,{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(Z.Handle),{type:"source",position:e.unref(Z.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),Go={class:"quick-add-menu__list"},Ho=["onClick"],Po={class:"quick-add-menu__icon"},jo={class:"quick-add-menu__label"},zo={key:0,class:"quick-add-menu__empty"},ue=8,Uo=te({__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),f=e.ref({x:0,y:0});e.watch(()=>o.visible,async k=>{if(!k||(f.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const L=t.value.getBoundingClientRect(),F=window.innerWidth,D=window.innerHeight;let{x:p,y:E}=o.position;p+L.width>F-ue&&(p=F-L.width-ue),E+L.height>D-ue&&(E=D-L.height-ue),p<ue&&(p=ue),E<ue&&(E=ue),f.value={x:p,y:E}});const _=e.computed(()=>({left:f.value.x+"px",top:f.value.y+"px"})),r=[{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:"🏁"}],y=e.computed(()=>{switch(o.sourceNodeType){case"start":return r.filter(k=>k.type==="dataSource");case"dataSource":return r.filter(k=>k.type==="smallModel"||k.type==="detectionTarget"||k.type==="classificationModel");case"smallModel":return r.filter(k=>k.type!=="dataSource"&&k.type!=="smallModel"&&k.type!=="targetCount"&&k.type!=="timerTarget");case"detectionTarget":case"classificationModel":return r.filter(k=>k.type!=="dataSource"&&k.type!=="smallModel");case"timerTarget":return r.filter(k=>["ocr","faceRecognition","licensePlate","end"].includes(k.type));case"targetCount":return r.filter(k=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(k.type));case"ocr":return r.filter(k=>["licensePlate","faceRecognition","end"].includes(k.type));case"licensePlate":return r.filter(k=>["ocr","faceRecognition","end"].includes(k.type));case"faceRecognition":return r.filter(k=>["ocr","licensePlate","end"].includes(k.type));default:return[]}});return(k,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(_.value)},[L[1]||(L[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Go,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value,F=>(e.openBlock(),e.createElementBlock("li",{key:F.type,class:"quick-add-menu__item",onClick:D=>k.$emit("select",F.type)},[e.createElementVNode("span",Po,e.toDisplayString(F.icon),1),e.createElementVNode("span",jo,e.toDisplayString(F.label),1)],8,Ho))),128)),y.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:L[0]||(L[0]=F=>k.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Wo={class:"workflow-canvas"},ze=5,Jo=te({__name:"WorkflowCanvas",setup(l){const o=ae(),{screenToFlowCoordinate:t,findNode:f,onConnectStart:_,onConnectEnd:r}=Z.useVueFlow(),y=e.inject("editorConfig",null),k=e.inject("editorMode",ee.ALGORITHM),L=e.computed(()=>k===ee.TASK),F=e.inject("echoAlgodata",null),{importFromJSON:D}=Dt();e.watch(F,async n=>{if(n&&Object.keys(n).length>0&&(await e.nextTick(),await D(n),L.value)){const C=n?.ruleSchema?.sourceGroups??[];let S=null;if(C.some(j=>j.streamConfig)?S="stream":(C.length>1||C.some(j=>(j.children??[]).length>1))&&(S="image"),S){const j=o.nodes.find(J=>J.type===b.START);j&&o.updateNodeData(j.id,{streamType:S})}}},{immediate:!0});const p=(n,C)=>{if(!C?.properties)return n;const S={};return Object.entries(C.properties).forEach(([j,J])=>{J.default!==void 0&&(S[j]=J.default)}),n.data.arguments={...S,...n.data.arguments},n},E=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),x=()=>{E.visible=!1,E.sourceNodeId=null,E.sourceNodeType=null,E.sourceHandleId=null,R=!1};let s=null,h=!1,a=null,w=null,R=!1;const m=()=>{a&&(document.removeEventListener("mousemove",a),a=null),w&&(document.removeEventListener("mouseup",w),w=null)};_(({nodeId:n,handleId:C,handleType:S,event:j})=>{if(S!=="source")return;if(L.value){K.ElMessage.warning("算法任务模式下不允许添加连接线");return}const J=o.nodes.find(oe=>oe.id===n);if(!J||J.type==="end")return;if(J.type===b.DATA_SOURCE&&J.data?.enableImageSequence){if(C&&o.edges.filter(I=>I.source===n&&I.sourceHandle===C).length>=1)return}else if(J.type!==b.START&&J.type!==b.DATA_SOURCE&&o.edges.filter(I=>I.source===n).length>=1)return;const W=j?.target;let v=0,ne=0;if(W){const oe=W.getBoundingClientRect();v=oe.right+12,ne=oe.top-8}s={nodeId:n,sourceNodeType:J.type,handleId:C,menuX:v,menuY:ne,flowPos:{...J.position}},h=!1;const se=j?.clientX??0,me=j?.clientY??0;m(),a=oe=>{(Math.abs(oe.clientX-se)>ze||Math.abs(oe.clientY-me)>ze)&&(h=!0,m())},w=()=>{if(m(),!h&&s){R=!0;const oe=s;E.visible=!0,E.screenPos={x:oe.menuX,y:oe.menuY},E.sourceNodeId=oe.nodeId,E.sourceNodeType=oe.sourceNodeType,E.sourceHandleId=oe.handleId,E.flowPos=oe.flowPos}s=null},document.addEventListener("mousemove",a),document.addEventListener("mouseup",w)});const $=n=>{const C=E.sourceNodeId,S=o.nodes.find(Q=>Q.id===C);if(!S){x();return}if(L.value){K.ElMessage.warning("算法任务模式下不允许添加节点"),x();return}const j=S.position.x+250,J=S.position.y;let W={x:j,y:J};const v=60,ne=80;let se=0,me=!0;for(;me;){me=!1;const Q=J+se;for(const le of o.nodes)if(Math.abs(le.position.x-j)<100&&Math.abs(le.position.y-Q)<v+20){me=!0,se+=ne;break}}if(W.y=J+se,n==="end"){const Q=o.nodes.find(le=>le.type==="end");if(Q){if(o.edges.some(Ce=>Ce.source===C&&Ce.target===Q.id)){K.ElMessage.warning("已经连接到结束节点"),x();return}const ge=A(S,Q);if(!ge.valid){K.ElMessage.warning(ge.message),x();return}o.addConnection({source:C,target:Q.id,sourceHandle:E.sourceHandleId||null,targetHandle:null}),z(),x(),K.ElMessage.success("已连接到结束节点");return}}let oe;switch(n){case"end":oe=ke(W);break;case"dataSource":oe=be(W);break;case"smallModel":oe=Ve(W);break;case"detectionTarget":oe=Be(W);break;case"classificationModel":oe=Ae(W);break;case"ocr":{const Q=y?.value??y;oe=p(De(W),Q?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const Q=y?.value??y;oe=p(Le(W),Q?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const Q=y?.value??y;oe=p(Ie(W),Q?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":oe=Oe(W);break;case"timerTarget":oe=Me(W);break;default:x();return}const I=A(S,oe);if(!I.valid){K.ElMessage.warning(I.message),x();return}o.addNode(oe),o.addConnection({source:C,target:oe.id,sourceHandle:E.sourceHandleId||null,targetHandle:null}),z(),x(),K.ElMessage.success(`已添加${oe.data.label}并连接`)},B=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],A=(n,C)=>{if(n?.parentNode&&C?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(C?.parentNode&&n?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(n?.type===b.START){if(C?.type!==b.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(J=>J.source===n.id).some(J=>o.nodes.find(v=>v.id===J.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(C?.type===b.SMALL_MODEL){if(n?.type!==b.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(W=>W.source===n.id).some(W=>o.nodes.find(ne=>ne.id===W.target)?.type!==b.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(n?.type===b.DATA_SOURCE){if(C?.type!==b.SMALL_MODEL&&C?.type!==b.DETECTION_TARGET&&C?.type!==b.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(W=>W.source===n.id).some(W=>o.nodes.find(ne=>ne.id===W.target)?.type===b.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(n?.type===b.SMALL_MODEL&&(C?.type===b.TARGET_COUNT||C?.type===b.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(n?.type===b.TARGET_COUNT&&![b.TIMER_TARGET,b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(C?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(n?.type===b.TIMER_TARGET&&![b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(C?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const S=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION];return S.includes(n?.type)&&!S.filter(J=>J!==n.type).concat(b.END).includes(C?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:C?.type!==b.END&&o.edges.filter(J=>J.target===C?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},T=e.markRaw({start:Mt,end:$t,dataSource:Ut,smallModel:Zt,detectionTarget:no,classificationModel:mo,ocr:ho,licensePlate:bo,targetCount:To,timerTarget:Do,group:Oo,faceRecognition:qo}),c=e.computed({get:()=>o.nodes,set:n=>{o.nodes=n}}),d=e.computed({get:()=>o.edges,set:n=>{o.edges=n}}),i=n=>{n.forEach(C=>{if(C.type==="position"&&C.position)o.updateNodePosition(C.id,C.position);else if(C.type==="remove"){if(L.value){K.ElMessage.warning("算法任务模式下不允许删除节点");return}const S=o.nodes.find(J=>J.id===C.id);if(S&&S.type===b.START){K.ElMessage.warning("开始节点不可删除");return}if(S&&S.type===b.END){K.ElMessage.warning("结束节点不可删除");return}if(S&&S.type==="group"){K.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const j=S?.parentNode;o.removeNode(C.id),j&&o.nodes.filter(W=>W.parentNode===j).length===0&&o.dissolveParallelGroup(j)}})},N=n=>{n.forEach(C=>{if(C.type==="remove"){if(L.value){K.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(C.id)}})},g=n=>{if(R)return;if(L.value){K.ElMessage.warning("算法任务模式下不允许添加连接线"),x();return}const C=o.nodes.find(J=>J.id===n.source),S=o.nodes.find(J=>J.id===n.target),j=A(C,S);if(!j.valid){K.ElMessage.warning(j.message),x();return}if(C?.type===b.DATA_SOURCE&&C.data.enableImageSequence&&n.sourceHandle&&o.edges.filter(W=>W.source===n.source&&W.sourceHandle===n.sourceHandle).length>=1){const W=n.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";K.ElMessage.warning(`${W}连接点只能连接一个节点`);return}if(B.includes(C?.type)&&!C.data.enableBranch&&o.edges.filter(W=>W.source===n.source).length>=1){K.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(n),z(),x()},V=n=>({and:"ALL",or:"SOME"})[n]||"ALL",M=n=>{const C=o.nodes.find(S=>S.id===n.source);if(!C)return"";if(C.type===b.START){const S=C.data.branchLogic||"and",j=V(S),J=n.data?.branchOrder;return J!=null?`${j} - 执行顺序 ${J}`:j}if(C.type===b.DATA_SOURCE){if(C.data?.enableImageSequence){const W=n.sourceHandle==="first-frame"?"首帧":"后续帧",v=n.data?.branchOrder;return v!=null?`${W} - 执行顺序 ${v}`:W}const S=C.data.branchLogic||"and",j=V(S),J=n.data?.branchOrder;return J!=null?`${j} - 执行顺序 ${J}`:j}return""},z=()=>{o.edges.forEach(n=>{const C=M(n);n.label!==C&&(n.label=C,n.labelStyle=C?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,n.labelBgStyle=C?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,n.labelBgPadding=C?[4,6]:void 0)})},q=()=>{o.nodes.forEach(n=>{if(n.type!=="group")return;const C=n.data.sourceNodeId;if(!C)return;const S=o.nodes.find(j=>j.id===C);S?.data?.enableBranch&&S.data.branchLogic!==n.data.branchLogic&&o.updateNodeData(n.id,{branchLogic:S.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(n=>B.includes(n.type)).map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic})),(n,C)=>{C&&n.forEach(S=>{const j=C.find(J=>J.id===S.id);if(j){if(S.enableBranch&&!j.enableBranch){const J=o.nodes.find(W=>W.id===S.id);if(!J)return;o.createEmptyGroup({x:J.position.x+200,y:J.position.y-30},J.data.branchLogic||"and",S.id)}else if(!S.enableBranch&&j.enableBranch){const J=o.nodes.find(W=>W.type==="group"&&W.data.sourceNodeId===S.id);J&&o.dissolveParallelGroup(J.id)}if(S.enableBranch&&j.branchLogic!==S.branchLogic){const J=o.nodes.find(W=>W.type==="group"&&W.data.sourceNodeId===S.id);J&&o.updateNodeData(J.id,{branchLogic:S.branchLogic})}}})}),e.watch(()=>o.nodes.filter(n=>n.type!=="group").map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic,branchOrder:n.data.branchOrder})),()=>{z(),q()},{deep:!0}),e.watch(()=>o.edges.map(n=>({id:n.id,branchOrder:n.data?.branchOrder})),(n,C)=>{z(),C&&n.forEach(S=>{const j=C.find(J=>J.id===S.id);if(j&&j.branchOrder!==S.branchOrder&&S.branchOrder!==void 0){const J=o.edges.find(W=>W.id===S.id);if(J){const W=o.nodes.find(v=>v.id===J.source);W&&W.type===b.DATA_SOURCE&&o.updateNodePosition(W.id,{x:W.position.x,y:W.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([n,C])=>{o.nodes.forEach(S=>{n.has(S.id)?S.class="invalid-node":S.class==="invalid-node"&&(S.class="")}),o.edges.forEach(S=>{C.has(S.id)?S.class="invalid-edge":S.class==="invalid-edge"&&(S.class="")})},{deep:!0});const G=n=>{n.event?.target?.closest(".vue-flow__handle")||o.selectNode(n.node.id)},P=n=>{o.selectEdge(n.edge.id)},Y=n=>{if(L.value){K.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(n.edge.id)},u=()=>{o.clearSelection()},O=({node:n})=>{if(n.type==="group"||!B.includes(n.type))return;const C=o.nodes.filter(j=>j.type==="group");let S=null;for(const j of C){const J=f(j.id);if(!J)continue;const W=J.dimensions?.width||parseInt(j.style?.width)||300,v=J.dimensions?.height||parseInt(j.style?.height)||160;let ne=n.position.x,se=n.position.y;if(n.parentNode){const ge=o.nodes.find(Ce=>Ce.id===n.parentNode);ge&&(ne+=ge.position.x,se+=ge.position.y)}const me=f(n.id),oe=me?.dimensions?.width||160,I=me?.dimensions?.height||60,Q=ne+oe/2,le=se+I/2;if(Q>=j.position.x&&Q<=j.position.x+W&&le>=j.position.y&&le<=j.position.y+v){S=j.id;break}}S?n.parentNode!==S&&o.addNodeToGroup(n.id,S):n.parentNode&&o.removeNodeFromGroup(n.id)},H=n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect="move")},U=n=>{n.preventDefault();const C=n.dataTransfer?.getData("application/vueflow");if(!C)return;if(L.value){K.ElMessage.warning("算法任务模式下不允许添加节点");return}if(C===b.START&&o.getNodeCountByType(b.START)>=1){K.ElMessage.warning("工作流只能有一个开始节点");return}if(C===b.END&&o.getNodeCountByType(b.END)>=1){K.ElMessage.warning("工作流只能有一个结束节点");return}const S=160,j=60,J=t({x:n.clientX,y:n.clientY}),W={x:J.x-S/2,y:J.y-j/2};let v;switch(C){case b.START:v=Se(W);break;case b.END:v=ke(W);break;case b.DATA_SOURCE:v=be(W);break;case b.SMALL_MODEL:v=Ve(W);break;case b.DETECTION_TARGET:v=Be(W);break;case b.CLASSIFICATION_MODEL:v=Ae(W);break;case b.OCR:{const ne=y?.value??y;v=p(De(W),ne?.ocr?.[0]?.inputSchema);break}case b.LICENSE_PLATE:{const ne=y?.value??y;v=p(Le(W),ne?.license_plate?.[0]?.inputSchema);break}case b.TARGET_COUNT:v=Oe(W);break;case b.TIMER_TARGET:v=Me(W);break;case b.FACE_RECOGNITION:{const ne=y?.value??y;v=p(Ie(W),ne?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(v),K.ElMessage.success("节点已添加")};return(n,C)=>(e.openBlock(),e.createElementBlock("div",Wo,[e.createVNode(e.unref(Z.VueFlow),{nodes:c.value,"onUpdate:nodes":C[0]||(C[0]=S=>c.value=S),edges:d.value,"onUpdate:edges":C[1]||(C[1]=S=>d.value=S),"node-types":e.unref(T),onNodesChange:i,onEdgesChange:N,onConnect:g,onNodeClick:G,onEdgeClick:P,onEdgeDoubleClick:Y,onPaneClick:u,onDrop:U,onDragover:H,onNodeDragStop:O,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(Qe.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(Ke.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Uo,{visible:E.visible,position:E.screenPos,"source-node-type":E.sourceNodeType,onSelect:$,onClose:x},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-8f161693"]]),Yo={class:"config-header"},Xo={key:0,class:"config-section"},Qo={key:1,class:"config-section"},Ko=te({__name:"EdgeConfig",setup(l){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),f=e.computed(()=>t===ee.TASK),_=e.computed(()=>{const D=o.selectedEdge;return D&&o.nodes.find(E=>E.id===D.source)?.data?.enableBranch?D:null}),r=e.computed(()=>_.value&&o.nodes.find(p=>p.id===_.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),y=e.computed(()=>{if(!_.value)return!1;const D=o.nodes.find(p=>p.id===_.value.source);return(D?.type==="dataSource"||D?.type==="start")&&D?.data?.enableBranch}),k=e.computed(()=>{if(!_.value)return 1;const D=o.nodes.find(p=>p.id===_.value.source);return D?o.edges.filter(p=>p.source===D.id).length:1}),L=e.computed(()=>{if(!_.value)return!1;const D=o.nodes.find(p=>p.id===_.value.source);return D?D.type==="dataSource"&&D.data?.enableImageSequence===!0&&_.value.sourceHandle!=="first-frame":!1}),F=D=>{_.value&&o.updateEdgeData(_.value.id,D)};return(D,p)=>{const E=e.resolveComponent("el-divider"),x=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-text"),h=e.resolveComponent("el-form-item"),a=e.resolveComponent("el-form"),w=e.resolveComponent("el-option"),R=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yo,[e.createElementVNode("h3",null,e.toDisplayString(r.value),1)]),e.createVNode(E),L.value?(e.openBlock(),e.createElementBlock("div",Xo,[p[3]||(p[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(x,{"model-value":_.value?.data?.timeWindowSeconds??null,onChange:p[0]||(p[0]=m=>F({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),y.value?(e.openBlock(),e.createElementBlock("div",Qo,[p[5]||(p[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":_.value?.data?.branchOrder??null,disabled:f.value,onChange:p[1]||(p[1]=m=>F({branchOrder:m})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,m=>(e.openBlock(),e.createBlock(w,{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"]]),Zo={class:"config-section"},vo=te({__name:"GroupNodeConfig",setup(l){return(o,t)=>{const f=e.resolveComponent("el-divider"),_=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(f),e.createElementVNode("div",Zo,[e.createVNode(_,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),en={class:"time-init-container"},tn={key:0,class:"time-header flex-x-start"},on={class:"tab-type flex-x"},nn={class:"time-content"},an={id:"time-content-table-body"},ln=["onClick"],rn=["onClick"],sn=["data-sort","data-value","data-day","data-type","onMousedown"],cn={key:1},dn=["data-sort","data-value","data-type","onMousedown"],mn={class:"time-list"},pn={key:0,class:"time-list-title"},un={key:1,style:{"margin-right":"10px"}},fn=te({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(l,{expose:o}){const t=l,f=e.ref(0);let _,r,y,k,L;const F=e.ref(new Map),D=e.ref(new Map),p=e.computed(()=>f.value===0?F.value:D.value);e.onMounted(()=>{_=document.querySelector("#time-content-table-body"),r=_.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",a)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",a)});const E=g=>{f.value!==g&&(f.value=g,e.nextTick(()=>{r=_.querySelectorAll("td.sel-able[data-type]"),r.forEach(M=>M.classList.remove("selected")),(g===0?F.value:D.value).forEach((M,z)=>{M.origin.forEach(q=>{Array.from(r).forEach(G=>{Number(G.dataset.sort)==q.sort&&Number(G.dataset.value)==q.value&&Number(G.dataset.day)==z&&G.classList.add("selected")})})})}))},x=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=(g,V,M)=>{t.operationType!=3&&M.which==1&&(k=g,y=Number(M.target.dataset.value),M.target.classList.contains("selected")?(M.target.classList.remove("selected"),L=""):(L="selected",M.target.classList.add("selected")),h(),B())},h=()=>{r.forEach(g=>{g.addEventListener("mouseover",w,!1,{once:!0})})},a=()=>{r.forEach(g=>{g.removeEventListener("mouseover",w)})},w=g=>{g.target.classList.remove("selected"),L&&g.target.classList.add(L);let V=Number(g.target.dataset.value),M=Number(g.target.dataset.day),z=M>k?M:k,q=M<k?M:k,G=V>y?V:y,P=V<y?V:y;for(let Y=q;Y<=z;Y++)for(let u=P;u<=G;u++){let O=document.querySelector(`td[data-value="${u}"][data-day="${Y}"]`);O.classList.remove("selected"),L&&O.classList.add(L)}B()},R=g=>{if(t.operationType==3)return;let V=[];r.forEach(M=>{Number(M.dataset.day)==g&&V.push(M)}),V.find(M=>!M.classList.contains("selected"))?V.forEach(M=>M.classList.add("selected")):V.forEach(M=>M.classList.remove("selected")),B()},m=g=>{if(t.operationType==3)return;let V=[];r.forEach(M=>{Number(M.dataset.sort)==g&&V.push(M)}),V.find(M=>!M.classList.contains("selected"))?V.forEach(M=>M.classList.add("selected")):V.forEach(M=>M.classList.remove("selected")),B()},$=()=>{r.forEach(V=>{V.classList.remove("selected")}),(f.value===0?F:D).value.clear()},B=()=>{const g=f.value===0?F:D;g.value.clear(),r.forEach(V=>{if(V.classList.contains("selected")){let M=V.dataset.day,z=V.dataset.sort,q=V.dataset.value;g.value.get(M)?g.value.get(M).origin.push({sort:Number(z),value:Number(q)}):g.value.set(M,{origin:[{sort:Number(z),value:Number(q)}],timeList:[]})}})},A=g=>{let z=p.value.get(g).origin.map(q=>q.value).reduce((q,G,P,Y)=>(P==0?q.push([G]):G==Y[P-1]+1?q[q.length-1].push(G):q.push([G]),q),[]);return z=z.map(q=>{let G=Math.max(...q)+1,P=Math.min(...q)+1,Y=P%2==0?30:0,u=G%2==0?0:30,O=T(Math.ceil(P/2)-1),H=T(Math.ceil(G/2)-(u==0?0:1));return{dayType:g,startTime:O+":"+(Y==0?"00":Y),endTime:H+":"+(u==0?"00":u)}}),p.value.get(g).timeList=z,z.map(q=>q.startTime+"-"+q.endTime).join()};function T(g){return g<10?"0"+g:g}const c=(g,V)=>{F.value.clear(),D.value.clear(),r.forEach(G=>G.classList.remove("selected")),f.value=V;const M=V===0?F:D,z=JSON.parse(g);let q=[];z.plan.forEach(G=>{G.timePeriod.forEach(P=>{q.push({...P,dayType:G.dayType})})}),e.nextTick(()=>{r=_.querySelectorAll("td.sel-able[data-type]"),q.forEach(G=>{M.value.get(G.dayType)?M.value.get(G.dayType).timeList.push(G):M.value.set(G.dayType,{origin:[],timeList:[{...G}]})}),M.value.forEach((G,P)=>{G.timeList.forEach(Y=>{let u=Number(Y.startTime.split(":")[1]),O=Number(Y.endTime.split(":")[1]),H=Number(Y.startTime.split(":")[0]),U=Number(Y.endTime.split(":")[0]);if(H==U){G.origin.push({sort:H,value:2*H});return}for(let n=H;n<=U;n++)if(n==H)u==0?(G.origin.push({sort:n,value:2*n}),G.origin.push({sort:n,value:2*n+1})):G.origin.push({sort:n,value:2*n+1});else if(n>H&&n<U)G.origin.push({sort:n,value:2*n}),G.origin.push({sort:n,value:2*n+1});else if(O==0){if(n==U)return;G.origin.push({sort:n,value:2*n}),G.origin.push({sort:n,value:2*n+1})}else G.origin.push({sort:n,value:2*n})}),G.origin.forEach(Y=>{Array.from(r).find(u=>{Number(u.dataset.sort)==Y.sort&&Number(u.dataset.value)==Y.value&&Number(u.dataset.day)==P&&u.classList.add("selected")})})})})},d=(g,V)=>g.map(q=>q.value).sort((q,G)=>q-G).reduce((q,G,P,Y)=>(P==0?q.push([G]):G==Y[P-1]+1?q[q.length-1].push(G):q.push([G]),q),[]).map(q=>{let G=Math.max(...q)+1,P=Math.min(...q)+1,Y=P%2==0?30:0,u=G%2==0?0:30,O=T(Math.ceil(P/2)-1),H=T(Math.ceil(G/2)-(u==0?0:1));return{dayType:V,startTime:O+":"+(Y==0?"00":Y),endTime:H+":"+(u==0?"00":u)}});return o({getTimeData:()=>{(f.value===0?D:F).value.clear();let V=[];p.value.forEach((q,G)=>{const P=d(q.origin,G);V=V.concat(P)});let M={plan:[]},z=V.map(q=>q.dayType).filter((q,G,P)=>P.indexOf(q)===G);return z.length?(z.forEach(q=>{M.plan.push({dayType:q,timePeriod:V.filter(G=>G.dayType===q).map(G=>({startTime:G.startTime,endTime:G.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(M),planType:f.value}):{validTime:!1}},revertByTime:c,resetFn:()=>{f.value=0,F.value.clear(),D.value.clear(),e.nextTick(()=>{r.forEach(g=>{g.classList.remove("selected")}),r=_.querySelectorAll("td.sel-able[data-type]")})}}),(g,V)=>{const M=e.resolveComponent("el-icon"),z=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",en,[l.operationType!=3?(e.openBlock(),e.createElementBlock("div",tn,[e.createElementVNode("div",on,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:f.value==0}]),onClick:V[0]||(V[0]=q=>E(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:f.value==1}]),onClick:V[1]||(V[1]=q=>E(1))}," 日计划 ",2)]),e.createVNode(z,{class:"rm-icon",link:"",type:"danger",onClick:$},{default:e.withCtx(()=>[e.createVNode(M,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",nn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:V[3]||(V[3]=q=>q.preventDefault())},[V[5]||(V[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",an,[e.createElementVNode("tr",null,[V[4]||(V[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,q=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:G=>m(q-1)},e.toDisplayString(q-1),9,ln)),64))]),f.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(x.value.filter(q=>q.value!=0),q=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:G=>R(q.value)},e.toDisplayString(q.name),9,rn),(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":q.value,"data-type":f.value,onMousedown:P=>s(q.value,G,P)},null,40,sn)),64))]))),256)):e.createCommentVNode("",!0),f.value==1?(e.openBlock(),e.createElementBlock("tr",cn,[e.createElementVNode("th",{onClick:V[2]||(V[2]=q=>R(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,q=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((q-1)/2),"data-value":q-1,"data-day":0,"data-type":f.value,onMousedown:G=>s(0,q,G)},null,40,dn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",mn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value.keys(),q=>(e.openBlock(),e.createElementBlock("div",null,[f.value==0?(e.openBlock(),e.createElementBlock("span",pn,[V[6]||(V[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(x.value.find(G=>G.value==q).name),1)])):(e.openBlock(),e.createElementBlock("span",un,e.toDisplayString(x.value.find(G=>G.value==q).name),1)),e.createTextVNode(" ("+e.toDisplayString(A(q))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),gn={class:"time-template-dialog"},hn={class:"time-editor-panel"},yn=te({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(l,{expose:o,emit:t}){const f=l,_=t,r=e.ref(null),y=e.ref(""),k=e.ref(""),L=e.ref(f.modelValue?.timeTemplateName||""),F=e.ref([]);return e.computed(()=>y.value?F.value.filter(E=>E.name.toLowerCase().includes(y.value.toLowerCase())):F.value),e.watch(L,E=>{_("update:modelValue",{...f.modelValue,timeTemplateName:E})}),o({getFormData:()=>{const E=r.value?.getTimeData();return{timeTemplateId:k.value,timeTemplateName:L.value,...E}},revertByTime:(E,x)=>{r.value?.revertByTime(E,x)}}),(E,x)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",gn,[e.createCommentVNode("",!0),e.createElementVNode("div",hn,[e.createCommentVNode("",!0),e.createVNode(fn,{ref_key:"timeInitRef",ref:r},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),_n={class:"config-section"},Nn={key:0,class:"config-section"},Cn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},kn={class:"config-section"},bn=te({__name:"StartNodeConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("echoAlgodata",null),y=e.computed(()=>{const s=(r?.value??r)?.ruleSchema?.sourceGroups??[];if(s.some(w=>w.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const h=s.length>1,a=s.some(w=>(w.children??[]).length>1);return h||a?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(y,x=>{x.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:x.value})},{immediate:!0});const k=e.ref(!1),L=e.ref(null),F=()=>{const x=L.value?.getFormData();if(x?.validTime){const h=(JSON.parse(x.timeZone)?.plan??[]).map(a=>({dayType:String(a.dayType),timePeriod:a.timePeriod.map(w=>({startTime:w.startTime,endTime:w.endTime}))}));o.updateNodeData(t.value.id,{executionTime:x.timeZone,schedule:h,timeZone:x.timeZone,planType:x.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});k.value=!1},D=()=>{const x=t.value?.data;x?.timeZone&&L.value?.revertByTime(x.timeZone,x.planType??0)},p=e.computed(()=>t.value?o.edges.filter(s=>s.source===t.value.id).length>=2:!1),E=x=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:x})};return(x,s)=>{const h=e.resolveComponent("el-divider"),a=e.resolveComponent("el-input"),w=e.resolveComponent("el-form-item"),R=e.resolveComponent("el-form"),m=e.resolveComponent("el-option"),$=e.resolveComponent("el-select"),B=e.resolveComponent("el-switch"),A=e.resolveComponent("el-button"),T=e.resolveComponent("el-dialog"),c=e.resolveComponent("el-icon"),d=e.resolveComponent("el-tooltip"),i=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(h),e.createElementVNode("div",_n,[s[9]||(s[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(R,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(a,{"model-value":t.value?.data.algorithmName,disabled:_.value,onInput:s[0]||(s[0]=N=>E(N)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),_.value?(e.openBlock(),e.createElementBlock("div",Nn,[s[10]||(s[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(R,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(a,{"model-value":t.value?.data.taskName,onInput:s[1]||(s[1]=N=>e.unref(o).updateNodeData(t.value.id,{taskName:N})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(w,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":y.value.locked?y.value.value:t.value?.data.streamType||"image",disabled:y.value.locked,onChange:s[2]||(s[2]=N=>e.unref(o).updateNodeData(t.value.id,{streamType:N})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"图片流",value:"image"}),e.createVNode(m,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),y.value.locked?(e.openBlock(),e.createElementBlock("div",Cn,e.toDisplayString(y.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(w,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(B,{"model-value":t.value?.data.enableAlertVideo,onChange:s[3]||(s[3]=N=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:N}))},null,8,["model-value"])]),_:1}),e.createVNode(w,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(a,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:s[4]||(s[4]=N=>k.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(T,{modelValue:k.value,"onUpdate:modelValue":s[6]||(s[6]=N=>k.value=N),title:"执行时段",width:"1200px","append-to-body":"",onOpened:D},{footer:e.withCtx(()=>[e.createVNode(A,{onClick:s[5]||(s[5]=N=>k.value=!1)},{default:e.withCtx(()=>[...s[11]||(s[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(A,{type:"primary",onClick:F},{default:e.withCtx(()=>[...s[12]||(s[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(yn,{ref_key:"timeTemplateRef",ref:L},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",kn,[s[14]||(s[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(R,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(w,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":t.value?.data.branchLogic||"and",disabled:_.value,onChange:s[7]||(s[7]=N=>e.unref(o).updateNodeData(t.value.id,{branchLogic:N})),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(w,{key:0},{label:e.withCtx(()=>[s[13]||(s[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(d,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(i,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:s[8]||(s[8]=N=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:N})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),xn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},En=["smallModel","detectionTarget"],Ee=()=>({schemaLoading:e.ref(!1),getToolType:r=>xn[r]||null,needsToolSelection:r=>En.includes(r),fetchToolSchema:async(r,y="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(r,y="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),wn={key:0,class:"config-section"},Tn={key:3,class:"array-input"},Sn={key:1,class:"config-section"},Vn=te({__name:"EndNodeConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:f,fetchSchemaForNodeType:_}=Ee(),r=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const E=p.required||[];return Object.entries(p.properties).map(([x,s])=>({key:x,type:s.type,label:s.title||s.label||s.description||x,description:s.description||"",default:s.default,required:E.includes(x)||s.required||!1,min:s.minimum!==void 0?s.minimum:s.min,max:s.maximum!==void 0?s.maximum:s.max,step:s.step,maxLength:s.maxLength,options:s.enum,optionLabels:s.enumLabels||s.enum,dependsOn:s.dependsOn}))}),y=p=>{if(t.value)return t.value.data.arguments?.[p]},k=(p,E)=>{if(!t.value)return;const s={...t.value.data.arguments||{},[p]:E};o.updateNodeData(t.value.id,{arguments:s})},L=p=>{if(!p.dependsOn||!t.value)return!0;const{field:E,value:x}=p.dependsOn,s=y(E);if(typeof x=="string"&&x.startsWith("!")){const h=x.substring(1);return s!==h}return Array.isArray(x)?x.includes(s):s===x},F=p=>{const E=y(p);return Array.isArray(E)?JSON.stringify(E):""},D=(p,E)=>{try{const x=JSON.parse(E);Array.isArray(x)&&k(p,x)}catch{}};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const E=t.value.type,x=t.value.data,s=x.input_schema||x.inputSchema;if(s&&s.properties&&Object.keys(s.properties).length>0)return;const h=await _(E);if(!h)return;const a=t.value?.data;a&&o.updateNodeData(t.value.id,{...a,input_schema:h.inputSchema,extraConfig:h.extraConfig,arguments:{...h.arguments,...a.arguments}})},{immediate:!0}),(p,E)=>{const x=e.resolveComponent("el-divider"),s=e.resolveComponent("el-icon"),h=e.resolveComponent("el-tooltip"),a=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),R=e.resolveComponent("el-switch"),m=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[2]||(E[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(x),r.value.length>0?(e.openBlock(),e.createElementBlock("div",wn,[E[0]||(E[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,T=>e.withDirectives((e.openBlock(),e.createBlock(B,{key:T.key,required:T.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(T.label),1),T.description?(e.openBlock(),e.createBlock(h,{key:0,content:T.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(s,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[T.options&&T.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":y(T.key),onChange:c=>k(T.key,c),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.options,(c,d)=>(e.openBlock(),e.createBlock(a,{key:c,label:T.optionLabels?T.optionLabels[d]:c,value:c},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):T.type==="boolean"?(e.openBlock(),e.createBlock(R,{key:1,"model-value":y(T.key),onChange:c=>k(T.key,c)},null,8,["model-value","onChange"])):T.type==="number"||T.type==="integer"?(e.openBlock(),e.createBlock(m,{key:2,"model-value":y(T.key),onChange:c=>k(T.key,c),min:T.min,max:T.max,step:T.step||(T.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):T.type==="array"&&!T.options?(e.openBlock(),e.createElementBlock("div",Tn,[e.createVNode($,{"model-value":F(T.key),onChange:c=>D(T.key,c),type:"textarea",rows:3,placeholder:T.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):T.type==="array"&&T.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":y(T.key),onChange:c=>k(T.key,c),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.options,(c,d)=>(e.openBlock(),e.createBlock(a,{key:c,label:T.optionLabels?T.optionLabels[d]:c,value:c},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock($,{key:5,"model-value":y(T.key),onInput:c=>k(T.key,c),maxlength:T.maxLength,"show-word-limit":!!T.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!T.dependsOn||L(T)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(f)&&r.value.length===0?(e.openBlock(),e.createElementBlock("div",Sn,[...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"]]),Bn={class:"config-header"},An={class:"config-section"},Dn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Ln={key:0,class:"config-section"},On={key:3,class:"array-input"},Mn={key:1,class:"config-section"},In={key:2,class:"config-section"},Rn=te({__name:"ClassificationModelConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("editorConfig",null),y=e.computed(()=>(r?.value??r)?.classification?.models??[]),k=e.computed(()=>(r?.value??r)?.classification?.modelParams??null),L=e.ref([]),F=e.ref(!1),D=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:B=>{t.value&&B&&a("modelId",B)}}),p=()=>{L.value=y.value},E=async B=>{if(!t.value||!B)return;const A=L.value.find(i=>i.id===B);if(!A)return;const T=t.value?.data;if(!T)return;const c=A.inputSchema||A.input_schema||k.value?.inputSchema||{},d={};c.properties&&Object.entries(c.properties).forEach(([i,N])=>{N.default!==void 0&&(d[i]=N.default)}),o.updateNodeData(t.value.id,{...T,input_schema:c,extraConfig:A.extraConfig||null,arguments:{...d,modelId:A.id,modelName:A.name}})},x=()=>{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 A=B.required||[];return Object.entries(B.properties).map(([T,c])=>({key:T,type:c.type,label:c.title||c.label||c.description||T,description:c.description||"",default:c.default,required:A.includes(T)||c.required||!1,min:c.minimum!==void 0?c.minimum:c.min,max:c.maximum!==void 0?c.maximum:c.max,step:c.step,maxLength:c.maxLength,options:c.enum,optionLabels:c.enumLabels||c.enum,dependsOn:c.dependsOn,sort:c.sort,hidden:c["x-hidden"]||!1})).filter(T=>!T.hidden).sort((T,c)=>(T.sort??1/0)-(c.sort??1/0))}),h=B=>{if(t.value)return t.value.data.arguments?.[B]},a=(B,A)=>{if(!t.value)return;const c={...t.value.data.arguments||{},[B]:A};o.updateNodeData(t.value.id,{arguments:c})},w=B=>{if(!B.dependsOn||!t.value)return!0;const{field:A,value:T}=B.dependsOn,c=h(A);if(typeof T=="string"&&T.startsWith("!")){const d=T.substring(1);return c!==d}return Array.isArray(T)?T.includes(c):c===T},R=B=>{const A=h(B);return Array.isArray(A)?JSON.stringify(A):""},m=(B,A)=>{try{const T=JSON.parse(A);Array.isArray(T)&&a(B,T)}catch{}},$=()=>{t.value&&K.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 A=t.value.data,T=A.input_schema||A.inputSchema,c=A.arguments?.modelId;if(c&&T&&T.properties&&Object.keys(T.properties).length>0||!c)return;const d=L.value.find(V=>V.id===c);if(!d)return;const i=d.inputSchema||d.input_schema||k.value?.inputSchema||{},N={};i.properties&&Object.entries(i.properties).forEach(([V,M])=>{M.default!==void 0&&(N[V]=M.default)});const g=t.value?.data;g&&o.updateNodeData(t.value.id,{...g,input_schema:i,extraConfig:d.extraConfig||null,arguments:{...N,...g.arguments}})},{immediate:!0}),(B,A)=>{const T=e.resolveComponent("el-button"),c=e.resolveComponent("el-divider"),d=e.resolveComponent("el-option"),i=e.resolveComponent("el-select"),N=e.resolveComponent("el-form-item"),g=e.resolveComponent("el-form"),V=e.resolveComponent("el-icon"),M=e.resolveComponent("el-tooltip"),z=e.resolveComponent("el-switch"),q=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Bn,[A[1]||(A[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:$},null,8,["icon"]))]),e.createVNode(c),e.createElementVNode("div",An,[A[2]||(A[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(g,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(i,{modelValue:D.value,"onUpdate:modelValue":A[0]||(A[0]=P=>D.value=P),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:F.value,disabled:_.value,onChange:E,onClear:x},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(L.value,P=>(e.openBlock(),e.createBlock(d,{key:P.id,label:P.name,value:P.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),L.value.length===0&&!F.value?(e.openBlock(),e.createElementBlock("div",Dn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),D.value&&s.value.length>0?(e.openBlock(),e.createElementBlock("div",Ln,[A[3]||(A[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(g,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,P=>e.withDirectives((e.openBlock(),e.createBlock(N,{key:P.key,required:P.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(P.label),1),P.description?(e.openBlock(),e.createBlock(M,{key:0,content:P.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(V,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[P.options&&P.type==="string"?(e.openBlock(),e.createBlock(i,{key:0,"model-value":h(P.key),disabled:_.value&&P.key!=="threshold",onChange:Y=>a(P.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(P.options,(Y,u)=>(e.openBlock(),e.createBlock(d,{key:Y,label:P.optionLabels?P.optionLabels[u]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):P.type==="boolean"?(e.openBlock(),e.createBlock(z,{key:1,"model-value":h(P.key),disabled:_.value&&P.key!=="threshold",onChange:Y=>a(P.key,Y)},null,8,["model-value","disabled","onChange"])):P.type==="number"||P.type==="integer"?(e.openBlock(),e.createBlock(q,{key:2,"model-value":h(P.key),disabled:_.value&&P.key!=="threshold",onChange:Y=>a(P.key,Y),min:P.min,max:P.max,step:P.step||(P.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):P.type==="array"&&!P.options?(e.openBlock(),e.createElementBlock("div",On,[e.createVNode(G,{"model-value":R(P.key),disabled:_.value&&P.key!=="threshold",onChange:Y=>m(P.key,Y),type:"textarea",rows:3,placeholder:P.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):P.type==="array"&&P.options?(e.openBlock(),e.createBlock(i,{key:4,"model-value":h(P.key),disabled:_.value&&P.key!=="threshold",onChange:Y=>a(P.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(P.options,(Y,u)=>(e.openBlock(),e.createBlock(d,{key:Y,label:P.optionLabels?P.optionLabels[u]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":h(P.key),disabled:_.value&&P.key!=="threshold",onInput:Y=>a(P.key,Y),maxlength:P.maxLength,"show-word-limit":!!P.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!P.dependsOn||w(P)]])),128))]),_:1})])):e.createCommentVNode("",!0),D.value&&F.value&&s.value.length===0?(e.openBlock(),e.createElementBlock("div",Mn,[...A[4]||(A[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!D.value&&!F.value?(e.openBlock(),e.createElementBlock("div",In,[...A[5]||(A[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),$n={class:"config-header"},Fn={class:"config-section"},qn=te({__name:"OcrConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("editorConfig",null),y=e.computed(()=>(r?.value??r)?.ocr?.[0]?.inputSchema??null),k=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(D,p)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[D]:p}})},F=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,D=>{if(!D||!t.value)return;const p=y.value,E=t.value.data.arguments||{},x={};p?.properties&&Object.entries(p.properties).forEach(([s,h])=>{h.default!==void 0&&(x[s]=h.default)}),o.updateNodeData(t.value.id,{arguments:{...x,...E}})},{immediate:!0}),(D,p)=>{const E=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),h=e.resolveComponent("el-form-item"),a=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",$n,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(x),e.createElementVNode("div",Fn,[p[2]||(p[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":k.value,onChange:p[0]||(p[0]=w=>L("threshold",w)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Gn={class:"config-header"},Hn={class:"config-section"},Pn=te({__name:"LicensePlateConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("editorConfig",null),y=e.computed(()=>(r?.value??r)?.license_plate?.[0]?.inputSchema??null),k=e.computed(()=>t.value?.data.arguments?.threshold??.5),L=(D,p)=>{if(!t.value)return;const E=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...E,[D]:p}})},F=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,D=>{if(!D||!t.value)return;const p=y.value,E=t.value.data.arguments||{},x={};p?.properties&&Object.entries(p.properties).forEach(([s,h])=>{h.default!==void 0&&(x[s]=h.default)}),o.updateNodeData(t.value.id,{arguments:{...x,...E}})},{immediate:!0}),(D,p)=>{const E=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input-number"),h=e.resolveComponent("el-form-item"),a=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Gn,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(x),e.createElementVNode("div",Hn,[p[2]||(p[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(a,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":k.value,onChange:p[0]||(p[0]=w=>L("threshold",w)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),jn={class:"config-header"},zn={class:"config-section"},Un={key:0,class:"config-section"},Ue=te({__name:"FaceConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("editorConfig",null),y=e.computed(()=>(r?.value??r)?.face?.faceRepos??[]),k=e.ref(null),L=e.computed(()=>({repositoryId:E.value})),F={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},D=e.computed(()=>t.value?.data.arguments?.threshold??.5),p=h=>t.value?.data.arguments?.[h],E=e.computed(()=>{const h=p("repositoryId");return h?Array.isArray(h)?h:[h]:[]}),x=(h,a)=>{if(!t.value)return;const w=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...w,[h]:a}})},s=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,h=>{if(!h||!t.value)return;const w=(r?.value??r)?.face?.faceParams?.[0]?.inputSchema??null,R=t.value.data.arguments||{},m={};w?.properties&&Object.entries(w.properties).forEach(([$,B])=>{B.default!==void 0&&(m[$]=B.default)}),o.updateNodeData(t.value.id,{arguments:{...m,...R}})},{immediate:!0}),(h,a)=>{const w=e.resolveComponent("el-button"),R=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),$=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form"),A=e.resolveComponent("el-option"),T=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[a[2]||(a[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(w,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(R),e.createElementVNode("div",zn,[a[3]||(a[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode($,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":D.value,onChange:a[0]||(a[0]=c=>x("threshold",c)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(f)==="task"?(e.openBlock(),e.createElementBlock("div",Un,[a[4]||(a[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(B,{model:L.value,rules:F,ref_key:"faceFormRef",ref:k,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode($,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(T,{"model-value":E.value,onChange:a[1]||(a[1]=c=>x("repositoryId",c)),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(y.value,c=>(e.openBlock(),e.createBlock(A,{key:c.id,label:c.name,value:c.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Wn={class:"config-header"},Jn={key:0,class:"config-section"},Yn={key:3,class:"array-input"},Xn={key:1,class:"config-section"},Qn=te({__name:"StreamConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),{schemaLoading:r,fetchSchemaForNodeType:y}=Ee(),k=e.computed(()=>{if(!t.value)return[];const s=t.value.data.input_schema||t.value.data.inputSchema;if(!s||!s.properties)return[];const h=s.required||[];return Object.entries(s.properties).map(([a,w])=>({key:a,type:w.type,label:w.title||w.label||w.description||a,description:w.description||"",default:w.default,required:h.includes(a)||w.required||!1,min:w.minimum!==void 0?w.minimum:w.min,max:w.maximum!==void 0?w.maximum:w.max,step:w.step,maxLength:w.maxLength,options:w.enum,optionLabels:w.enumLabels||w.enum,dependsOn:w.dependsOn,sort:w.sort})).sort((a,w)=>(a.sort??1/0)-(w.sort??1/0))}),L=s=>{if(t.value)return t.value.data.arguments?.[s]},F=(s,h)=>{if(!t.value)return;const w={...t.value.data.arguments||{},[s]:h};o.updateNodeData(t.value.id,{arguments:w})},D=s=>{if(!s.dependsOn||!t.value)return!0;const{field:h,value:a}=s.dependsOn,w=L(h);if(typeof a=="string"&&a.startsWith("!")){const R=a.substring(1);return w!==R}return Array.isArray(a)?a.includes(w):w===a},p=s=>{const h=L(s);return Array.isArray(h)?JSON.stringify(h):""},E=(s,h)=>{try{const a=JSON.parse(h);Array.isArray(a)&&F(s,a)}catch{}},x=()=>{t.value&&K.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 h=t.value.type,a=t.value.data,w=a.input_schema||a.inputSchema;if(w&&w.properties&&Object.keys(w.properties).length>0)return;const R=await y(h);if(!R)return;const m=t.value?.data;m&&o.updateNodeData(t.value.id,{...m,input_schema:R.inputSchema,extraConfig:R.extraConfig,arguments:{...R.arguments,...m.arguments}})},{immediate:!0}),(s,h)=>{const a=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),R=e.resolveComponent("el-icon"),m=e.resolveComponent("el-tooltip"),$=e.resolveComponent("el-option"),B=e.resolveComponent("el-select"),A=e.resolveComponent("el-switch"),T=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-input"),d=e.resolveComponent("el-form-item"),i=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Wn,[h[0]||(h[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(a,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:x},null,8,["icon"]))]),e.createVNode(w),k.value.length>0?(e.openBlock(),e.createElementBlock("div",Jn,[h[1]||(h[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,N=>e.withDirectives((e.openBlock(),e.createBlock(d,{key:N.key,required:N.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(N.label),1),N.description?(e.openBlock(),e.createBlock(m,{key:0,content:N.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(R,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[N.options&&N.type==="string"?(e.openBlock(),e.createBlock(B,{key:0,"model-value":L(N.key),onChange:g=>F(N.key,g),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(g,V)=>(e.openBlock(),e.createBlock($,{key:g,label:N.optionLabels?N.optionLabels[V]:g,value:g},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):N.type==="boolean"?(e.openBlock(),e.createBlock(A,{key:1,"model-value":L(N.key),onChange:g=>F(N.key,g)},null,8,["model-value","onChange"])):N.type==="number"||N.type==="integer"?(e.openBlock(),e.createBlock(T,{key:2,"model-value":L(N.key),onChange:g=>F(N.key,g),min:N.min,max:N.max,step:N.step||(N.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):N.type==="array"&&!N.options?(e.openBlock(),e.createElementBlock("div",Yn,[e.createVNode(c,{"model-value":p(N.key),onChange:g=>E(N.key,g),type:"textarea",rows:3,placeholder:N.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):N.type==="array"&&N.options?(e.openBlock(),e.createBlock(B,{key:4,"model-value":L(N.key),onChange:g=>F(N.key,g),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.options,(g,V)=>(e.openBlock(),e.createBlock($,{key:g,label:N.optionLabels?N.optionLabels[V]:g,value:g},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(c,{key:5,"model-value":L(N.key),onInput:g=>F(N.key,g),maxlength:N.maxLength,"show-word-limit":!!N.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!N.dependsOn||D(N)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(r)&&k.value.length===0?(e.openBlock(),e.createElementBlock("div",Xn,[...h[2]||(h[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),Kn={class:"config-header"},Zn={class:"config-section"},vn={key:0,class:"config-section"},ea={key:1,class:"config-section"},ta={key:0,class:"el-form-item__error"},oa={key:2,class:"config-section"},na={key:3,class:"config-section"},aa={key:4,class:"config-section"},la=te({__name:"DataSourceConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.inject("taskModeConfig",null),r=e.computed(()=>f==="task"),y=e.computed(()=>a("deviceType")??"camera"),k=e.computed(()=>{const d=o.nodes.find(N=>N.type===b.START);return d?.data?.streamType?d.data.streamType:(_?.value??_)?.streamType??"image"}),L=e.computed(()=>{const d=_?.value??_,i=t.value?.id;return d?.datasource?.getDevices?.(i)?.length??0}),F=()=>{const d=_?.value??_,i=t.value?.id,N=t.value?.data?.label??"",g=d?.datasource?.getDevices?.(i)??[],V=o.nodes.filter(z=>z.type===b.DATA_SOURCE).findIndex(z=>z.id===i),M=t.value?.data?.sourceGroupId??d?.datasource?.getSourceGroupIdByIndex?.(V)??i;d?.datasource?.onDeviceClick?.(i,N,M,g,y.value)},{fetchSchemaForNodeType:D}=Ee(),p=e.computed(()=>o.nodes.some(d=>d.type===b.SMALL_MODEL)),E=e.computed(()=>o.getDataSourceCount()>=2),x=e.computed(()=>!o.supportPatrol()),s=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),h=e.computed(()=>{if(!t.value)return[];const d=t.value.data.input_schema||t.value.data.inputSchema;if(!d||!d.properties)return[];const i=d.required||[];return Object.entries(d.properties).map(([N,g])=>({key:N,type:g.type,label:g.title||g.label||g.description||N,description:g.description||"",default:g.default,required:i.includes(N)||g.required||!1,min:g.minimum!==void 0?g.minimum:g.min,max:g.maximum!==void 0?g.maximum:g.max,step:g.step,maxLength:g.maxLength,options:g.enum,optionLabels:g.enumLabels||g.enum,dependsOn:g.dependsOn}))}),a=d=>{if(t.value)return t.value.data.arguments?.[d]},w=e.computed(()=>!!a("enableImageSequence")),R=e.computed(()=>!!a("needCooperativeDetection")),m=(d,i)=>{if(!t.value)return;const g={...t.value.data.arguments||{},[d]:i};o.updateNodeData(t.value.id,{arguments:g})},$=async d=>{if(!t.value)return;if(o.edges.some(N=>N.source===t.value.id))try{await K.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(g=>g.source===t.value.id).forEach(g=>{o.removeEdge(g.id)}),d&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:d}),m("enableImageSequence",d),d&&o.initializeSubsequentFrames(t.value.id)}catch{return}else d&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:d}),m("enableImageSequence",d),d&&o.initializeSubsequentFrames(t.value.id)},B=d=>{t.value&&(d&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),m("enableImageSequence",!1),m("enablePatrol",!1)),m("needCooperativeDetection",d))};e.watch(k,d=>{d==="stream"&&t.value&&a("deviceType")==="1400"&&m("deviceType","camera")},{immediate:!0});const A=e.computed(()=>r.value&&y.value==="camera"&&k.value!=="stream"&&o.supportPatrol());e.watch(A,d=>{!d&&t.value&&a("enablePatrol")&&m("enablePatrol",!1)}),e.watch(L,d=>{d>0&&a("enablePatrol")&&(a("patrolGroupSize")??1)>d&&m("patrolGroupSize",d)});const T=d=>{if(!d.dependsOn||!t.value)return!0;const{field:i,value:N}=d.dependsOn,g=a(i);if(typeof N=="string"&&N.startsWith("!")){const V=N.substring(1);return g!==V}return Array.isArray(N)?N.includes(g):g===N},c=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async d=>{if(!d||!t.value)return;const i=t.value.type,N=t.value.data;if(i==="dataSource"&&r.value){const z=N.arguments||{},q={},G=o.nodes.some(P=>P.type===b.SMALL_MODEL);z.mode===void 0&&(q.mode=G?3:0),z.interval===void 0&&(q.interval=30),k.value==="stream"&&z.sw_decoding===void 0&&(q.sw_decoding="CPU"),Object.keys(q).length>0&&o.updateNodeData(d,{arguments:{...z,...q}})}const g=N.input_schema||N.inputSchema;if(i==="dataSource"&&g&&g.properties&&!g.properties.windowSeconds){g.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},N.arguments.windowSeconds||o.updateNodeData(t.value.id,{...N,input_schema:g,arguments:{...N.arguments,windowSeconds:5}});return}if(g&&g.properties&&Object.keys(g.properties).length>0)return;const V=await D(i);if(!V)return;const M=t.value?.data;M&&o.updateNodeData(t.value.id,{...M,input_schema:V.inputSchema,extraConfig:V.extraConfig,arguments:{...V.arguments,...M.arguments}})},{immediate:!0}),(d,i)=>{const N=e.resolveComponent("el-button"),g=e.resolveComponent("el-divider"),V=e.resolveComponent("el-icon"),M=e.resolveComponent("el-tooltip"),z=e.resolveComponent("el-option"),q=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),P=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),u=e.resolveComponent("el-form-item"),O=e.resolveComponent("el-form"),H=e.resolveComponent("el-radio"),U=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Kn,[i[11]||(i[11]=e.createElementVNode("h3",null,"节点配置",-1)),r.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(N,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode(g),e.createElementVNode("div",Zn,[i[12]||(i[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,n=>e.withDirectives((e.openBlock(),e.createBlock(u,{key:n.key,required:n.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(n.label),1),n.description?(e.openBlock(),e.createBlock(M,{key:0,content:n.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(V,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[n.options&&n.type==="string"?(e.openBlock(),e.createBlock(q,{key:0,"model-value":a(n.key),onChange:C=>m(n.key,C),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,(C,S)=>(e.openBlock(),e.createBlock(z,{key:C,label:n.optionLabels?n.optionLabels[S]:C,value:C},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):n.type==="boolean"?(e.openBlock(),e.createBlock(M,{key:1,content:r.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":n.key==="needCooperativeDetection"&&w.value?"已开启图片时序,无法同时开启协同检测":n.key==="enableImageSequence"&&R.value?"已开启协同检测,无法同时开启图片时序":n.key==="enableImageSequence"&&E.value?"多数据源场景下不允许开启图片时序":"",disabled:!(r.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence"))&&!(n.key==="needCooperativeDetection"&&w.value)&&!(n.key==="enableImageSequence"&&R.value)&&!(n.key==="enableImageSequence"&&E.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":a(n.key),disabled:r.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")||n.key==="needCooperativeDetection"&&w.value||n.key==="enableImageSequence"&&R.value||n.key==="enableImageSequence"&&E.value,onChange:C=>n.key==="enableImageSequence"?$(C):n.key==="needCooperativeDetection"?B(C):m(n.key,C)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):n.type==="number"||n.type==="integer"?(e.openBlock(),e.createBlock(P,{key:2,"model-value":a(n.key),onChange:C=>m(n.key,C),min:n.min,max:n.max,step:n.step||(n.type==="integer"?1:.1),precision:n.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":a(n.key),onInput:C=>m(n.key,C),maxlength:n.maxLength,"show-word-limit":!!n.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!n.dependsOn||T(n)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",vn,[i[13]||(i[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":t.value?.data.branchLogic||"and",disabled:r.value,onChange:i[0]||(i[0]=n=>e.unref(o).updateNodeData(t.value.id,{branchLogic:n})),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})])),r.value?(e.openBlock(),e.createElementBlock("div",ea,[i[16]||(i[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(U,{"model-value":a("deviceType")??"camera",onChange:i[1]||(i[1]=n=>m("deviceType",n))},{default:e.withCtx(()=>[e.createVNode(H,{value:"camera"},{default:e.withCtx(()=>[...i[14]||(i[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(H,{value:"1400",disabled:k.value==="stream"},{default:e.withCtx(()=>[...i[15]||(i[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(u,{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:F},null,8,["model-value","class"]),L.value===0?(e.openBlock(),e.createElementBlock("div",ta,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),r.value&&y.value==="1400"?(e.openBlock(),e.createElementBlock("div",oa,[i[19]||(i[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(U,{"model-value":a("detectionMode")??"platform",onChange:i[2]||(i[2]=n=>m("detectionMode",n))},{default:e.withCtx(()=>[e.createVNode(H,{value:"platform"},{default:e.withCtx(()=>[...i[17]||(i[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(H,{value:"device"},{default:e.withCtx(()=>[...i[18]||(i[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),r.value&&y.value==="camera"&&k.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",na,[i[21]||(i[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(M,{disabled:!x.value,content:s.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":x.value?!1:a("enablePatrol"),disabled:x.value,onChange:i[3]||(i[3]=n=>m("enablePatrol",n))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),a("enablePatrol")?(e.openBlock(),e.createBlock(u,{key:0},{label:e.withCtx(()=>[i[20]||(i[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(M,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(V,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(P,{"model-value":a("patrolGroupSize")??1,onChange:i[4]||(i[4]=n=>m("patrolGroupSize",n)),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),r.value&&y.value==="camera"?(e.openBlock(),e.createElementBlock("div",aa,[i[22]||(i[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"抽帧策略"},{default:e.withCtx(()=>[k.value==="image"?(e.openBlock(),e.createBlock(q,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(z,{label:"按时间间隔抽帧",value:0})]),_:1})):p.value?(e.openBlock(),e.createBlock(q,{key:1,"model-value":a("mode")??3,onChange:i[5]||(i[5]=n=>{m("mode",n),n===1&&m("interval",p.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(q,{key:2,"model-value":a("mode")??0,onChange:i[6]||(i[6]=n=>{m("mode",n),n===0&&m("interval",30),n===1&&m("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}),k.value==="image"||k.value==="stream"&&(a("mode")??0)===0?(e.openBlock(),e.createBlock(u,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":a("interval")??30,onChange:i[7]||(i[7]=n=>m("interval",n)),min:1,max:k.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),k.value==="stream"&&(a("mode")??0)===1?(e.openBlock(),e.createBlock(u,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[p.value?(e.openBlock(),e.createBlock(P,{key:0,"model-value":a("interval")??5,onChange:i[8]||(i[8]=n=>m("interval",n)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(q,{key:1,"model-value":a("interval")??25,onChange:i[9]||(i[9]=n=>m("interval",n)),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),k.value==="stream"?(e.openBlock(),e.createBlock(u,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":a("sw_decoding")??"CPU",onChange:i[10]||(i[10]=n=>m("sw_decoding",n)),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"]]),ra={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},We=(l=null)=>{const o=e.ref(l||[]),t=e.ref(!1),f=e.ref(null),_=e.ref(""),r=async(x=!1)=>{if(l){o.value=l;return}},y=async()=>{o.value=[],await r(!0)},k=x=>o.value.find(s=>s.id===x||s.title===x),L=x=>{const s=k(x);if(!s)return{};const h=s.inputSchema||s.input_schema;if(!h||!h.properties)return{};const a={};return Object.entries(h.properties).forEach(([w,R])=>{R.default!==void 0&&(a[w]=R.default)}),a},F=x=>{const s=k(x);if(!s)return[];const h=s.inputSchema||s.input_schema;if(!h||!h.properties)return[];const a=h.required||[];return Object.entries(h.properties).map(([w,R])=>({key:w,type:R.type,label:R.title||R.description||w,description:R.description||"",default:R.default,required:a.includes(w)||R.required||!1,min:R.minimum,max:R.maximum,step:R.step,options:R.enum,optionLabels:R.enumLabels||R.enum,dependsOn:R.dependsOn}))},D=e.computed(()=>{if(!_.value)return o.value;const x=_.value.toLowerCase();return o.value.filter(s=>s.name?.toLowerCase().includes(x)||s.type?.toLowerCase().includes(x)||s.title?.toLowerCase().includes(x)||s.description&&s.description.toLowerCase().includes(x)||p(s.type).toLowerCase().includes(x))}),p=x=>ra[x]||x;return{models:o,loading:t,error:f,searchKeyword:_,filteredModels:D,loadSmallModels:r,reloadSmallModels:y,getModelConfig:k,getTypeLabel:p,getDefaultArguments:L,getSchemaFields:F,validateArguments:(x,s)=>{const h=k(x);if(!h)return{valid:!1,errors:["模型不存在"]};const a=[],w=h.inputSchema||h.input_schema;return!w||!w.properties?{valid:!0,errors:[]}:(Object.entries(w.properties).forEach(([R,m])=>{const $=s[R];if(m.required&&($==null||$==="")){a.push(`${m.title||R} 为必填项`);return}if($!=null&&(m.type==="number"||m.type==="integer")){if(typeof $!="number"){a.push(`${m.title||R} 必须是数字`);return}m.minimum!==void 0&&$<m.minimum&&a.push(`${m.title||R} 不能小于 ${m.minimum}`),m.maximum!==void 0&&$>m.maximum&&a.push(`${m.title||R} 不能大于 ${m.maximum}`)}}),{valid:a.length===0,errors:a})}}},sa={class:"small-model-selector"},ia={key:0,class:"loading-state"},ca={key:1,class:"error-state"},da={key:2,class:"model-list"},ma=["onClick"],pa={class:"model-header"},ua={class:"model-name"},fa={class:"model-description"},ga={class:"model-meta"},ha={key:3,class:"empty-state"},ya=te({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(l,{emit:o}){const t=l,f=o,{loading:_,error:r,searchKeyword:y,filteredModels:k,loadSmallModels:L,reloadSmallModels:F,getTypeLabel:D}=We(t.externalModels),p=s=>{f("update:modelValue",s.id),f("select",s)},E=()=>{F()},x=s=>({safety:"warning",security:"danger",traffic:"info"})[s]||"info";return e.onMounted(()=>{t.externalModels||L()}),(s,h)=>{const a=e.resolveComponent("el-input"),w=e.resolveComponent("el-icon"),R=e.resolveComponent("el-button"),m=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",sa,[e.createVNode(a,{modelValue:e.unref(y),"onUpdate:modelValue":h[0]||(h[0]=$=>e.isRef(y)?y.value=$:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(X.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(_)?(e.openBlock(),e.createElementBlock("div",ia,[e.createVNode(w,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),h[2]||(h[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(r)?(e.openBlock(),e.createElementBlock("div",ca,[e.createVNode(w,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(r)),1),e.createVNode(R,{type:"primary",onClick:E},{default:e.withCtx(()=>[...h[3]||(h[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(k).length>0?(e.openBlock(),e.createElementBlock("div",da,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(k),$=>(e.openBlock(),e.createElementBlock("div",{key:$.id,class:e.normalizeClass(["model-item",{selected:l.modelValue===$.id}]),onClick:B=>p($)},[e.createElementVNode("div",pa,[e.createElementVNode("div",ua,[e.createVNode(w,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString($.name),1)]),e.createVNode(m,{type:x($.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(D)($.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",fa,e.toDisplayString($.description),1),e.createElementVNode("div",ga,[$.supportDirectAlert?(e.openBlock(),e.createBlock(m,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...h[4]||(h[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ma))),128))])):(e.openBlock(),e.createElementBlock("div",ha,[e.createVNode(w,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),h[6]||(h[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(R,{text:"",onClick:h[1]||(h[1]=$=>y.value="")},{default:e.withCtx(()=>[...h[5]||(h[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),_a={class:"position-tooltip"},we=te({__name:"PositionTooltip",setup(l){return(o,t)=>(e.openBlock(),e.createElementBlock("div",_a,[...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"]]),Na={class:"config-header"},Ca={class:"config-section"},ka={key:0,class:"model-selector-wrapper"},ba={key:1,class:"selected-model-info"},xa={class:"model-info-header"},Ea={class:"model-info-name"},wa={class:"model-info-description"},Ta={key:0,class:"config-section"},Sa={key:3,class:"array-input"},Va="检测到事件后,连续两次告警上报的时间间隔",Ba=te({__name:"SmallModelConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=e.inject("editorConfig",null),y=e.computed(()=>(r?.value??r)?.smallModels??null),{models:k}=We(y.value),L=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),F={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},D=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||[],T=t.value.data.title||"";return Object.entries(B.properties).filter(([c])=>L.has(c)).map(([c,d])=>{const i={key:c,type:d.type,label:d.title||d.label||d.description||c,description:d.description||"",default:d.default,required:A.includes(c)||d.required||!1,min:d.minimum!==void 0?d.minimum:d.min,max:d.maximum!==void 0?d.maximum:d.max,step:d.step,maxLength:d.maxLength,options:d.enum,optionLabels:d.enumLabels||d.enum,dependsOn:d.dependsOn,sort:d.sort};return c==="interval"&&(i.label="告警间隔(秒)",i.description=F[T]||Va,i.isInterval=!0,i.default=i.default!=null?i.default/1e3:10,i.min=i.min!=null?i.min/1e3:1,i.max=i.max!=null?i.max/1e3:void 0,i.step=1,i.precision=0),c==="threshold"&&(i.label="小模型阈值",i.step=.01,i.precision=2),c==="targetWidth"&&(i.label="最小目标宽度",i.default=60,i.min=20,i.max=1920,i.step=1,i.precision=0),c==="targetHeight"&&(i.label="最小目标高度",i.default=60,i.min=20,i.max=1080,i.step=1,i.precision=0),c==="topScale"&&(i.label="调整目标框高度比例 (上)",i.max=10,i.step=.1,i.precision=1),c==="bottomScale"&&(i.label="调整目标框高度比例 (下)",i.max=10,i.step=.1,i.precision=1),c==="leftScale"&&(i.label="调整目标框宽度比例 (左)",i.max=10,i.step=.1,i.precision=1),c==="rightScale"&&(i.label="调整目标框宽度比例 (右)",i.max=10,i.step=.1,i.precision=1),c==="x_ratio"&&(i.label="X轴位置信息",i.step=.01,i.precision=2),c==="y_ratio"&&(i.label="Y轴位置信息",i.step=.01,i.precision=2),c==="targetDuration"&&(i.label="目标持续时间(秒)",i.default=i.default!=null?i.default/1e3:1,i.min=i.min!=null?i.min/1e3:1,i.max=i.max!=null?i.max/1e3:void 0,i.step=.01,i.precision=2),c==="overloadNumber"&&(i.precision=0),c==="targetNumber"&&(i.precision=0),i}).filter(c=>!["areas","darwin","direction","lines"].includes(c.key)).filter(c=>!(c.key==="targetDuration"&&T==="NonMotorCounter")).sort((c,d)=>(c.sort??1/0)-(d.sort??1/0))}),p=["interval","targetDuration"],E=B=>{if(!t.value)return;const A=t.value.data.arguments?.[B];return p.includes(B)&&A!=null?A/1e3:A},x=(B,A)=>{if(!t.value)return;let T=A;p.includes(B)&&A!=null&&(T=A*1e3);const d={...t.value.data.arguments||{},[B]:T};o.updateNodeData(t.value.id,{arguments:d})},s=B=>{if(!B.dependsOn||!t.value)return!0;const{field:A,value:T}=B.dependsOn,c=E(A);if(typeof T=="string"&&T.startsWith("!")){const d=T.substring(1);return c!==d}return Array.isArray(T)?T.includes(c):c===T},h=B=>{const A=E(B);return Array.isArray(A)?JSON.stringify(A):""},a=(B,A)=>{try{const T=JSON.parse(A);Array.isArray(T)&&x(B,T)}catch{}},w=async B=>{if(!t.value)return;const A=B.inputSchema||B.input_schema||{},T={};A.properties&&Object.entries(A.properties).forEach(([c,d])=>{d.default!==void 0&&(T[c]=d.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:A,extraConfig:B.extraConfig,supportDirectAlert:B.supportDirectAlert||!1,arguments:T})},R=()=>{t.value&&K.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?k.value.find(A=>A.id===t.value.data.modelId)?.description||"暂无描述":"",$=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(B,A)=>{const T=e.resolveComponent("el-button"),c=e.resolveComponent("el-divider"),d=e.resolveComponent("el-icon"),i=e.resolveComponent("el-tag"),N=e.resolveComponent("el-tooltip"),g=e.resolveComponent("el-option"),V=e.resolveComponent("el-select"),M=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-input"),G=e.resolveComponent("el-text"),P=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Na,[A[0]||(A[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:$},null,8,["icon"]))]),e.createVNode(c),e.createElementVNode("div",Ca,[A[3]||(A[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!_.value?(e.openBlock(),e.createElementBlock("div",ka,[e.createVNode(ya,{"model-value":t.value?.data.modelId,"external-models":y.value,onSelect:w},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",ba,[e.createElementVNode("div",xa,[e.createElementVNode("div",Ea,[e.createVNode(d,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"text",text:"",size:"small",onClick:R},{default:e.withCtx(()=>[...A[1]||(A[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",wa,e.toDisplayString(m()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(i,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...A[2]||(A[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ta,[A[4]||(A[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(Y,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,u=>e.withDirectives((e.openBlock(),e.createBlock(P,{key:u.key,required:u.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(u.label),1),u.key==="x_ratio"||u.key==="y_ratio"?(e.openBlock(),e.createBlock(N,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(we)]),default:e.withCtx(()=>[e.createVNode(d,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):u.description?(e.openBlock(),e.createBlock(N,{key:1,content:u.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(d,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[u.options&&u.type==="string"?(e.openBlock(),e.createBlock(V,{key:0,"model-value":E(u.key),onChange:O=>x(u.key,O),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.options,(O,H)=>(e.openBlock(),e.createBlock(g,{key:O,label:u.optionLabels?u.optionLabels[H]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):u.type==="boolean"?(e.openBlock(),e.createBlock(M,{key:1,"model-value":E(u.key),onChange:O=>x(u.key,O)},null,8,["model-value","onChange"])):u.type==="number"||u.type==="integer"||u.type==="float"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":E(u.key),onChange:O=>x(u.key,O),min:u.min,max:u.max,step:u.step||(u.type==="integer"||u.type==="number"?1:.01),precision:u.precision??(u.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):u.type==="array"&&!u.options?(e.openBlock(),e.createElementBlock("div",Sa,[e.createVNode(q,{"model-value":h(u.key),onChange:O=>a(u.key,O),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(u.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):u.type==="array"&&u.options?(e.openBlock(),e.createBlock(V,{key:4,"model-value":E(u.key),onChange:O=>x(u.key,O),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.options,(O,H)=>(e.openBlock(),e.createBlock(g,{key:O,label:u.optionLabels?u.optionLabels[H]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(q,{key:5,"model-value":E(u.key),onInput:O=>x(u.key,O)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!u.dependsOn||s(u)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Aa=(l=null)=>{const o=ae(),t=e.ref(l?l.map(p=>xe.backendToFrontend(p)):[]),f=e.ref(!1),_=e.ref(null),r=async(p=!1)=>{if(l){t.value=l.map(E=>xe.backendToFrontend(E));return}},y=p=>t.value.find(E=>E.title===p)||null,k=p=>{const E=y(p);return E?{targetId:E.title,targetName:E.label,threshold:E.data.threshold||.5,targetWidth:E.data.targetWidth||20,targetHeight:E.data.targetHeight||20,postmodel:E.data.postmodel||"ClipVit",areas:E.data.areas||[],expandRect:E.data.expandRect!==void 0?E.data.expandRect:!1,topScale:E.data.topScale||1.6,bottomScale:E.data.bottomScale||1.6,leftScale:E.data.leftScale||1.6,rightScale:E.data.rightScale||1.6,enableStructure:E.data.enableStructure}:{}},L=(p=null)=>o.nodes.filter(E=>E.type==="detectionTarget"&&E.id!==p).map(E=>({value:E.id,label:E.data.targetName||E.data.label})),F=(p=null)=>{const E=[{value:"original",label:"原图"}],x=L(p);return[...E,...x]},D=e.computed(()=>t.value.map(p=>({value:p.title,label:p.label,...p})));return{detectionTargets:t,loading:f,error:_,loadDetectionTargets:r,getTargetById:y,getDefaultConfig:k,getDetectionTargetNodes:L,getDetectionScopeOptions:F,getTargetOptions:D}},Da={class:"paired-array-input"},Te=te({__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=(D,p)=>{let E;return(...x)=>{clearTimeout(E),E=setTimeout(()=>D(...x),p)}},f=l,_=o,r=e.ref([]),y=()=>{const D=f.primaryValue||[],p=f.pairedValue||[],E=Math.max(D.length,p.length,1);r.value=Array.from({length:E},(x,s)=>({primary:D[s]||"",paired:p[s]!==void 0?p[s]:f.pairedField.default?.[0]||.5}))};e.watch(()=>[f.primaryValue,f.pairedValue],()=>{y()},{immediate:!0,deep:!0});const k=t((D,p)=>{_("update",D,p)},300);e.watch(r,D=>{const p=D.map(x=>x.primary),E=D.map(x=>x.paired);k(p,E)},{deep:!0});const L=()=>{r.value.length>=10||r.value.push({primary:"",paired:f.pairedField.default?.[0]||.5})},F=D=>{r.value.length>1&&r.value.splice(D,1)};return(D,p)=>{const E=e.resolveComponent("el-input"),x=e.resolveComponent("el-input-number"),s=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Da,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,(h,a)=>(e.openBlock(),e.createElementBlock("div",{key:a,class:"input-row"},[e.createVNode(E,{modelValue:r.value[a].primary,"onUpdate:modelValue":w=>r.value[a].primary=w,placeholder:l.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!r.value[a].primary||r.value[a].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(x,{modelValue:r.value[a].paired,"onUpdate:modelValue":w=>r.value[a].paired=w,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(X.Delete),circle:"",size:"small",disabled:r.value.length===1,onClick:w=>F(a)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(s,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:r.value.length>=10,onClick:L},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(l.primaryField.label)+e.toDisplayString(r.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),La={class:"config-header"},Oa={class:"config-section"},Ma={class:"flex items-center justify-between"},Ia={key:0,class:"config-section"},Ra={key:1,class:"config-section"},$a={key:2,class:"config-section"},Fa={class:"device-list"},qa=["onClick"],Ga={class:"device-name"},Ha={key:0,class:"device-list-empty"},Pa={key:4,class:"array-input"},ja={key:4,class:"array-input"},za=te({__name:"DetectionTargetConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f==="task"),r=e.inject("taskModeConfig",null),y=e.inject("echoAlgodata",null),k=e.inject("echoTaskData",null),L=e.computed(()=>{if(!t.value)return null;const u=new Set,O=[t.value.id];for(;O.length;){const H=O.shift();if(u.has(H))continue;u.add(H);const U=o.edges.filter(n=>n.target===H);for(const n of U){const C=o.nodes.find(S=>S.id===n.source);if(C){if(C.type==="dataSource")return C.id;O.push(C.id)}}}return null}),F=e.computed(()=>{const u=L.value;return u?(r?.value??r)?.datasource?.getDevices?.(u)??[]:[]}),D=e.computed(()=>_.value&&F.value.length>0),p=e.ref(""),E=e.ref(""),x=e.computed(()=>{const u=E.value.trim().toLowerCase();return u?F.value.filter(O=>(O.sourceName??O.name??String(O.sourceId??O.id??O)).toLowerCase().includes(u)):F.value}),s=e.computed(()=>{const u={},O=L.value,H=t.value?.id;if(!O||!H)return u;const U={...t.value?.data?.arguments??{}};delete U.configMode;for(const n of F.value){const C=String(n.sourceId??n.id??n),S=o.getTaskSourceArguments(O,C,H);if(S===null){u[C]=!1;continue}const j=new Set([...Object.keys(S),...Object.keys(U)]);let J=!1;for(const W of j)if(JSON.stringify(S[W])!==JSON.stringify(U[W])){J=!0;break}u[C]=J}return u});e.watch([F,()=>t.value?.data?.arguments?.configMode],([u])=>{u.length>0?p.value=String(u[0]?.sourceId??u[0]?.id??u[0]):p.value=""},{immediate:!0});const h=(u,O=null)=>{if(O){const C=((k?.value??k)?.graph?.sources??[]).find(S=>String(S.sourceId)===String(O));if(C?.branches)for(const S of C.branches){const j=S.nodes?.find(J=>J.toolTitle===u);if(j?.arguments)return{...j.arguments}}return null}const H=y?.value??y;if(!H?.branches)return null;for(const U of H.branches){const n=U.nodes?.find(C=>C.toolTitle===u);if(n?.arguments)return{...n.arguments}}return null},a=u=>{const O=L.value,H=t.value?.id;if(!O||!H||!u||o.getTaskSourceArguments(O,u,H)!==null)return;const U=t.value?.data?.targetId,n=U?h(U,u):null,C=t.value?.data?.arguments??{},S={...n??C};delete S.configMode,o.setTaskSourceArguments(O,u,H,S)};e.watch(p,u=>{u&&t.value?.data?.arguments?.configMode==="perDevice"&&a(u)}),e.watch(()=>t.value?.data?.arguments?.configMode,u=>{u==="perDevice"&&p.value&&a(p.value)});const w=e.inject("editorConfig",null),R=e.computed(()=>(w?.value??w)?.detection??null),{detectionTargets:m,loading:$}=Aa(R.value),B=e.computed(()=>{if(!t.value)return[];const u=t.value.data.input_schema||t.value.data.inputSchema;if(!u||!u.properties)return[];const O=u.required||[];return Object.entries(u.properties).map(([H,U])=>({key:H,type:U.type,label:U.title||U.label||U.description||H,description:U.description||"",default:U.default,required:O.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,"x-component":U["x-component"],"x-paired-with":U["x-paired-with"],sort:U.sort})).sort((H,U)=>(H.sort??1/0)-(U.sort??1/0))}),A=u=>u.type==="array"&&u["x-component"]==="paired-array"&&u["x-paired-with"],T=u=>{const O=u["x-paired-with"];return B.value.find(H=>H.key===O)},c={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}},d=new Set(Object.keys(c)),i=e.computed(()=>{const u=t.value?.data.targetId,O=new Set;return B.value.forEach(H=>{H["x-paired-with"]&&O.add(H["x-paired-with"])}),B.value.filter(H=>u==="traffic_accident"?H.key==="threshold":d.has(H.key)&&!O.has(H.key)&&!A(H)).map(H=>{const U=c[H.key]||{};return{...H,label:U.label||H.label,description:U.description||H.description,min:U.min??H.min,max:U.max??H.max,step:U.step??H.step,precision:U.precision,default:U.default??H.default}})}),N=e.computed(()=>B.value.filter(u=>A(u))),g=u=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const H=L.value,U=o.getTaskSourceArguments(H,p.value,t.value.id);if(U!==null)return U[u]}return t.value.data.arguments?.[u]},V=(u,O)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(u!=="configMode"&&H==="perDevice"&&p.value){const C=L.value;o.updateTaskSourceArgument(C,p.value,t.value.id,u,O);return}const n={...t.value.data.arguments||{},[u]:O};o.updateNodeData(t.value.id,{arguments:n})},M=u=>{if(!u.dependsOn||!t.value)return!0;const{field:O,value:H}=u.dependsOn,U=g(O);if(typeof H=="string"&&H.startsWith("!")){const n=H.substring(1);return U!==n}return Array.isArray(H)?H.includes(U):U===H},z=u=>{const O=g(u);return Array.isArray(O)?JSON.stringify(O):""},q=(u,O)=>{try{const H=JSON.parse(O);Array.isArray(H)&&V(u,H)}catch{}},G=(u,O,H,U)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const j=L.value;o.updateTaskSourceArgument(j,p.value,t.value.id,u,O),o.updateTaskSourceArgument(j,p.value,t.value.id,H,U);return}const S={...t.value.data.arguments||{},[u]:O,[H]:U};o.updateNodeData(t.value.id,{arguments:S})},P=async u=>{if(!t.value||!u)return;const O=m.value.find(S=>S.title===u);if(!O)return;let H=O.inputSchema||O.input_schema||{};if(u==="other"){const S={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,...S.properties}}}const U={};H.properties&&Object.entries(H.properties).forEach(([S,j])=>{j.default!==void 0&&(U[S]=j.default)});const n=t.value.data,C={...U,target_class:O.title};o.updateNodeData(t.value.id,{...n,targetId:O.title,targetName:O.label,label:O.label,input_schema:H,inputSchema:H,extraConfig:O.extraConfig,arguments:C})},Y=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,u=>{if(!u||!t.value)return;const O=m.value.find(n=>n.title===u);if(!O)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const U={...O.defaultArguments,...H.arguments,target_class:O.title};o.updateNodeData(t.value.id,{...H,input_schema:O.inputSchema,arguments:U})}),(u,O)=>{const H=e.resolveComponent("el-button"),U=e.resolveComponent("el-divider"),n=e.resolveComponent("el-option"),C=e.resolveComponent("el-select"),S=e.resolveComponent("el-form-item"),j=e.resolveComponent("el-form"),J=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group"),v=e.resolveComponent("el-icon"),ne=e.resolveComponent("el-tooltip"),se=e.resolveComponent("el-input"),me=e.resolveComponent("el-switch"),oe=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",La,[O[2]||(O[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(H,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(U),e.createElementVNode("div",Oa,[O[3]||(O[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(S,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(C,{"model-value":t.value?.data.targetId,disabled:_.value,onChange:P,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref($),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(m),I=>(e.openBlock(),e.createBlock(n,{key:I.title,label:I.label,value:I.title},{default:e.withCtx(()=>[e.createElementVNode("div",Ma,[e.createElementVNode("span",null,e.toDisplayString(I.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),D.value?(e.openBlock(),e.createElementBlock("div",Ia,[O[6]||(O[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(S,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:O[0]||(O[0]=I=>V("configMode",I))},{default:e.withCtx(()=>[e.createVNode(J,{value:"unified"},{default:e.withCtx(()=>[...O[4]||(O[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(J,{value:"perDevice"},{default:e.withCtx(()=>[...O[5]||(O[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),N.value.length>0?(e.openBlock(),e.createElementBlock("div",Ra,[O[7]||(O[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(j,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,I=>(e.openBlock(),e.createBlock(S,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.description?(e.openBlock(),e.createBlock(ne,{key:0,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(v,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Te,{"primary-field":I,"paired-field":T(I),"primary-value":g(I.key),"paired-value":g(I["x-paired-with"]),onUpdate:(Q,le)=>G(I.key,Q,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",$a,[O[9]||(O[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&F.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(se,{modelValue:E.value,"onUpdate:modelValue":O[1]||(O[1]=I=>E.value=I),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(v,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Fa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,I=>(e.openBlock(),e.createElementBlock("div",{key:String(I.sourceId??I.id??I),class:e.normalizeClass(["device-list-item",{"is-active":p.value===String(I.sourceId??I.id??I),"has-custom":s.value[String(I.sourceId??I.id??I)]}]),onClick:Q=>p.value=String(I.sourceId??I.id??I)},[e.createElementVNode("span",Ga,e.toDisplayString(I.sourceName??I.name??String(I.sourceId??I.id??I)),1),s.value[String(I.sourceId??I.id??I)]?(e.openBlock(),e.createBlock(ne,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...O[8]||(O[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,qa))),128)),x.value.length===0?(e.openBlock(),e.createElementBlock("div",Ha," 无匹配设备 ")):e.createCommentVNode("",!0)]),p.value?(e.openBlock(),e.createBlock(j,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,I=>e.withDirectives((e.openBlock(),e.createBlock(S,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.key==="y_ratio"?(e.openBlock(),e.createBlock(ne,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(we)]),default:e.withCtx(()=>[e.createVNode(v,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(ne,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(v,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(C,{key:0,"model-value":g(I.key),onChange:Q=>V(I.key,Q),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(Q,le)=>(e.openBlock(),e.createBlock(n,{key:Q,label:I.optionLabels?I.optionLabels[le]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(me,{key:1,"model-value":g(I.key),onChange:Q=>V(I.key,Q)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(oe,{key:2,"model-value":g(I.key),onChange:Q=>V(I.key,Q),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"])):A(I)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":I,"paired-field":T(I),"primary-value":g(I.key),"paired-value":g(I["x-paired-with"]),onUpdate:(Q,le)=>G(I.key,Q,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Pa,[e.createVNode(se,{"model-value":z(I.key),onChange:Q=>q(I.key,Q),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(C,{key:5,"model-value":g(I.key),onChange:Q=>V(I.key,Q),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(Q,le)=>(e.openBlock(),e.createBlock(n,{key:Q,label:I.optionLabels?I.optionLabels[le]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":g(I.key),onInput:Q=>V(I.key,Q),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||M(I)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(j,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,I=>e.withDirectives((e.openBlock(),e.createBlock(S,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.key==="y_ratio"?(e.openBlock(),e.createBlock(ne,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(we)]),default:e.withCtx(()=>[e.createVNode(v,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(ne,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(v,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(C,{key:0,"model-value":g(I.key),onChange:Q=>V(I.key,Q),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(Q,le)=>(e.openBlock(),e.createBlock(n,{key:Q,label:I.optionLabels?I.optionLabels[le]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(me,{key:1,"model-value":g(I.key),onChange:Q=>V(I.key,Q)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(oe,{key:2,"model-value":g(I.key),onChange:Q=>V(I.key,Q),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"])):A(I)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":I,"paired-field":T(I),"primary-value":g(I.key),"paired-value":g(I["x-paired-with"]),onUpdate:(Q,le)=>G(I.key,Q,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",ja,[e.createVNode(se,{"model-value":z(I.key),onChange:Q=>q(I.key,Q),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(C,{key:5,"model-value":g(I.key),onChange:Q=>V(I.key,Q),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(Q,le)=>(e.openBlock(),e.createBlock(n,{key:Q,label:I.optionLabels?I.optionLabels[le]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":g(I.key),onInput:Q=>V(I.key,Q),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||M(I)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ua={class:"config-header"},Wa={class:"config-section"},Ja={key:0,style:{"margin-bottom":"8px"}},Ya=te({__name:"TargetCountConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=D=>{if(!t.value)return;const p={...t.value.data.arguments,conditionRelation:D};o.updateNodeData(t.value.id,{arguments:p})},y=()=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],E={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:E})},k=(D,p,E)=>{if(!t.value)return;const x=[...t.value.data.arguments?.alertConditions||[]];x[D]={...x[D],[p]:E};const s={...t.value.data.arguments,alertConditions:x};o.updateNodeData(t.value.id,{arguments:s})},L=D=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[]];p.splice(D,1);const E={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:E})},F=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(D,p)=>{const E=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),s=e.resolveComponent("el-text"),h=e.resolveComponent("el-option"),a=e.resolveComponent("el-select"),w=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-radio"),m=e.resolveComponent("el-radio-group"),$=e.resolveComponent("el-form-item"),B=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ua,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(E,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(x),e.createElementVNode("div",Wa,[p[9]||(p[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(B,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode($,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||[],(A,T)=>(e.openBlock(),e.createElementBlock("div",{key:T,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(a,{"model-value":A.operator,onChange:c=>k(T,"operator",c),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(h,{label:"等于 =",value:"="}),e.createVNode(h,{label:"大于 >",value:">"}),e.createVNode(h,{label:"小于 <",value:"<"}),e.createVNode(h,{label:"大于等于 ≥",value:">="}),e.createVNode(h,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(w,{"model-value":A.value,onChange:c=>k(T,"value",c),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(E,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:c=>L(T)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Ja,[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]=A=>r(A))},{default:e.withCtx(()=>[e.createVNode(R,{value:"OR"},{default:e.withCtx(()=>[...p[6]||(p[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(R,{value:"AND"},{default:e.withCtx(()=>[...p[7]||(p[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(E,{type:"text",link:"",icon:e.unref(X.Plus),onClick:y},{default:e.withCtx(()=>[...p[8]||(p[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Xa={class:"config-header"},Qa={class:"config-section"},Ka={style:{display:"flex","align-items":"center",gap:"8px"}},Za={style:{display:"flex","align-items":"center",gap:"8px"}},va={style:{display:"flex","align-items":"center",gap:"8px"}},el=te({__name:"TimerTargetConfig",setup(l){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),_=e.computed(()=>f===ee.TASK),r=h=>{if(!t.value)return;const a={...t.value.data.arguments,duration:h};o.updateNodeData(t.value.id,{arguments:a})},y=h=>{if(!t.value)return;const a={...t.value.data.arguments,similarity_enabled:h};o.updateNodeData(t.value.id,{arguments:a})},k=h=>{if(!t.value)return;const a={...t.value.data.arguments,similarity_threshold:h};o.updateNodeData(t.value.id,{arguments:a})},L=h=>{if(!t.value)return;const a={...t.value.data.arguments,hit_rate_enabled:h};o.updateNodeData(t.value.id,{arguments:a})},F=h=>{if(!t.value)return;const a={...t.value.data.arguments,hit_rate_operator:h};o.updateNodeData(t.value.id,{arguments:a})},D=h=>{if(!t.value)return;const a={...t.value.data.arguments,hit_rate_threshold:h};o.updateNodeData(t.value.id,{arguments:a})},p=h=>{if(!t.value)return;const a=t.value.data.arguments?.overlap_detection||{},w={...t.value.data.arguments,overlap_detection:{operator:a.operator??"gt",threshold:a.threshold??90,...a,enabled:h}};o.updateNodeData(t.value.id,{arguments:w})},E=h=>{if(!t.value)return;const a={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:h}};o.updateNodeData(t.value.id,{arguments:a})},x=h=>{if(!t.value)return;const a={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:h}};o.updateNodeData(t.value.id,{arguments:a})},s=()=>{t.value&&K.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(h,a)=>{const w=e.resolveComponent("el-button"),R=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),$=e.resolveComponent("el-text"),B=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-switch"),T=e.resolveComponent("el-icon"),c=e.resolveComponent("el-tooltip"),d=e.resolveComponent("el-slider"),i=e.resolveComponent("el-option"),N=e.resolveComponent("el-select"),g=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Xa,[a[9]||(a[9]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(w,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:s},null,8,["icon"]))]),e.createVNode(R),e.createElementVNode("div",Qa,[a[13]||(a[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(g,{"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:a[0]||(a[0]=V=>r(V)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode($,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...a[10]||(a[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(B,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",Ka,[e.createVNode(A,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:a[1]||(a[1]=V=>y(V))},null,8,["model-value"]),e.createVNode(c,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(B,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(d,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:a[2]||(a[2]=V=>k(V)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode($,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...a[11]||(a[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(B,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",Za,[e.createVNode(A,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:a[3]||(a[3]=V=>L(V))},null,8,["model-value"]),e.createVNode(c,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(B,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:a[4]||(a[4]=V=>F(V)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(i,{label:"大于 >",value:"gt"}),e.createVNode(i,{label:"大于等于 >=",value:"gte"}),e.createVNode(i,{label:"等于 =",value:"eq"}),e.createVNode(i,{label:"小于等于 <=",value:"lte"}),e.createVNode(i,{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:a[5]||(a[5]=V=>D(V)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode($,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...a[12]||(a[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(B,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",va,[e.createVNode(A,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:a[6]||(a[6]=V=>p(V))},null,8,["model-value"]),e.createVNode(c,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(T,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(B,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:a[7]||(a[7]=V=>E(V)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(i,{label:"大于 >",value:"gt"}),e.createVNode(i,{label:"等于 =",value:"eq"}),e.createVNode(i,{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:a[8]||(a[8]=V=>x(V)),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"]]),tl={class:"node-config-panel"},ol={class:"config-content"},nl=te({__name:"NodeConfigPanel",setup(l){const o=ae(),t={edge:Ko,group:vo,start:bn,end:Vn,classificationModel:Rn,ocr:qn,licensePlate:Pn,face:Ue,stream:Qn,dataSource:la,smallModel:Ba,detectionTarget:za,targetCount:Ya,timerTarget:el,faceRecognition:Ue},f=e.computed(()=>{const _=o.selectedEdge;if(_)return o.nodes.find(k=>k.id===_.source)?.data?.enableBranch&&t.edge||null;const r=o.selectedNode;return r&&t[r.type]||null});return(_,r)=>(e.openBlock(),e.createElementBlock("div",tl,[e.createElementVNode("div",ol,[f.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(f.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),al={class:"workflow-editor",id:"workflow-editor"},ll={class:"editor-content"},rl={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:l=>Object.values(ee).includes(l)},pageMode:{type:String,default:he.CREATE,validator:l=>Object.values(he).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;e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig)),e.provide("editorConfig",e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig)),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const f=ae(),{copyToClipboard:_,downloadJSON:r,exportToJSON:y}=gt(),{runValidation:k}=yt(),L=e.computed(()=>{if(f.selectedNodeId)return!0;const D=f.selectedEdge;return D?!!f.nodes.find(E=>E.id===D.source)?.data?.enableBranch:!1});return o({reset:()=>{K.ElMessageBox.confirm("确定要重置工作流吗?所有节点和连接将被清空。","确认重置",{confirmButtonText:"重置",cancelButtonText:"取消",type:"warning"}).then(()=>{f.resetWorkflow(),K.ElMessage.success("工作流已重置")}).catch(()=>{})},runTest:k,copyJSON:_,exportJSON:y}),(D,p)=>(e.openBlock(),e.createElementBlock("div",al,[e.createElementVNode("div",ll,[e.createVNode(xt),e.createVNode(Jo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[L.value?(e.openBlock(),e.createBlock(nl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Je=te(rl,[["__scopeId","data-v-9bab7dba"]]),sl={Box:X.Box,CircleCheck:X.CircleCheck,CircleClose:X.CircleClose,Close:X.Close,CopyDocument:X.CopyDocument,Cpu:X.Cpu,DArrowLeft:X.DArrowLeft,DataAnalysis:X.DataAnalysis,Delete:X.Delete,Document:X.Document,Download:X.Download,FolderOpened:X.FolderOpened,Grid:X.Grid,Loading:X.Loading,Plus:X.Plus,QuestionFilled:X.QuestionFilled,RefreshLeft:X.RefreshLeft,Search:X.Search,Timer:X.Timer,Upload:X.Upload,User:X.User,View:X.View,VideoPlay:X.VideoPlay,Warning:X.Warning},Ye=l=>{Object.entries(sl).forEach(([o,t])=>{l.component(o,t)}),l.component("WorkflowEditor",Je)},il={install:Ye};re.EditorMode=ee,re.NodeType=b,re.PageMode=he,re.WorkflowEditor=Je,re.default=il,re.install=Ye,Object.defineProperties(re,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
1
+ (function(re,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(re=typeof globalThis<"u"?globalThis:re||self,e(re.AIFlowUI={},re.Vue,re.ElementPlusIconsVue,re.ElementPlus,re.Pinia,re.VueFlowCore,re.VueFlowBackground,re.VueFlowControls,re.VueFlowNodeResizer))})(this,(function(re,e,X,Z,Qe,v,Ke,Ze,ve){"use strict";const k={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},et={[k.DETECTION_TARGET]:"检测目标",[k.CLASSIFICATION_MODEL]:"分类模型",[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时",[k.FACE_RECOGNITION]:"人脸识别",[k.SMALL_MODEL]:"小模型"},tt={cls:k.CLASSIFICATION_MODEL,ocr:k.OCR,license_plate:k.LICENSE_PLATE,target_count:k.TARGET_COUNT,timer_target:k.TIMER_TARGET,face:k.FACE_RECOGNITION,face_recognition:k.FACE_RECOGNITION},ee={ALGORITHM:"algorithm",TASK:"task"},ye={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ve=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),be=a=>({id:me("end"),type:"end",position:a,data:{label:"结束",input_schema:{properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]},arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80}}}),xe=a=>({id:me("dataSource"),type:"dataSource",position:a,data:{label:"数据源",enableImageSequence:!1,input_schema:{properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",description:"开启协同检测后,该数据源下的多个摄像机画面会按协同条件检测。使用此算法的任务将不支持轮巡",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",description:"开启后将区分首帧检测和后续帧检测",default:!1}},required:[]},arguments:{needCooperativeDetection:!1,windowSeconds:5,enableImageSequence:!1,deviceType:"camera"},enableBranch:!0,branchLogic:"and"}}),Be=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Ae=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),De=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Le=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Oe=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Me=a=>({id:me("targetCount"),type:"targetCount",position:a,data:{label:"目标计数",description:"",arguments:{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"},input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}}}),Ie=a=>({id:me("timerTarget"),type:"timerTarget",position:a,data:{label:"目标计时",description:"",arguments:{duration:30,similarity_enabled:!1,similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gte",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:90}},input_schema:{}}}),ot=(a,o={width:300,height:160},t="and",m=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:m},selectable:!0,deletable:!1,zIndex:-1}),Re=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ge=new Map,$e=()=>{const a=Ve({x:80,y:300}),o=xe({x:320,y:300}),t=be({x:1e3,y:300}),m={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[m]}},nt=a=>Qe.defineStore(`aiflow-workflow-${a}`,()=>{const o=$e(),t=e.ref(o.nodes),m=e.ref(o.edges),y=e.ref(null),l=e.ref(null),b=e.ref(new Set),T=e.ref(new Set),B=e.ref({}),q=(d,V,$,U)=>{B.value[d]||(B.value[d]={}),B.value[d][V]||(B.value[d][V]={}),B.value[d][V][$]={...U}},M=(d,V,$,U,J)=>{B.value[d]||(B.value[d]={}),B.value[d][V]||(B.value[d][V]={}),B.value[d][V][$]||(B.value[d][V][$]={}),B.value[d][V][$][U]=J},f=(d,V,$)=>B.value[d]?.[V]?.[$]??null,C=()=>{B.value={}},N=e.computed(()=>y.value?t.value.find(d=>d.id===y.value):null),c=e.computed(()=>l.value?m.value.find(d=>d.id===l.value):null),u=d=>t.value.filter(V=>V.type===d).length,n=()=>{const d=t.value.filter(V=>V.type===k.DATA_SOURCE);d.length!==0&&(d.length===1?d[0].data.label="数据源":d.forEach((V,$)=>{V.data.label=`数据源 ${$+1}`}))},x=()=>t.value.filter(d=>d.type===k.DATA_SOURCE).length,P=()=>t.value.filter(V=>V.type===k.DATA_SOURCE).some(V=>V.data.arguments?.needCooperativeDetection===!0),g=()=>{const d=x(),V=P();return!(d>1||V)},O=d=>{t.value.push(d),d.type===k.DATA_SOURCE&&n()},E=d=>{const V=t.value.find(U=>U.id===d),$=V?.type===k.DATA_SOURCE;if(V?.type==="group"){w(d),m.value=m.value.filter(U=>U.source!==d&&U.target!==d),y.value===d&&(y.value=null);return}t.value=t.value.filter(U=>U.id!==d),m.value=m.value.filter(U=>U.source!==d&&U.target!==d),y.value===d&&(y.value=null),$&&n()},L=(d,V)=>{const $=t.value.find(U=>U.id===d);$&&($.data={...$.data,...V})},S=(d,V)=>{const $=t.value.find(U=>U.id===d);$&&($.position=V)},A=d=>{const V=t.value.find($=>$.id===d.source);if(V&&(V.type===k.START||V.type===k.DATA_SOURCE)&&V.data?.enableBranch===!0){const U=m.value.filter(J=>J.source===d.source).length+1;d={...d,data:{...d.data,branchOrder:U}}}m.value=v.addEdge(d,m.value)},i=d=>{const V=m.value.find($=>$.id===d);if(m.value=m.value.filter($=>$.id!==d),l.value===d&&(l.value=null),V&&V.data?.branchOrder!==void 0){const $=t.value.find(U=>U.id===V.source);$&&($.type===k.START||$.type===k.DATA_SOURCE)&&m.value.filter(J=>J.source===V.source).sort((J,Q)=>(J.data?.branchOrder||0)-(Q.data?.branchOrder||0)).forEach((J,Q)=>{J.data?J.data.branchOrder=Q+1:J.data={branchOrder:Q+1}})}},r=(d,V="and",$=null)=>{const U=ot(d,{width:300,height:160},V,$);return t.value.unshift(U),U.id},_=(d,V)=>{const $=t.value.find(Q=>Q.id===d),U=t.value.find(Q=>Q.id===V);if(!$||!U||$.parentNode===V)return;$.parentNode&&p(d);const J=t.value.find(Q=>Q.id===d);J&&(t.value=t.value.map(Q=>Q.id!==d?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:V,extent:"parent"}))},p=d=>{const V=t.value.find(Q=>Q.id===d);if(!V||!V.parentNode)return;const $=t.value.find(Q=>Q.id===V.parentNode),U=$?V.position.x+$.position.x:V.position.x,J=$?V.position.y+$.position.y:V.position.y;t.value=t.value.map(Q=>{if(Q.id!==d)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},w=d=>{const V=t.value.find($=>$.id===d);V&&(t.value=t.value.filter($=>$.id!==d).map($=>{if($.parentNode!==d)return $;const U={...$,position:{x:$.position.x+V.position.x,y:$.position.y+V.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:m,selectedNodeId:y,selectedEdgeId:l,invalidNodeIds:b,invalidEdgeIds:T,selectedNode:N,selectedEdge:c,getNodeCountByType:u,getDataSourceCount:x,hasCooperativeDetection:P,supportPatrol:g,addNode:O,removeNode:E,updateNodeData:L,updateNodePosition:S,addConnection:A,removeEdge:i,updateEdgeData:(d,V)=>{const $=m.value.find(U=>U.id===d);if($){if(V.branchOrder!==void 0){const U=t.value.find(J=>J.id===$.source);if(U&&(U.type===k.START||U.type===k.DATA_SOURCE)){const J=$.data?.branchOrder,Q=V.branchOrder;if(J!==Q&&Q!==null){const se=m.value.filter(ce=>ce.source===$.source&&ce.id!==d).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}$.data={...$.data,...V}}},selectNode:d=>{y.value=d,l.value=null},selectEdge:d=>{l.value=d,y.value=null},clearSelection:()=>{y.value=null,l.value=null},resetWorkflow:()=>{const d=$e();t.value=d.nodes,m.value=d.edges,y.value=null,l.value=null,C()},loadWorkflow:(d,V)=>{t.value=d,m.value=V,y.value=null,l.value=null,C()},refreshDataSourceLabels:n,createEmptyGroup:r,addNodeToGroup:_,removeNodeFromGroup:p,dissolveParallelGroup:w,initializeSubsequentFrames:d=>{t.value.find($=>$.id===d)&&L(d,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(d,V)=>{const $=t.value.find(U=>U.id===d);!$||$.type!=="dataSource"||($.data.subsequentFrames||($.data.subsequentFrames=[]),$.data.subsequentFrames.push(V),L(d,{subsequentFrames:[...$.data.subsequentFrames]}))},removeSubsequentFrame:(d,V)=>{const $=t.value.find(Q=>Q.id===d);if(!$||$.type!=="dataSource")return;const U=$.data.subsequentFrames.find(Q=>Q.id===V);U&&m.value.filter(te=>te.source===d&&te.sourceHandle===U.handleId).forEach(te=>i(te.id));const J=$.data.subsequentFrames.filter(Q=>Q.id!==V);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),L(d,{subsequentFrames:J})},setInvalidIds:(d,V)=>{b.value=new Set(d),T.value=new Set(V)},clearInvalidIds:()=>{b.value=new Set,T.value=new Set},taskSources:B,setTaskSourceArguments:q,updateTaskSourceArgument:M,getTaskSourceArguments:f,clearTaskSources:C}}),ae=(a=null)=>{const o=a??e.inject("workflowInstanceId","default");return ge.has(o)||ge.set(o,nt(o)),ge.get(o)()},at=a=>{if(ge.has(a)){try{ge.get(a)().$dispose()}catch{}ge.delete(a)}},Fe=(a,o,t)=>{const m=[],y=[],l=a.filter(n=>n.type!=="group"),b=l.filter(n=>n.type===k.START);b.length===0?m.push("工作流必须包含一个开始节点"):b.length>1&&m.push("工作流只能包含一个开始节点");const T=l.filter(n=>n.type===k.END);T.length===0?m.push("工作流必须包含一个结束节点"):T.length>1&&m.push("工作流只能包含一个结束节点");const B=l.filter(n=>n.type===k.DATA_SOURCE);B.length===0&&m.push("工作流必须至少包含一个数据源节点"),l.filter(n=>n.type===k.DETECTION_TARGET||n.type===k.SMALL_MODEL||n.type===k.CLASSIFICATION_MODEL).length===0&&m.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(n=>n.type===k.SMALL_MODEL),B.some(n=>n.data.arguments?.needCooperativeDetection===!0),B.length>1,l.forEach(n=>{const x=o.filter(g=>g.target===n.id),P=o.filter(g=>g.source===n.id);if(n.type===k.START&&x.length>0&&y.push("开始节点不应有输入连接"),n.type===k.END&&P.length>0&&y.push("结束节点不应有输出连接"),n.type===k.START&&P.length===0&&m.push("开始节点必须有输出连接"),n.type===k.END&&x.length===0&&m.push("结束节点必须有输入连接"),n.type===k.DATA_SOURCE&&n.data.enableImageSequence)if(P.length===0)m.push({nodeId:n.id,message:`数据源节点"${n.data.label}"开启了图片时序但未连接到任何处理节点`});else{const g=P.filter(S=>S.sourceHandle==="first-frame"),O=n.data.subsequentFrames||[],E=new Set(P.map(S=>S.sourceHandle)),L=O.filter(S=>!E.has(S.handleId));g.length===0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"的首帧检测未连接`}),L.length>0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"有${L.length}个后续帧未连接`})}n.type!==k.START&&n.type!==k.END&&!n.parentNode&&(x.length===0||P.length===0)&&y.push(`节点 "${n.data.label}" 可能未正确连接`)});const M=new Set;o.forEach(n=>{const x=a.find(P=>P.id===n.source);x?.type==="dataSource"&&x.data?.enableImageSequence===!0&&n.sourceHandle!=="first-frame"&&(!n.data?.timeWindowSeconds||n.data.timeWindowSeconds<1)&&m.push({edgeId:n.id,message:`分支"${n.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),M.add(n.source),M.add(n.target)}),l.forEach(n=>{n.parentNode||!M.has(n.id)&&l.length>1&&y.push(`节点 "${n.data.label}" 未连接到工作流`)});const f=lt(l,o);m.push(...f);const C=st(l,o);m.push(...C);const N=rt(l);m.push(...N);const c=it(l,o);m.push(...c);const u=ct(l,o);return m.push(...u),t==="task"&&l.filter(x=>x.type===k.FACE_RECOGNITION).forEach(x=>{(!x.data.arguments?.repositoryId||Array.isArray(x.data.arguments.repositoryId)&&x.data.arguments.repositoryId.length===0)&&m.push({nodeId:x.id,message:`人脸识别节点"${x.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:m.length===0,errors:m,warnings:y}},lt=(a,o)=>{const t=[],m=a.find(b=>b.type===k.START);if(!m)return t;const y=new Set,l=(b,T,B,q)=>{if(T.includes(b))return;const M=a.find(u=>u.id===b);if(!M)return;const f=[...T,b];let C=[...B],N=[...q];if(M.type===k.TARGET_COUNT&&C.push(M),M.type===k.TIMER_TARGET&&N.push(M),M.type===k.END){const u=f.join("->");y.has(u)||(y.add(u),C.length>1&&t.push(`工作流分支中存在多个目标计数节点(${C.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const c=o.filter(u=>u.source===b);c.length===0?(C.length>1&&t.push(`工作流分支中存在多个目标计数节点(${C.map(u=>`"${u.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(u=>`"${u.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):c.forEach(u=>{l(u.target,f,C,N)})};return l(m.id,[],[],[]),t},rt=a=>{const o=[],t=a.filter(y=>y.type===k.DATA_SOURCE),m=a.filter(y=>y.type===k.SMALL_MODEL);return m.length>0&&t.length>1&&m.forEach(y=>{o.push({nodeId:y.id,message:`小模型节点"${y.data.label||y.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},st=(a,o)=>{const t=[];return a.filter(y=>y.type===k.DATA_SOURCE).forEach(y=>{const l=o.filter(b=>b.source===y.id);if(l.length>1){const b=l.map(q=>q.target),B=a.filter(q=>b.includes(q.id)).filter(q=>q.type===k.SMALL_MODEL);if(B.length>0){const q=B.map(M=>`"${M.data.label||M.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${q})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},it=(a,o)=>{const t=[],m=[k.TARGET_COUNT,k.TIMER_TARGET],y={[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时"};return a.filter(b=>b.type===k.SMALL_MODEL).forEach(b=>{o.filter(B=>B.source===b.id).forEach(B=>{const q=a.find(M=>M.id===B.target);if(q&&m.includes(q.type)){const M=y[q.type]||q.type;t.push(`小模型节点"${b.data.label||b.data.modelName}"不能直接连接${M}节点"${q.data.label}",请先连接检测目标节点`)}})}),t},ct=(a,o)=>{const t=[],m=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION],y={[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.FACE_RECOGNITION]:"人脸识别"};return a.filter(b=>m.includes(b.type)).forEach(b=>{const T=o.filter(M=>M.source===b.id),B=m.filter(M=>M!==b.type).concat(k.END),q=b.data.label||y[b.type];T.forEach(M=>{const f=a.find(C=>C.id===M.target);f&&!B.includes(f.type)&&t.push(`${q}节点"${q}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${f.data.label||f.type}"节点`)}),T.length===0&&t.push(`${q}节点"${q}"必须连接到其他辅助节点或结束节点`)}),t},qe=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(m=>t.get(m)).filter(Boolean),Ge=(a,o)=>{const t={},m=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,b)=>{const T=l.data?.branchOrder??1/0,B=b.data?.branchOrder??1/0;return T-B}).forEach(l=>{if(m.has(l.source)&&m.has(l.target))return;let b=l.source,T=l.target;if(m.has(b)){const B=o.find(q=>q.target===b&&!m.has(q.source));if(!B)return;b=B.source}if(m.has(T)){const B=o.find(q=>q.source===T&&!m.has(q.target));if(!B)return;T=B.target}t[b]||(t[b]=[]),t[b].includes(T)||t[b].push(T)}),t},He=(a,o)=>{const t=[...o.values()].find(b=>b.type===k.START);if(!t)return[];const m=new Set,y=[],l=b=>{if(m.has(b))return;m.add(b);const T=o.get(b);if(!T)return;T.type!==k.START&&T.type!==k.END&&T.type!=="group"&&y.push(T),(a[b]||[]).forEach(q=>l(q))};return l(t.id),y},dt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ce=(a,o,t,m)=>{const y=a.nodes.findIndex(b=>b.toolTitle===o);if(y===-1)return;const l=a.nodes[y];l.arguments?.[t]&&(a[m]=l.arguments[t]),a.nodes=a.nodes.filter((b,T)=>T!==y),a.nodes.forEach((b,T)=>{b.sortOrder=T+1})},mt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(m=>({op:m.operator,value:m.value}))}}},pt=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const m={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:m[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const m=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[m]||">",value:t.threshold,matchFrames:3}}return a.similarity_enabled&&a.similarity_threshold!==void 0&&(o.similarity={op:">",value:a.similarity_threshold,matchFrames:3}),{duration:o}},ut={[k.TARGET_COUNT]:mt,[k.TIMER_TARGET]:pt},_e=(a,o)=>{if(!a)return{};const t=ut[o];if(t)return t(a);const m={...a};return dt.forEach(y=>{delete m[y]}),Object.keys(m).forEach(y=>{const l=m[y];(l==null||l==="")&&delete m[y]}),o===k.FACE_RECOGNITION&&m.repositoryId!==void 0&&(Array.isArray(m.repositoryId)||(m.repositoryId=[m.repositoryId]),m.repositoryId.length===0&&delete m.repositoryId),m},ft=a=>{switch(a.type){case k.DETECTION_TARGET:return a.data.targetId||"";case k.CLASSIFICATION_MODEL:return"cls";case k.OCR:return"ocr";case k.LICENSE_PLATE:return"license_plate";case k.SMALL_MODEL:return a.data.title||a.data.modelName||"";case k.TARGET_COUNT:return"target_count";case k.TIMER_TARGET:return"timer_target";case k.FACE_RECOGNITION:return"face";default:return a.data.label||""}},gt=(a,o,t,m,y=null)=>{const l={toolTitle:ft(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:_e(y??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const b=m.find(T=>T.source===t&&T.target===a.id);b?.data?.branchOrder!==void 0&&b?.data?.branchOrder!==null&&(l.branchOrder=b.data.branchOrder)}return l},Pe=(a,o,t,m,y,l=null,b=[])=>{const T=[],B=Array.isArray(a)?[...a]:[a],q=new Set;let M=1;for(;B.length>0;){const f=[...B];B.length=0;const C=[];f.forEach(N=>{if(q.has(N))return;q.add(N);const c=m.get(N);!c||c.type===k.END||c.type===k.START||c.type===k.DATA_SOURCE||((t[N]||[]).forEach(n=>{const x=m.get(n);x&&x.type!==k.END&&B.push(n)}),b.includes(c.type))||C.push(c)}),C.length>0&&(C.forEach(N=>{const c=l?.(N.id)??null,u=gt(N,M,o,y,c);C.length>1&&(u.nodeLogic="or"),T.push(u)}),M++)}return T},ht=(a=null)=>{const o=a??ae(),t=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",ye.CREATE);const m=e.inject("editorConfig",null),y=e.computed(()=>Fe(o.nodes,o.edges,t)),l=(i,r,_,p)=>{if(_){const w=pe(i,_.id,r).find(G=>G.type===k.SMALL_MODEL);if(w)return w}return p.find(w=>w.type===k.SMALL_MODEL)||null},b=(i,r,_)=>{const w=pe(r,i.id,_).find(F=>F.type===k.SMALL_MODEL);return w?pe(r,w.id,_).filter(F=>F.type!==k.END&&F.type!==k.START&&F.type!==k.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},T=(i,r,_,p,w)=>{if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){const F=l(p,w,_,i);return F?{toolTitle:F.data.title||F.data.modelName||"",toolType:"small",arguments:_e(F.data.arguments,k.SMALL_MODEL)}:null}const G=i.find(F=>F.type===k.DETECTION_TARGET);return G?{toolTitle:G.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:_e(G.data.arguments,k.DETECTION_TARGET)}:null},B=()=>{const i=o.nodes.find(p=>p.type===k.END);if(!i||!i.data.arguments)return{};const r=i.data.arguments,_={};return r.reportFrequency==="interval"&&r.reportInterval&&(_.interval={value:r.reportInterval}),r.enableDeduplication&&r.similarityThreshold!==void 0&&(_.dedup={value:r.similarityThreshold}),_},q=i=>{if(i.length<=1)return;const r=i.map(p=>p.sortOrder);if(new Set(r).size!==r.length){const p=r.filter((w,G)=>r.indexOf(w)!==G);throw new Error(`分支执行顺序存在重复:${[...new Set(p)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},M=(i,r,_,p,w)=>{let G=[],F;if(i===de.IMAGE_BRANCH)r&&(G=pe(p,r.id,w).filter(R=>R.type!==k.END)),F=r?.id||_.find(R=>R.type===k.DATA_SOURCE)?.id;else if(i===de.SMALL_MODEL_BRANCH){const R=l(p,w,r,_);R&&(G=pe(p,R.id,w).filter(j=>j.type!==k.END),F=R.id)}return{branchStartNodes:G,sourceNodeId:F}},f=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]),C=(i,r,_)=>{const p=new Set,w=[],G=F=>{if(p.has(F))return;p.add(F);const R=_.get(F);if(!R||R.type===k.END)return;f.has(R.type)&&w.push(R),(r[F]||[]).forEach(z=>G(z))};return G(i),w.length>0?w[w.length-1]:null},N=(i,r,_,p,w)=>{const G=`分支${w+1}`,F=C(r,_,p);if(!F)return i?.data?.nodeName||G;if(F.type===k.DETECTION_TARGET&&F.data?.targetId==="other"){const j=F.data?.arguments?.object;if(Array.isArray(j)&&j.length>0){const z=j.join(",");return z.length>32?z.slice(0,32):z}}if(F.type===k.CLASSIFICATION_MODEL){const j=F.data?.arguments?.modelName||F.data?.label;if(!j)return G;const z=F.data?.arguments?.resultNegate?"(取反)":"";return j+z}return F.data?.label||F.data?.targetName||G},c=(i,r,_,p,w,G)=>{const{branchStartNodes:F,sourceNodeId:R}=M(r,_,i,p,w);if(F.length===0)return[];const j=[];return F.forEach((z,Y)=>{const h=Pe([z.id],R,p,w,G);if(h.length===0)return;const D=R?G.find(d=>d.source===R&&d.target===z.id):null,H=D?.data||{},W=H.branchOrder!==void 0&&H.branchOrder!==null?H.branchOrder:Y+1,s={branchName:H.branchName||N(z,z.id,p,w,Y),sortOrder:W,nodes:h};D?.sourceHandle&&(s.sourceHandle=D.sourceHandle),Ce(s,"target_count","targetCount","targetCount"),Ce(s,"timer_target","duration","duration"),H.timeWindowSeconds!==void 0&&H.timeWindowSeconds!==null&&(s.timeWindowSeconds=H.timeWindowSeconds),H.branchDescription&&(s.description=H.branchDescription),j.push(s)}),q(j),j},u=()=>{const i=y.value;if(i.errors.length>0){const r=i.errors.map(_=>typeof _=="object"?_.message:_);return Z.ElMessage.error(`验证失败: ${r.join(", ")}`),!1}return i.warnings.length>0&&Z.ElMessage.warning(`警告: ${i.warnings.join(", ")}`),!0},n=()=>{const i=o.nodes,r=o.edges,_=qe(i),p=Ge(i,r),w=He(p,_),G=[..._.values()].find(F=>F.type===k.START);return{allNodes:i,edges:r,nodeMap:_,adj:p,orderedNodes:w,startNode:G}},x=i=>{const r={ruleName:i?.data?.algorithmName||"",description:"",webhookUrl:""},_=B();Object.keys(_).length>0&&(r.extraConfig=_);const w=(m?.value??m)?.platform;return r.attach=w?{platform:w}:{},r},P=(i,r)=>{const _=i.filter(p=>p.type===k.DATA_SOURCE);if(_.length===0){const p=r.find(w=>w.type===k.DATA_SOURCE);p&&_.push(p)}return _},g=i=>i?.data?.enableImageSequence||i?.data?.arguments?.enableImageSequence||!1?"order":i?.data?.enableBranch&&i.data.branchLogic||"and",O=(i,r,_,p)=>{const{orderedNodes:w,adj:G,nodeMap:F,edges:R}=r,j=b(i,G,F),z=!!i.data.arguments?.needCooperativeDetection,Y=R.find(s=>s.target===i.id),h=Y?.data?.branchOrder!==void 0&&Y?.data?.branchOrder!==null?Y.data.branchOrder:p+1,D={sourceGroupId:null,name:i.data.label||"数据源",sort:h,synEnabled:z};if(z&&(D.windowSeconds=i.data.arguments?.windowSeconds||5),j===de.SMALL_MODEL){const s=T(w,j,i,G,F);return s&&(D.streamConfig=s),D.logic="and",D.children=[],D}if(j===de.SMALL_MODEL_BRANCH){const s=T(w,j,i,G,F);s&&(D.streamConfig=s)}D.logic=g(i);const H=c(w,j,i,G,F,R),W=_.length;return D.children=H.map((s,d)=>({name:s.branchName,branchRefs:[W+d]})),_.push(...H),D},E=(i,r)=>{const p={groupLogic:i?.data?.enableBranch&&i.data.branchLogic||"and",sourceGroups:r};return r.length>=2&&(p.groupWindowSeconds=i.data.groupWindowSeconds),p},L=()=>{if(!u())return null;try{const i=n(),r=x(i.startNode),_=P(i.orderedNodes,i.allNodes),p=[],w=_.map((G,F)=>O(G,i,p,F));return r.ruleSchema=E(i.startNode,w),p.length>0&&(r.branches=p),r}catch(i){return Z.ElMessage.error(i.message||"导出失败"),null}};return{validation:y,exportToJSON:L,copyToClipboard:()=>{try{const i=L();if(!i)return;const r=JSON.stringify(i,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(r).then(()=>{Z.ElMessage.success("已复制到剪贴板")}).catch(()=>{Z.ElMessage.error("复制失败")});else{const _=document.createElement("textarea");_.value=r,_.style.position="fixed",_.style.opacity="0",document.body.appendChild(_),_.select(),document.execCommand("copy"),document.body.removeChild(_),Z.ElMessage.success("已复制到剪贴板")}}catch(i){console.error("复制JSON失败:",i),Z.ElMessage.error(`复制失败: ${i.message}`)}},downloadJSON:()=>{const i=L();if(!i)return;const r=JSON.stringify(i,null,2),_=new Blob([r],{type:"application/json"}),p=URL.createObjectURL(_),w=document.createElement("a");w.href=p,w.download=`workflow_${Date.now()}.json`,w.click(),URL.revokeObjectURL(p),Z.ElMessage.success("导出成功")}}},yt=(a=null)=>{const o=a??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",ye.CREATE);const t=e.inject("editorConfig",null),m=e.inject("taskModeConfig",null),y=e.inject("echoTaskData",null),l=e.computed(()=>({errors:[],warnings:[]})),b=(u,n)=>{const x={},P=n?.data?.arguments??{};P.reportFrequency==="interval"&&P.reportInterval&&(x.interval={value:P.reportInterval}),P.enableDeduplication&&P.similarityThreshold!==void 0&&(x.dedup={value:P.similarityThreshold}),o.nodes.filter(E=>E.type===k.DATA_SOURCE).length>=2&&u?.data?.groupWindowSeconds!==void 0&&(x.groupWindowSeconds=u.data.groupWindowSeconds),x.enableVideo=!!u?.data?.enableAlertVideo;const O=u?.data?.schedule;return Array.isArray(O)&&O.length>0?x.schedule=O:x.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],x},T=(u,n,x,P,g="image")=>{const O=pe(n,u.id,x).find(E=>E.type===k.SMALL_MODEL);if(O){const E=u.data?.arguments??{};return{toolTitle:O.data.title||O.data.modelName||"",toolType:"small",arguments:_e(O.data.arguments,k.SMALL_MODEL),decoder:B(E,!0)}}if(g==="stream"){const E=P.find(S=>S.type===k.DETECTION_TARGET);if(!E)return null;const L=u.data?.arguments??{};return{toolTitle:E.data.targetId||"",toolType:"stream",arguments:_e(E.data.arguments,k.DETECTION_TARGET),decoder:B(L,!1)}}return null},B=(u,n)=>{const x=u.mode??(n?3:0),P=u.interval??0,g=u.sw_decoding??(n?"CPU":"GPU");let O=0,E=0;return n?x===3?(O=0,E=0):x===2?(O=1,E=0):x===1&&(O=0,E=P):x===0?(O=0,E=P*25):x===1?(O=0,E=P):x===2&&(O=1,E=0),{sw_decoding:g==="CPU",mode:O,interval:E}},q=(u,n,x,P,g=null)=>{let O=u.id,E=pe(n,u.id,x).filter(A=>A.type!==k.END&&A.type!==k.START);E.length===1&&E[0].type===k.SMALL_MODEL&&(O=E[0].id,E=pe(n,O,x).filter(A=>A.type!==k.END&&A.type!==k.START));const L=E;if(L.length===0)return[];const S=g?A=>o.getTaskSourceArguments(u.id,g,A):null;return L.map((A,i)=>{const r=Pe([A.id],O,n,x,P,S,[k.SMALL_MODEL]),_=P.find(R=>R.source===O&&R.target===A.id),p=_?.data??{},w=p.branchOrder??i+1,G=p.branchId??null,F={branchId:G,id:G,branchName:p.branchName||A.data?.label||`分支${i+1}`,sortOrder:w,nodes:r};return _?.sourceHandle&&(F.sourceHandle=_.sourceHandle),p.timeWindowSeconds!==void 0&&p.timeWindowSeconds!==null&&(F.timeWindowSeconds=p.timeWindowSeconds),p.branchDescription&&(F.description=p.branchDescription),Ce(F,"target_count","targetCount","targetCount"),Ce(F,"timer_target","duration","duration"),F})},M=(u,n,x,P,g=null,O=null,E=null,L=1,S=!1,A=!1)=>{const i=g??u.deviceType??"",r=i==="1400"||i==="2",_=r?"1400":"camera",p=n==="stream"?2:1,w=r&&O!==null?O==="device"?1:2:u.detectionType??2,F=(y?.value??y)?.graph?.sources??[],R=String(u.sourceId??u.id??""),z=F.find(h=>String(h.sourceId)===R)?.attach??{},Y={deviceType:_,detectionType:w,dataSourceType:p,sourceOrder:x,timeTemplateId:z.timeTemplateId??"",timeTemplateName:z.timeTemplateName??"",platform:P?.platform??"TAI"};if(!r){const h=E?.mode??0;h===3?(Y.frameExtractionType=0,Y.frameInterval=0):h===2?(Y.frameExtractionType=A?1:3,Y.frameInterval=0):(Y.frameExtractionType=h+1,Y.frameInterval=E?.interval??30);const D=E?.sw_decoding??"CPU";Y.frameExtractionSourceType=D==="GPU"?2:1,L===1&&n==="image"&&!S&&!!E?.enablePatrol?Y.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,E?.patrolGroupSize??1)),pollingInterval:"0"}:Y.pollingConfig={enablePolling:0},Y.thirdId=u.thirdId??""}return Y},f=(u,n,x,P,g,O,E)=>{const L=m?.value??m,S=L?.datasource?.getDevices?.(u.id)??[],A=u.data?.sourceGroupId??null,i=!!u.data?.arguments?.needCooperativeDetection,r=i?u.data?.arguments?.windowSeconds??5:void 0,_=n?.data?.streamType??"image",p=pe(x,u.id,P).some(D=>D.type===k.SMALL_MODEL),w=p?"small":_,G=T(u,x,P,E,_),F=u.data?.arguments?.deviceType??null,R=u.data?.arguments?.detectionMode??null,j=u.data?.arguments??null,z=o.getDataSourceCount();if(S.length>0)return S.map((D,H)=>{const W=String(D.sourceId??D.id??""),s=q(u,x,P,g,W),d={sourceId:D.sourceId??D.id??"",sourceName:D.sourceName??D.name??"",sourceType:w,sourceGroupId:A,areas:D.area??D.areas??[],branches:s,attach:M(D,_,H,L,F,R,j,z,i,p),synEnabled:i,...r!==void 0&&{windowSeconds:r}};return G&&(d.streamConfig=G,d.streamUrl="rtsp"),d});const Y=q(u,x,P,g),h={sourceId:"",sourceName:u.data?.label??"数据源",sourceType:w,sourceGroupId:A,areas:[],branches:Y,attach:M({},_,0,L,F,R,j,z,i,p),synEnabled:i};return G&&(h.streamConfig=G,h.streamUrl="rtsp"),[h]},C=()=>{try{const u=o.nodes,n=o.edges,x=qe(u),P=Ge(u,n),g=[...x.values()].find(r=>r.type===k.START),O=[...x.values()].find(r=>r.type===k.END),E=t?.value??t,L=He(P,x);let S=L.filter(r=>r.type===k.DATA_SOURCE);S.length===0&&(S=u.filter(r=>r.type===k.DATA_SOURCE));const A=S.flatMap((r,_)=>f(r,g,P,x,n,_,L)),i={workflowName:g?.data?.taskName??"",ruleId:E?.ruleId??"",sources:A,extraConfig:b(g,O),description:""};if((E?.platform??"TAI")==="THIRD"){const _=S[0]?.data?.arguments??{},p=_.mode??0,w=_.interval??0;let G,F,R;return p===0?(G="time",F=w,R=0):(G="frame",F=0,p===3?R=0:p===2?R=-1:R=w),{name:i.workflowName,type:"simple",plan:i.extraConfig.schedule??[],inferStrategy:G,timeInterval:F,frameInterval:R,mps:i.extraConfig.enableVideo??!1,graph:i}}return i}catch(u){return Z.ElMessage.error(u.message||"导出失败"),null}};return{validation:l,exportToJSON:C,copyToClipboard:()=>{const u=C();if(!u)return;const n=JSON.stringify(u,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(n).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const x=document.createElement("textarea");x.value=n,x.style.position="fixed",x.style.opacity="0",document.body.appendChild(x),x.select(),document.execCommand("copy"),document.body.removeChild(x),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const u=C();if(!u)return;const n=JSON.stringify(u,null,2),x=new Blob([n],{type:"application/json"}),P=URL.createObjectURL(x),g=document.createElement("a");g.href=P,g.download=`task_workflow_${Date.now()}.json`,g.click(),URL.revokeObjectURL(P),Z.ElMessage.success("导出成功")}}},_t=(a=null)=>{const o=e.inject("editorMode",ee.ALGORITHM);return(a??o)===ee.TASK?yt(null):ht(null)},Nt=a=>{if(!a)return null;const o=a.indexOf("{");if(o===-1)return null;try{return JSON.parse(a.slice(o))}catch{return null}};function Ct(a=null){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),m=a??t,y=e.inject("taskModeConfig",null),l=B=>{const{type:q,data:M}=B,f=M.arguments||{},C=[];switch(q){case k.START:if(m===ee.TASK)if(M.taskName?.trim()||C.push("任务名称"),!M.executionTime?.trim())C.push("任务执行时间");else{const N=Nt(M.executionTime);(!N||!Array.isArray(N.plan)||N.plan.length===0)&&C.push("任务执行时间(计划为空)")}else M.algorithmName?.trim()||C.push("算法名称");break;case k.SMALL_MODEL:M.modelId||C.push("模型选择");break;case k.DETECTION_TARGET:M.targetId||C.push("检测目标选择");break;case k.CLASSIFICATION_MODEL:f.modelId||C.push("分类模型选择");break;case k.DATA_SOURCE:m===ee.TASK&&((y?.value??y)?.datasource?.getDevices?.(B.id)??[]).length===0&&C.push("设备选择");break;case k.TARGET_COUNT:break;case k.TIMER_TARGET:(!f.duration||f.duration<1)&&C.push("持续时间");break}return C},b=B=>{const q=o.nodes.find(f=>f.id===B.source);if(!q)return[];const M=[];return q.type===k.DATA_SOURCE&&q.data?.enableImageSequence===!0&&B.sourceHandle!=="first-frame"&&(!B.data?.timeWindowSeconds||B.data.timeWindowSeconds<1)&&M.push("后续检测帧的持续时间"),M};return{runValidation:()=>{const{nodes:B,edges:q}=o;o.clearInvalidIds();const M=Fe(B,q,m),f=M.errors,C=[],N=[],c=[];B.filter(O=>O.type!=="group").forEach(O=>{const E=l(O);E.length>0&&(C.push(O.id),c.push(`节点"${O.data.label}"缺少必填参数:${E.join("、")}`))}),q.forEach(O=>{const E=b(O);E.length>0&&(N.push(O.id),c.push(`分支"${O.data?.branchName||"未命名"}"缺少:${E.join("、")}`))}),f.forEach(O=>{typeof O=="object"&&(O.nodeId&&C.push(O.nodeId),O.edgeId&&N.push(O.edgeId))}),(C.length>0||N.length>0)&&(o.setInvalidIds(C,N),setTimeout(()=>{o.clearInvalidIds()},5e3));const n=f.map(O=>typeof O=="object"?O.message:O),x=M.warnings.map(O=>typeof O=="object"?O.message:O),P=[...n.map(O=>({msg:O,type:"error"})),...c.map(O=>({msg:O,type:"warning"})),...x.map(O=>({msg:O,type:"warning"}))],g=n.length===0&&c.length===0;if(g&&x.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(P.length>0){const O=P[0];Z.ElMessage[O.type](O.msg)}return g}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[m,y]of o)t[m]=y;return t},kt={key:0},bt={class:"node-list"},xt={class:"node-list"},Et={class:"node-list"},wt={class:"node-list"},Tt=oe({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),m=(y,l)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",l),y.dataTransfer.effectAllowed="move")};return(y,l)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("VideoPlay"),B=e.resolveComponent("CircleClose"),q=e.resolveComponent("el-collapse-item"),M=e.resolveComponent("FolderOpened"),f=e.resolveComponent("Cpu"),C=e.resolveComponent("View"),N=e.resolveComponent("el-collapse");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["node-toolbox",{collapsed:!o.value}])},[e.createElementVNode("div",{class:"toolbox-header",onClick:l[1]||(l[1]=c=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",kt,"节点工具箱")):(e.openBlock(),e.createBlock(b,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(b,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(c=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(N,{key:0,modelValue:t.value,"onUpdate:modelValue":l[13]||(l[13]=c=>t.value=c),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(q,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=c=>m(c,"start"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),l[14]||(l[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[3]||(l[3]=c=>m(c,"end"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(B)]),_:1}),l[15]||(l[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(q,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",xt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=c=>m(c,"dataSource"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(M)]),_:1}),l[16]||(l[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[5]||(l[5]=c=>m(c,"smallModel"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),l[17]||(l[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[6]||(l[6]=c=>m(c,"detectionTarget"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(C)]),_:1}),l[18]||(l[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[7]||(l[7]=c=>m(c,"classificationModel"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(q,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=c=>m(c,"targetCount"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),l[20]||(l[20]=e.createElementVNode("span",null,"目标计数",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[9]||(l[9]=c=>m(c,"timerTarget"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(q,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=c=>m(c,"ocr"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),l[22]||(l[22]=e.createElementVNode("span",null,"OCR识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[11]||(l[11]=c=>m(c,"licensePlate"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),l[23]||(l[23]=e.createElementVNode("span",null,"车牌识别",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[12]||(l[12]=c=>m(c,"faceRecognition"))},[e.createVNode(b,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),l[24]||(l[24]=e.createElementVNode("span",null,"人脸识别",-1))],32)])]),_:1})]),_:1},8,["modelValue"])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-fac9714d"]]);class Ee{static backendToFrontend(o){const{id:t,title:m,name:y,inputSchema:l,extraConfig:b}=o,T={id:t,title:m,label:y,type:"DETECTION_TARGET",inputSchema:l,extraConfig:b,data:{targetId:m,targetName:y,description:y,areas:l?.properties?.areas?.default||[],threshold:l?.properties?.threshold?.default||.5,targetWidth:l?.properties?.targetWidth?.default||20,targetHeight:l?.properties?.targetHeight?.default||20,postmodel:l?.properties?.postmodel?.default||"ClipVit",expandRect:l?.properties?.expandRect?.default!==void 0?l.properties.expandRect.default:!1,topScale:l?.properties?.topScale?.default||1.6,bottomScale:l?.properties?.bottomScale?.default||1.6,leftScale:l?.properties?.leftScale?.default||1.6,rightScale:l?.properties?.rightScale?.default||1.6,enableStructure:b?.showStruct!==void 0?!1:void 0}};return Object.keys(T.data).forEach(B=>{T.data[B]===void 0&&delete T.data[B]}),T}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},je=a=>et[a]||a,fe=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||je(a),...t}}),Ne=(a,o,t={})=>{const{sourceHandle:m,...y}=t,l={id:`e_${a}_${o}`,source:a,target:o};return m&&(l.sourceHandle=m),Object.keys(y).length>0&&(l.data=y),l},St=a=>{if(!a)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=a.rules||[],t=a.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(m=>({operator:m.op,value:m.value}))}},Vt=a=>{if(!a)return{duration:30,condition_type:"similarity",similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gt",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1};const o={">":"gt",">=":"gte","=":"eq","<=":"lte","<":"lt"};return{duration:a.value??30,condition_type:a.similarity?"similarity":"hit_rate",similarity_enabled:!!a.similarity,similarity_threshold:a.similarity?.value??90,hit_rate_enabled:!!a.hitCount,hit_rate_operator:o[a.hitCount?.op]||"gt",hit_rate_threshold:a.hitCount?.value??2,overlap_detection:a.overlap?{enabled:!0,operator:o[a.overlap.op]||"gt",threshold:a.overlap.value}:{enabled:!1,operator:"gt",threshold:null},reset_timer:!1}},Bt=a=>{if(!a)return{};const o={};return a.interval&&(o.reportFrequency="interval",o.reportInterval=a.interval.value),a.dedup&&(o.enableDeduplication=!0,o.similarityThreshold=a.dedup.value),o},At=()=>({properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]}),Dt=()=>({properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",default:!1}},required:[]}),Lt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),ze=()=>{const a=ae(),o=e.inject("editorConfig",null),t=g=>tt[g]||k.DETECTION_TARGET,m=(g,O)=>g?.find(E=>E.id===String(O))??g?.[O],y=(g,O)=>g.streamConfig?(g.children||[]).some(S=>(S.branchRefs||[]).some(A=>m(O.branches,A)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=g=>!g||typeof g!="object"?"无效的JSON格式":!g.ruleName&&g.ruleName!==""?"缺少 ruleName 字段":g.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",b=g=>{const O=o?.value??o;return g==="small"?O?.smallModels||[]:g==="detection"?O?.detection||[]:g==="classification"?O?.classification?.models||[]:[]},T=()=>{},B=(g,O)=>{g.modelName=O||"",g.title=O||"",g.modelId=O||null;const L=b("small").find(S=>S.title===O);L&&(g.input_schema=L.inputSchema||L.input_schema||{},g.modelId=L.id||L.title,g.modelName=L.name||O,g.modelType=L.type,g.supportDirectAlert=L.supportDirectAlert||!1,g.extraConfig=L.extraConfig)},q=async(g,O)=>{const E=t(g.toolTitle),L={label:g.nodeName||je(E),arguments:g.arguments||{},input_schema:{}};switch(E){case k.DETECTION_TARGET:L.targetId=g.toolTitle,L.targetName=g.nodeName||"检测目标";{const A=b("detection").find(i=>i.title===g.toolTitle);if(A){let r=Ee.backendToFrontend(A).inputSchema||{};if(g.toolTitle==="other"){const _={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};r={...r,properties:{...r.properties,..._.properties}}}L.input_schema=r}}break;case k.CLASSIFICATION_MODEL:L.modelName=g.nodeName||"分类模型";break;case k.SMALL_MODEL:B(L,g.toolTitle);break}return g.branchLogic&&(L.enableBranch=!0,L.branchLogic=g.branchLogic),fe(E,O,L)},M=(g,O,E,L)=>{const S={label:"小模型",input_schema:{},arguments:g.arguments||{}};return B(S,g.toolTitle),O===de.SMALL_MODEL_BRANCH&&(S.enableBranch=!0,S.branchLogic=E.logic||"and"),fe("smallModel",L,S)},f=async(g,O,E,L,S,A)=>{let i=O,r=L;const _={branchOrder:g.sortOrder??1,branchName:g.branchName||"",branchId:g.id??null};g.sourceHandle&&(_.sourceHandle=g.sourceHandle);const p=g.timeWindowSeconds??g.extraConfig?.timeWindowSeconds;p!==void 0&&(_.timeWindowSeconds=p),g.description&&(_.branchDescription=g.description);const w=[...g.nodes||[]].sort((h,D)=>(h.sortOrder??0)-(D.sortOrder??0)),G=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]);let F=-1;w.forEach((h,D)=>{G.has(t(h.toolTitle))&&(F=D)});const R=w.map(h=>({kind:"regular",data:h})),j=g.targetCount??g.extraConfig?.targetCount,z=g.duration??g.extraConfig?.duration,Y=[];j&&Y.push({kind:"targetCount",data:j}),z&&Y.push({kind:"timerTarget",data:z}),Y.length>0&&R.splice(F+1,0,...Y);for(let h=0;h<R.length;h++){const D=R[h];let H;if(D.kind==="regular")H=await q(D.data,{x:r,y:E});else if(D.kind==="targetCount"){const W=St(D.data);H=fe("targetCount",{x:r,y:E},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=Vt(D.data);H=fe("timerTarget",{x:r,y:E},{label:"目标计时",arguments:W,input_schema:{duration:{required:!0,type:"integer",min:1,max:3600},condition_type:{required:!0,type:"string",enum:["similarity","hit_rate"]},similarity_threshold:{required:!1,type:"integer",min:0,max:100},hit_rate_threshold:{required:!1,type:"integer",min:0,max:100},reset_timer:{required:!0,type:"boolean"}}})}S.push(H),A.push(Ne(i,H.id,h===0?_:void 0)),i=H.id,r+=ie.H_GAP}return{lastNodeId:i,endX:r}},C=g=>{const O=g.ruleSchema.sourceGroups||[],E=g.ruleSchema.groupLogic||"and",L=O.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:g.ruleName||"",enableBranch:L?!0:E!=="and",branchLogic:E,groupWindowSeconds:g.ruleSchema.groupWindowSeconds??null})},N=g=>{const O=Bt(g.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:At(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...O}})},c=(g,O)=>[...g||[]].sort((E,L)=>(E.sort??0)-(L.sort??0)).map(E=>{const L=y(E,O),S=[];return(E.children||[]).forEach(A=>{(A.branchRefs||[]).forEach(i=>{const r=m(O.branches,i);r&&S.push(r)})}),S.sort((A,i)=>(A.sortOrder??0)-(i.sortOrder??0)),{sg:E,mode:L,refBranches:S}}),u=g=>{const E=(g.reduce((L,S)=>L+Math.max(S.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-E/2},n=async(g,O,E,L,S,A)=>{const{sg:i,mode:r,refBranches:_}=g,p=Math.max(_.length,1),w=E+(p-1)*ie.V_GAP/2;let G=ie.START_X+ie.H_GAP,F=ie.START_X;const R=i.logic==="order",j=fe("dataSource",{x:G,y:w},{label:i.name||"数据源",sourceGroupId:i.sourceGroupId??null,enableImageSequence:R,input_schema:Dt(),arguments:{needCooperativeDetection:!!i.synEnabled,windowSeconds:i.windowSeconds||5,enableImageSequence:R},enableBranch:!0,branchLogic:R?"order":i.logic||"and"});L.push(j),S.push(Ne(O.id,j.id,{branchOrder:i.sort??null,branchName:i.name||""})),R&&_.forEach((h,D)=>{h.sourceHandle||(h.sourceHandle=D===0?"first-frame":Lt())});const z=R?{dataSourceNode:j,refBranches:_}:null;let Y=j.id;if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){G+=ie.H_GAP;const h=M(i.streamConfig,r,i,{x:G,y:w});L.push(h),S.push(Ne(j.id,h.id)),Y=h.id}if(_.length>0)for(let h=0;h<_.length;h++){const D=E+h*ie.V_GAP,{lastNodeId:H,endX:W}=await f(_[h],Y,D,G+ie.H_GAP,L,S);S.push(Ne(H,A.id)),W>F&&(F=W)}else{S.push(Ne(Y,A.id));const h=G+ie.H_GAP;h>F&&(F=h)}return{branchY:E+p*ie.V_GAP,maxX:F,imageSequenceInfo:z}},x=g=>{for(const{dataSourceNode:O,refBranches:E}of g){const L=E.filter(S=>S.sourceHandle&&S.sourceHandle!=="first-frame");L.length>0&&(O.data.subsequentFrames=L.map((S,A)=>({id:A===0?"default-subsequent":`subsequent-${Date.now()}-${A}`,label:A===0?"后续帧检测":`后续帧检测${A+1}`,handleId:S.sourceHandle})))}};return{importFromJSON:async g=>{const O=l(g);if(O)return Z.ElMessage.error(O),!1;try{T();const E=[],L=[],S=C(g),A=N(g);E.push(S);const i=c(g.ruleSchema.sourceGroups,g);let r=u(i),_=ie.START_X;const p=[];for(const w of i){const G=await n(w,S,r,E,L,A);r=G.branchY,G.maxX>_&&(_=G.maxX),G.imageSequenceInfo&&p.push(G.imageSequenceInfo)}return A.position.x=_+ie.H_GAP,E.push(A),x(p),a.loadWorkflow(E,L),Z.ElMessage.success("导入成功"),!0}catch(E){return Z.ElMessage.error("导入失败: "+(E.message||"未知错误")),!1}},validateImportJSON:l}},Ot=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:m,validateImportJSON:y}=ze(),l=(N,c)=>{const u=N.mode??0,n=N.interval??0,x=N.sw_decoding===!1?"GPU":"CPU";let P,g;return c?u===1?(P=2,g=0):u===0&&n===0?(P=3,g=0):(P=1,g=n):u===1?(P=2,g=0):n===0?(P=0,g=30):(P=0,g=n),{mode:P,interval:g,sw_decoding:x}},b=(N,c)=>{const u=N.frameExtractionType??1,n=N.frameInterval??0,P=(N.frameExtractionSourceType??1)===2?"GPU":"CPU";let g,O;return u===0?(g=3,O=0):u===1&&n===0?(g=c?2:0,O=30):u===1?(g=0,O=n):u===2?(g=1,O=n):u===3?(g=2,O=0):(g=c?3:0,O=30),{mode:g,interval:O,sw_decoding:P}},T=N=>N===1?"device":"platform",B=N=>!N||N.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(N.pollingAmount??1)},q=(N,c,u)=>{if(c){const n=N.find(x=>x.sourceGroupId===c);if(n)return n}return N[u]??null},M=(N,c)=>{if(!N?.branches)return null;for(const u of N.branches){const n=u.nodes?.find(x=>x.toolTitle===c);if(n?.arguments)return{...n.arguments}}return null},f=N=>{if(!Array.isArray(N)||N.length===0)return{timeZone:"",planType:0};const c=N.map(n=>({dayType:Number(n.dayType??0),timePeriod:(n.timePeriod??[]).map(x=>({startTime:x.startTime,endTime:x.endTime}))})),u=c.some(n=>n.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:c}),planType:u}};return{importFromJSON:async N=>{const c=y(N);if(c)return Z.ElMessage.error(c),!1;if(!await m(N))return!1;const n=a?.value??a;if(!n||typeof n!="object"||Object.keys(n).length===0)return!0;const x=n.graph??{},P=x.sources??[],g=x.extraConfig??{},O=t.nodes.find(i=>i.type===k.START);if(O){const i=n.name??x.workflowName??"",r=!!g.enableVideo,_=g.schedule??[],{timeZone:p,planType:w}=f(_);t.updateNodeData(O.id,{taskName:i,enableAlertVideo:r,schedule:_,timeZone:p,planType:w,...p?{executionTime:p}:{}})}const E=t.nodes.filter(i=>i.type===k.DATA_SOURCE),L=t.nodes.some(i=>i.type===k.SMALL_MODEL);return E.forEach((i,r)=>{const _=i.data?.sourceGroupId??null,p=q(P,_,r);if(!p)return;const w=p.attach??{},G=p.streamConfig?.decoder??null,F=w.deviceType==="1400"?"1400":"camera",R=F==="camera"?G?l(G,L):b(w,L):{},j=F==="camera"?B(w.pollingConfig):{},z=F==="1400"?{detectionMode:T(w.detectionType)}:{},Y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...Y,deviceType:F,...R,...j,...z}});const h=o?.value??o;if(h?.datasource?.setDevices){const H=(_?P.filter(W=>W.sourceGroupId===_):[p]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));h.datasource.setDevices(i.id,H)}}),t.nodes.filter(i=>i.type===k.DETECTION_TARGET).forEach(i=>{const r=new Set,_=[i.id];let p=null;for(;_.length&&!p;){const h=_.shift();if(r.has(h))continue;r.add(h);const D=t.edges.filter(H=>H.target===h);for(const H of D){const W=t.nodes.find(s=>s.id===H.source);if(W){if(W.type===k.DATA_SOURCE){p=W.id;break}_.push(W.id)}}}if(!p)return;const G=(o?.value??o)?.datasource?.getDevices?.(p)??[];if(G.length<=1)return;const F=i.data?.targetId;if(!F)return;const R=G.map(h=>{const D=String(h.sourceId??h.id??""),H=P.find(W=>String(W.sourceId)===D);if(!H?.branches)return{deviceId:D,args:null};for(const W of H.branches){const s=W.nodes?.find(d=>d.toolTitle===F);if(s?.arguments)return{deviceId:D,args:{...s.arguments}}}return{deviceId:D,args:null}}),j=R.filter(h=>h.args!==null);if(j.length===0)return;const z=JSON.stringify(j[0].args);if(j.some(h=>JSON.stringify(h.args)!==z)){const h=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...h,configMode:"perDevice"}}),R.forEach(({deviceId:D,args:H})=>{H&&t.setTaskSourceArguments(p,D,i.id,H)})}}),t.nodes.filter(i=>i.type===k.FACE_RECOGNITION).forEach(i=>{const r=new Set,_=[i.id];let p=null;for(;_.length&&!p;){const Y=_.shift();if(r.has(Y))continue;r.add(Y);const h=t.edges.filter(D=>D.target===Y);for(const D of h){const H=t.nodes.find(W=>W.id===D.source);if(H){if(H.type===k.DATA_SOURCE){p=H.id;break}_.push(H.id)}}}const G=(p?t.nodes.find(Y=>Y.id===p):null)?.data?.sourceGroupId??null,F=E.findIndex(Y=>Y.id===p),R=q(P,G,F>=0?F:0);if(!R)return;const j=M(R,"face");if(!j?.repositoryId)return;const z=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...z,repositoryId:Array.isArray(j.repositoryId)?j.repositoryId:[j.repositoryId]}})}),!0},validateImportJSON:y}},Mt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Ot():ze(),It={class:"node-content"},Rt={class:"node-label"},$t=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("VideoPlay"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",It,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("span",Rt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Ft={class:"node-content"},qt={class:"node-label"},Gt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("CircleClose"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ft,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("span",qt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Ht={class:"node-content"},Pt={class:"node-info"},jt={class:"node-label"},zt={key:1,class:"sequence-handles"},Ut={class:"handle-item"},Wt={class:"handle-label"},Jt={key:0,class:"handle-item add-button-item"},Yt=oe({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,M=>{const f=Math.random()*16|0;return(M==="x"?f:f&3|8).toString(16)}),b=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let T=!1;const B=()=>{if(T)return;T=!0;const M=o.data.subsequentFrames||[],f={id:l(),label:`后续帧检测${M.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,f),setTimeout(()=>{T=!1},300)},q=async M=>{const f=o.data.subsequentFrames.find(N=>N.id===M);if(t.edges.some(N=>N.source===o.id&&N.sourceHandle===f.handleId))try{await Z.ElMessageBox.confirm(`删除"${f.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,M)};return(M,f)=>{const C=e.resolveComponent("FolderOpened"),N=e.resolveComponent("el-icon"),c=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["data-source-node",{"sequence-mode":a.data.enableImageSequence,selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ht,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(C)]),_:1}),e.createElementVNode("div",Pt,[e.createElementVNode("div",jt,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(v.Handle),{key:0,type:"source",position:e.unref(v.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",zt,[e.createElementVNode("div",Ut,[f[0]||(f[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,u=>(e.openBlock(),e.createElementBlock("div",{key:u.id,class:"handle-item"},[e.createElementVNode("span",Wt,e.toDisplayString(u.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:u.handleId,class:"handle-right"},null,8,["position","id"]),u.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(N,{key:0,class:"delete-icon",onClick:e.withModifiers(n=>q(u.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Jt,[e.createVNode(c,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(B,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Xt={class:"node-content"},Qt={class:"node-info"},Kt={class:"node-label"},Zt={key:0,class:"node-model"},vt={key:1,class:"node-placeholder"},eo={key:0,class:"direct-alert-badge"},to=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("Cpu"),y=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Xt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("div",Qt,[e.createElementVNode("div",Kt,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",Zt,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",vt,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",eo,[e.createVNode(y,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),oo={class:"node-content"},no={class:"node-info"},ao={class:"node-target"},lo={class:"node-params"},ro=oe({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=()=>o.data.targetName||o.data.label||"检测目标",m=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),y=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const l=o.data.arguments.object;if(Array.isArray(l))return l.filter(T=>T&&T.trim()!=="").length}return null});return(l,b)=>{const T=e.resolveComponent("View"),B=e.resolveComponent("el-icon"),q=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",oo,[e.createVNode(B,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",no,[b[1]||(b[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",ao,e.toDisplayString(t()),1),e.createElementVNode("div",lo,[y.value?(e.openBlock(),e.createBlock(q,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),m.value?(e.openBlock(),e.createBlock(q,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.targetHeight&&a.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(q,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(a.data.arguments.targetWidth)+"x"+e.toDisplayString(a.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(q,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...b[0]||(b[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),so={class:"node-content"},io={class:"node-info"},co={class:"node-label"},mo={key:0,class:"node-model"},po={key:1,class:"node-placeholder"},uo={key:2,class:"node-stats"},fo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const m=e.resolveComponent("Grid"),y=e.resolveComponent("el-icon"),l=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["classification-model-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",so,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(m)]),_:1}),e.createElementVNode("div",io,[e.createElementVNode("div",co,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",mo,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",po,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",uo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(l,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.categories?.length>0?(e.openBlock(),e.createBlock(l,{key:1,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.data.arguments.categories.length)+" 类 ",1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.topK?(e.openBlock(),e.createBlock(l,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" Top-"+e.toDisplayString(a.data.arguments.topK),1)]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),go={class:"node-content"},ho={class:"node-info"},yo={class:"node-label"},_o={class:"node-params"},No=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return ae(),(o,t)=>{const m=e.resolveComponent("el-icon"),y=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",go,[e.createVNode(m,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",ho,[e.createElementVNode("div",yo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",_o,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(y,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),Co={class:"node-content"},ko={class:"node-info"},bo={class:"node-label"},xo={class:"node-scope"},Eo={class:"node-params"},wo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(b=>b.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const b=e.resolveComponent("Document"),T=e.resolveComponent("el-icon"),B=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Co,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(b)]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",xo,e.toDisplayString(m()),1),e.createElementVNode("div",Eo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(B,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minPlateWidth!==void 0&&a.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(B,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minPlateWidth)+"×"+e.toDisplayString(a.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),To={class:"node-content"},So={class:"node-info"},Vo={class:"node-params"},Bo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},m=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const b=y[0];return`数量 ${t[b.operator]||b.operator} ${b.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${l})`});return(y,l)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",To,[e.createVNode(b,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",So,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Vo,[m.value?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Ao={class:"node-content"},Do={class:"node-info"},Lo={class:"node-label"},Oo={class:"node-params"},Mo=oe({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=e.computed(()=>o.data.description||"目标计时"),m=e.computed(()=>`${o.data.arguments?.duration||30}秒`),y=e.computed(()=>{const l=o.data.arguments?.condition_type;return l==="similarity"?`相似度 ${o.data.arguments?.similarity_threshold||90}%`:l==="hit_rate"?`命中率 ${o.data.arguments?.hit_rate_threshold||80}%`:""});return(l,b)=>{const T=e.resolveComponent("el-icon"),B=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Ao,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Do,[e.createElementVNode("div",Lo,e.toDisplayString(t.value),1),e.createElementVNode("div",Oo,[e.createVNode(B,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1}),y.value?(e.openBlock(),e.createBlock(B,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Io={class:"group-label"},Ro=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},m=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),l={width:"8px",height:"8px",borderRadius:"2px"},b={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(T,B)=>{const q=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",Io,[e.createVNode(q,{type:y.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1},8,["type"]),B[0]||(B[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(ve.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":b})],2)}}},[["__scopeId","data-v-adf6607d"]]),$o={class:"node-content"},Fo={class:"node-info"},qo={class:"node-label"},Go={class:"node-scope"},Ho={class:"node-params"},Po=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),m=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(b=>b.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const b=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",$o,[e.createVNode(b,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",Fo,[e.createElementVNode("div",qo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",Go,e.toDisplayString(m()),1),e.createElementVNode("div",Ho,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minFaceWidth!==void 0&&a.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(T,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minFaceWidth)+"×"+e.toDisplayString(a.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),jo={class:"quick-add-menu__list"},zo=["onClick"],Uo={class:"quick-add-menu__icon"},Wo={class:"quick-add-menu__label"},Jo={key:0,class:"quick-add-menu__empty"},ue=8,Yo=oe({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(a){const o=a,t=e.ref(null),m=e.ref({x:0,y:0});e.watch(()=>o.visible,async T=>{if(!T||(m.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const B=t.value.getBoundingClientRect(),q=window.innerWidth,M=window.innerHeight;let{x:f,y:C}=o.position;f+B.width>q-ue&&(f=q-B.width-ue),C+B.height>M-ue&&(C=M-B.height-ue),f<ue&&(f=ue),C<ue&&(C=ue),m.value={x:f,y:C}});const y=e.computed(()=>({left:m.value.x+"px",top:m.value.y+"px"})),l=[{type:"dataSource",label:"数据源",icon:"📦"},{type:"smallModel",label:"小模型",icon:"🤖"},{type:"detectionTarget",label:"检测目标",icon:"🎯"},{type:"classificationModel",label:"分类模型",icon:"🏷️"},{type:"ocr",label:"OCR识别",icon:"📝"},{type:"licensePlate",label:"车牌识别",icon:"🚗"},{type:"faceRecognition",label:"人脸识别",icon:"👤"},{type:"targetCount",label:"目标计数",icon:"📊"},{type:"timerTarget",label:"目标计时",icon:"⏱️"},{type:"end",label:"结束节点",icon:"🏁"}],b=e.computed(()=>{switch(o.sourceNodeType){case"start":return l.filter(T=>T.type==="dataSource");case"dataSource":return l.filter(T=>T.type==="smallModel"||T.type==="detectionTarget"||T.type==="classificationModel");case"smallModel":return l.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel"&&T.type!=="targetCount"&&T.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel");case"timerTarget":return l.filter(T=>["ocr","faceRecognition","licensePlate","end"].includes(T.type));case"targetCount":return l.filter(T=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(T.type));case"ocr":return l.filter(T=>["licensePlate","faceRecognition","end"].includes(T.type));case"licensePlate":return l.filter(T=>["ocr","faceRecognition","end"].includes(T.type));case"faceRecognition":return l.filter(T=>["ocr","licensePlate","end"].includes(T.type));default:return[]}});return(T,B)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[a.visible?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRef",ref:t,class:"quick-add-menu",style:e.normalizeStyle(y.value)},[B[1]||(B[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",jo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,q=>(e.openBlock(),e.createElementBlock("li",{key:q.type,class:"quick-add-menu__item",onClick:M=>T.$emit("select",q.type)},[e.createElementVNode("span",Uo,e.toDisplayString(q.icon),1),e.createElementVNode("span",Wo,e.toDisplayString(q.label),1)],8,zo))),128)),b.value.length===0?(e.openBlock(),e.createElementBlock("li",Jo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),a.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:B[0]||(B[0]=q=>T.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Xo={class:"workflow-canvas"},Ue=5,Qo=oe({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:m,onConnectStart:y,onConnectEnd:l}=v.useVueFlow(),b=e.inject("editorConfig",null),T=e.inject("editorMode",ee.ALGORITHM),B=e.computed(()=>T===ee.TASK),q=e.inject("echoAlgodata",null),{importFromJSON:M}=Mt();e.watch(q,async s=>{if(s&&Object.keys(s).length>0&&(await e.nextTick(),await M(s),B.value)){const d=s?.ruleSchema?.sourceGroups??[];let V=null;if(d.some($=>$.streamConfig)?V="stream":(d.length>1||d.some($=>($.children??[]).length>1))&&(V="image"),V){const $=o.nodes.find(U=>U.type===k.START);$&&o.updateNodeData($.id,{streamType:V})}}},{immediate:!0});const f=(s,d)=>{if(!d?.properties)return s;const V={};return Object.entries(d.properties).forEach(([$,U])=>{U.default!==void 0&&(V[$]=U.default)}),s.data.arguments={...V,...s.data.arguments},s},C=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),N=()=>{C.visible=!1,C.sourceNodeId=null,C.sourceNodeType=null,C.sourceHandleId=null,P=!1};let c=null,u=!1,n=null,x=null,P=!1;const g=()=>{n&&(document.removeEventListener("mousemove",n),n=null),x&&(document.removeEventListener("mouseup",x),x=null)};e.onUnmounted(()=>{g()}),y(({nodeId:s,handleId:d,handleType:V,event:$})=>{if(V!=="source")return;if(B.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const U=o.nodes.find(ne=>ne.id===s);if(!U||U.type==="end")return;if(U.type===k.DATA_SOURCE&&U.data?.enableImageSequence){if(d&&o.edges.filter(I=>I.source===s&&I.sourceHandle===d).length>=1)return}else if(U.type!==k.START&&U.type!==k.DATA_SOURCE&&o.edges.filter(I=>I.source===s).length>=1)return;const J=$?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}c={nodeId:s,sourceNodeType:U.type,handleId:d,menuX:Q,menuY:te,flowPos:{...U.position}},u=!1;const se=$?.clientX??0,ce=$?.clientY??0;g(),n=ne=>{(Math.abs(ne.clientX-se)>Ue||Math.abs(ne.clientY-ce)>Ue)&&(u=!0,g())},x=()=>{if(g(),!u&&c){P=!0;const ne=c;C.visible=!0,C.screenPos={x:ne.menuX,y:ne.menuY},C.sourceNodeId=ne.nodeId,C.sourceNodeType=ne.sourceNodeType,C.sourceHandleId=ne.handleId,C.flowPos=ne.flowPos}c=null},document.addEventListener("mousemove",n),document.addEventListener("mouseup",x)});const O=s=>{const d=C.sourceNodeId,V=o.nodes.find(K=>K.id===d);if(!V){N();return}if(B.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),N();return}const $=V.position.x+250,U=V.position.y;let J={x:$,y:U};const Q=60,te=80;let se=0,ce=!0;for(;ce;){ce=!1;const K=U+se;for(const le of o.nodes)if(Math.abs(le.position.x-$)<100&&Math.abs(le.position.y-K)<Q+20){ce=!0,se+=te;break}}if(J.y=U+se,s==="end"){const K=o.nodes.find(le=>le.type==="end");if(K){if(o.edges.some(ke=>ke.source===d&&ke.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),N();return}const he=L(V,K);if(!he.valid){Z.ElMessage.warning(he.message),N();return}o.addConnection({source:d,target:K.id,sourceHandle:C.sourceHandleId||null,targetHandle:null}),F(),N(),Z.ElMessage.success("已连接到结束节点");return}}let ne;switch(s){case"end":ne=be(J);break;case"dataSource":ne=xe(J);break;case"smallModel":ne=Be(J);break;case"detectionTarget":ne=Ae(J);break;case"classificationModel":ne=De(J);break;case"ocr":{const K=b?.value??b;ne=f(Le(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=b?.value??b;ne=f(Oe(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=b?.value??b;ne=f(Re(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Me(J);break;case"timerTarget":ne=Ie(J);break;default:N();return}const I=L(V,ne);if(!I.valid){Z.ElMessage.warning(I.message),N();return}o.addNode(ne),o.addConnection({source:d,target:ne.id,sourceHandle:C.sourceHandleId||null,targetHandle:null}),F(),N(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},E=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],L=(s,d)=>{if(s?.parentNode&&d?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(d?.parentNode&&s?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(s?.type===k.START){if(d?.type!==k.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(U=>U.source===s.id).some(U=>o.nodes.find(Q=>Q.id===U.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(d?.type===k.SMALL_MODEL){if(s?.type!==k.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(J=>J.source===s.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type!==k.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(s?.type===k.DATA_SOURCE){if(d?.type!==k.SMALL_MODEL&&d?.type!==k.DETECTION_TARGET&&d?.type!==k.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(J=>J.source===s.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type===k.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(s?.type===k.SMALL_MODEL&&(d?.type===k.TARGET_COUNT||d?.type===k.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(s?.type===k.TARGET_COUNT&&![k.TIMER_TARGET,k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(d?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(s?.type===k.TIMER_TARGET&&![k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(d?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const V=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION];return V.includes(s?.type)&&!V.filter(U=>U!==s.type).concat(k.END).includes(d?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:d?.type!==k.END&&o.edges.filter(U=>U.target===d?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},S=e.markRaw({start:$t,end:Gt,dataSource:Yt,smallModel:to,detectionTarget:ro,classificationModel:fo,ocr:No,licensePlate:wo,targetCount:Bo,timerTarget:Mo,group:Ro,faceRecognition:Po}),A=e.computed({get:()=>o.nodes,set:s=>{o.nodes=s}}),i=e.computed({get:()=>o.edges,set:s=>{o.edges=s}}),r=s=>{s.forEach(d=>{if(d.type==="position"&&d.position)o.updateNodePosition(d.id,d.position);else if(d.type==="remove"){if(B.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const V=o.nodes.find(U=>U.id===d.id);if(V&&V.type===k.START){Z.ElMessage.warning("开始节点不可删除");return}if(V&&V.type===k.END){Z.ElMessage.warning("结束节点不可删除");return}if(V&&V.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const $=V?.parentNode;o.removeNode(d.id),$&&o.nodes.filter(J=>J.parentNode===$).length===0&&o.dissolveParallelGroup($)}})},_=s=>{s.forEach(d=>{if(d.type==="remove"){if(B.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(d.id)}})},p=s=>{if(P)return;if(B.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),N();return}const d=o.nodes.find(U=>U.id===s.source),V=o.nodes.find(U=>U.id===s.target),$=L(d,V);if(!$.valid){Z.ElMessage.warning($.message),N();return}if(d?.type===k.DATA_SOURCE&&d.data.enableImageSequence&&s.sourceHandle&&o.edges.filter(J=>J.source===s.source&&J.sourceHandle===s.sourceHandle).length>=1){const J=s.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";Z.ElMessage.warning(`${J}连接点只能连接一个节点`);return}if(E.includes(d?.type)&&!d.data.enableBranch&&o.edges.filter(J=>J.source===s.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(s),F(),N()},w=s=>({and:"ALL",or:"SOME"})[s]||"ALL",G=s=>{const d=o.nodes.find(V=>V.id===s.source);if(!d)return"";if(d.type===k.START){const V=d.data.branchLogic||"and",$=w(V),U=s.data?.branchOrder;return U!=null?`${$} - 执行顺序 ${U}`:$}if(d.type===k.DATA_SOURCE){if(d.data?.enableImageSequence){const J=s.sourceHandle==="first-frame"?"首帧":"后续帧",Q=s.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const V=d.data.branchLogic||"and",$=w(V),U=s.data?.branchOrder;return U!=null?`${$} - 执行顺序 ${U}`:$}return""},F=()=>{o.edges.forEach(s=>{const d=G(s);s.label!==d&&(s.label=d,s.labelStyle=d?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,s.labelBgStyle=d?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,s.labelBgPadding=d?[4,6]:void 0)})},R=()=>{o.nodes.forEach(s=>{if(s.type!=="group")return;const d=s.data.sourceNodeId;if(!d)return;const V=o.nodes.find($=>$.id===d);V?.data?.enableBranch&&V.data.branchLogic!==s.data.branchLogic&&o.updateNodeData(s.id,{branchLogic:V.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(s=>E.includes(s.type)).map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic})),(s,d)=>{d&&s.forEach(V=>{const $=d.find(U=>U.id===V.id);if($){if(V.enableBranch&&!$.enableBranch){const U=o.nodes.find(J=>J.id===V.id);if(!U)return;o.createEmptyGroup({x:U.position.x+200,y:U.position.y-30},U.data.branchLogic||"and",V.id)}else if(!V.enableBranch&&$.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.dissolveParallelGroup(U.id)}if(V.enableBranch&&$.branchLogic!==V.branchLogic){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.updateNodeData(U.id,{branchLogic:V.branchLogic})}}})}),e.watch(()=>o.nodes.filter(s=>s.type!=="group").map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic,branchOrder:s.data.branchOrder})),()=>{F(),R()},{deep:!0}),e.watch(()=>o.edges.map(s=>({id:s.id,branchOrder:s.data?.branchOrder})),(s,d)=>{F(),d&&s.forEach(V=>{const $=d.find(U=>U.id===V.id);if($&&$.branchOrder!==V.branchOrder&&V.branchOrder!==void 0){const U=o.edges.find(J=>J.id===V.id);if(U){const J=o.nodes.find(Q=>Q.id===U.source);J&&J.type===k.DATA_SOURCE&&o.updateNodePosition(J.id,{x:J.position.x,y:J.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([s,d])=>{o.nodes.forEach(V=>{s.has(V.id)?V.class="invalid-node":V.class==="invalid-node"&&(V.class="")}),o.edges.forEach(V=>{d.has(V.id)?V.class="invalid-edge":V.class==="invalid-edge"&&(V.class="")})},{deep:!0});const j=s=>{s.event?.target?.closest(".vue-flow__handle")||o.selectNode(s.node.id)},z=s=>{o.selectEdge(s.edge.id)},Y=s=>{if(B.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(s.edge.id)},h=()=>{o.clearSelection()},D=({node:s})=>{if(s.type==="group"||!E.includes(s.type))return;const d=o.nodes.filter($=>$.type==="group");let V=null;for(const $ of d){const U=m($.id);if(!U)continue;const J=U.dimensions?.width||parseInt($.style?.width)||300,Q=U.dimensions?.height||parseInt($.style?.height)||160;let te=s.position.x,se=s.position.y;if(s.parentNode){const he=o.nodes.find(ke=>ke.id===s.parentNode);he&&(te+=he.position.x,se+=he.position.y)}const ce=m(s.id),ne=ce?.dimensions?.width||160,I=ce?.dimensions?.height||60,K=te+ne/2,le=se+I/2;if(K>=$.position.x&&K<=$.position.x+J&&le>=$.position.y&&le<=$.position.y+Q){V=$.id;break}}V?s.parentNode!==V&&o.addNodeToGroup(s.id,V):s.parentNode&&o.removeNodeFromGroup(s.id)},H=s=>{s.preventDefault(),s.dataTransfer&&(s.dataTransfer.dropEffect="move")},W=s=>{s.preventDefault();const d=s.dataTransfer?.getData("application/vueflow");if(!d)return;if(B.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(d===k.START&&o.getNodeCountByType(k.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(d===k.END&&o.getNodeCountByType(k.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const V=160,$=60,U=t({x:s.clientX,y:s.clientY}),J={x:U.x-V/2,y:U.y-$/2};let Q;switch(d){case k.START:Q=Ve(J);break;case k.END:Q=be(J);break;case k.DATA_SOURCE:Q=xe(J);break;case k.SMALL_MODEL:Q=Be(J);break;case k.DETECTION_TARGET:Q=Ae(J);break;case k.CLASSIFICATION_MODEL:Q=De(J);break;case k.OCR:{const te=b?.value??b;Q=f(Le(J),te?.ocr?.[0]?.inputSchema);break}case k.LICENSE_PLATE:{const te=b?.value??b;Q=f(Oe(J),te?.license_plate?.[0]?.inputSchema);break}case k.TARGET_COUNT:Q=Me(J);break;case k.TIMER_TARGET:Q=Ie(J);break;case k.FACE_RECOGNITION:{const te=b?.value??b;Q=f(Re(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(s,d)=>(e.openBlock(),e.createElementBlock("div",Xo,[e.createVNode(e.unref(v.VueFlow),{nodes:A.value,"onUpdate:nodes":d[0]||(d[0]=V=>A.value=V),edges:i.value,"onUpdate:edges":d[1]||(d[1]=V=>i.value=V),"node-types":e.unref(S),onNodesChange:r,onEdgesChange:_,onConnect:p,onNodeClick:j,onEdgeClick:z,onEdgeDoubleClick:Y,onPaneClick:h,onDrop:W,onDragover:H,onNodeDragStop:D,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(Ke.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(Ze.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Yo,{visible:C.visible,position:C.screenPos,"source-node-type":C.sourceNodeType,onSelect:O,onClose:N},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-70847917"]]),Ko={class:"config-header"},Zo={key:0,class:"config-section"},vo={key:1,class:"config-section"},en=oe({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),m=e.computed(()=>t===ee.TASK),y=e.computed(()=>{const M=o.selectedEdge;return M&&o.nodes.find(C=>C.id===M.source)?.data?.enableBranch?M:null}),l=e.computed(()=>y.value&&o.nodes.find(f=>f.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),b=e.computed(()=>{if(!y.value)return!1;const M=o.nodes.find(f=>f.id===y.value.source);return(M?.type==="dataSource"||M?.type==="start")&&M?.data?.enableBranch}),T=e.computed(()=>{if(!y.value)return 1;const M=o.nodes.find(f=>f.id===y.value.source);return M?o.edges.filter(f=>f.source===M.id).length:1}),B=e.computed(()=>{if(!y.value)return!1;const M=o.nodes.find(f=>f.id===y.value.source);return M?M.type==="dataSource"&&M.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),q=M=>{y.value&&o.updateEdgeData(y.value.id,M)};return(M,f)=>{const C=e.resolveComponent("el-divider"),N=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-text"),u=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form"),x=e.resolveComponent("el-option"),P=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ko,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(C),B.value?(e.openBlock(),e.createElementBlock("div",Zo,[f[3]||(f[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":y.value?.data?.timeWindowSeconds??null,onChange:f[0]||(f[0]=g=>q({timeWindowSeconds:g})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(c,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...f[2]||(f[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),b.value?(e.openBlock(),e.createElementBlock("div",vo,[f[5]||(f[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":y.value?.data?.branchOrder??null,disabled:m.value,onChange:f[1]||(f[1]=g=>q({branchOrder:g})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,g=>(e.openBlock(),e.createBlock(x,{key:g,label:`执行顺序 ${g}`,value:g},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(c,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...f[4]||(f[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),tn={class:"config-section"},on=oe({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const m=e.resolveComponent("el-divider"),y=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(m),e.createElementVNode("div",tn,[e.createVNode(y,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),nn={class:"time-init-container"},an={key:0,class:"time-header flex-x-start"},ln={class:"tab-type flex-x"},rn={class:"time-content"},sn={id:"time-content-table-body"},cn=["onClick"],dn=["onClick"],mn=["data-sort","data-value","data-day","data-type","onMousedown"],pn={key:1},un=["data-sort","data-value","data-type","onMousedown"],fn={class:"time-list"},gn={key:0,class:"time-list-title"},hn={key:1,style:{"margin-right":"10px"}},yn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,m=e.ref(0);let y,l,b,T,B;const q=e.ref(new Map),M=e.ref(new Map),f=e.computed(()=>m.value===0?q.value:M.value);e.onMounted(()=>{y=document.querySelector("#time-content-table-body"),l=y.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",n)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",n)});const C=p=>{m.value!==p&&(m.value=p,e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),l.forEach(G=>G.classList.remove("selected")),(p===0?q.value:M.value).forEach((G,F)=>{G.origin.forEach(R=>{Array.from(l).forEach(j=>{Number(j.dataset.sort)==R.sort&&Number(j.dataset.value)==R.value&&Number(j.dataset.day)==F&&j.classList.add("selected")})})})}))},N=e.ref([{name:"每日",value:0},{name:"一",value:1},{name:"二",value:2},{name:"三",value:3},{name:"四",value:4},{name:"五",value:5},{name:"六",value:6},{name:"日",value:7}]),c=(p,w,G)=>{t.operationType!=3&&G.which==1&&(T=p,b=Number(G.target.dataset.value),G.target.classList.contains("selected")?(G.target.classList.remove("selected"),B=""):(B="selected",G.target.classList.add("selected")),u(),E())},u=()=>{l.forEach(p=>{p.addEventListener("mouseover",x,!1,{once:!0})})},n=()=>{l.forEach(p=>{p.removeEventListener("mouseover",x)})},x=p=>{p.target.classList.remove("selected"),B&&p.target.classList.add(B);let w=Number(p.target.dataset.value),G=Number(p.target.dataset.day),F=G>T?G:T,R=G<T?G:T,j=w>b?w:b,z=w<b?w:b;for(let Y=R;Y<=F;Y++)for(let h=z;h<=j;h++){let D=document.querySelector(`td[data-value="${h}"][data-day="${Y}"]`);D.classList.remove("selected"),B&&D.classList.add(B)}E()},P=p=>{if(t.operationType==3)return;let w=[];l.forEach(G=>{Number(G.dataset.day)==p&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),E()},g=p=>{if(t.operationType==3)return;let w=[];l.forEach(G=>{Number(G.dataset.sort)==p&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),E()},O=()=>{l.forEach(w=>{w.classList.remove("selected")}),(m.value===0?q:M).value.clear()},E=()=>{const p=m.value===0?q:M;p.value.clear(),l.forEach(w=>{if(w.classList.contains("selected")){let G=w.dataset.day,F=w.dataset.sort,R=w.dataset.value;p.value.get(G)?p.value.get(G).origin.push({sort:Number(F),value:Number(R)}):p.value.set(G,{origin:[{sort:Number(F),value:Number(R)}],timeList:[]})}})},L=p=>{let F=f.value.get(p).origin.map(R=>R.value).reduce((R,j,z,Y)=>(z==0?R.push([j]):j==Y[z-1]+1?R[R.length-1].push(j):R.push([j]),R),[]);return F=F.map(R=>{let j=Math.max(...R)+1,z=Math.min(...R)+1,Y=z%2==0?30:0,h=j%2==0?0:30,D=S(Math.ceil(z/2)-1),H=S(Math.ceil(j/2)-(h==0?0:1));return{dayType:p,startTime:D+":"+(Y==0?"00":Y),endTime:H+":"+(h==0?"00":h)}}),f.value.get(p).timeList=F,F.map(R=>R.startTime+"-"+R.endTime).join()};function S(p){return p<10?"0"+p:p}const A=(p,w)=>{q.value.clear(),M.value.clear(),l.forEach(j=>j.classList.remove("selected")),m.value=w;const G=w===0?q:M,F=JSON.parse(p);let R=[];F.plan.forEach(j=>{j.timePeriod.forEach(z=>{R.push({...z,dayType:j.dayType})})}),e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),R.forEach(j=>{G.value.get(j.dayType)?G.value.get(j.dayType).timeList.push(j):G.value.set(j.dayType,{origin:[],timeList:[{...j}]})}),G.value.forEach((j,z)=>{j.timeList.forEach(Y=>{let h=Number(Y.startTime.split(":")[1]),D=Number(Y.endTime.split(":")[1]),H=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if(H==W){j.origin.push({sort:H,value:2*H});return}for(let s=H;s<=W;s++)if(s==H)h==0?(j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1})):j.origin.push({sort:s,value:2*s+1});else if(s>H&&s<W)j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1});else if(D==0){if(s==W)return;j.origin.push({sort:s,value:2*s}),j.origin.push({sort:s,value:2*s+1})}else j.origin.push({sort:s,value:2*s})}),j.origin.forEach(Y=>{Array.from(l).find(h=>{Number(h.dataset.sort)==Y.sort&&Number(h.dataset.value)==Y.value&&Number(h.dataset.day)==z&&h.classList.add("selected")})})})})},i=(p,w)=>p.map(R=>R.value).sort((R,j)=>R-j).reduce((R,j,z,Y)=>(z==0?R.push([j]):j==Y[z-1]+1?R[R.length-1].push(j):R.push([j]),R),[]).map(R=>{let j=Math.max(...R)+1,z=Math.min(...R)+1,Y=z%2==0?30:0,h=j%2==0?0:30,D=S(Math.ceil(z/2)-1),H=S(Math.ceil(j/2)-(h==0?0:1));return{dayType:w,startTime:D+":"+(Y==0?"00":Y),endTime:H+":"+(h==0?"00":h)}});return o({getTimeData:()=>{(m.value===0?M:q).value.clear();let w=[];f.value.forEach((R,j)=>{const z=i(R.origin,j);w=w.concat(z)});let G={plan:[]},F=w.map(R=>R.dayType).filter((R,j,z)=>z.indexOf(R)===j);return F.length?(F.forEach(R=>{G.plan.push({dayType:R,timePeriod:w.filter(j=>j.dayType===R).map(j=>({startTime:j.startTime,endTime:j.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(G),planType:m.value}):{validTime:!1}},revertByTime:A,resetFn:()=>{m.value=0,q.value.clear(),M.value.clear(),e.nextTick(()=>{l.forEach(p=>{p.classList.remove("selected")}),l=y.querySelectorAll("td.sel-able[data-type]")})}}),(p,w)=>{const G=e.resolveComponent("el-icon"),F=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",nn,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",an,[e.createElementVNode("div",ln,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:m.value==0}]),onClick:w[0]||(w[0]=R=>C(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:m.value==1}]),onClick:w[1]||(w[1]=R=>C(1))}," 日计划 ",2)]),e.createVNode(F,{class:"rm-icon",link:"",type:"danger",onClick:O},{default:e.withCtx(()=>[e.createVNode(G,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",rn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:w[3]||(w[3]=R=>R.preventDefault())},[w[5]||(w[5]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th"),e.createElementVNode("th",{colspan:"24"},"上午"),e.createElementVNode("th",{colspan:"24"},"下午")])],-1)),e.createElementVNode("tbody",sn,[e.createElementVNode("tr",null,[w[4]||(w[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,R=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:j=>g(R-1)},e.toDisplayString(R-1),9,cn)),64))]),m.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(N.value.filter(R=>R.value!=0),R=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:j=>P(R.value)},e.toDisplayString(R.name),9,dn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,j=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((j-1)/2),"data-value":j-1,"data-day":R.value,"data-type":m.value,onMousedown:z=>c(R.value,j,z)},null,40,mn)),64))]))),256)):e.createCommentVNode("",!0),m.value==1?(e.openBlock(),e.createElementBlock("tr",pn,[e.createElementVNode("th",{onClick:w[2]||(w[2]=R=>P(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,R=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((R-1)/2),"data-value":R-1,"data-day":0,"data-type":m.value,onMousedown:j=>c(0,R,j)},null,40,un)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",fn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value.keys(),R=>(e.openBlock(),e.createElementBlock("div",null,[m.value==0?(e.openBlock(),e.createElementBlock("span",gn,[w[6]||(w[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(N.value.find(j=>j.value==R).name),1)])):(e.openBlock(),e.createElementBlock("span",hn,e.toDisplayString(N.value.find(j=>j.value==R).name),1)),e.createTextVNode(" ("+e.toDisplayString(L(R))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),_n={class:"time-template-dialog"},Nn={class:"time-editor-panel"},Cn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const m=a,y=t,l=e.ref(null),b=e.ref(""),T=e.ref(""),B=e.ref(m.modelValue?.timeTemplateName||""),q=e.ref([]);return e.computed(()=>b.value?q.value.filter(C=>C.name.toLowerCase().includes(b.value.toLowerCase())):q.value),e.watch(B,C=>{y("update:modelValue",{...m.modelValue,timeTemplateName:C})}),o({getFormData:()=>{const C=l.value?.getTimeData();return{timeTemplateId:T.value,timeTemplateName:B.value,...C}},revertByTime:(C,N)=>{l.value?.revertByTime(C,N)}}),(C,N)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",_n,[e.createCommentVNode("",!0),e.createElementVNode("div",Nn,[e.createCommentVNode("",!0),e.createVNode(yn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),kn={class:"config-section"},bn={key:0,class:"config-section"},xn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},En={class:"config-section"},wn=oe({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("echoAlgodata",null),b=e.computed(()=>{const c=(l?.value??l)?.ruleSchema?.sourceGroups??[];if(c.some(x=>x.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const u=c.length>1,n=c.some(x=>(x.children??[]).length>1);return u||n?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(b,N=>{N.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:N.value})},{immediate:!0});const T=e.ref(!1),B=e.ref(null),q=()=>{const N=B.value?.getFormData();if(N?.validTime){const u=(JSON.parse(N.timeZone)?.plan??[]).map(n=>({dayType:String(n.dayType),timePeriod:n.timePeriod.map(x=>({startTime:x.startTime,endTime:x.endTime}))}));o.updateNodeData(t.value.id,{executionTime:N.timeZone,schedule:u,timeZone:N.timeZone,planType:N.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});T.value=!1},M=()=>{const N=t.value?.data;N?.timeZone&&B.value?.revertByTime(N.timeZone,N.planType??0)},f=e.computed(()=>t.value?o.edges.filter(c=>c.source===t.value.id).length>=2:!1),C=N=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:N})};return(N,c)=>{const u=e.resolveComponent("el-divider"),n=e.resolveComponent("el-input"),x=e.resolveComponent("el-form-item"),P=e.resolveComponent("el-form"),g=e.resolveComponent("el-option"),O=e.resolveComponent("el-select"),E=e.resolveComponent("el-switch"),L=e.resolveComponent("el-button"),S=e.resolveComponent("el-dialog"),A=e.resolveComponent("el-icon"),i=e.resolveComponent("el-tooltip"),r=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[c[15]||(c[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(u),e.createElementVNode("div",kn,[c[9]||(c[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(x,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:c[0]||(c[0]=_=>C(_)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",bn,[c[10]||(c[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(x,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.taskName,onInput:c[1]||(c[1]=_=>e.unref(o).updateNodeData(t.value.id,{taskName:_})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(x,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":b.value.locked?b.value.value:t.value?.data.streamType||"image",disabled:b.value.locked,onChange:c[2]||(c[2]=_=>e.unref(o).updateNodeData(t.value.id,{streamType:_})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"图片流",value:"image"}),e.createVNode(g,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),b.value.locked?(e.openBlock(),e.createElementBlock("div",xn,e.toDisplayString(b.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(x,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(E,{"model-value":t.value?.data.enableAlertVideo,onChange:c[3]||(c[3]=_=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:_}))},null,8,["model-value"])]),_:1}),e.createVNode(x,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:c[4]||(c[4]=_=>T.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(S,{modelValue:T.value,"onUpdate:modelValue":c[6]||(c[6]=_=>T.value=_),title:"执行时段",width:"1200px","append-to-body":"",onOpened:M},{footer:e.withCtx(()=>[e.createVNode(L,{onClick:c[5]||(c[5]=_=>T.value=!1)},{default:e.withCtx(()=>[...c[11]||(c[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:q},{default:e.withCtx(()=>[...c[12]||(c[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(Cn,{ref_key:"timeTemplateRef",ref:B},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",En,[c[14]||(c[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(x,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:c[7]||(c[7]=_=>e.unref(o).updateNodeData(t.value.id,{branchLogic:_})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(g,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(g,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),f.value?(e.openBlock(),e.createBlock(x,{key:0},{label:e.withCtx(()=>[c[13]||(c[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(i,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(A,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(r,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:c[8]||(c[8]=_=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:_})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),Tn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Sn=["smallModel","detectionTarget"],we=()=>({schemaLoading:e.ref(!1),getToolType:l=>Tn[l]||null,needsToolSelection:l=>Sn.includes(l),fetchToolSchema:async(l,b="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(l,b="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Vn={key:0,class:"config-section"},Bn={key:3,class:"array-input"},An={key:1,class:"config-section"},Dn=oe({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:m,fetchSchemaForNodeType:y}=we(),l=e.computed(()=>{if(!t.value)return[];const f=t.value.data.input_schema||t.value.data.inputSchema;if(!f||!f.properties)return[];const C=f.required||[];return Object.entries(f.properties).map(([N,c])=>({key:N,type:c.type,label:c.title||c.label||c.description||N,description:c.description||"",default:c.default,required:C.includes(N)||c.required||!1,min:c.minimum!==void 0?c.minimum:c.min,max:c.maximum!==void 0?c.maximum:c.max,step:c.step,maxLength:c.maxLength,options:c.enum,optionLabels:c.enumLabels||c.enum,dependsOn:c.dependsOn}))}),b=f=>{if(t.value)return t.value.data.arguments?.[f]},T=(f,C)=>{if(!t.value)return;const c={...t.value.data.arguments||{},[f]:C};o.updateNodeData(t.value.id,{arguments:c})},B=f=>{if(!f.dependsOn||!t.value)return!0;const{field:C,value:N}=f.dependsOn,c=b(C);if(typeof N=="string"&&N.startsWith("!")){const u=N.substring(1);return c!==u}return Array.isArray(N)?N.includes(c):c===N},q=f=>{const C=b(f);return Array.isArray(C)?JSON.stringify(C):""},M=(f,C)=>{try{const N=JSON.parse(C);Array.isArray(N)&&T(f,N)}catch{}};return e.watch(()=>t.value?.id,async f=>{if(!f||!t.value)return;const C=t.value.type,N=t.value.data,c=N.input_schema||N.inputSchema;if(c&&c.properties&&Object.keys(c.properties).length>0)return;const u=await y(C);if(!u)return;const n=t.value?.data;n&&o.updateNodeData(t.value.id,{...n,input_schema:u.inputSchema,extraConfig:u.extraConfig,arguments:{...u.arguments,...n.arguments}})},{immediate:!0}),(f,C)=>{const N=e.resolveComponent("el-divider"),c=e.resolveComponent("el-icon"),u=e.resolveComponent("el-tooltip"),n=e.resolveComponent("el-option"),x=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),g=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-input"),E=e.resolveComponent("el-form-item"),L=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[C[2]||(C[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(N),l.value.length>0?(e.openBlock(),e.createElementBlock("div",Vn,[C[0]||(C[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(L,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,S=>e.withDirectives((e.openBlock(),e.createBlock(E,{key:S.key,required:S.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(S.label),1),S.description?(e.openBlock(),e.createBlock(u,{key:0,content:S.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[S.options&&S.type==="string"?(e.openBlock(),e.createBlock(x,{key:0,"model-value":b(S.key),onChange:A=>T(S.key,A),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.options,(A,i)=>(e.openBlock(),e.createBlock(n,{key:A,label:S.optionLabels?S.optionLabels[i]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):S.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":b(S.key),onChange:A=>T(S.key,A)},null,8,["model-value","onChange"])):S.type==="number"||S.type==="integer"?(e.openBlock(),e.createBlock(g,{key:2,"model-value":b(S.key),onChange:A=>T(S.key,A),min:S.min,max:S.max,step:S.step||(S.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):S.type==="array"&&!S.options?(e.openBlock(),e.createElementBlock("div",Bn,[e.createVNode(O,{"model-value":q(S.key),onChange:A=>M(S.key,A),type:"textarea",rows:3,placeholder:S.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):S.type==="array"&&S.options?(e.openBlock(),e.createBlock(x,{key:4,"model-value":b(S.key),onChange:A=>T(S.key,A),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.options,(A,i)=>(e.openBlock(),e.createBlock(n,{key:A,label:S.optionLabels?S.optionLabels[i]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(O,{key:5,"model-value":b(S.key),onInput:A=>T(S.key,A),maxlength:S.maxLength,"show-word-limit":!!S.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!S.dependsOn||B(S)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(m)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",An,[...C[1]||(C[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),Ln={class:"config-header"},On={class:"config-section"},Mn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},In={key:0,class:"config-section"},Rn={key:3,class:"array-input"},$n={key:1,class:"config-section"},Fn={key:2,class:"config-section"},qn=oe({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),b=e.computed(()=>(l?.value??l)?.classification?.models??[]),T=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),B=e.ref([]),q=e.ref(!1),M=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:E=>{t.value&&E&&n("modelId",E)}}),f=()=>{B.value=b.value},C=async E=>{if(!t.value||!E)return;const L=B.value.find(r=>r.id===E);if(!L)return;const S=t.value?.data;if(!S)return;const A=L.inputSchema||L.input_schema||T.value?.inputSchema||{},i={};A.properties&&Object.entries(A.properties).forEach(([r,_])=>{_.default!==void 0&&(i[r]=_.default)}),o.updateNodeData(t.value.id,{...S,input_schema:A,extraConfig:L.extraConfig||null,arguments:{...i,modelId:L.id,modelName:L.name}})},N=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},c=e.computed(()=>{if(!t.value)return[];const E=t.value.data.input_schema||t.value.data.inputSchema;if(!E||!E.properties)return[];const L=E.required||[];return Object.entries(E.properties).map(([S,A])=>({key:S,type:A.type,label:A.title||A.label||A.description||S,description:A.description||"",default:A.default,required:L.includes(S)||A.required||!1,min:A.minimum!==void 0?A.minimum:A.min,max:A.maximum!==void 0?A.maximum:A.max,step:A.step,maxLength:A.maxLength,options:A.enum,optionLabels:A.enumLabels||A.enum,dependsOn:A.dependsOn,sort:A.sort,hidden:A["x-hidden"]||!1})).filter(S=>!S.hidden).sort((S,A)=>(S.sort??1/0)-(A.sort??1/0))}),u=E=>{if(t.value)return t.value.data.arguments?.[E]},n=(E,L)=>{if(!t.value)return;const A={...t.value.data.arguments||{},[E]:L};o.updateNodeData(t.value.id,{arguments:A})},x=E=>{if(!E.dependsOn||!t.value)return!0;const{field:L,value:S}=E.dependsOn,A=u(L);if(typeof S=="string"&&S.startsWith("!")){const i=S.substring(1);return A!==i}return Array.isArray(S)?S.includes(A):A===S},P=E=>{const L=u(E);return Array.isArray(L)?JSON.stringify(L):""},g=(E,L)=>{try{const S=JSON.parse(L);Array.isArray(S)&&n(E,S)}catch{}},O=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async E=>{if(!E||!t.value)return;B.value.length===0&&f();const L=t.value.data,S=L.input_schema||L.inputSchema,A=L.arguments?.modelId;if(A&&S&&S.properties&&Object.keys(S.properties).length>0||!A)return;const i=B.value.find(w=>w.id===A);if(!i)return;const r=i.inputSchema||i.input_schema||T.value?.inputSchema||{},_={};r.properties&&Object.entries(r.properties).forEach(([w,G])=>{G.default!==void 0&&(_[w]=G.default)});const p=t.value?.data;p&&o.updateNodeData(t.value.id,{...p,input_schema:r,extraConfig:i.extraConfig||null,arguments:{..._,...p.arguments}})},{immediate:!0}),(E,L)=>{const S=e.resolveComponent("el-button"),A=e.resolveComponent("el-divider"),i=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),_=e.resolveComponent("el-form-item"),p=e.resolveComponent("el-form"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-switch"),R=e.resolveComponent("el-input-number"),j=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ln,[L[1]||(L[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(A),e.createElementVNode("div",On,[L[2]||(L[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(r,{modelValue:M.value,"onUpdate:modelValue":L[0]||(L[0]=z=>M.value=z),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:q.value,disabled:y.value,onChange:C,onClear:N},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.value,z=>(e.openBlock(),e.createBlock(i,{key:z.id,label:z.name,value:z.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),B.value.length===0&&!q.value?(e.openBlock(),e.createElementBlock("div",Mn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),M.value&&c.value.length>0?(e.openBlock(),e.createElementBlock("div",In,[L[3]||(L[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,z=>e.withDirectives((e.openBlock(),e.createBlock(_,{key:z.key,required:z.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(z.label),1),z.description?(e.openBlock(),e.createBlock(G,{key:0,content:z.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[z.options&&z.type==="string"?(e.openBlock(),e.createBlock(r,{key:0,"model-value":u(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z.options,(Y,h)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):z.type==="boolean"?(e.openBlock(),e.createBlock(F,{key:1,"model-value":u(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y)},null,8,["model-value","disabled","onChange"])):z.type==="number"||z.type==="integer"?(e.openBlock(),e.createBlock(R,{key:2,"model-value":u(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),min:z.min,max:z.max,step:z.step||(z.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):z.type==="array"&&!z.options?(e.openBlock(),e.createElementBlock("div",Rn,[e.createVNode(j,{"model-value":P(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>g(z.key,Y),type:"textarea",rows:3,placeholder:z.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):z.type==="array"&&z.options?(e.openBlock(),e.createBlock(r,{key:4,"model-value":u(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>n(z.key,Y),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(z.options,(Y,h)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[h]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(j,{key:5,"model-value":u(z.key),disabled:y.value&&z.key!=="threshold",onInput:Y=>n(z.key,Y),maxlength:z.maxLength,"show-word-limit":!!z.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!z.dependsOn||x(z)]])),128))]),_:1})])):e.createCommentVNode("",!0),M.value&&q.value&&c.value.length===0?(e.openBlock(),e.createElementBlock("div",$n,[...L[4]||(L[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!M.value&&!q.value?(e.openBlock(),e.createElementBlock("div",Fn,[...L[5]||(L[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),Gn={class:"config-header"},Hn={class:"config-section"},Pn=oe({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),b=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),B=(M,f)=>{if(!t.value)return;const C=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...C,[M]:f}})},q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,M=>{if(!M||!t.value)return;const f=b.value,C=t.value.data.arguments||{},N={};f?.properties&&Object.entries(f.properties).forEach(([c,u])=>{u.default!==void 0&&(N[c]=u.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...C}})},{immediate:!0}),(M,f)=>{const C=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),u=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Gn,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(C,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",Hn,[f[2]||(f[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:f[0]||(f[0]=x=>B("threshold",x)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),jn={class:"config-header"},zn={class:"config-section"},Un=oe({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),b=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),B=(M,f)=>{if(!t.value)return;const C=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...C,[M]:f}})},q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,M=>{if(!M||!t.value)return;const f=b.value,C=t.value.data.arguments||{},N={};f?.properties&&Object.entries(f.properties).forEach(([c,u])=>{u.default!==void 0&&(N[c]=u.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...C}})},{immediate:!0}),(M,f)=>{const C=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),u=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(C,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",zn,[f[2]||(f[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:f[0]||(f[0]=x=>B("threshold",x)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Wn={class:"config-header"},Jn={class:"config-section"},Yn={key:0,class:"config-section"},We=oe({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),b=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),T=e.ref(null),B=e.computed(()=>({repositoryId:C.value})),q={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},M=e.computed(()=>t.value?.data.arguments?.threshold??.5),f=u=>t.value?.data.arguments?.[u],C=e.computed(()=>{const u=f("repositoryId");return u?Array.isArray(u)?u:[u]:[]}),N=(u,n)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[u]:n}})},c=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,u=>{if(!u||!t.value)return;const x=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,P=t.value.data.arguments||{},g={};x?.properties&&Object.entries(x.properties).forEach(([O,E])=>{E.default!==void 0&&(g[O]=E.default)}),o.updateNodeData(t.value.id,{arguments:{...g,...P}})},{immediate:!0}),(u,n)=>{const x=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-form-item"),E=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),S=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Wn,[n[2]||(n[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",Jn,[n[3]||(n[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(E,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":M.value,onChange:n[0]||(n[0]=A=>N("threshold",A)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(m)==="task"?(e.openBlock(),e.createElementBlock("div",Yn,[n[4]||(n[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(E,{model:B.value,rules:q,ref_key:"faceFormRef",ref:T,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(S,{"model-value":C.value,onChange:n[1]||(n[1]=A=>N("repositoryId",A)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.value,A=>(e.openBlock(),e.createBlock(L,{key:A.id,label:A.name,value:A.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Xn={class:"config-header"},Qn={key:0,class:"config-section"},Kn={key:3,class:"array-input"},Zn={key:1,class:"config-section"},vn=oe({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),{schemaLoading:l,fetchSchemaForNodeType:b}=we(),T=e.computed(()=>{if(!t.value)return[];const c=t.value.data.input_schema||t.value.data.inputSchema;if(!c||!c.properties)return[];const u=c.required||[];return Object.entries(c.properties).map(([n,x])=>({key:n,type:x.type,label:x.title||x.label||x.description||n,description:x.description||"",default:x.default,required:u.includes(n)||x.required||!1,min:x.minimum!==void 0?x.minimum:x.min,max:x.maximum!==void 0?x.maximum:x.max,step:x.step,maxLength:x.maxLength,options:x.enum,optionLabels:x.enumLabels||x.enum,dependsOn:x.dependsOn,sort:x.sort})).sort((n,x)=>(n.sort??1/0)-(x.sort??1/0))}),B=c=>{if(t.value)return t.value.data.arguments?.[c]},q=(c,u)=>{if(!t.value)return;const x={...t.value.data.arguments||{},[c]:u};o.updateNodeData(t.value.id,{arguments:x})},M=c=>{if(!c.dependsOn||!t.value)return!0;const{field:u,value:n}=c.dependsOn,x=B(u);if(typeof n=="string"&&n.startsWith("!")){const P=n.substring(1);return x!==P}return Array.isArray(n)?n.includes(x):x===n},f=c=>{const u=B(c);return Array.isArray(u)?JSON.stringify(u):""},C=(c,u)=>{try{const n=JSON.parse(u);Array.isArray(n)&&q(c,n)}catch{}},N=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async c=>{if(!c||!t.value)return;const u=t.value.type,n=t.value.data,x=n.input_schema||n.inputSchema;if(x&&x.properties&&Object.keys(x.properties).length>0)return;const P=await b(u);if(!P)return;const g=t.value?.data;g&&o.updateNodeData(t.value.id,{...g,input_schema:P.inputSchema,extraConfig:P.extraConfig,arguments:{...P.arguments,...g.arguments}})},{immediate:!0}),(c,u)=>{const n=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),P=e.resolveComponent("el-icon"),g=e.resolveComponent("el-tooltip"),O=e.resolveComponent("el-option"),E=e.resolveComponent("el-select"),L=e.resolveComponent("el-switch"),S=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),i=e.resolveComponent("el-form-item"),r=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Xn,[u[0]||(u[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(n,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:N},null,8,["icon"]))]),e.createVNode(x),T.value.length>0?(e.openBlock(),e.createElementBlock("div",Qn,[u[1]||(u[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(r,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,_=>e.withDirectives((e.openBlock(),e.createBlock(i,{key:_.key,required:_.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(_.label),1),_.description?(e.openBlock(),e.createBlock(g,{key:0,content:_.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[_.options&&_.type==="string"?(e.openBlock(),e.createBlock(E,{key:0,"model-value":B(_.key),onChange:p=>q(_.key,p),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(p,w)=>(e.openBlock(),e.createBlock(O,{key:p,label:_.optionLabels?_.optionLabels[w]:p,value:p},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):_.type==="boolean"?(e.openBlock(),e.createBlock(L,{key:1,"model-value":B(_.key),onChange:p=>q(_.key,p)},null,8,["model-value","onChange"])):_.type==="number"||_.type==="integer"?(e.openBlock(),e.createBlock(S,{key:2,"model-value":B(_.key),onChange:p=>q(_.key,p),min:_.min,max:_.max,step:_.step||(_.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):_.type==="array"&&!_.options?(e.openBlock(),e.createElementBlock("div",Kn,[e.createVNode(A,{"model-value":f(_.key),onChange:p=>C(_.key,p),type:"textarea",rows:3,placeholder:_.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):_.type==="array"&&_.options?(e.openBlock(),e.createBlock(E,{key:4,"model-value":B(_.key),onChange:p=>q(_.key,p),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(p,w)=>(e.openBlock(),e.createBlock(O,{key:p,label:_.optionLabels?_.optionLabels[w]:p,value:p},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":B(_.key),onInput:p=>q(_.key,p),maxlength:_.maxLength,"show-word-limit":!!_.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!_.dependsOn||M(_)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&T.value.length===0?(e.openBlock(),e.createElementBlock("div",Zn,[...u[2]||(u[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),ea={class:"config-header"},ta={class:"config-section"},oa={key:0,class:"config-section"},na={key:1,class:"config-section"},aa={key:0,class:"el-form-item__error"},la={key:2,class:"config-section"},ra={key:3,class:"config-section"},sa={key:4,class:"config-section"},ia=oe({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.inject("taskModeConfig",null),l=e.computed(()=>m==="task"),b=e.computed(()=>n("deviceType")??"camera"),T=e.computed(()=>{const i=o.nodes.find(_=>_.type===k.START);return i?.data?.streamType?i.data.streamType:(y?.value??y)?.streamType??"image"}),B=e.computed(()=>{const i=y?.value??y,r=t.value?.id;return i?.datasource?.getDevices?.(r)?.length??0}),q=()=>{const i=y?.value??y,r=t.value?.id,_=t.value?.data?.label??"",p=i?.datasource?.getDevices?.(r)??[],w=o.nodes.filter(F=>F.type===k.DATA_SOURCE).findIndex(F=>F.id===r),G=t.value?.data?.sourceGroupId??i?.datasource?.getSourceGroupIdByIndex?.(w)??r;i?.datasource?.onDeviceClick?.(r,_,G,p,b.value)},{fetchSchemaForNodeType:M}=we(),f=e.computed(()=>o.nodes.some(i=>i.type===k.SMALL_MODEL)),C=e.computed(()=>o.getDataSourceCount()>=2),N=e.computed(()=>!o.supportPatrol()),c=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),u=e.computed(()=>{if(!t.value)return[];const i=t.value.data.input_schema||t.value.data.inputSchema;if(!i||!i.properties)return[];const r=i.required||[];return Object.entries(i.properties).map(([_,p])=>({key:_,type:p.type,label:p.title||p.label||p.description||_,description:p.description||"",default:p.default,required:r.includes(_)||p.required||!1,min:p.minimum!==void 0?p.minimum:p.min,max:p.maximum!==void 0?p.maximum:p.max,step:p.step,maxLength:p.maxLength,options:p.enum,optionLabels:p.enumLabels||p.enum,dependsOn:p.dependsOn}))}),n=i=>{if(t.value)return t.value.data.arguments?.[i]},x=e.computed(()=>!!n("enableImageSequence")),P=e.computed(()=>!!n("needCooperativeDetection")),g=(i,r)=>{if(!t.value)return;const p={...t.value.data.arguments||{},[i]:r};o.updateNodeData(t.value.id,{arguments:p})},O=async i=>{if(!t.value)return;if(o.edges.some(_=>_.source===t.value.id))try{await Z.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(p=>p.source===t.value.id).forEach(p=>{o.removeEdge(p.id)}),i&&g("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),g("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)}catch{return}else i&&g("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),g("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)},E=i=>{t.value&&(i&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),g("enableImageSequence",!1),g("enablePatrol",!1)),g("needCooperativeDetection",i))};e.watch(T,i=>{i==="stream"&&t.value&&n("deviceType")==="1400"&&g("deviceType","camera")},{immediate:!0});const L=e.computed(()=>l.value&&b.value==="camera"&&T.value!=="stream"&&o.supportPatrol());e.watch(L,i=>{!i&&t.value&&n("enablePatrol")&&g("enablePatrol",!1)}),e.watch(B,i=>{i>0&&n("enablePatrol")&&(n("patrolGroupSize")??1)>i&&g("patrolGroupSize",i)});const S=i=>{if(!i.dependsOn||!t.value)return!0;const{field:r,value:_}=i.dependsOn,p=n(r);if(typeof _=="string"&&_.startsWith("!")){const w=_.substring(1);return p!==w}return Array.isArray(_)?_.includes(p):p===_},A=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async i=>{if(!i||!t.value)return;const r=t.value.type,_=t.value.data;if(r==="dataSource"&&l.value){const F=_.arguments||{},R={},j=o.nodes.some(z=>z.type===k.SMALL_MODEL);F.mode===void 0&&(R.mode=j?3:0),F.interval===void 0&&(R.interval=30),T.value==="stream"&&F.sw_decoding===void 0&&(R.sw_decoding="CPU"),Object.keys(R).length>0&&o.updateNodeData(i,{arguments:{...F,...R}})}const p=_.input_schema||_.inputSchema;if(r==="dataSource"&&p&&p.properties&&!p.properties.windowSeconds){p.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},_.arguments.windowSeconds||o.updateNodeData(t.value.id,{..._,input_schema:p,arguments:{..._.arguments,windowSeconds:5}});return}if(p&&p.properties&&Object.keys(p.properties).length>0)return;const w=await M(r);if(!w)return;const G=t.value?.data;G&&o.updateNodeData(t.value.id,{...G,input_schema:w.inputSchema,extraConfig:w.extraConfig,arguments:{...w.arguments,...G.arguments}})},{immediate:!0}),(i,r)=>{const _=e.resolveComponent("el-button"),p=e.resolveComponent("el-divider"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-option"),R=e.resolveComponent("el-select"),j=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),h=e.resolveComponent("el-form-item"),D=e.resolveComponent("el-form"),H=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ea,[r[11]||(r[11]=e.createElementVNode("h3",null,"节点配置",-1)),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(_,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:A},null,8,["icon"]))]),e.createVNode(p),e.createElementVNode("div",ta,[r[12]||(r[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,s=>e.withDirectives((e.openBlock(),e.createBlock(h,{key:s.key,required:s.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(s.label),1),s.description?(e.openBlock(),e.createBlock(G,{key:0,content:s.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[s.options&&s.type==="string"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":n(s.key),onChange:d=>g(s.key,d),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.options,(d,V)=>(e.openBlock(),e.createBlock(F,{key:d,label:s.optionLabels?s.optionLabels[V]:d,value:d},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):s.type==="boolean"?(e.openBlock(),e.createBlock(G,{key:1,content:l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":s.key==="needCooperativeDetection"&&x.value?"已开启图片时序,无法同时开启协同检测":s.key==="enableImageSequence"&&P.value?"已开启协同检测,无法同时开启图片时序":s.key==="enableImageSequence"&&C.value?"多数据源场景下不允许开启图片时序":"",disabled:!(l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence"))&&!(s.key==="needCooperativeDetection"&&x.value)&&!(s.key==="enableImageSequence"&&P.value)&&!(s.key==="enableImageSequence"&&C.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":n(s.key),disabled:l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence")||s.key==="needCooperativeDetection"&&x.value||s.key==="enableImageSequence"&&P.value||s.key==="enableImageSequence"&&C.value,onChange:d=>s.key==="enableImageSequence"?O(d):s.key==="needCooperativeDetection"?E(d):g(s.key,d)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):s.type==="number"||s.type==="integer"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":n(s.key),onChange:d=>g(s.key,d),min:s.min,max:s.max,step:s.step||(s.type==="integer"?1:.1),precision:s.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(Y,{key:3,"model-value":n(s.key),onInput:d=>g(s.key,d),maxlength:s.maxLength,"show-word-limit":!!s.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!s.dependsOn||S(s)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",oa,[r[13]||(r[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":t.value?.data.branchLogic||"and",disabled:l.value,onChange:r[0]||(r[0]=s=>e.unref(o).updateNodeData(t.value.id,{branchLogic:s})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(F,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(F,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),l.value?(e.openBlock(),e.createElementBlock("div",na,[r[16]||(r[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("deviceType")??"camera",onChange:r[1]||(r[1]=s=>g("deviceType",s))},{default:e.withCtx(()=>[e.createVNode(H,{value:"camera"},{default:e.withCtx(()=>[...r[14]||(r[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(H,{value:"1400",disabled:T.value==="stream"},{default:e.withCtx(()=>[...r[15]||(r[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(h,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${B.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":B.value===0}),onClick:q},null,8,["model-value","class"]),B.value===0?(e.openBlock(),e.createElementBlock("div",aa,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&b.value==="1400"?(e.openBlock(),e.createElementBlock("div",la,[r[19]||(r[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("detectionMode")??"platform",onChange:r[2]||(r[2]=s=>g("detectionMode",s))},{default:e.withCtx(()=>[e.createVNode(H,{value:"platform"},{default:e.withCtx(()=>[...r[17]||(r[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(H,{value:"device"},{default:e.withCtx(()=>[...r[18]||(r[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&b.value==="camera"&&T.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ra,[r[21]||(r[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(G,{disabled:!N.value,content:c.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(j,{"model-value":N.value?!1:n("enablePatrol"),disabled:N.value,onChange:r[3]||(r[3]=s=>g("enablePatrol",s))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),n("enablePatrol")?(e.openBlock(),e.createBlock(h,{key:0},{label:e.withCtx(()=>[r[20]||(r[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(G,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(w,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("patrolGroupSize")??1,onChange:r[4]||(r[4]=s=>g("patrolGroupSize",s)),min:1,max:B.value>0?B.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),l.value&&b.value==="camera"?(e.openBlock(),e.createElementBlock("div",sa,[r[22]||(r[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(h,{label:"抽帧策略"},{default:e.withCtx(()=>[T.value==="image"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"按时间间隔抽帧",value:0})]),_:1})):f.value?(e.openBlock(),e.createBlock(R,{key:1,"model-value":n("mode")??3,onChange:r[5]||(r[5]=s=>{g("mode",s),s===1&&g("interval",f.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"每一帧都检测",value:3}),e.createVNode(F,{label:"跳帧检测",value:1}),e.createVNode(F,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(R,{key:2,"model-value":n("mode")??0,onChange:r[6]||(r[6]=s=>{g("mode",s),s===0&&g("interval",30),s===1&&g("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"按时间间隔抽帧",value:0}),e.createVNode(F,{label:"跳帧检测",value:1}),e.createVNode(F,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),T.value==="image"||T.value==="stream"&&(n("mode")??0)===0?(e.openBlock(),e.createBlock(h,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("interval")??30,onChange:r[7]||(r[7]=s=>g("interval",s)),min:1,max:T.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),T.value==="stream"&&(n("mode")??0)===1?(e.openBlock(),e.createBlock(h,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[f.value?(e.openBlock(),e.createBlock(z,{key:0,"model-value":n("interval")??5,onChange:r[8]||(r[8]=s=>g("interval",s)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(R,{key:1,"model-value":n("interval")??25,onChange:r[9]||(r[9]=s=>g("interval",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:25,value:25}),e.createVNode(F,{label:50,value:50}),e.createVNode(F,{label:75,value:75}),e.createVNode(F,{label:125,value:125}),e.createVNode(F,{label:250,value:250}),e.createVNode(F,{label:375,value:375}),e.createVNode(F,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),T.value==="stream"?(e.openBlock(),e.createBlock(h,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":n("sw_decoding")??"CPU",onChange:r[10]||(r[10]=s=>g("sw_decoding",s)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"GPU",value:"GPU"}),e.createVNode(F,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),ca={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Je=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),m=e.ref(null),y=e.ref(""),l=async(N=!1)=>{if(a){o.value=a;return}},b=async()=>{o.value=[],await l(!0)},T=N=>o.value.find(c=>c.id===N||c.title===N),B=N=>{const c=T(N);if(!c)return{};const u=c.inputSchema||c.input_schema;if(!u||!u.properties)return{};const n={};return Object.entries(u.properties).forEach(([x,P])=>{P.default!==void 0&&(n[x]=P.default)}),n},q=N=>{const c=T(N);if(!c)return[];const u=c.inputSchema||c.input_schema;if(!u||!u.properties)return[];const n=u.required||[];return Object.entries(u.properties).map(([x,P])=>({key:x,type:P.type,label:P.title||P.description||x,description:P.description||"",default:P.default,required:n.includes(x)||P.required||!1,min:P.minimum,max:P.maximum,step:P.step,options:P.enum,optionLabels:P.enumLabels||P.enum,dependsOn:P.dependsOn}))},M=e.computed(()=>{if(!y.value)return o.value;const N=y.value.toLowerCase();return o.value.filter(c=>c.name?.toLowerCase().includes(N)||c.type?.toLowerCase().includes(N)||c.title?.toLowerCase().includes(N)||c.description&&c.description.toLowerCase().includes(N)||f(c.type).toLowerCase().includes(N))}),f=N=>ca[N]||N;return{models:o,loading:t,error:m,searchKeyword:y,filteredModels:M,loadSmallModels:l,reloadSmallModels:b,getModelConfig:T,getTypeLabel:f,getDefaultArguments:B,getSchemaFields:q,validateArguments:(N,c)=>{const u=T(N);if(!u)return{valid:!1,errors:["模型不存在"]};const n=[],x=u.inputSchema||u.input_schema;return!x||!x.properties?{valid:!0,errors:[]}:(Object.entries(x.properties).forEach(([P,g])=>{const O=c[P];if(g.required&&(O==null||O==="")){n.push(`${g.title||P} 为必填项`);return}if(O!=null&&(g.type==="number"||g.type==="integer")){if(typeof O!="number"){n.push(`${g.title||P} 必须是数字`);return}g.minimum!==void 0&&O<g.minimum&&n.push(`${g.title||P} 不能小于 ${g.minimum}`),g.maximum!==void 0&&O>g.maximum&&n.push(`${g.title||P} 不能大于 ${g.maximum}`)}}),{valid:n.length===0,errors:n})}}},da={class:"small-model-selector"},ma={key:0,class:"loading-state"},pa={key:1,class:"error-state"},ua={key:2,class:"model-list"},fa=["onClick"],ga={class:"model-header"},ha={class:"model-name"},ya={class:"model-description"},_a={class:"model-meta"},Na={key:3,class:"empty-state"},Ca=oe({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(a,{emit:o}){const t=a,m=o,{loading:y,error:l,searchKeyword:b,filteredModels:T,loadSmallModels:B,reloadSmallModels:q,getTypeLabel:M}=Je(t.externalModels),f=c=>{m("update:modelValue",c.id),m("select",c)},C=()=>{q()},N=c=>({safety:"warning",security:"danger",traffic:"info"})[c]||"info";return e.onMounted(()=>{t.externalModels||B()}),(c,u)=>{const n=e.resolveComponent("el-input"),x=e.resolveComponent("el-icon"),P=e.resolveComponent("el-button"),g=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",da,[e.createVNode(n,{modelValue:e.unref(b),"onUpdate:modelValue":u[0]||(u[0]=O=>e.isRef(b)?b.value=O:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(X.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(y)?(e.openBlock(),e.createElementBlock("div",ma,[e.createVNode(x,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),u[2]||(u[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(x,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(l)),1),e.createVNode(P,{type:"primary",onClick:C},{default:e.withCtx(()=>[...u[3]||(u[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(T).length>0?(e.openBlock(),e.createElementBlock("div",ua,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(T),O=>(e.openBlock(),e.createElementBlock("div",{key:O.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===O.id}]),onClick:E=>f(O)},[e.createElementVNode("div",ga,[e.createElementVNode("div",ha,[e.createVNode(x,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(O.name),1)]),e.createVNode(g,{type:N(O.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(M)(O.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ya,e.toDisplayString(O.description),1),e.createElementVNode("div",_a,[O.supportDirectAlert?(e.openBlock(),e.createBlock(g,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...u[4]||(u[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,fa))),128))])):(e.openBlock(),e.createElementBlock("div",Na,[e.createVNode(x,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),u[6]||(u[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(P,{text:"",onClick:u[1]||(u[1]=O=>b.value="")},{default:e.withCtx(()=>[...u[5]||(u[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),ka={class:"position-tooltip"},Te=oe({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",ka,[...t[0]||(t[0]=[e.createStaticVNode('<div class="tooltip-title" data-v-6ac23ee8>提示说明</div><div class="tooltip-desc" data-v-6ac23ee8> 目标点为点位代表目标位置的点,系统默认使用目标框的中心点表示目标的位置。只有当目标的重心点满足检测框完整落在检测区域时,才表示目标进入检测框或者离开检测区域。 </div><div class="tooltip-examples" data-v-6ac23ee8><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例1:以目标框的中心点代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="60" cy="90" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0.5   Y轴: 0.5</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例2:以目标框的最左上角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="5" cy="5" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0   Y轴: 0</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例3:以目标框的最右下角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="115" cy="175" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 1   Y轴: 1</div></div></div>',3)])]))}},[["__scopeId","data-v-6ac23ee8"]]),ba={class:"config-header"},xa={class:"config-section"},Ea={key:0,class:"model-selector-wrapper"},wa={key:1,class:"selected-model-info"},Ta={class:"model-info-header"},Sa={class:"model-info-name"},Va={class:"model-info-description"},Ba={key:0,class:"config-section"},Aa={key:3,class:"array-input"},Da="检测到事件后,连续两次告警上报的时间间隔",La=oe({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=e.inject("editorConfig",null),b=e.computed(()=>(l?.value??l)?.smallModels??null),{models:T}=Je(b.value),B=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),q={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},M=e.computed(()=>{if(!t.value)return[];const E=t.value.data.input_schema||t.value.data.inputSchema;if(!E||!E.properties)return[];const L=E.required||[],S=t.value.data.title||"";return Object.entries(E.properties).filter(([A])=>B.has(A)).map(([A,i])=>{const r={key:A,type:i.type,label:i.title||i.label||i.description||A,description:i.description||"",default:i.default,required:L.includes(A)||i.required||!1,min:i.minimum!==void 0?i.minimum:i.min,max:i.maximum!==void 0?i.maximum:i.max,step:i.step,maxLength:i.maxLength,options:i.enum,optionLabels:i.enumLabels||i.enum,dependsOn:i.dependsOn,sort:i.sort};return A==="interval"&&(r.label="告警间隔(秒)",r.description=q[S]||Da,r.isInterval=!0,r.default=r.default!=null?r.default/1e3:10,r.min=r.min!=null?r.min/1e3:1,r.max=r.max!=null?r.max/1e3:void 0,r.step=1,r.precision=0),A==="threshold"&&(r.label="小模型阈值",r.step=.01,r.precision=2),A==="targetWidth"&&(r.label="最小目标宽度",r.default=60,r.min=20,r.max=1920,r.step=1,r.precision=0),A==="targetHeight"&&(r.label="最小目标高度",r.default=60,r.min=20,r.max=1080,r.step=1,r.precision=0),A==="topScale"&&(r.label="调整目标框高度比例 (上)",r.max=10,r.step=.1,r.precision=1),A==="bottomScale"&&(r.label="调整目标框高度比例 (下)",r.max=10,r.step=.1,r.precision=1),A==="leftScale"&&(r.label="调整目标框宽度比例 (左)",r.max=10,r.step=.1,r.precision=1),A==="rightScale"&&(r.label="调整目标框宽度比例 (右)",r.max=10,r.step=.1,r.precision=1),A==="x_ratio"&&(r.label="X轴位置信息",r.step=.01,r.precision=2),A==="y_ratio"&&(r.label="Y轴位置信息",r.step=.01,r.precision=2),A==="targetDuration"&&(r.label="目标持续时间(秒)",r.default=r.default!=null?r.default/1e3:1,r.min=r.min!=null?r.min/1e3:1,r.max=r.max!=null?r.max/1e3:void 0,r.step=.01,r.precision=2),A==="overloadNumber"&&(r.precision=0),A==="targetNumber"&&(r.precision=0),r}).filter(A=>!["areas","darwin","direction","lines"].includes(A.key)).filter(A=>!(A.key==="targetDuration"&&S==="NonMotorCounter")).sort((A,i)=>(A.sort??1/0)-(i.sort??1/0))}),f=["interval","targetDuration"],C=E=>{if(!t.value)return;const L=t.value.data.arguments?.[E];return f.includes(E)&&L!=null?L/1e3:L},N=(E,L)=>{if(!t.value)return;let S=L;f.includes(E)&&L!=null&&(S=L*1e3);const i={...t.value.data.arguments||{},[E]:S};o.updateNodeData(t.value.id,{arguments:i})},c=E=>{if(!E.dependsOn||!t.value)return!0;const{field:L,value:S}=E.dependsOn,A=C(L);if(typeof S=="string"&&S.startsWith("!")){const i=S.substring(1);return A!==i}return Array.isArray(S)?S.includes(A):A===S},u=E=>{const L=C(E);return Array.isArray(L)?JSON.stringify(L):""},n=(E,L)=>{try{const S=JSON.parse(L);Array.isArray(S)&&N(E,S)}catch{}},x=async E=>{if(!t.value)return;const L=E.inputSchema||E.input_schema||{},S={};L.properties&&Object.entries(L.properties).forEach(([A,i])=>{i.default!==void 0&&(S[A]=i.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:E.id||E.title,title:E.title,modelName:E.name,modelType:E.type,input_schema:L,extraConfig:E.extraConfig,supportDirectAlert:E.supportDirectAlert||!1,arguments:S})},P=()=>{t.value&&Z.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},g=()=>t.value?.data.modelId?T.value.find(L=>L.id===t.value.data.modelId)?.description||"暂无描述":"",O=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(E,L)=>{const S=e.resolveComponent("el-button"),A=e.resolveComponent("el-divider"),i=e.resolveComponent("el-icon"),r=e.resolveComponent("el-tag"),_=e.resolveComponent("el-tooltip"),p=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),F=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-input"),j=e.resolveComponent("el-text"),z=e.resolveComponent("el-form-item"),Y=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ba,[L[0]||(L[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:O},null,8,["icon"]))]),e.createVNode(A),e.createElementVNode("div",xa,[L[3]||(L[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!y.value?(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(Ca,{"model-value":t.value?.data.modelId,"external-models":b.value,onSelect:x},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",wa,[e.createElementVNode("div",Ta,[e.createElementVNode("div",Sa,[e.createVNode(i,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"text",text:"",size:"small",onClick:P},{default:e.withCtx(()=>[...L[1]||(L[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Va,e.toDisplayString(g()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(r,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...L[2]||(L[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ba,[L[4]||(L[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(M.value,h=>e.withDirectives((e.openBlock(),e.createBlock(z,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.key==="x_ratio"||h.key==="y_ratio"?(e.openBlock(),e.createBlock(_,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):h.description?(e.openBlock(),e.createBlock(_,{key:1,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":C(h.key),onChange:D=>N(h.key,D),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(D,H)=>(e.openBlock(),e.createBlock(p,{key:D,label:h.optionLabels?h.optionLabels[H]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(G,{key:1,"model-value":C(h.key),onChange:D=>N(h.key,D)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"||h.type==="float"?(e.openBlock(),e.createBlock(F,{key:2,"model-value":C(h.key),onChange:D=>N(h.key,D),min:h.min,max:h.max,step:h.step||(h.type==="integer"||h.type==="number"?1:.01),precision:h.precision??(h.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",Aa,[e.createVNode(R,{"model-value":u(h.key),onChange:D=>n(h.key,D),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(j,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":C(h.key),onChange:D=>N(h.key,D),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(D,H)=>(e.openBlock(),e.createBlock(p,{key:D,label:h.optionLabels?h.optionLabels[H]:D,value:D},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(R,{key:5,"model-value":C(h.key),onInput:D=>N(h.key,D)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||c(h)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Oa=(a=null)=>{const o=ae(),t=e.ref(a?a.map(f=>Ee.backendToFrontend(f)):[]),m=e.ref(!1),y=e.ref(null),l=async(f=!1)=>{if(a){t.value=a.map(C=>Ee.backendToFrontend(C));return}},b=f=>t.value.find(C=>C.title===f)||null,T=f=>{const C=b(f);return C?{targetId:C.title,targetName:C.label,threshold:C.data.threshold||.5,targetWidth:C.data.targetWidth||20,targetHeight:C.data.targetHeight||20,postmodel:C.data.postmodel||"ClipVit",areas:C.data.areas||[],expandRect:C.data.expandRect!==void 0?C.data.expandRect:!1,topScale:C.data.topScale||1.6,bottomScale:C.data.bottomScale||1.6,leftScale:C.data.leftScale||1.6,rightScale:C.data.rightScale||1.6,enableStructure:C.data.enableStructure}:{}},B=(f=null)=>o.nodes.filter(C=>C.type==="detectionTarget"&&C.id!==f).map(C=>({value:C.id,label:C.data.targetName||C.data.label})),q=(f=null)=>{const C=[{value:"original",label:"原图"}],N=B(f);return[...C,...N]},M=e.computed(()=>t.value.map(f=>({value:f.title,label:f.label,...f})));return{detectionTargets:t,loading:m,error:y,loadDetectionTargets:l,getTargetById:b,getDefaultConfig:T,getDetectionTargetNodes:B,getDetectionScopeOptions:q,getTargetOptions:M}},Ma={class:"paired-array-input"},Se=oe({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(a,{emit:o}){const t=(M,f)=>{let C;return(...N)=>{clearTimeout(C),C=setTimeout(()=>M(...N),f)}},m=a,y=o,l=e.ref([]),b=()=>{const M=m.primaryValue||[],f=m.pairedValue||[],C=Math.max(M.length,f.length,1);l.value=Array.from({length:C},(N,c)=>({primary:M[c]||"",paired:f[c]!==void 0?f[c]:m.pairedField.default?.[0]||.5}))};e.watch(()=>[m.primaryValue,m.pairedValue],()=>{b()},{immediate:!0,deep:!0});const T=t((M,f)=>{y("update",M,f)},300);e.watch(l,M=>{const f=M.map(N=>N.primary),C=M.map(N=>N.paired);T(f,C)},{deep:!0});const B=()=>{l.value.length>=10||l.value.push({primary:"",paired:m.pairedField.default?.[0]||.5})},q=M=>{l.value.length>1&&l.value.splice(M,1)};return(M,f)=>{const C=e.resolveComponent("el-input"),N=e.resolveComponent("el-input-number"),c=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Ma,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(u,n)=>(e.openBlock(),e.createElementBlock("div",{key:n,class:"input-row"},[e.createVNode(C,{modelValue:l.value[n].primary,"onUpdate:modelValue":x=>l.value[n].primary=x,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!l.value[n].primary||l.value[n].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(N,{modelValue:l.value[n].paired,"onUpdate:modelValue":x=>l.value[n].paired=x,min:a.pairedField.min||0,max:a.pairedField.max||1,step:a.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(c,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:x=>q(n)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(c,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:l.value.length>=10,onClick:B},{default:e.withCtx(()=>[e.createTextVNode(" 添加"+e.toDisplayString(a.primaryField.label)+e.toDisplayString(l.value.length>=10?"(已达上限)":""),1)]),_:1},8,["icon","disabled"])])}}},[["__scopeId","data-v-05218f96"]]),Ia={class:"config-header"},Ra={class:"config-section"},$a={class:"flex items-center justify-between"},Fa={key:0,class:"config-section"},qa={key:1,class:"config-section"},Ga={key:2,class:"config-section"},Ha={class:"device-list"},Pa=["onClick"],ja={class:"device-name"},za={key:0,class:"device-list-empty"},Ua={key:4,class:"array-input"},Wa={key:4,class:"array-input"},Ja=oe({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m==="task"),l=e.inject("taskModeConfig",null),b=e.inject("echoAlgodata",null),T=e.inject("echoTaskData",null),B=e.computed(()=>{if(!t.value)return null;const h=new Set,D=[t.value.id];for(;D.length;){const H=D.shift();if(h.has(H))continue;h.add(H);const W=o.edges.filter(s=>s.target===H);for(const s of W){const d=o.nodes.find(V=>V.id===s.source);if(d){if(d.type==="dataSource")return d.id;D.push(d.id)}}}return null}),q=e.computed(()=>{const h=B.value;return h?(l?.value??l)?.datasource?.getDevices?.(h)??[]:[]}),M=e.computed(()=>y.value&&q.value.length>0),f=e.ref(""),C=e.ref(""),N=e.computed(()=>{const h=C.value.trim().toLowerCase();return h?q.value.filter(D=>(D.sourceName??D.name??String(D.sourceId??D.id??D)).toLowerCase().includes(h)):q.value}),c=e.computed(()=>{const h={},D=B.value,H=t.value?.id;if(!D||!H)return h;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const s of q.value){const d=String(s.sourceId??s.id??s),V=o.getTaskSourceArguments(D,d,H);if(V===null){h[d]=!1;continue}const $=new Set([...Object.keys(V),...Object.keys(W)]);let U=!1;for(const J of $)if(JSON.stringify(V[J])!==JSON.stringify(W[J])){U=!0;break}h[d]=U}return h});e.watch([q,()=>t.value?.data?.arguments?.configMode],([h])=>{h.length>0?f.value=String(h[0]?.sourceId??h[0]?.id??h[0]):f.value=""},{immediate:!0});const u=(h,D=null)=>{if(D){const d=((T?.value??T)?.graph?.sources??[]).find(V=>String(V.sourceId)===String(D));if(d?.branches)for(const V of d.branches){const $=V.nodes?.find(U=>U.toolTitle===h);if($?.arguments)return{...$.arguments}}return null}const H=b?.value??b;if(!H?.branches)return null;for(const W of H.branches){const s=W.nodes?.find(d=>d.toolTitle===h);if(s?.arguments)return{...s.arguments}}return null},n=h=>{const D=B.value,H=t.value?.id;if(!D||!H||!h||o.getTaskSourceArguments(D,h,H)!==null)return;const W=t.value?.data?.targetId,s=W?u(W,h):null,d=t.value?.data?.arguments??{},V={...s??d};delete V.configMode,o.setTaskSourceArguments(D,h,H,V)};e.watch(f,h=>{h&&t.value?.data?.arguments?.configMode==="perDevice"&&n(h)}),e.watch(()=>t.value?.data?.arguments?.configMode,h=>{h==="perDevice"&&f.value&&n(f.value)});const x=e.inject("editorConfig",null),P=e.computed(()=>(x?.value??x)?.detection??null),{detectionTargets:g,loading:O}=Oa(P.value),E=e.computed(()=>{if(!t.value)return[];const h=t.value.data.input_schema||t.value.data.inputSchema;if(!h||!h.properties)return[];const D=h.required||[];return Object.entries(h.properties).map(([H,W])=>({key:H,type:W.type,label:W.title||W.label||W.description||H,description:W.description||"",default:W.default,required:D.includes(H)||W.required||!1,min:W.minimum!==void 0?W.minimum:W.min,max:W.maximum!==void 0?W.maximum:W.max,step:W.step,maxLength:W.maxLength,options:W.enum,optionLabels:W.enumLabels||W.enum,dependsOn:W.dependsOn,"x-component":W["x-component"],"x-paired-with":W["x-paired-with"],sort:W.sort})).sort((H,W)=>(H.sort??1/0)-(W.sort??1/0))}),L=h=>h.type==="array"&&h["x-component"]==="paired-array"&&h["x-paired-with"],S=h=>{const D=h["x-paired-with"];return E.value.find(H=>H.key===D)},A={targetWidth:{label:"最小目标宽度",min:20,max:1920,step:1,precision:0,default:60},targetHeight:{label:"最小目标高度",min:20,max:1080,step:1,precision:0,default:60},threshold:{label:"检测阈值",step:.01,precision:2},topScale:{label:"调整目标框高度比例 (上)",description:"按照目标框中心点坐标,向上缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},bottomScale:{label:"调整目标框高度比例 (下)",description:"按照目标框中心点坐标,向下缩放目标框y轴方向大小",max:10,step:.1,default:1.6,precision:1},rightScale:{label:"调整目标框宽度比例 (右)",description:"按照目标框中心点坐标,向右缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},leftScale:{label:"调整目标框宽度比例 (左)",description:"按照目标框中心点坐标,向左缩放目标框x轴方向大小",max:10,step:.1,default:1.6,precision:1},enableStruct:{label:"属性检测"},x_ratio:{label:"X轴位置信息",step:.01,precision:2},y_ratio:{label:"Y轴位置信息",step:.01,precision:2}},i=new Set(Object.keys(A)),r=e.computed(()=>{const h=t.value?.data.targetId,D=new Set;return E.value.forEach(H=>{H["x-paired-with"]&&D.add(H["x-paired-with"])}),E.value.filter(H=>h==="traffic_accident"?H.key==="threshold":i.has(H.key)&&!D.has(H.key)&&!L(H)).map(H=>{const W=A[H.key]||{};return{...H,label:W.label||H.label,description:W.description||H.description,min:W.min??H.min,max:W.max??H.max,step:W.step??H.step,precision:W.precision,default:W.default??H.default}})}),_=e.computed(()=>E.value.filter(h=>L(h))),p=h=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&f.value){const H=B.value,W=o.getTaskSourceArguments(H,f.value,t.value.id);if(W!==null)return W[h]}return t.value.data.arguments?.[h]},w=(h,D)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(h!=="configMode"&&H==="perDevice"&&f.value){const d=B.value;o.updateTaskSourceArgument(d,f.value,t.value.id,h,D);return}const s={...t.value.data.arguments||{},[h]:D};o.updateNodeData(t.value.id,{arguments:s})},G=h=>{if(!h.dependsOn||!t.value)return!0;const{field:D,value:H}=h.dependsOn,W=p(D);if(typeof H=="string"&&H.startsWith("!")){const s=H.substring(1);return W!==s}return Array.isArray(H)?H.includes(W):W===H},F=h=>{const D=p(h);return Array.isArray(D)?JSON.stringify(D):""},R=(h,D)=>{try{const H=JSON.parse(D);Array.isArray(H)&&w(h,H)}catch{}},j=(h,D,H,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&f.value){const $=B.value;o.updateTaskSourceArgument($,f.value,t.value.id,h,D),o.updateTaskSourceArgument($,f.value,t.value.id,H,W);return}const V={...t.value.data.arguments||{},[h]:D,[H]:W};o.updateNodeData(t.value.id,{arguments:V})},z=async h=>{if(!t.value||!h)return;const D=g.value.find(V=>V.title===h);if(!D)return;let H=D.inputSchema||D.input_schema||{};if(h==="other"){const V={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};H={...H,properties:{...H.properties,...V.properties}}}const W={};H.properties&&Object.entries(H.properties).forEach(([V,$])=>{$.default!==void 0&&(W[V]=$.default)});const s=t.value.data,d={...W,target_class:D.title};o.updateNodeData(t.value.id,{...s,targetId:D.title,targetName:D.label,label:D.label,input_schema:H,inputSchema:H,extraConfig:D.extraConfig,arguments:d})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,h=>{if(!h||!t.value)return;const D=g.value.find(s=>s.title===h);if(!D)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const W={...D.defaultArguments,...H.arguments,target_class:D.title};o.updateNodeData(t.value.id,{...H,input_schema:D.inputSchema,arguments:W})}),(h,D)=>{const H=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),s=e.resolveComponent("el-option"),d=e.resolveComponent("el-select"),V=e.resolveComponent("el-form-item"),$=e.resolveComponent("el-form"),U=e.resolveComponent("el-radio"),J=e.resolveComponent("el-radio-group"),Q=e.resolveComponent("el-icon"),te=e.resolveComponent("el-tooltip"),se=e.resolveComponent("el-input"),ce=e.resolveComponent("el-switch"),ne=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ia,[D[2]||(D[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(H,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",Ra,[D[3]||(D[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(d,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:z,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(O),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(g),I=>(e.openBlock(),e.createBlock(s,{key:I.title,label:I.label,value:I.title},{default:e.withCtx(()=>[e.createElementVNode("div",$a,[e.createElementVNode("span",null,e.toDisplayString(I.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),M.value?(e.openBlock(),e.createElementBlock("div",Fa,[D[6]||(D[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:D[0]||(D[0]=I=>w("configMode",I))},{default:e.withCtx(()=>[e.createVNode(U,{value:"unified"},{default:e.withCtx(()=>[...D[4]||(D[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(U,{value:"perDevice"},{default:e.withCtx(()=>[...D[5]||(D[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),_.value.length>0?(e.openBlock(),e.createElementBlock("div",qa,[D[7]||(D[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.value,I=>(e.openBlock(),e.createBlock(V,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.description?(e.openBlock(),e.createBlock(te,{key:0,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Se,{"primary-field":I,"paired-field":S(I),"primary-value":p(I.key),"paired-value":p(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",Ga,[D[9]||(D[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&q.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(se,{modelValue:C.value,"onUpdate:modelValue":D[1]||(D[1]=I=>C.value=I),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(Q,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Ha,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,I=>(e.openBlock(),e.createElementBlock("div",{key:String(I.sourceId??I.id??I),class:e.normalizeClass(["device-list-item",{"is-active":f.value===String(I.sourceId??I.id??I),"has-custom":c.value[String(I.sourceId??I.id??I)]}]),onClick:K=>f.value=String(I.sourceId??I.id??I)},[e.createElementVNode("span",ja,e.toDisplayString(I.sourceName??I.name??String(I.sourceId??I.id??I)),1),c.value[String(I.sourceId??I.id??I)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...D[8]||(D[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Pa))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("div",za," 无匹配设备 ")):e.createCommentVNode("",!0)]),f.value?(e.openBlock(),e.createBlock($,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,I=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(te,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(d,{key:0,"model-value":p(I.key),onChange:K=>w(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":p(I.key),onChange:K=>w(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":p(I.key),onChange:K=>w(I.key,K),min:I.min,max:I.max,step:I.step||(I.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):L(I)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":I,"paired-field":S(I),"primary-value":p(I.key),"paired-value":p(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Ua,[e.createVNode(se,{"model-value":F(I.key),onChange:K=>R(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(d,{key:5,"model-value":p(I.key),onChange:K=>w(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":p(I.key),onInput:K=>w(I.key,K),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||G(I)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock($,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,I=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.key==="x_ratio"||I.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Te)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(te,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(d,{key:0,"model-value":p(I.key),onChange:K=>w(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":p(I.key),onChange:K=>w(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":p(I.key),onChange:K=>w(I.key,K),min:I.min,max:I.max,step:I.step||(I.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):L(I)?(e.openBlock(),e.createBlock(Se,{key:3,"primary-field":I,"paired-field":S(I),"primary-value":p(I.key),"paired-value":p(I["x-paired-with"]),onUpdate:(K,le)=>j(I.key,K,I["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Wa,[e.createVNode(se,{"model-value":F(I.key),onChange:K=>R(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(d,{key:5,"model-value":p(I.key),onChange:K=>w(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:I.optionLabels?I.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":p(I.key),onInput:K=>w(I.key,K),maxlength:I.maxLength,"show-word-limit":!!I.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!I.dependsOn||G(I)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ya={class:"config-header"},Xa={class:"config-section"},Qa={key:0,style:{"margin-bottom":"8px"}},Ka=oe({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=M=>{if(!t.value)return;const f={...t.value.data.arguments,conditionRelation:M};o.updateNodeData(t.value.id,{arguments:f})},b=()=>{if(!t.value)return;const f=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],C={...t.value.data.arguments,alertConditions:f};o.updateNodeData(t.value.id,{arguments:C})},T=(M,f,C)=>{if(!t.value)return;const N=[...t.value.data.arguments?.alertConditions||[]];N[M]={...N[M],[f]:C};const c={...t.value.data.arguments,alertConditions:N};o.updateNodeData(t.value.id,{arguments:c})},B=M=>{if(!t.value)return;const f=[...t.value.data.arguments?.alertConditions||[]];f.splice(M,1);const C={...t.value.data.arguments,alertConditions:f};o.updateNodeData(t.value.id,{arguments:C})},q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(M,f)=>{const C=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),c=e.resolveComponent("el-text"),u=e.resolveComponent("el-option"),n=e.resolveComponent("el-select"),x=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-radio"),g=e.resolveComponent("el-radio-group"),O=e.resolveComponent("el-form-item"),E=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ya,[f[1]||(f[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(C,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",Xa,[f[9]||(f[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(E,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(O,null,{label:e.withCtx(()=>[f[3]||(f[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(c,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...f[2]||(f[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(c,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...f[4]||(f[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(L,S)=>(e.openBlock(),e.createElementBlock("div",{key:S,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(n,{"model-value":L.operator,onChange:A=>T(S,"operator",A),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(u,{label:"等于 =",value:"="}),e.createVNode(u,{label:"大于 >",value:">"}),e.createVNode(u,{label:"小于 <",value:"<"}),e.createVNode(u,{label:"大于等于 ≥",value:">="}),e.createVNode(u,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(x,{"model-value":L.value,onChange:A=>T(S,"value",A),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(C,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:A=>B(S)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Qa,[e.createVNode(c,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...f[5]||(f[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(g,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:f[0]||(f[0]=L=>l(L))},{default:e.withCtx(()=>[e.createVNode(P,{value:"OR"},{default:e.withCtx(()=>[...f[6]||(f[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(P,{value:"AND"},{default:e.withCtx(()=>[...f[7]||(f[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(C,{type:"text",link:"",icon:e.unref(X.Plus),onClick:b},{default:e.withCtx(()=>[...f[8]||(f[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Za={class:"config-header"},va={class:"config-section"},el={style:{display:"flex","align-items":"center",gap:"8px"}},tl={style:{display:"flex","align-items":"center",gap:"8px"}},ol={style:{display:"flex","align-items":"center",gap:"8px"}},nl=oe({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),m=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>m===ee.TASK),l=u=>{if(!t.value)return;const n={...t.value.data.arguments,duration:u};o.updateNodeData(t.value.id,{arguments:n})},b=u=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_enabled:u};o.updateNodeData(t.value.id,{arguments:n})},T=u=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_threshold:u};o.updateNodeData(t.value.id,{arguments:n})},B=u=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_enabled:u};o.updateNodeData(t.value.id,{arguments:n})},q=u=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_operator:u};o.updateNodeData(t.value.id,{arguments:n})},M=u=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_threshold:u};o.updateNodeData(t.value.id,{arguments:n})},f=u=>{if(!t.value)return;const n=t.value.data.arguments?.overlap_detection||{},x={...t.value.data.arguments,overlap_detection:{operator:n.operator??"gt",threshold:n.threshold??90,...n,enabled:u}};o.updateNodeData(t.value.id,{arguments:x})},C=u=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:u}};o.updateNodeData(t.value.id,{arguments:n})},N=u=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:u}};o.updateNodeData(t.value.id,{arguments:n})},c=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(u,n)=>{const x=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-text"),E=e.resolveComponent("el-form-item"),L=e.resolveComponent("el-switch"),S=e.resolveComponent("el-icon"),A=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-slider"),r=e.resolveComponent("el-option"),_=e.resolveComponent("el-select"),p=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Za,[n[9]||(n[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:c},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",va,[n[13]||(n[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(E,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.duration??30,onChange:n[0]||(n[0]=w=>l(w)),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(()=>[...n[10]||(n[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(E,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(L,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:n[1]||(n[1]=w=>b(w))},null,8,["model-value"]),e.createVNode(A,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(S,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(E,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(i,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:n[2]||(n[2]=w=>T(w)),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(()=>[...n[11]||(n[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(E,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(L,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:n[3]||(n[3]=w=>B(w))},null,8,["model-value"]),e.createVNode(A,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(S,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(E,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(_,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:n[4]||(n[4]=w=>q(w)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(r,{label:"大于 >",value:"gt"}),e.createVNode(r,{label:"大于等于 >=",value:"gte"}),e.createVNode(r,{label:"等于 =",value:"eq"}),e.createVNode(r,{label:"小于等于 <=",value:"lte"}),e.createVNode(r,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(E,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:n[5]||(n[5]=w=>M(w)),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(()=>[...n[12]||(n[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(E,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(L,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:n[6]||(n[6]=w=>f(w))},null,8,["model-value"]),e.createVNode(A,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(S,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(E,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(_,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:n[7]||(n[7]=w=>C(w)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(r,{label:"大于 >",value:"gt"}),e.createVNode(r,{label:"等于 =",value:"eq"}),e.createVNode(r,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(E,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:n[8]||(n[8]=w=>N(w)),min:0,max:100,precision:2,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-2969d123"]]),al={class:"node-config-panel"},ll={class:"config-content"},rl=oe({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:en,group:on,start:wn,end:Dn,classificationModel:qn,ocr:Pn,licensePlate:Un,face:We,stream:vn,dataSource:ia,smallModel:La,detectionTarget:Ja,targetCount:Ka,timerTarget:nl,faceRecognition:We},m=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(T=>T.id===y.source)?.data?.enableBranch&&t.edge||null;const l=o.selectedNode;return l&&t[l.type]||null});return(y,l)=>(e.openBlock(),e.createElementBlock("div",al,[e.createElementVNode("div",ll,[m.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(m.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),sl={class:"workflow-editor",id:"workflow-editor"},il={class:"editor-content"},cl={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:a=>Object.values(ee).includes(a)},pageMode:{type:String,default:ye.CREATE,validator:a=>Object.values(ye).includes(a)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(a,{expose:o}){const t=a,m=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",m),e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig)),e.provide("editorConfig",e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig)),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const y=ae(m),{copyToClipboard:l,downloadJSON:b,exportToJSON:T}=_t(t.mode),{runValidation:B}=Ct(t.mode);e.onUnmounted(()=>{at(m)});const q=e.computed(()=>{if(y.selectedNodeId)return!0;const f=y.selectedEdge;return f?!!y.nodes.find(N=>N.id===f.source)?.data?.enableBranch:!1});return o({reset:()=>{Z.ElMessageBox.confirm("确定要重置工作流吗?所有节点和连接将被清空。","确认重置",{confirmButtonText:"重置",cancelButtonText:"取消",type:"warning"}).then(()=>{y.resetWorkflow(),Z.ElMessage.success("工作流已重置")}).catch(()=>{})},runTest:B,copyJSON:l,exportJSON:T}),(f,C)=>(e.openBlock(),e.createElementBlock("div",sl,[e.createElementVNode("div",il,[e.createVNode(Tt),e.createVNode(Qo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[q.value?(e.openBlock(),e.createBlock(rl,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ye=oe(cl,[["__scopeId","data-v-0c88e0e0"]]),dl={Box:X.Box,CircleCheck:X.CircleCheck,CircleClose:X.CircleClose,Close:X.Close,CopyDocument:X.CopyDocument,Cpu:X.Cpu,DArrowLeft:X.DArrowLeft,DataAnalysis:X.DataAnalysis,Delete:X.Delete,Document:X.Document,Download:X.Download,FolderOpened:X.FolderOpened,Grid:X.Grid,Loading:X.Loading,Plus:X.Plus,QuestionFilled:X.QuestionFilled,RefreshLeft:X.RefreshLeft,Search:X.Search,Timer:X.Timer,Upload:X.Upload,User:X.User,View:X.View,VideoPlay:X.VideoPlay,Warning:X.Warning},Xe=a=>{Object.entries(dl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Ye)},ml={install:Xe};re.EditorMode=ee,re.NodeType=k,re.PageMode=ye,re.WorkflowEditor=Ye,re.default=ml,re.install=Xe,Object.defineProperties(re,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));