aiflowui 1.0.4 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/aiflowui.es.js +3491 -3491
- package/dist-lib/aiflowui.umd.js +1 -1
- package/dist-lib/style.css +1 -1
- package/package.json +1 -1
package/dist-lib/aiflowui.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(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,Ke,v,Ze,ve,et){"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"},tt={[k.DETECTION_TARGET]:"检测目标",[k.CLASSIFICATION_MODEL]:"分类模型",[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时",[k.FACE_RECOGNITION]:"人脸识别",[k.SMALL_MODEL]:"小模型"},ot={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"},he={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Se=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),ke=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}}}),be=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"}}),Ve=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Be=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Ae=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),De=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Le=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Oe=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"}}}}),Me=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:{}}}),nt=(a,o={width:300,height:160},t="and",u=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:u},selectable:!0,deletable:!1,zIndex:-1}),Ie=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),Re=Symbol("workflowStore"),$e=()=>{const a=Se({x:80,y:300}),o=be({x:320,y:300}),t=ke({x:1e3,y:300}),u={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[u]}},Fe=a=>Ke.defineStore(a,()=>{const o=$e(),t=e.ref(o.nodes),u=e.ref(o.edges),y=e.ref(null),l=e.ref(null),N=e.ref(new Set),E=e.ref(new Set),V=e.ref({}),F=(g,S,$,j)=>{V.value[g]||(V.value[g]={}),V.value[g][S]||(V.value[g][S]={}),V.value[g][S][$]={...j}},L=(g,S,$,j,J)=>{V.value[g]||(V.value[g]={}),V.value[g][S]||(V.value[g][S]={}),V.value[g][S][$]||(V.value[g][S][$]={}),V.value[g][S][$][j]=J},p=(g,S,$)=>V.value[g]?.[S]?.[$]??null,x=()=>{V.value={}},b=e.computed(()=>y.value?t.value.find(g=>g.id===y.value):null),r=e.computed(()=>l.value?u.value.find(g=>g.id===l.value):null),_=g=>t.value.filter(S=>S.type===g).length,n=()=>{const g=t.value.filter(S=>S.type===k.DATA_SOURCE);g.length!==0&&(g.length===1?g[0].data.label="数据源":g.forEach((S,$)=>{S.data.label=`数据源 ${$+1}`}))},w=()=>t.value.filter(g=>g.type===k.DATA_SOURCE).length,R=()=>t.value.filter(S=>S.type===k.DATA_SOURCE).some(S=>S.data.arguments?.needCooperativeDetection===!0),m=()=>{const g=w(),S=R();return!(g>1||S)},q=g=>{t.value.push(g),g.type===k.DATA_SOURCE&&n()},D=g=>{const S=t.value.find(j=>j.id===g),$=S?.type===k.DATA_SOURCE;if(S?.type==="group"){B(g),u.value=u.value.filter(j=>j.source!==g&&j.target!==g),y.value===g&&(y.value=null);return}t.value=t.value.filter(j=>j.id!==g),u.value=u.value.filter(j=>j.source!==g&&j.target!==g),y.value===g&&(y.value=null),$&&n()},A=(g,S)=>{const $=t.value.find(j=>j.id===g);$&&($.data={...$.data,...S})},T=(g,S)=>{const $=t.value.find(j=>j.id===g);$&&($.position=S)},d=g=>{const S=t.value.find($=>$.id===g.source);if(S&&(S.type===k.START||S.type===k.DATA_SOURCE)&&S.data?.enableBranch===!0){const j=u.value.filter(J=>J.source===g.source).length+1;g={...g,data:{...g.data,branchOrder:j}}}u.value=v.addEdge(g,u.value)},c=g=>{const S=u.value.find($=>$.id===g);if(u.value=u.value.filter($=>$.id!==g),l.value===g&&(l.value=null),S&&S.data?.branchOrder!==void 0){const $=t.value.find(j=>j.id===S.source);$&&($.type===k.START||$.type===k.DATA_SOURCE)&&u.value.filter(J=>J.source===S.source).sort((J,Q)=>(J.data?.branchOrder||0)-(Q.data?.branchOrder||0)).forEach((J,Q)=>{J.data?J.data.branchOrder=Q+1:J.data={branchOrder:Q+1}})}},s=(g,S="and",$=null)=>{const j=nt(g,{width:300,height:160},S,$);return t.value.unshift(j),j.id},C=(g,S)=>{const $=t.value.find(Q=>Q.id===g),j=t.value.find(Q=>Q.id===S);if(!$||!j||$.parentNode===S)return;$.parentNode&&h(g);const J=t.value.find(Q=>Q.id===g);J&&(t.value=t.value.map(Q=>Q.id!==g?Q:{...Q,position:{x:J.position.x-j.position.x,y:J.position.y-j.position.y},parentNode:S,extent:"parent"}))},h=g=>{const S=t.value.find(Q=>Q.id===g);if(!S||!S.parentNode)return;const $=t.value.find(Q=>Q.id===S.parentNode),j=$?S.position.x+$.position.x:S.position.x,J=$?S.position.y+$.position.y:S.position.y;t.value=t.value.map(Q=>{if(Q.id!==g)return Q;const te={...Q,position:{x:j,y:J}};return delete te.parentNode,delete te.extent,te})},B=g=>{const S=t.value.find($=>$.id===g);S&&(t.value=t.value.filter($=>$.id!==g).map($=>{if($.parentNode!==g)return $;const j={...$,position:{x:$.position.x+S.position.x,y:$.position.y+S.position.y}};return delete j.parentNode,delete j.extent,j}))};return{nodes:t,edges:u,selectedNodeId:y,selectedEdgeId:l,invalidNodeIds:N,invalidEdgeIds:E,selectedNode:b,selectedEdge:r,getNodeCountByType:_,getDataSourceCount:w,hasCooperativeDetection:R,supportPatrol:m,addNode:q,removeNode:D,updateNodeData:A,updateNodePosition:T,addConnection:d,removeEdge:c,updateEdgeData:(g,S)=>{const $=u.value.find(j=>j.id===g);if($){if(S.branchOrder!==void 0){const j=t.value.find(J=>J.id===$.source);if(j&&(j.type===k.START||j.type===k.DATA_SOURCE)){const J=$.data?.branchOrder,Q=S.branchOrder;if(J!==Q&&Q!==null){const se=u.value.filter(ce=>ce.source===$.source&&ce.id!==g).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}$.data={...$.data,...S}}},selectNode:g=>{y.value=g,l.value=null},selectEdge:g=>{l.value=g,y.value=null},clearSelection:()=>{y.value=null,l.value=null},resetWorkflow:()=>{const g=$e();t.value=g.nodes,u.value=g.edges,y.value=null,l.value=null,x()},loadWorkflow:(g,S)=>{t.value=g,u.value=S,y.value=null,l.value=null,x()},refreshDataSourceLabels:n,createEmptyGroup:s,addNodeToGroup:C,removeNodeFromGroup:h,dissolveParallelGroup:B,initializeSubsequentFrames:g=>{t.value.find($=>$.id===g)&&A(g,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(g,S)=>{const $=t.value.find(j=>j.id===g);!$||$.type!=="dataSource"||($.data.subsequentFrames||($.data.subsequentFrames=[]),$.data.subsequentFrames.push(S),A(g,{subsequentFrames:[...$.data.subsequentFrames]}))},removeSubsequentFrame:(g,S)=>{const $=t.value.find(Q=>Q.id===g);if(!$||$.type!=="dataSource")return;const j=$.data.subsequentFrames.find(Q=>Q.id===S);j&&u.value.filter(te=>te.source===g&&te.sourceHandle===j.handleId).forEach(te=>c(te.id));const J=$.data.subsequentFrames.filter(Q=>Q.id!==S);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),A(g,{subsequentFrames:J})},setInvalidIds:(g,S)=>{N.value=new Set(g),E.value=new Set(S)},clearInvalidIds:()=>{N.value=new Set,E.value=new Set},taskSources:V,setTaskSourceArguments:F,updateTaskSourceArgument:L,getTaskSourceArguments:p,clearTaskSources:x}}),ae=()=>{const a=e.inject(Re,null);return a||Fe("aiflow-workflow")()},qe=(a,o,t)=>{const u=[],y=[],l=a.filter(n=>n.type!=="group"),N=l.filter(n=>n.type===k.START);N.length===0?u.push("工作流必须包含一个开始节点"):N.length>1&&u.push("工作流只能包含一个开始节点");const E=l.filter(n=>n.type===k.END);E.length===0?u.push("工作流必须包含一个结束节点"):E.length>1&&u.push("工作流只能包含一个结束节点");const V=l.filter(n=>n.type===k.DATA_SOURCE);V.length===0&&u.push("工作流必须至少包含一个数据源节点"),l.filter(n=>n.type===k.DETECTION_TARGET||n.type===k.SMALL_MODEL||n.type===k.CLASSIFICATION_MODEL).length===0&&u.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(n=>n.type===k.SMALL_MODEL),V.some(n=>n.data.arguments?.needCooperativeDetection===!0),V.length>1,l.forEach(n=>{const w=o.filter(m=>m.target===n.id),R=o.filter(m=>m.source===n.id);if(n.type===k.START&&w.length>0&&y.push("开始节点不应有输入连接"),n.type===k.END&&R.length>0&&y.push("结束节点不应有输出连接"),n.type===k.START&&R.length===0&&u.push("开始节点必须有输出连接"),n.type===k.END&&w.length===0&&u.push("结束节点必须有输入连接"),n.type===k.DATA_SOURCE&&n.data.enableImageSequence)if(R.length===0)u.push({nodeId:n.id,message:`数据源节点"${n.data.label}"开启了图片时序但未连接到任何处理节点`});else{const m=R.filter(T=>T.sourceHandle==="first-frame"),q=n.data.subsequentFrames||[],D=new Set(R.map(T=>T.sourceHandle)),A=q.filter(T=>!D.has(T.handleId));m.length===0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"的首帧检测未连接`}),A.length>0&&y.push({nodeId:n.id,message:`数据源节点"${n.data.label}"有${A.length}个后续帧未连接`})}n.type!==k.START&&n.type!==k.END&&!n.parentNode&&(w.length===0||R.length===0)&&y.push(`节点 "${n.data.label}" 可能未正确连接`)});const L=new Set;o.forEach(n=>{const w=a.find(R=>R.id===n.source);w?.type==="dataSource"&&w.data?.enableImageSequence===!0&&n.sourceHandle!=="first-frame"&&(!n.data?.timeWindowSeconds||n.data.timeWindowSeconds<1)&&u.push({edgeId:n.id,message:`分支"${n.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),L.add(n.source),L.add(n.target)}),l.forEach(n=>{n.parentNode||!L.has(n.id)&&l.length>1&&y.push(`节点 "${n.data.label}" 未连接到工作流`)});const p=at(l,o);u.push(...p);const x=rt(l,o);u.push(...x);const b=lt(l);u.push(...b);const r=st(l,o);u.push(...r);const _=it(l,o);return u.push(..._),t==="task"&&l.filter(w=>w.type===k.FACE_RECOGNITION).forEach(w=>{(!w.data.arguments?.repositoryId||Array.isArray(w.data.arguments.repositoryId)&&w.data.arguments.repositoryId.length===0)&&u.push({nodeId:w.id,message:`人脸识别节点"${w.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:u.length===0,errors:u,warnings:y}},at=(a,o)=>{const t=[],u=a.find(N=>N.type===k.START);if(!u)return t;const y=new Set,l=(N,E,V,F)=>{if(E.includes(N))return;const L=a.find(_=>_.id===N);if(!L)return;const p=[...E,N];let x=[...V],b=[...F];if(L.type===k.TARGET_COUNT&&x.push(L),L.type===k.TIMER_TARGET&&b.push(L),L.type===k.END){const _=p.join("->");y.has(_)||(y.add(_),x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),b.length>1&&t.push(`工作流分支中存在多个目标计时节点(${b.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const r=o.filter(_=>_.source===N);r.length===0?(x.length>1&&t.push(`工作流分支中存在多个目标计数节点(${x.map(_=>`"${_.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),b.length>1&&t.push(`工作流分支中存在多个目标计时节点(${b.map(_=>`"${_.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):r.forEach(_=>{l(_.target,p,x,b)})};return l(u.id,[],[],[]),t},lt=a=>{const o=[],t=a.filter(y=>y.type===k.DATA_SOURCE),u=a.filter(y=>y.type===k.SMALL_MODEL);return u.length>0&&t.length>1&&u.forEach(y=>{o.push({nodeId:y.id,message:`小模型节点"${y.data.label||y.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},rt=(a,o)=>{const t=[];return a.filter(y=>y.type===k.DATA_SOURCE).forEach(y=>{const l=o.filter(N=>N.source===y.id);if(l.length>1){const N=l.map(F=>F.target),V=a.filter(F=>N.includes(F.id)).filter(F=>F.type===k.SMALL_MODEL);if(V.length>0){const F=V.map(L=>`"${L.data.label||L.data.modelName}"`).join("、");t.push(`数据源节点"${y.data.label}"开启了多分支,不能包含小模型节点(${F})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},st=(a,o)=>{const t=[],u=[k.TARGET_COUNT,k.TIMER_TARGET],y={[k.TARGET_COUNT]:"目标计数",[k.TIMER_TARGET]:"目标计时"};return a.filter(N=>N.type===k.SMALL_MODEL).forEach(N=>{o.filter(V=>V.source===N.id).forEach(V=>{const F=a.find(L=>L.id===V.target);if(F&&u.includes(F.type)){const L=y[F.type]||F.type;t.push(`小模型节点"${N.data.label||N.data.modelName}"不能直接连接${L}节点"${F.data.label}",请先连接检测目标节点`)}})}),t},it=(a,o)=>{const t=[],u=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION],y={[k.OCR]:"OCR识别",[k.LICENSE_PLATE]:"车牌识别",[k.FACE_RECOGNITION]:"人脸识别"};return a.filter(N=>u.includes(N.type)).forEach(N=>{const E=o.filter(L=>L.source===N.id),V=u.filter(L=>L!==N.type).concat(k.END),F=N.data.label||y[N.type];E.forEach(L=>{const p=a.find(x=>x.id===L.target);p&&!V.includes(p.type)&&t.push(`${F}节点"${F}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${p.data.label||p.type}"节点`)}),E.length===0&&t.push(`${F}节点"${F}"必须连接到其他辅助节点或结束节点`)}),t},Ge=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(u=>t.get(u)).filter(Boolean),He=(a,o)=>{const t={},u=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,N)=>{const E=l.data?.branchOrder??1/0,V=N.data?.branchOrder??1/0;return E-V}).forEach(l=>{if(u.has(l.source)&&u.has(l.target))return;let N=l.source,E=l.target;if(u.has(N)){const V=o.find(F=>F.target===N&&!u.has(F.source));if(!V)return;N=V.source}if(u.has(E)){const V=o.find(F=>F.source===E&&!u.has(F.target));if(!V)return;E=V.target}t[N]||(t[N]=[]),t[N].includes(E)||t[N].push(E)}),t},Pe=(a,o)=>{const t=[...o.values()].find(N=>N.type===k.START);if(!t)return[];const u=new Set,y=[],l=N=>{if(u.has(N))return;u.add(N);const E=o.get(N);if(!E)return;E.type!==k.START&&E.type!==k.END&&E.type!=="group"&&y.push(E),(a[N]||[]).forEach(F=>l(F))};return l(t.id),y},ct=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ne=(a,o,t,u)=>{const y=a.nodes.findIndex(N=>N.toolTitle===o);if(y===-1)return;const l=a.nodes[y];l.arguments?.[t]&&(a[u]=l.arguments[t]),a.nodes=a.nodes.filter((N,E)=>E!==y),a.nodes.forEach((N,E)=>{N.sortOrder=E+1})},dt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(u=>({op:u.operator,value:u.value}))}}},mt=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const u={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:u[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const u=t.operator||"gt",y={gt:">",eq:"=",lt:"<"};o.overlap={op:y[u]||">",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}},pt={[k.TARGET_COUNT]:dt,[k.TIMER_TARGET]:mt},ye=(a,o)=>{if(!a)return{};const t=pt[o];if(t)return t(a);const u={...a};return ct.forEach(y=>{delete u[y]}),Object.keys(u).forEach(y=>{const l=u[y];(l==null||l==="")&&delete u[y]}),o===k.FACE_RECOGNITION&&u.repositoryId!==void 0&&(Array.isArray(u.repositoryId)||(u.repositoryId=[u.repositoryId]),u.repositoryId.length===0&&delete u.repositoryId),u},ut=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||""}},ft=(a,o,t,u,y=null)=>{const l={toolTitle:ut(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:ye(y??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const N=u.find(E=>E.source===t&&E.target===a.id);N?.data?.branchOrder!==void 0&&N?.data?.branchOrder!==null&&(l.branchOrder=N.data.branchOrder)}return l},je=(a,o,t,u,y,l=null,N=[])=>{const E=[],V=Array.isArray(a)?[...a]:[a],F=new Set;let L=1;for(;V.length>0;){const p=[...V];V.length=0;const x=[];p.forEach(b=>{if(F.has(b))return;F.add(b);const r=u.get(b);!r||r.type===k.END||r.type===k.START||r.type===k.DATA_SOURCE||((t[b]||[]).forEach(n=>{const w=u.get(n);w&&w.type!==k.END&&V.push(n)}),N.includes(r.type))||x.push(r)}),x.length>0&&(x.forEach(b=>{const r=l?.(b.id)??null,_=ft(b,L,o,y,r);x.length>1&&(_.nodeLogic="or"),E.push(_)}),L++)}return E},gt=()=>{const a=ae(),o=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",he.CREATE);const t=e.inject("editorConfig",null),u=e.computed(()=>qe(a.nodes,a.edges,o)),y=(d,c,s,C)=>{if(s){const h=pe(d,s.id,c).find(B=>B.type===k.SMALL_MODEL);if(h)return h}return C.find(h=>h.type===k.SMALL_MODEL)||null},l=(d,c,s)=>{const h=pe(c,d.id,s).find(M=>M.type===k.SMALL_MODEL);return h?pe(c,h.id,s).filter(M=>M.type!==k.END&&M.type!==k.START&&M.type!==k.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},N=(d,c,s,C,h)=>{if(c===de.SMALL_MODEL||c===de.SMALL_MODEL_BRANCH){const M=y(C,h,s,d);return M?{toolTitle:M.data.title||M.data.modelName||"",toolType:"small",arguments:ye(M.data.arguments,k.SMALL_MODEL)}:null}const B=d.find(M=>M.type===k.DETECTION_TARGET);return B?{toolTitle:B.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:ye(B.data.arguments,k.DETECTION_TARGET)}:null},E=()=>{const d=a.nodes.find(C=>C.type===k.END);if(!d||!d.data.arguments)return{};const c=d.data.arguments,s={};return c.reportFrequency==="interval"&&c.reportInterval&&(s.interval={value:c.reportInterval}),c.enableDeduplication&&c.similarityThreshold!==void 0&&(s.dedup={value:c.similarityThreshold}),s},V=d=>{if(d.length<=1)return;const c=d.map(C=>C.sortOrder);if(new Set(c).size!==c.length){const C=c.filter((h,B)=>c.indexOf(h)!==B);throw new Error(`分支执行顺序存在重复:${[...new Set(C)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},F=(d,c,s,C,h)=>{let B=[],M;if(d===de.IMAGE_BRANCH)c&&(B=pe(C,c.id,h).filter(U=>U.type!==k.END)),M=c?.id||s.find(U=>U.type===k.DATA_SOURCE)?.id;else if(d===de.SMALL_MODEL_BRANCH){const U=y(C,h,c,s);U&&(B=pe(C,U.id,h).filter(G=>G.type!==k.END),M=U.id)}return{branchStartNodes:B,sourceNodeId:M}},L=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]),p=(d,c,s)=>{const C=new Set,h=[],B=M=>{if(C.has(M))return;C.add(M);const U=s.get(M);if(!U||U.type===k.END)return;L.has(U.type)&&h.push(U),(c[M]||[]).forEach(H=>B(H))};return B(d),h.length>0?h[h.length-1]:null},x=(d,c,s,C,h)=>{const B=`分支${h+1}`,M=p(c,s,C);if(!M)return d?.data?.nodeName||B;if(M.type===k.DETECTION_TARGET&&M.data?.targetId==="other"){const G=M.data?.arguments?.object;if(Array.isArray(G)&&G.length>0){const H=G.join(",");return H.length>32?H.slice(0,32):H}}if(M.type===k.CLASSIFICATION_MODEL){const G=M.data?.arguments?.modelName||M.data?.label;if(!G)return B;const H=M.data?.arguments?.resultNegate?"(取反)":"";return G+H}return M.data?.label||M.data?.targetName||B},b=(d,c,s,C,h,B)=>{const{branchStartNodes:M,sourceNodeId:U}=F(c,s,d,C,h);if(M.length===0)return[];const G=[];return M.forEach((H,z)=>{const Y=je([H.id],U,C,h,B);if(Y.length===0)return;const f=U?B.find(i=>i.source===U&&i.target===H.id):null,O=f?.data||{},P=O.branchOrder!==void 0&&O.branchOrder!==null?O.branchOrder:z+1,W={branchName:O.branchName||x(H,H.id,C,h,z),sortOrder:P,nodes:Y};f?.sourceHandle&&(W.sourceHandle=f.sourceHandle),Ne(W,"target_count","targetCount","targetCount"),Ne(W,"timer_target","duration","duration"),O.timeWindowSeconds!==void 0&&O.timeWindowSeconds!==null&&(W.timeWindowSeconds=O.timeWindowSeconds),O.branchDescription&&(W.description=O.branchDescription),G.push(W)}),V(G),G},r=()=>{const d=u.value;if(d.errors.length>0){const c=d.errors.map(s=>typeof s=="object"?s.message:s);return Z.ElMessage.error(`验证失败: ${c.join(", ")}`),!1}return d.warnings.length>0&&Z.ElMessage.warning(`警告: ${d.warnings.join(", ")}`),!0},_=()=>{const d=a.nodes,c=a.edges,s=Ge(d),C=He(d,c),h=Pe(C,s),B=[...s.values()].find(M=>M.type===k.START);return{allNodes:d,edges:c,nodeMap:s,adj:C,orderedNodes:h,startNode:B}},n=d=>{const c={ruleName:d?.data?.algorithmName||"",description:"",webhookUrl:""},s=E();Object.keys(s).length>0&&(c.extraConfig=s);const h=(t?.value??t)?.platform;return c.attach=h?{platform:h}:{},c},w=(d,c)=>{const s=d.filter(C=>C.type===k.DATA_SOURCE);if(s.length===0){const C=c.find(h=>h.type===k.DATA_SOURCE);C&&s.push(C)}return s},R=d=>d?.data?.enableImageSequence||d?.data?.arguments?.enableImageSequence||!1?"order":d?.data?.enableBranch&&d.data.branchLogic||"and",m=(d,c,s,C)=>{const{orderedNodes:h,adj:B,nodeMap:M,edges:U}=c,G=l(d,B,M),H=!!d.data.arguments?.needCooperativeDetection,z=U.find(W=>W.target===d.id),Y=z?.data?.branchOrder!==void 0&&z?.data?.branchOrder!==null?z.data.branchOrder:C+1,f={sourceGroupId:null,name:d.data.label||"数据源",sort:Y,synEnabled:H};if(H&&(f.windowSeconds=d.data.arguments?.windowSeconds||5),G===de.SMALL_MODEL){const W=N(h,G,d,B,M);return W&&(f.streamConfig=W),f.logic="and",f.children=[],f}if(G===de.SMALL_MODEL_BRANCH){const W=N(h,G,d,B,M);W&&(f.streamConfig=W)}f.logic=R(d);const O=b(h,G,d,B,M,U),P=s.length;return f.children=O.map((W,i)=>({name:W.branchName,branchRefs:[P+i]})),s.push(...O),f},q=(d,c)=>{const C={groupLogic:d?.data?.enableBranch&&d.data.branchLogic||"and",sourceGroups:c};return c.length>=2&&(C.groupWindowSeconds=d.data.groupWindowSeconds),C},D=()=>{if(!r())return null;try{const d=_(),c=n(d.startNode),s=w(d.orderedNodes,d.allNodes),C=[],h=s.map((B,M)=>m(B,d,C,M));return c.ruleSchema=q(d.startNode,h),C.length>0&&(c.branches=C),c}catch(d){return Z.ElMessage.error(d.message||"导出失败"),null}};return{validation:u,exportToJSON:D,copyToClipboard:()=>{try{const d=D();if(!d)return;const c=JSON.stringify(d,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(c).then(()=>{Z.ElMessage.success("已复制到剪贴板")}).catch(()=>{Z.ElMessage.error("复制失败")});else{const s=document.createElement("textarea");s.value=c,s.style.position="fixed",s.style.opacity="0",document.body.appendChild(s),s.select(),document.execCommand("copy"),document.body.removeChild(s),Z.ElMessage.success("已复制到剪贴板")}}catch(d){console.error("复制JSON失败:",d),Z.ElMessage.error(`复制失败: ${d.message}`)}},downloadJSON:()=>{const d=D();if(!d)return;const c=JSON.stringify(d,null,2),s=new Blob([c],{type:"application/json"}),C=URL.createObjectURL(s),h=document.createElement("a");h.href=C,h.download=`workflow_${Date.now()}.json`,h.click(),URL.revokeObjectURL(C),Z.ElMessage.success("导出成功")}}},ht=()=>{const a=ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",he.CREATE);const o=e.inject("editorConfig",null),t=e.inject("taskModeConfig",null),u=e.inject("echoTaskData",null),y=e.computed(()=>({errors:[],warnings:[]})),l=(r,_)=>{const n={},w=_?.data?.arguments??{};w.reportFrequency==="interval"&&w.reportInterval&&(n.interval={value:w.reportInterval}),w.enableDeduplication&&w.similarityThreshold!==void 0&&(n.dedup={value:w.similarityThreshold}),a.nodes.filter(q=>q.type===k.DATA_SOURCE).length>=2&&r?.data?.groupWindowSeconds!==void 0&&(n.groupWindowSeconds=r.data.groupWindowSeconds),n.enableVideo=!!r?.data?.enableAlertVideo;const m=r?.data?.schedule;return Array.isArray(m)&&m.length>0?n.schedule=m:n.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],n},N=(r,_,n,w,R="image")=>{const m=pe(_,r.id,n).find(q=>q.type===k.SMALL_MODEL);if(m){const q=r.data?.arguments??{};return{toolTitle:m.data.title||m.data.modelName||"",toolType:"small",arguments:ye(m.data.arguments,k.SMALL_MODEL),decoder:E(q,!0)}}if(R==="stream"){const q=w.find(A=>A.type===k.DETECTION_TARGET);if(!q)return null;const D=r.data?.arguments??{};return{toolTitle:q.data.targetId||"",toolType:"stream",arguments:ye(q.data.arguments,k.DETECTION_TARGET),decoder:E(D,!1)}}return null},E=(r,_)=>{const n=r.mode??(_?3:0),w=r.interval??0,R=r.sw_decoding??(_?"CPU":"GPU");let m=0,q=0;return _?n===3?(m=0,q=0):n===2?(m=1,q=0):n===1&&(m=0,q=w):n===0?(m=0,q=w*25):n===1?(m=0,q=w):n===2&&(m=1,q=0),{sw_decoding:R==="CPU",mode:m,interval:q}},V=(r,_,n,w,R=null)=>{let m=r.id,q=pe(_,r.id,n).filter(T=>T.type!==k.END&&T.type!==k.START);q.length===1&&q[0].type===k.SMALL_MODEL&&(m=q[0].id,q=pe(_,m,n).filter(T=>T.type!==k.END&&T.type!==k.START));const D=q;if(D.length===0)return[];const A=R?T=>a.getTaskSourceArguments(r.id,R,T):null;return D.map((T,d)=>{const c=je([T.id],m,_,n,w,A,[k.SMALL_MODEL]),s=w.find(U=>U.source===m&&U.target===T.id),C=s?.data??{},h=C.branchOrder??d+1,B=C.branchId??null,M={branchId:B,id:B,branchName:C.branchName||T.data?.label||`分支${d+1}`,sortOrder:h,nodes:c};return s?.sourceHandle&&(M.sourceHandle=s.sourceHandle),C.timeWindowSeconds!==void 0&&C.timeWindowSeconds!==null&&(M.timeWindowSeconds=C.timeWindowSeconds),C.branchDescription&&(M.description=C.branchDescription),Ne(M,"target_count","targetCount","targetCount"),Ne(M,"timer_target","duration","duration"),M})},F=(r,_,n,w,R=null,m=null,q=null,D=1,A=!1,T=!1)=>{const d=R??r.deviceType??"",c=d==="1400"||d==="2",s=c?"1400":"camera",C=_==="stream"?2:1,h=c&&m!==null?m==="device"?1:2:r.detectionType??2,M=(u?.value??u)?.graph?.sources??[],U=String(r.sourceId??r.id??""),H=M.find(Y=>String(Y.sourceId)===U)?.attach??{},z={deviceType:s,detectionType:h,dataSourceType:C,sourceOrder:n,timeTemplateId:H.timeTemplateId??"",timeTemplateName:H.timeTemplateName??"",platform:w?.platform??"TAI"};if(!c){const Y=q?.mode??0;Y===3?(z.frameExtractionType=0,z.frameInterval=0):Y===2?(z.frameExtractionType=T?1:3,z.frameInterval=0):(z.frameExtractionType=Y+1,z.frameInterval=q?.interval??30);const f=q?.sw_decoding??"CPU";z.frameExtractionSourceType=f==="GPU"?2:1,D===1&&_==="image"&&!A&&!!q?.enablePatrol?z.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,q?.patrolGroupSize??1)),pollingInterval:"0"}:z.pollingConfig={enablePolling:0},z.thirdId=r.thirdId??""}return z},L=(r,_,n,w,R,m,q)=>{const D=t?.value??t,A=D?.datasource?.getDevices?.(r.id)??[],T=r.data?.sourceGroupId??null,d=!!r.data?.arguments?.needCooperativeDetection,c=d?r.data?.arguments?.windowSeconds??5:void 0,s=_?.data?.streamType??"image",C=pe(n,r.id,w).some(f=>f.type===k.SMALL_MODEL),h=C?"small":s,B=N(r,n,w,q,s),M=r.data?.arguments?.deviceType??null,U=r.data?.arguments?.detectionMode??null,G=r.data?.arguments??null,H=a.getDataSourceCount();if(A.length>0)return A.map((f,O)=>{const P=String(f.sourceId??f.id??""),W=V(r,n,w,R,P),i={sourceId:f.sourceId??f.id??"",sourceName:f.sourceName??f.name??"",sourceType:h,sourceGroupId:T,areas:f.area??f.areas??[],branches:W,attach:F(f,s,O,D,M,U,G,H,d,C),synEnabled:d,...c!==void 0&&{windowSeconds:c}};return B&&(i.streamConfig=B,i.streamUrl="rtsp"),i});const z=V(r,n,w,R),Y={sourceId:"",sourceName:r.data?.label??"数据源",sourceType:h,sourceGroupId:T,areas:[],branches:z,attach:F({},s,0,D,M,U,G,H,d,C),synEnabled:d};return B&&(Y.streamConfig=B,Y.streamUrl="rtsp"),[Y]},p=()=>{try{const r=a.nodes,_=a.edges,n=Ge(r),w=He(r,_),R=[...n.values()].find(c=>c.type===k.START),m=[...n.values()].find(c=>c.type===k.END),q=o?.value??o,D=Pe(w,n);let A=D.filter(c=>c.type===k.DATA_SOURCE);A.length===0&&(A=r.filter(c=>c.type===k.DATA_SOURCE));const T=A.flatMap((c,s)=>L(c,R,w,n,_,s,D)),d={workflowName:R?.data?.taskName??"",ruleId:q?.ruleId??"",sources:T,extraConfig:l(R,m),description:""};if((q?.platform??"TAI")==="THIRD"){const s=A[0]?.data?.arguments??{},C=s.mode??0,h=s.interval??0;let B,M,U;return C===0?(B="time",M=h,U=0):(B="frame",M=0,C===3?U=0:C===2?U=-1:U=h),{name:d.workflowName,type:"simple",plan:d.extraConfig.schedule??[],inferStrategy:B,timeInterval:M,frameInterval:U,mps:d.extraConfig.enableVideo??!1,graph:d}}return d}catch(r){return Z.ElMessage.error(r.message||"导出失败"),null}};return{validation:y,exportToJSON:p,copyToClipboard:()=>{const r=p();if(!r)return;const _=JSON.stringify(r,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(_).then(()=>Z.ElMessage.success("已复制到剪贴板")).catch(()=>Z.ElMessage.error("复制失败"));else{const n=document.createElement("textarea");n.value=_,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select(),document.execCommand("copy"),document.body.removeChild(n),Z.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const r=p();if(!r)return;const _=JSON.stringify(r,null,2),n=new Blob([_],{type:"application/json"}),w=URL.createObjectURL(n),R=document.createElement("a");R.href=w,R.download=`task_workflow_${Date.now()}.json`,R.click(),URL.revokeObjectURL(w),Z.ElMessage.success("导出成功")}}},yt=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?ht():gt(),_t=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 Nt(){const a=ae(),o=e.inject("editorMode",ee.ALGORITHM),t=e.inject("taskModeConfig",null),u=N=>{const{type:E,data:V}=N,F=V.arguments||{},L=[];switch(E){case k.START:if(o===ee.TASK)if(V.taskName?.trim()||L.push("任务名称"),!V.executionTime?.trim())L.push("任务执行时间");else{const p=_t(V.executionTime);(!p||!Array.isArray(p.plan)||p.plan.length===0)&&L.push("任务执行时间(计划为空)")}else V.algorithmName?.trim()||L.push("算法名称");break;case k.SMALL_MODEL:V.modelId||L.push("模型选择");break;case k.DETECTION_TARGET:V.targetId||L.push("检测目标选择");break;case k.CLASSIFICATION_MODEL:F.modelId||L.push("分类模型选择");break;case k.DATA_SOURCE:o===ee.TASK&&((t?.value??t)?.datasource?.getDevices?.(N.id)??[]).length===0&&L.push("设备选择");break;case k.TARGET_COUNT:break;case k.TIMER_TARGET:(!F.duration||F.duration<1)&&L.push("持续时间");break}return L},y=N=>{const E=a.nodes.find(F=>F.id===N.source);if(!E)return[];const V=[];return E.type===k.DATA_SOURCE&&E.data?.enableImageSequence===!0&&N.sourceHandle!=="first-frame"&&(!N.data?.timeWindowSeconds||N.data.timeWindowSeconds<1)&&V.push("后续检测帧的持续时间"),V};return{runValidation:()=>{const{nodes:N,edges:E}=a;a.clearInvalidIds();const V=qe(N,E,o),F=V.errors,L=[],p=[],x=[];N.filter(R=>R.type!=="group").forEach(R=>{const m=u(R);m.length>0&&(L.push(R.id),x.push(`节点"${R.data.label}"缺少必填参数:${m.join("、")}`))}),E.forEach(R=>{const m=y(R);m.length>0&&(p.push(R.id),x.push(`分支"${R.data?.branchName||"未命名"}"缺少:${m.join("、")}`))}),F.forEach(R=>{typeof R=="object"&&(R.nodeId&&L.push(R.nodeId),R.edgeId&&p.push(R.edgeId))}),(L.length>0||p.length>0)&&(a.setInvalidIds(L,p),setTimeout(()=>{a.clearInvalidIds()},5e3));const r=F.map(R=>typeof R=="object"?R.message:R),_=V.warnings.map(R=>typeof R=="object"?R.message:R),n=[...r.map(R=>({msg:R,type:"error"})),...x.map(R=>({msg:R,type:"warning"})),..._.map(R=>({msg:R,type:"warning"}))],w=r.length===0&&x.length===0;if(w&&_.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(n.length>0){const R=n[0];Z.ElMessage[R.type](R.msg)}return w}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[u,y]of o)t[u]=y;return t},Ct={key:0},kt={class:"node-list"},bt={class:"node-list"},xt={class:"node-list"},Et={class:"node-list"},wt=oe({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),u=(y,l)=>{y.dataTransfer&&(y.dataTransfer.setData("application/vueflow",l),y.dataTransfer.effectAllowed="move")};return(y,l)=>{const N=e.resolveComponent("el-icon"),E=e.resolveComponent("VideoPlay"),V=e.resolveComponent("CircleClose"),F=e.resolveComponent("el-collapse-item"),L=e.resolveComponent("FolderOpened"),p=e.resolveComponent("Cpu"),x=e.resolveComponent("View"),b=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]=r=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",Ct,"节点工具箱")):(e.openBlock(),e.createBlock(N,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(N,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(r=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(b,{key:0,modelValue:t.value,"onUpdate:modelValue":l[13]||(l[13]=r=>t.value=r),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(F,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",kt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=r=>u(r,"start"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),l[14]||(l[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[3]||(l[3]=r=>u(r,"end"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(V)]),_:1}),l[15]||(l[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(F,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=r=>u(r,"dataSource"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(L)]),_:1}),l[16]||(l[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[5]||(l[5]=r=>u(r,"smallModel"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(p)]),_:1}),l[17]||(l[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[6]||(l[6]=r=>u(r,"detectionTarget"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),l[18]||(l[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[7]||(l[7]=r=>u(r,"classificationModel"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(F,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",xt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=r=>u(r,"targetCount"))},[e.createVNode(N,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]=r=>u(r,"timerTarget"))},[e.createVNode(N,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(F,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=r=>u(r,"ocr"))},[e.createVNode(N,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]=r=>u(r,"licensePlate"))},[e.createVNode(N,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]=r=>u(r,"faceRecognition"))},[e.createVNode(N,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 xe{static backendToFrontend(o){const{id:t,title:u,name:y,inputSchema:l,extraConfig:N}=o,E={id:t,title:u,label:y,type:"DETECTION_TARGET",inputSchema:l,extraConfig:N,data:{targetId:u,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:N?.showStruct!==void 0?!1:void 0}};return Object.keys(E.data).forEach(V=>{E.data[V]===void 0&&delete E.data[V]}),E}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},ze=a=>tt[a]||a,fe=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||ze(a),...t}}),_e=(a,o,t={})=>{const{sourceHandle:u,...y}=t,l={id:`e_${a}_${o}`,source:a,target:o};return u&&(l.sourceHandle=u),Object.keys(y).length>0&&(l.data=y),l},Tt=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(u=>({operator:u.op,value:u.value}))}},St=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}},Vt=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},Bt=()=>({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"]}),At=()=>({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:[]}),Dt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),Ue=()=>{const a=ae(),o=e.inject("editorConfig",null),t=m=>ot[m]||k.DETECTION_TARGET,u=(m,q)=>m?.find(D=>D.id===String(q))??m?.[q],y=(m,q)=>m.streamConfig?(m.children||[]).some(T=>(T.branchRefs||[]).some(d=>u(q.branches,d)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=m=>!m||typeof m!="object"?"无效的JSON格式":!m.ruleName&&m.ruleName!==""?"缺少 ruleName 字段":m.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",N=m=>{const q=o?.value??o;return m==="small"?q?.smallModels||[]:m==="detection"?q?.detection||[]:m==="classification"?q?.classification?.models||[]:[]},E=()=>{},V=(m,q)=>{m.modelName=q||"",m.title=q||"",m.modelId=q||null;const A=N("small").find(T=>T.title===q);A&&(m.input_schema=A.inputSchema||A.input_schema||{},m.modelId=A.id||A.title,m.modelName=A.name||q,m.modelType=A.type,m.supportDirectAlert=A.supportDirectAlert||!1,m.extraConfig=A.extraConfig)},F=async(m,q)=>{const D=t(m.toolTitle),A={label:m.nodeName||ze(D),arguments:m.arguments||{},input_schema:{}};switch(D){case k.DETECTION_TARGET:A.targetId=m.toolTitle,A.targetName=m.nodeName||"检测目标";{const d=N("detection").find(c=>c.title===m.toolTitle);if(d){let s=xe.backendToFrontend(d).inputSchema||{};if(m.toolTitle==="other"){const C={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};s={...s,properties:{...s.properties,...C.properties}}}A.input_schema=s}}break;case k.CLASSIFICATION_MODEL:A.modelName=m.nodeName||"分类模型";break;case k.SMALL_MODEL:V(A,m.toolTitle);break}return m.branchLogic&&(A.enableBranch=!0,A.branchLogic=m.branchLogic),fe(D,q,A)},L=(m,q,D,A)=>{const T={label:"小模型",input_schema:{},arguments:m.arguments||{}};return V(T,m.toolTitle),q===de.SMALL_MODEL_BRANCH&&(T.enableBranch=!0,T.branchLogic=D.logic||"and"),fe("smallModel",A,T)},p=async(m,q,D,A,T,d)=>{let c=q,s=A;const C={branchOrder:m.sortOrder??1,branchName:m.branchName||"",branchId:m.id??null};m.sourceHandle&&(C.sourceHandle=m.sourceHandle);const h=m.timeWindowSeconds??m.extraConfig?.timeWindowSeconds;h!==void 0&&(C.timeWindowSeconds=h),m.description&&(C.branchDescription=m.description);const B=[...m.nodes||[]].sort((f,O)=>(f.sortOrder??0)-(O.sortOrder??0)),M=new Set([k.DETECTION_TARGET,k.CLASSIFICATION_MODEL,k.SMALL_MODEL]);let U=-1;B.forEach((f,O)=>{M.has(t(f.toolTitle))&&(U=O)});const G=B.map(f=>({kind:"regular",data:f})),H=m.targetCount??m.extraConfig?.targetCount,z=m.duration??m.extraConfig?.duration,Y=[];H&&Y.push({kind:"targetCount",data:H}),z&&Y.push({kind:"timerTarget",data:z}),Y.length>0&&G.splice(U+1,0,...Y);for(let f=0;f<G.length;f++){const O=G[f];let P;if(O.kind==="regular")P=await F(O.data,{x:s,y:D});else if(O.kind==="targetCount"){const W=Tt(O.data);P=fe("targetCount",{x:s,y:D},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=St(O.data);P=fe("timerTarget",{x:s,y:D},{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"}}})}T.push(P),d.push(_e(c,P.id,f===0?C:void 0)),c=P.id,s+=ie.H_GAP}return{lastNodeId:c,endX:s}},x=m=>{const q=m.ruleSchema.sourceGroups||[],D=m.ruleSchema.groupLogic||"and",A=q.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:m.ruleName||"",enableBranch:A?!0:D!=="and",branchLogic:D,groupWindowSeconds:m.ruleSchema.groupWindowSeconds??null})},b=m=>{const q=Vt(m.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:Bt(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...q}})},r=(m,q)=>[...m||[]].sort((D,A)=>(D.sort??0)-(A.sort??0)).map(D=>{const A=y(D,q),T=[];return(D.children||[]).forEach(d=>{(d.branchRefs||[]).forEach(c=>{const s=u(q.branches,c);s&&T.push(s)})}),T.sort((d,c)=>(d.sortOrder??0)-(c.sortOrder??0)),{sg:D,mode:A,refBranches:T}}),_=m=>{const D=(m.reduce((A,T)=>A+Math.max(T.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-D/2},n=async(m,q,D,A,T,d)=>{const{sg:c,mode:s,refBranches:C}=m,h=Math.max(C.length,1),B=D+(h-1)*ie.V_GAP/2;let M=ie.START_X+ie.H_GAP,U=ie.START_X;const G=c.logic==="order",H=fe("dataSource",{x:M,y:B},{label:c.name||"数据源",sourceGroupId:c.sourceGroupId??null,enableImageSequence:G,input_schema:At(),arguments:{needCooperativeDetection:!!c.synEnabled,windowSeconds:c.windowSeconds||5,enableImageSequence:G},enableBranch:!0,branchLogic:G?"order":c.logic||"and"});A.push(H),T.push(_e(q.id,H.id,{branchOrder:c.sort??null,branchName:c.name||""})),G&&C.forEach((f,O)=>{f.sourceHandle||(f.sourceHandle=O===0?"first-frame":Dt())});const z=G?{dataSourceNode:H,refBranches:C}:null;let Y=H.id;if(s===de.SMALL_MODEL||s===de.SMALL_MODEL_BRANCH){M+=ie.H_GAP;const f=L(c.streamConfig,s,c,{x:M,y:B});A.push(f),T.push(_e(H.id,f.id)),Y=f.id}if(C.length>0)for(let f=0;f<C.length;f++){const O=D+f*ie.V_GAP,{lastNodeId:P,endX:W}=await p(C[f],Y,O,M+ie.H_GAP,A,T);T.push(_e(P,d.id)),W>U&&(U=W)}else{T.push(_e(Y,d.id));const f=M+ie.H_GAP;f>U&&(U=f)}return{branchY:D+h*ie.V_GAP,maxX:U,imageSequenceInfo:z}},w=m=>{for(const{dataSourceNode:q,refBranches:D}of m){const A=D.filter(T=>T.sourceHandle&&T.sourceHandle!=="first-frame");A.length>0&&(q.data.subsequentFrames=A.map((T,d)=>({id:d===0?"default-subsequent":`subsequent-${Date.now()}-${d}`,label:d===0?"后续帧检测":`后续帧检测${d+1}`,handleId:T.sourceHandle})))}};return{importFromJSON:async m=>{const q=l(m);if(q)return Z.ElMessage.error(q),!1;try{E();const D=[],A=[],T=x(m),d=b(m);D.push(T);const c=r(m.ruleSchema.sourceGroups,m);let s=_(c),C=ie.START_X;const h=[];for(const B of c){const M=await n(B,T,s,D,A,d);s=M.branchY,M.maxX>C&&(C=M.maxX),M.imageSequenceInfo&&h.push(M.imageSequenceInfo)}return d.position.x=C+ie.H_GAP,D.push(d),w(h),a.loadWorkflow(D,A),Z.ElMessage.success("导入成功"),!0}catch(D){return Z.ElMessage.error("导入失败: "+(D.message||"未知错误")),!1}},validateImportJSON:l}},Lt=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:u,validateImportJSON:y}=Ue(),l=(b,r)=>{const _=b.mode??0,n=b.interval??0,w=b.sw_decoding===!1?"GPU":"CPU";let R,m;return r?_===1?(R=2,m=0):_===0&&n===0?(R=3,m=0):(R=1,m=n):_===1?(R=2,m=0):n===0?(R=0,m=30):(R=0,m=n),{mode:R,interval:m,sw_decoding:w}},N=(b,r)=>{const _=b.frameExtractionType??1,n=b.frameInterval??0,R=(b.frameExtractionSourceType??1)===2?"GPU":"CPU";let m,q;return _===0?(m=3,q=0):_===1&&n===0?(m=r?2:0,q=30):_===1?(m=0,q=n):_===2?(m=1,q=n):_===3?(m=2,q=0):(m=r?3:0,q=30),{mode:m,interval:q,sw_decoding:R}},E=b=>b===1?"device":"platform",V=b=>!b||b.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(b.pollingAmount??1)},F=(b,r,_)=>{if(r){const n=b.find(w=>w.sourceGroupId===r);if(n)return n}return b[_]??null},L=(b,r)=>{if(!b?.branches)return null;for(const _ of b.branches){const n=_.nodes?.find(w=>w.toolTitle===r);if(n?.arguments)return{...n.arguments}}return null},p=b=>{if(!Array.isArray(b)||b.length===0)return{timeZone:"",planType:0};const r=b.map(n=>({dayType:Number(n.dayType??0),timePeriod:(n.timePeriod??[]).map(w=>({startTime:w.startTime,endTime:w.endTime}))})),_=r.some(n=>n.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:r}),planType:_}};return{importFromJSON:async b=>{const r=y(b);if(r)return Z.ElMessage.error(r),!1;if(!await u(b))return!1;const n=a?.value??a;if(!n||typeof n!="object"||Object.keys(n).length===0)return!0;const w=n.graph??{},R=w.sources??[],m=w.extraConfig??{},q=t.nodes.find(c=>c.type===k.START);if(q){const c=n.name??w.workflowName??"",s=!!m.enableVideo,C=m.schedule??[],{timeZone:h,planType:B}=p(C);t.updateNodeData(q.id,{taskName:c,enableAlertVideo:s,schedule:C,timeZone:h,planType:B,...h?{executionTime:h}:{}})}const D=t.nodes.filter(c=>c.type===k.DATA_SOURCE),A=t.nodes.some(c=>c.type===k.SMALL_MODEL);return D.forEach((c,s)=>{const C=c.data?.sourceGroupId??null,h=F(R,C,s);if(!h)return;const B=h.attach??{},M=h.streamConfig?.decoder??null,U=B.deviceType==="1400"?"1400":"camera",G=U==="camera"?M?l(M,A):N(B,A):{},H=U==="camera"?V(B.pollingConfig):{},z=U==="1400"?{detectionMode:E(B.detectionType)}:{},Y=c.data?.arguments??{};t.updateNodeData(c.id,{arguments:{...Y,deviceType:U,...G,...H,...z}});const f=o?.value??o;if(f?.datasource?.setDevices){const P=(C?R.filter(W=>W.sourceGroupId===C):[h]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));f.datasource.setDevices(c.id,P)}}),t.nodes.filter(c=>c.type===k.DETECTION_TARGET).forEach(c=>{const s=new Set,C=[c.id];let h=null;for(;C.length&&!h;){const f=C.shift();if(s.has(f))continue;s.add(f);const O=t.edges.filter(P=>P.target===f);for(const P of O){const W=t.nodes.find(i=>i.id===P.source);if(W){if(W.type===k.DATA_SOURCE){h=W.id;break}C.push(W.id)}}}if(!h)return;const M=(o?.value??o)?.datasource?.getDevices?.(h)??[];if(M.length<=1)return;const U=c.data?.targetId;if(!U)return;const G=M.map(f=>{const O=String(f.sourceId??f.id??""),P=R.find(W=>String(W.sourceId)===O);if(!P?.branches)return{deviceId:O,args:null};for(const W of P.branches){const i=W.nodes?.find(g=>g.toolTitle===U);if(i?.arguments)return{deviceId:O,args:{...i.arguments}}}return{deviceId:O,args:null}}),H=G.filter(f=>f.args!==null);if(H.length===0)return;const z=JSON.stringify(H[0].args);if(H.some(f=>JSON.stringify(f.args)!==z)){const f=c.data?.arguments??{};t.updateNodeData(c.id,{arguments:{...f,configMode:"perDevice"}}),G.forEach(({deviceId:O,args:P})=>{P&&t.setTaskSourceArguments(h,O,c.id,P)})}}),t.nodes.filter(c=>c.type===k.FACE_RECOGNITION).forEach(c=>{const s=new Set,C=[c.id];let h=null;for(;C.length&&!h;){const Y=C.shift();if(s.has(Y))continue;s.add(Y);const f=t.edges.filter(O=>O.target===Y);for(const O of f){const P=t.nodes.find(W=>W.id===O.source);if(P){if(P.type===k.DATA_SOURCE){h=P.id;break}C.push(P.id)}}}const M=(h?t.nodes.find(Y=>Y.id===h):null)?.data?.sourceGroupId??null,U=D.findIndex(Y=>Y.id===h),G=F(R,M,U>=0?U:0);if(!G)return;const H=L(G,"face");if(!H?.repositoryId)return;const z=c.data?.arguments??{};t.updateNodeData(c.id,{arguments:{...z,repositoryId:Array.isArray(H.repositoryId)?H.repositoryId:[H.repositoryId]}})}),!0},validateImportJSON:y}},Ot=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Lt():Ue(),Mt={class:"node-content"},It={class:"node-label"},Rt=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const u=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",Mt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(u)]),_:1}),e.createElementVNode("span",It,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),$t={class:"node-content"},Ft={class:"node-label"},qt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const u=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",$t,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(u)]),_:1}),e.createElementVNode("span",Ft,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Gt={class:"node-content"},Ht={class:"node-info"},Pt={class:"node-label"},jt={key:1,class:"sequence-handles"},zt={class:"handle-item"},Ut={class:"handle-label"},Wt={key:0,class:"handle-item add-button-item"},Jt=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(),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,L=>{const p=Math.random()*16|0;return(L==="x"?p:p&3|8).toString(16)}),N=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let E=!1;const V=()=>{if(E)return;E=!0;const L=o.data.subsequentFrames||[],p={id:l(),label:`后续帧检测${L.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,p),setTimeout(()=>{E=!1},300)},F=async L=>{const p=o.data.subsequentFrames.find(b=>b.id===L);if(t.edges.some(b=>b.source===o.id&&b.sourceHandle===p.handleId))try{await Z.ElMessageBox.confirm(`删除"${p.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,L)};return(L,p)=>{const x=e.resolveComponent("FolderOpened"),b=e.resolveComponent("el-icon"),r=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",Gt,[e.createVNode(b,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(x)]),_:1}),e.createElementVNode("div",Ht,[e.createElementVNode("div",Pt,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(v.Handle),{key:0,type:"source",position:e.unref(v.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",jt,[e.createElementVNode("div",zt,[p[0]||(p[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,_=>(e.openBlock(),e.createElementBlock("div",{key:_.id,class:"handle-item"},[e.createElementVNode("span",Ut,e.toDisplayString(_.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:_.handleId,class:"handle-right"},null,8,["position","id"]),_.id!=="default-subsequent"&&!y.value?(e.openBlock(),e.createBlock(b,{key:0,class:"delete-icon",onClick:e.withModifiers(n=>F(_.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",Wt,[e.createVNode(r,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(V,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Yt={class:"node-content"},Xt={class:"node-info"},Qt={class:"node-label"},Kt={key:0,class:"node-model"},Zt={key:1,class:"node-placeholder"},vt={key:0,class:"direct-alert-badge"},eo=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const u=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",Yt,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(u)]),_:1}),e.createElementVNode("div",Xt,[e.createElementVNode("div",Qt,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",Kt,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",Zt,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",vt,[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"]]),to={class:"node-content"},oo={class:"node-info"},no={class:"node-target"},ao={class:"node-params"},lo=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||"检测目标",u=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(E=>E&&E.trim()!=="").length}return null});return(l,N)=>{const E=e.resolveComponent("View"),V=e.resolveComponent("el-icon"),F=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",to,[e.createVNode(V,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",oo,[N[1]||(N[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",no,e.toDisplayString(t()),1),e.createElementVNode("div",ao,[y.value?(e.openBlock(),e.createBlock(F,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(y.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),u.value?(e.openBlock(),e.createBlock(F,{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(F,{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(F,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...N[0]||(N[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"]]),ro={class:"node-content"},so={class:"node-info"},io={class:"node-label"},co={key:0,class:"node-model"},mo={key:1,class:"node-placeholder"},po={key:2,class:"node-stats"},uo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const u=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",ro,[e.createVNode(y,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(u)]),_:1}),e.createElementVNode("div",so,[e.createElementVNode("div",io,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",co,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",mo,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",po,[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"]]),fo={class:"node-content"},go={class:"node-info"},ho={class:"node-label"},yo={class:"node-params"},_o=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return ae(),(o,t)=>{const u=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",fo,[e.createVNode(u,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",go,[e.createElementVNode("div",ho,e.toDisplayString(a.data.label),1),e.createElementVNode("div",yo,[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"]]),No={class:"node-content"},Co={class:"node-info"},ko={class:"node-label"},bo={class:"node-scope"},xo={class:"node-params"},Eo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),u=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(N=>N.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const N=e.resolveComponent("Document"),E=e.resolveComponent("el-icon"),V=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",No,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(N)]),_:1}),e.createElementVNode("div",Co,[e.createElementVNode("div",ko,e.toDisplayString(a.data.label),1),e.createElementVNode("div",bo,e.toDisplayString(u()),1),e.createElementVNode("div",xo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(V,{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(V,{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"]]),wo={class:"node-content"},To={class:"node-info"},So={class:"node-params"},Vo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},u=e.computed(()=>{const y=o.data.arguments?.alertConditions||[];if(y.length===0)return"";if(y.length===1){const N=y[0];return`数量 ${t[N.operator]||N.operator} ${N.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${y.length} 个条件(${l})`});return(y,l)=>{const N=e.resolveComponent("el-icon"),E=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",wo,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",To,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",So,[u.value?(e.openBlock(),e.createBlock(E,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.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"]]),Bo={class:"node-content"},Ao={class:"node-info"},Do={class:"node-label"},Lo={class:"node-params"},Oo=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||"目标计时"),u=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,N)=>{const E=e.resolveComponent("el-icon"),V=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",Bo,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Ao,[e.createElementVNode("div",Do,e.toDisplayString(t.value),1),e.createElementVNode("div",Lo,[e.createVNode(V,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.value),1)]),_:1}),y.value?(e.openBlock(),e.createBlock(V,{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"]]),Mo={class:"group-label"},Io=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},u=e.computed(()=>t[o.data.branchLogic]??"ALL"),y=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),l={width:"8px",height:"8px",borderRadius:"2px"},N={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(E,V)=>{const F=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",Mo,[e.createVNode(F,{type:y.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.value),1)]),_:1},8,["type"]),V[0]||(V[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(et.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":N})],2)}}},[["__scopeId","data-v-adf6607d"]]),Ro={class:"node-content"},$o={class:"node-info"},Fo={class:"node-label"},qo={class:"node-scope"},Go={class:"node-params"},Ho=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),u=()=>{const y=o.data.arguments?.detectionScope;if(!y)return"";const l=t.nodes.find(N=>N.id===y);return l?l.data.label:"检测范围"};return(y,l)=>{const N=e.resolveComponent("el-icon"),E=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",Ro,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",$o,[e.createElementVNode("div",Fo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",qo,e.toDisplayString(u()),1),e.createElementVNode("div",Go,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(E,{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(E,{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"]]),Po={class:"quick-add-menu__list"},jo=["onClick"],zo={class:"quick-add-menu__icon"},Uo={class:"quick-add-menu__label"},Wo={key:0,class:"quick-add-menu__empty"},ue=8,Jo=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),u=e.ref({x:0,y:0});e.watch(()=>o.visible,async E=>{if(!E||(u.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const V=t.value.getBoundingClientRect(),F=window.innerWidth,L=window.innerHeight;let{x:p,y:x}=o.position;p+V.width>F-ue&&(p=F-V.width-ue),x+V.height>L-ue&&(x=L-V.height-ue),p<ue&&(p=ue),x<ue&&(x=ue),u.value={x:p,y:x}});const y=e.computed(()=>({left:u.value.x+"px",top:u.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:"🏁"}],N=e.computed(()=>{switch(o.sourceNodeType){case"start":return l.filter(E=>E.type==="dataSource");case"dataSource":return l.filter(E=>E.type==="smallModel"||E.type==="detectionTarget"||E.type==="classificationModel");case"smallModel":return l.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel"&&E.type!=="targetCount"&&E.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel");case"timerTarget":return l.filter(E=>["ocr","faceRecognition","licensePlate","end"].includes(E.type));case"targetCount":return l.filter(E=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(E.type));case"ocr":return l.filter(E=>["licensePlate","faceRecognition","end"].includes(E.type));case"licensePlate":return l.filter(E=>["ocr","faceRecognition","end"].includes(E.type));case"faceRecognition":return l.filter(E=>["ocr","licensePlate","end"].includes(E.type));default:return[]}});return(E,V)=>(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)},[V[1]||(V[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Po,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,F=>(e.openBlock(),e.createElementBlock("li",{key:F.type,class:"quick-add-menu__item",onClick:L=>E.$emit("select",F.type)},[e.createElementVNode("span",zo,e.toDisplayString(F.icon),1),e.createElementVNode("span",Uo,e.toDisplayString(F.label),1)],8,jo))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("li",Wo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),a.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:V[0]||(V[0]=F=>E.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Yo={class:"workflow-canvas"},We=5,Xo=oe({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:u,onConnectStart:y,onConnectEnd:l}=v.useVueFlow(),N=e.inject("editorConfig",null),E=e.inject("editorMode",ee.ALGORITHM),V=e.computed(()=>E===ee.TASK),F=e.inject("echoAlgodata",null),{importFromJSON:L}=Ot();e.watch(F,async i=>{if(i&&Object.keys(i).length>0&&(await e.nextTick(),await L(i),V.value)){const g=i?.ruleSchema?.sourceGroups??[];let S=null;if(g.some($=>$.streamConfig)?S="stream":(g.length>1||g.some($=>($.children??[]).length>1))&&(S="image"),S){const $=o.nodes.find(j=>j.type===k.START);$&&o.updateNodeData($.id,{streamType:S})}}},{immediate:!0});const p=(i,g)=>{if(!g?.properties)return i;const S={};return Object.entries(g.properties).forEach(([$,j])=>{j.default!==void 0&&(S[$]=j.default)}),i.data.arguments={...S,...i.data.arguments},i},x=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),b=()=>{x.visible=!1,x.sourceNodeId=null,x.sourceNodeType=null,x.sourceHandleId=null,R=!1};let r=null,_=!1,n=null,w=null,R=!1;const m=()=>{n&&(document.removeEventListener("mousemove",n),n=null),w&&(document.removeEventListener("mouseup",w),w=null)};y(({nodeId:i,handleId:g,handleType:S,event:$})=>{if(S!=="source")return;if(V.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const j=o.nodes.find(ne=>ne.id===i);if(!j||j.type==="end")return;if(j.type===k.DATA_SOURCE&&j.data?.enableImageSequence){if(g&&o.edges.filter(I=>I.source===i&&I.sourceHandle===g).length>=1)return}else if(j.type!==k.START&&j.type!==k.DATA_SOURCE&&o.edges.filter(I=>I.source===i).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}r={nodeId:i,sourceNodeType:j.type,handleId:g,menuX:Q,menuY:te,flowPos:{...j.position}},_=!1;const se=$?.clientX??0,ce=$?.clientY??0;m(),n=ne=>{(Math.abs(ne.clientX-se)>We||Math.abs(ne.clientY-ce)>We)&&(_=!0,m())},w=()=>{if(m(),!_&&r){R=!0;const ne=r;x.visible=!0,x.screenPos={x:ne.menuX,y:ne.menuY},x.sourceNodeId=ne.nodeId,x.sourceNodeType=ne.sourceNodeType,x.sourceHandleId=ne.handleId,x.flowPos=ne.flowPos}r=null},document.addEventListener("mousemove",n),document.addEventListener("mouseup",w)});const q=i=>{const g=x.sourceNodeId,S=o.nodes.find(K=>K.id===g);if(!S){b();return}if(V.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),b();return}const $=S.position.x+250,j=S.position.y;let J={x:$,y:j};const Q=60,te=80;let se=0,ce=!0;for(;ce;){ce=!1;const K=j+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=j+se,i==="end"){const K=o.nodes.find(le=>le.type==="end");if(K){if(o.edges.some(Ce=>Ce.source===g&&Ce.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),b();return}const ge=A(S,K);if(!ge.valid){Z.ElMessage.warning(ge.message),b();return}o.addConnection({source:g,target:K.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),U(),b(),Z.ElMessage.success("已连接到结束节点");return}}let ne;switch(i){case"end":ne=ke(J);break;case"dataSource":ne=be(J);break;case"smallModel":ne=Ve(J);break;case"detectionTarget":ne=Be(J);break;case"classificationModel":ne=Ae(J);break;case"ocr":{const K=N?.value??N;ne=p(De(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=N?.value??N;ne=p(Le(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=N?.value??N;ne=p(Ie(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Oe(J);break;case"timerTarget":ne=Me(J);break;default:b();return}const I=A(S,ne);if(!I.valid){Z.ElMessage.warning(I.message),b();return}o.addNode(ne),o.addConnection({source:g,target:ne.id,sourceHandle:x.sourceHandleId||null,targetHandle:null}),U(),b(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},D=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],A=(i,g)=>{if(i?.parentNode&&g?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(g?.parentNode&&i?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(i?.type===k.START){if(g?.type!==k.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(j=>j.source===i.id).some(j=>o.nodes.find(Q=>Q.id===j.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(g?.type===k.SMALL_MODEL){if(i?.type!==k.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(J=>J.source===i.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type!==k.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(i?.type===k.DATA_SOURCE){if(g?.type!==k.SMALL_MODEL&&g?.type!==k.DETECTION_TARGET&&g?.type!==k.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(J=>J.source===i.id).some(J=>o.nodes.find(te=>te.id===J.target)?.type===k.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(i?.type===k.SMALL_MODEL&&(g?.type===k.TARGET_COUNT||g?.type===k.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(i?.type===k.TARGET_COUNT&&![k.TIMER_TARGET,k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(g?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(i?.type===k.TIMER_TARGET&&![k.OCR,k.FACE_RECOGNITION,k.LICENSE_PLATE,k.END].includes(g?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const S=[k.OCR,k.LICENSE_PLATE,k.FACE_RECOGNITION];return S.includes(i?.type)&&!S.filter(j=>j!==i.type).concat(k.END).includes(g?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:g?.type!==k.END&&o.edges.filter(j=>j.target===g?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},T=e.markRaw({start:Rt,end:qt,dataSource:Jt,smallModel:eo,detectionTarget:lo,classificationModel:uo,ocr:_o,licensePlate:Eo,targetCount:Vo,timerTarget:Oo,group:Io,faceRecognition:Ho}),d=e.computed({get:()=>o.nodes,set:i=>{o.nodes=i}}),c=e.computed({get:()=>o.edges,set:i=>{o.edges=i}}),s=i=>{i.forEach(g=>{if(g.type==="position"&&g.position)o.updateNodePosition(g.id,g.position);else if(g.type==="remove"){if(V.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const S=o.nodes.find(j=>j.id===g.id);if(S&&S.type===k.START){Z.ElMessage.warning("开始节点不可删除");return}if(S&&S.type===k.END){Z.ElMessage.warning("结束节点不可删除");return}if(S&&S.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const $=S?.parentNode;o.removeNode(g.id),$&&o.nodes.filter(J=>J.parentNode===$).length===0&&o.dissolveParallelGroup($)}})},C=i=>{i.forEach(g=>{if(g.type==="remove"){if(V.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(g.id)}})},h=i=>{if(R)return;if(V.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),b();return}const g=o.nodes.find(j=>j.id===i.source),S=o.nodes.find(j=>j.id===i.target),$=A(g,S);if(!$.valid){Z.ElMessage.warning($.message),b();return}if(g?.type===k.DATA_SOURCE&&g.data.enableImageSequence&&i.sourceHandle&&o.edges.filter(J=>J.source===i.source&&J.sourceHandle===i.sourceHandle).length>=1){const J=i.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";Z.ElMessage.warning(`${J}连接点只能连接一个节点`);return}if(D.includes(g?.type)&&!g.data.enableBranch&&o.edges.filter(J=>J.source===i.source).length>=1){Z.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(i),U(),b()},B=i=>({and:"ALL",or:"SOME"})[i]||"ALL",M=i=>{const g=o.nodes.find(S=>S.id===i.source);if(!g)return"";if(g.type===k.START){const S=g.data.branchLogic||"and",$=B(S),j=i.data?.branchOrder;return j!=null?`${$} - 执行顺序 ${j}`:$}if(g.type===k.DATA_SOURCE){if(g.data?.enableImageSequence){const J=i.sourceHandle==="first-frame"?"首帧":"后续帧",Q=i.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const S=g.data.branchLogic||"and",$=B(S),j=i.data?.branchOrder;return j!=null?`${$} - 执行顺序 ${j}`:$}return""},U=()=>{o.edges.forEach(i=>{const g=M(i);i.label!==g&&(i.label=g,i.labelStyle=g?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,i.labelBgStyle=g?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,i.labelBgPadding=g?[4,6]:void 0)})},G=()=>{o.nodes.forEach(i=>{if(i.type!=="group")return;const g=i.data.sourceNodeId;if(!g)return;const S=o.nodes.find($=>$.id===g);S?.data?.enableBranch&&S.data.branchLogic!==i.data.branchLogic&&o.updateNodeData(i.id,{branchLogic:S.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(i=>D.includes(i.type)).map(i=>({id:i.id,enableBranch:i.data.enableBranch,branchLogic:i.data.branchLogic})),(i,g)=>{g&&i.forEach(S=>{const $=g.find(j=>j.id===S.id);if($){if(S.enableBranch&&!$.enableBranch){const j=o.nodes.find(J=>J.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&&$.enableBranch){const j=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===S.id);j&&o.dissolveParallelGroup(j.id)}if(S.enableBranch&&$.branchLogic!==S.branchLogic){const j=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===S.id);j&&o.updateNodeData(j.id,{branchLogic:S.branchLogic})}}})}),e.watch(()=>o.nodes.filter(i=>i.type!=="group").map(i=>({id:i.id,enableBranch:i.data.enableBranch,branchLogic:i.data.branchLogic,branchOrder:i.data.branchOrder})),()=>{U(),G()},{deep:!0}),e.watch(()=>o.edges.map(i=>({id:i.id,branchOrder:i.data?.branchOrder})),(i,g)=>{U(),g&&i.forEach(S=>{const $=g.find(j=>j.id===S.id);if($&&$.branchOrder!==S.branchOrder&&S.branchOrder!==void 0){const j=o.edges.find(J=>J.id===S.id);if(j){const J=o.nodes.find(Q=>Q.id===j.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],([i,g])=>{o.nodes.forEach(S=>{i.has(S.id)?S.class="invalid-node":S.class==="invalid-node"&&(S.class="")}),o.edges.forEach(S=>{g.has(S.id)?S.class="invalid-edge":S.class==="invalid-edge"&&(S.class="")})},{deep:!0});const H=i=>{i.event?.target?.closest(".vue-flow__handle")||o.selectNode(i.node.id)},z=i=>{o.selectEdge(i.edge.id)},Y=i=>{if(V.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(i.edge.id)},f=()=>{o.clearSelection()},O=({node:i})=>{if(i.type==="group"||!D.includes(i.type))return;const g=o.nodes.filter($=>$.type==="group");let S=null;for(const $ of g){const j=u($.id);if(!j)continue;const J=j.dimensions?.width||parseInt($.style?.width)||300,Q=j.dimensions?.height||parseInt($.style?.height)||160;let te=i.position.x,se=i.position.y;if(i.parentNode){const ge=o.nodes.find(Ce=>Ce.id===i.parentNode);ge&&(te+=ge.position.x,se+=ge.position.y)}const ce=u(i.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){S=$.id;break}}S?i.parentNode!==S&&o.addNodeToGroup(i.id,S):i.parentNode&&o.removeNodeFromGroup(i.id)},P=i=>{i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="move")},W=i=>{i.preventDefault();const g=i.dataTransfer?.getData("application/vueflow");if(!g)return;if(V.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(g===k.START&&o.getNodeCountByType(k.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(g===k.END&&o.getNodeCountByType(k.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const S=160,$=60,j=t({x:i.clientX,y:i.clientY}),J={x:j.x-S/2,y:j.y-$/2};let Q;switch(g){case k.START:Q=Se(J);break;case k.END:Q=ke(J);break;case k.DATA_SOURCE:Q=be(J);break;case k.SMALL_MODEL:Q=Ve(J);break;case k.DETECTION_TARGET:Q=Be(J);break;case k.CLASSIFICATION_MODEL:Q=Ae(J);break;case k.OCR:{const te=N?.value??N;Q=p(De(J),te?.ocr?.[0]?.inputSchema);break}case k.LICENSE_PLATE:{const te=N?.value??N;Q=p(Le(J),te?.license_plate?.[0]?.inputSchema);break}case k.TARGET_COUNT:Q=Oe(J);break;case k.TIMER_TARGET:Q=Me(J);break;case k.FACE_RECOGNITION:{const te=N?.value??N;Q=p(Ie(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(i,g)=>(e.openBlock(),e.createElementBlock("div",Yo,[e.createVNode(e.unref(v.VueFlow),{nodes:d.value,"onUpdate:nodes":g[0]||(g[0]=S=>d.value=S),edges:c.value,"onUpdate:edges":g[1]||(g[1]=S=>c.value=S),"node-types":e.unref(T),onNodesChange:s,onEdgesChange:C,onConnect:h,onNodeClick:H,onEdgeClick:z,onEdgeDoubleClick:Y,onPaneClick:f,onDrop:W,onDragover:P,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(Ze.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(ve.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Jo,{visible:x.visible,position:x.screenPos,"source-node-type":x.sourceNodeType,onSelect:q,onClose:b},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-8f161693"]]),Qo={class:"config-header"},Ko={key:0,class:"config-section"},Zo={key:1,class:"config-section"},vo=oe({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),u=e.computed(()=>t===ee.TASK),y=e.computed(()=>{const L=o.selectedEdge;return L&&o.nodes.find(x=>x.id===L.source)?.data?.enableBranch?L:null}),l=e.computed(()=>y.value&&o.nodes.find(p=>p.id===y.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),N=e.computed(()=>{if(!y.value)return!1;const L=o.nodes.find(p=>p.id===y.value.source);return(L?.type==="dataSource"||L?.type==="start")&&L?.data?.enableBranch}),E=e.computed(()=>{if(!y.value)return 1;const L=o.nodes.find(p=>p.id===y.value.source);return L?o.edges.filter(p=>p.source===L.id).length:1}),V=e.computed(()=>{if(!y.value)return!1;const L=o.nodes.find(p=>p.id===y.value.source);return L?L.type==="dataSource"&&L.data?.enableImageSequence===!0&&y.value.sourceHandle!=="first-frame":!1}),F=L=>{y.value&&o.updateEdgeData(y.value.id,L)};return(L,p)=>{const x=e.resolveComponent("el-divider"),b=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-text"),_=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form"),w=e.resolveComponent("el-option"),R=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Qo,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(x),V.value?(e.openBlock(),e.createElementBlock("div",Ko,[p[3]||(p[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(b,{"model-value":y.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(r,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),N.value?(e.openBlock(),e.createElementBlock("div",Zo,[p[5]||(p[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":y.value?.data?.branchOrder??null,disabled:u.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(E.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(r,{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"]]),en={class:"config-section"},tn=oe({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const u=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(u),e.createElementVNode("div",en,[e.createVNode(y,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),on={class:"time-init-container"},nn={key:0,class:"time-header flex-x-start"},an={class:"tab-type flex-x"},ln={class:"time-content"},rn={id:"time-content-table-body"},sn=["onClick"],cn=["onClick"],dn=["data-sort","data-value","data-day","data-type","onMousedown"],mn={key:1},pn=["data-sort","data-value","data-type","onMousedown"],un={class:"time-list"},fn={key:0,class:"time-list-title"},gn={key:1,style:{"margin-right":"10px"}},hn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,u=e.ref(0);let y,l,N,E,V;const F=e.ref(new Map),L=e.ref(new Map),p=e.computed(()=>u.value===0?F.value:L.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 x=h=>{u.value!==h&&(u.value=h,e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),l.forEach(M=>M.classList.remove("selected")),(h===0?F.value:L.value).forEach((M,U)=>{M.origin.forEach(G=>{Array.from(l).forEach(H=>{Number(H.dataset.sort)==G.sort&&Number(H.dataset.value)==G.value&&Number(H.dataset.day)==U&&H.classList.add("selected")})})})}))},b=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}]),r=(h,B,M)=>{t.operationType!=3&&M.which==1&&(E=h,N=Number(M.target.dataset.value),M.target.classList.contains("selected")?(M.target.classList.remove("selected"),V=""):(V="selected",M.target.classList.add("selected")),_(),D())},_=()=>{l.forEach(h=>{h.addEventListener("mouseover",w,!1,{once:!0})})},n=()=>{l.forEach(h=>{h.removeEventListener("mouseover",w)})},w=h=>{h.target.classList.remove("selected"),V&&h.target.classList.add(V);let B=Number(h.target.dataset.value),M=Number(h.target.dataset.day),U=M>E?M:E,G=M<E?M:E,H=B>N?B:N,z=B<N?B:N;for(let Y=G;Y<=U;Y++)for(let f=z;f<=H;f++){let O=document.querySelector(`td[data-value="${f}"][data-day="${Y}"]`);O.classList.remove("selected"),V&&O.classList.add(V)}D()},R=h=>{if(t.operationType==3)return;let B=[];l.forEach(M=>{Number(M.dataset.day)==h&&B.push(M)}),B.find(M=>!M.classList.contains("selected"))?B.forEach(M=>M.classList.add("selected")):B.forEach(M=>M.classList.remove("selected")),D()},m=h=>{if(t.operationType==3)return;let B=[];l.forEach(M=>{Number(M.dataset.sort)==h&&B.push(M)}),B.find(M=>!M.classList.contains("selected"))?B.forEach(M=>M.classList.add("selected")):B.forEach(M=>M.classList.remove("selected")),D()},q=()=>{l.forEach(B=>{B.classList.remove("selected")}),(u.value===0?F:L).value.clear()},D=()=>{const h=u.value===0?F:L;h.value.clear(),l.forEach(B=>{if(B.classList.contains("selected")){let M=B.dataset.day,U=B.dataset.sort,G=B.dataset.value;h.value.get(M)?h.value.get(M).origin.push({sort:Number(U),value:Number(G)}):h.value.set(M,{origin:[{sort:Number(U),value:Number(G)}],timeList:[]})}})},A=h=>{let U=p.value.get(h).origin.map(G=>G.value).reduce((G,H,z,Y)=>(z==0?G.push([H]):H==Y[z-1]+1?G[G.length-1].push(H):G.push([H]),G),[]);return U=U.map(G=>{let H=Math.max(...G)+1,z=Math.min(...G)+1,Y=z%2==0?30:0,f=H%2==0?0:30,O=T(Math.ceil(z/2)-1),P=T(Math.ceil(H/2)-(f==0?0:1));return{dayType:h,startTime:O+":"+(Y==0?"00":Y),endTime:P+":"+(f==0?"00":f)}}),p.value.get(h).timeList=U,U.map(G=>G.startTime+"-"+G.endTime).join()};function T(h){return h<10?"0"+h:h}const d=(h,B)=>{F.value.clear(),L.value.clear(),l.forEach(H=>H.classList.remove("selected")),u.value=B;const M=B===0?F:L,U=JSON.parse(h);let G=[];U.plan.forEach(H=>{H.timePeriod.forEach(z=>{G.push({...z,dayType:H.dayType})})}),e.nextTick(()=>{l=y.querySelectorAll("td.sel-able[data-type]"),G.forEach(H=>{M.value.get(H.dayType)?M.value.get(H.dayType).timeList.push(H):M.value.set(H.dayType,{origin:[],timeList:[{...H}]})}),M.value.forEach((H,z)=>{H.timeList.forEach(Y=>{let f=Number(Y.startTime.split(":")[1]),O=Number(Y.endTime.split(":")[1]),P=Number(Y.startTime.split(":")[0]),W=Number(Y.endTime.split(":")[0]);if(P==W){H.origin.push({sort:P,value:2*P});return}for(let i=P;i<=W;i++)if(i==P)f==0?(H.origin.push({sort:i,value:2*i}),H.origin.push({sort:i,value:2*i+1})):H.origin.push({sort:i,value:2*i+1});else if(i>P&&i<W)H.origin.push({sort:i,value:2*i}),H.origin.push({sort:i,value:2*i+1});else if(O==0){if(i==W)return;H.origin.push({sort:i,value:2*i}),H.origin.push({sort:i,value:2*i+1})}else H.origin.push({sort:i,value:2*i})}),H.origin.forEach(Y=>{Array.from(l).find(f=>{Number(f.dataset.sort)==Y.sort&&Number(f.dataset.value)==Y.value&&Number(f.dataset.day)==z&&f.classList.add("selected")})})})})},c=(h,B)=>h.map(G=>G.value).sort((G,H)=>G-H).reduce((G,H,z,Y)=>(z==0?G.push([H]):H==Y[z-1]+1?G[G.length-1].push(H):G.push([H]),G),[]).map(G=>{let H=Math.max(...G)+1,z=Math.min(...G)+1,Y=z%2==0?30:0,f=H%2==0?0:30,O=T(Math.ceil(z/2)-1),P=T(Math.ceil(H/2)-(f==0?0:1));return{dayType:B,startTime:O+":"+(Y==0?"00":Y),endTime:P+":"+(f==0?"00":f)}});return o({getTimeData:()=>{(u.value===0?L:F).value.clear();let B=[];p.value.forEach((G,H)=>{const z=c(G.origin,H);B=B.concat(z)});let M={plan:[]},U=B.map(G=>G.dayType).filter((G,H,z)=>z.indexOf(G)===H);return U.length?(U.forEach(G=>{M.plan.push({dayType:G,timePeriod:B.filter(H=>H.dayType===G).map(H=>({startTime:H.startTime,endTime:H.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(M),planType:u.value}):{validTime:!1}},revertByTime:d,resetFn:()=>{u.value=0,F.value.clear(),L.value.clear(),e.nextTick(()=>{l.forEach(h=>{h.classList.remove("selected")}),l=y.querySelectorAll("td.sel-able[data-type]")})}}),(h,B)=>{const M=e.resolveComponent("el-icon"),U=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",on,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",nn,[e.createElementVNode("div",an,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:u.value==0}]),onClick:B[0]||(B[0]=G=>x(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:u.value==1}]),onClick:B[1]||(B[1]=G=>x(1))}," 日计划 ",2)]),e.createVNode(U,{class:"rm-icon",link:"",type:"danger",onClick:q},{default:e.withCtx(()=>[e.createVNode(M,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",ln,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:B[3]||(B[3]=G=>G.preventDefault())},[B[5]||(B[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",rn,[e.createElementVNode("tr",null,[B[4]||(B[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,G=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:H=>m(G-1)},e.toDisplayString(G-1),9,sn)),64))]),u.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(b.value.filter(G=>G.value!=0),G=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:H=>R(G.value)},e.toDisplayString(G.name),9,cn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,H=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((H-1)/2),"data-value":H-1,"data-day":G.value,"data-type":u.value,onMousedown:z=>r(G.value,H,z)},null,40,dn)),64))]))),256)):e.createCommentVNode("",!0),u.value==1?(e.openBlock(),e.createElementBlock("tr",mn,[e.createElementVNode("th",{onClick:B[2]||(B[2]=G=>R(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,G=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((G-1)/2),"data-value":G-1,"data-day":0,"data-type":u.value,onMousedown:H=>r(0,G,H)},null,40,pn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",un,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value.keys(),G=>(e.openBlock(),e.createElementBlock("div",null,[u.value==0?(e.openBlock(),e.createElementBlock("span",fn,[B[6]||(B[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(b.value.find(H=>H.value==G).name),1)])):(e.openBlock(),e.createElementBlock("span",gn,e.toDisplayString(b.value.find(H=>H.value==G).name),1)),e.createTextVNode(" ("+e.toDisplayString(A(G))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),yn={class:"time-template-dialog"},_n={class:"time-editor-panel"},Nn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const u=a,y=t,l=e.ref(null),N=e.ref(""),E=e.ref(""),V=e.ref(u.modelValue?.timeTemplateName||""),F=e.ref([]);return e.computed(()=>N.value?F.value.filter(x=>x.name.toLowerCase().includes(N.value.toLowerCase())):F.value),e.watch(V,x=>{y("update:modelValue",{...u.modelValue,timeTemplateName:x})}),o({getFormData:()=>{const x=l.value?.getTimeData();return{timeTemplateId:E.value,timeTemplateName:V.value,...x}},revertByTime:(x,b)=>{l.value?.revertByTime(x,b)}}),(x,b)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",yn,[e.createCommentVNode("",!0),e.createElementVNode("div",_n,[e.createCommentVNode("",!0),e.createVNode(hn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),Cn={class:"config-section"},kn={key:0,class:"config-section"},bn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},xn={class:"config-section"},En=oe({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("echoAlgodata",null),N=e.computed(()=>{const r=(l?.value??l)?.ruleSchema?.sourceGroups??[];if(r.some(w=>w.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const _=r.length>1,n=r.some(w=>(w.children??[]).length>1);return _||n?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(N,b=>{b.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:b.value})},{immediate:!0});const E=e.ref(!1),V=e.ref(null),F=()=>{const b=V.value?.getFormData();if(b?.validTime){const _=(JSON.parse(b.timeZone)?.plan??[]).map(n=>({dayType:String(n.dayType),timePeriod:n.timePeriod.map(w=>({startTime:w.startTime,endTime:w.endTime}))}));o.updateNodeData(t.value.id,{executionTime:b.timeZone,schedule:_,timeZone:b.timeZone,planType:b.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});E.value=!1},L=()=>{const b=t.value?.data;b?.timeZone&&V.value?.revertByTime(b.timeZone,b.planType??0)},p=e.computed(()=>t.value?o.edges.filter(r=>r.source===t.value.id).length>=2:!1),x=b=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:b})};return(b,r)=>{const _=e.resolveComponent("el-divider"),n=e.resolveComponent("el-input"),w=e.resolveComponent("el-form-item"),R=e.resolveComponent("el-form"),m=e.resolveComponent("el-option"),q=e.resolveComponent("el-select"),D=e.resolveComponent("el-switch"),A=e.resolveComponent("el-button"),T=e.resolveComponent("el-dialog"),d=e.resolveComponent("el-icon"),c=e.resolveComponent("el-tooltip"),s=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[r[15]||(r[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(_),e.createElementVNode("div",Cn,[r[9]||(r[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(n,{"model-value":t.value?.data.algorithmName,disabled:y.value,onInput:r[0]||(r[0]=C=>x(C)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),y.value?(e.openBlock(),e.createElementBlock("div",kn,[r[10]||(r[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(n,{"model-value":t.value?.data.taskName,onInput:r[1]||(r[1]=C=>e.unref(o).updateNodeData(t.value.id,{taskName:C})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(w,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":N.value.locked?N.value.value:t.value?.data.streamType||"image",disabled:N.value.locked,onChange:r[2]||(r[2]=C=>e.unref(o).updateNodeData(t.value.id,{streamType:C})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"图片流",value:"image"}),e.createVNode(m,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),N.value.locked?(e.openBlock(),e.createElementBlock("div",bn,e.toDisplayString(N.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(w,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(D,{"model-value":t.value?.data.enableAlertVideo,onChange:r[3]||(r[3]=C=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:C}))},null,8,["model-value"])]),_:1}),e.createVNode(w,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(n,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:r[4]||(r[4]=C=>E.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(T,{modelValue:E.value,"onUpdate:modelValue":r[6]||(r[6]=C=>E.value=C),title:"执行时段",width:"1200px","append-to-body":"",onOpened:L},{footer:e.withCtx(()=>[e.createVNode(A,{onClick:r[5]||(r[5]=C=>E.value=!1)},{default:e.withCtx(()=>[...r[11]||(r[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(A,{type:"primary",onClick:F},{default:e.withCtx(()=>[...r[12]||(r[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(Nn,{ref_key:"timeTemplateRef",ref:V},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",xn,[r[14]||(r[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(q,{"model-value":t.value?.data.branchLogic||"and",disabled:y.value,onChange:r[7]||(r[7]=C=>e.unref(o).updateNodeData(t.value.id,{branchLogic:C})),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(()=>[r[13]||(r[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(c,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(d,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:r[8]||(r[8]=C=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:C})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-0820dc2c"]]),wn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Tn=["smallModel","detectionTarget"],Ee=()=>({schemaLoading:e.ref(!1),getToolType:l=>wn[l]||null,needsToolSelection:l=>Tn.includes(l),fetchToolSchema:async(l,N="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(l,N="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Sn={key:0,class:"config-section"},Vn={key:3,class:"array-input"},Bn={key:1,class:"config-section"},An=oe({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:u,fetchSchemaForNodeType:y}=Ee(),l=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const x=p.required||[];return Object.entries(p.properties).map(([b,r])=>({key:b,type:r.type,label:r.title||r.label||r.description||b,description:r.description||"",default:r.default,required:x.includes(b)||r.required||!1,min:r.minimum!==void 0?r.minimum:r.min,max:r.maximum!==void 0?r.maximum:r.max,step:r.step,maxLength:r.maxLength,options:r.enum,optionLabels:r.enumLabels||r.enum,dependsOn:r.dependsOn}))}),N=p=>{if(t.value)return t.value.data.arguments?.[p]},E=(p,x)=>{if(!t.value)return;const r={...t.value.data.arguments||{},[p]:x};o.updateNodeData(t.value.id,{arguments:r})},V=p=>{if(!p.dependsOn||!t.value)return!0;const{field:x,value:b}=p.dependsOn,r=N(x);if(typeof b=="string"&&b.startsWith("!")){const _=b.substring(1);return r!==_}return Array.isArray(b)?b.includes(r):r===b},F=p=>{const x=N(p);return Array.isArray(x)?JSON.stringify(x):""},L=(p,x)=>{try{const b=JSON.parse(x);Array.isArray(b)&&E(p,b)}catch{}};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const x=t.value.type,b=t.value.data,r=b.input_schema||b.inputSchema;if(r&&r.properties&&Object.keys(r.properties).length>0)return;const _=await y(x);if(!_)return;const n=t.value?.data;n&&o.updateNodeData(t.value.id,{...n,input_schema:_.inputSchema,extraConfig:_.extraConfig,arguments:{..._.arguments,...n.arguments}})},{immediate:!0}),(p,x)=>{const b=e.resolveComponent("el-divider"),r=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tooltip"),n=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),R=e.resolveComponent("el-switch"),m=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-input"),D=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[x[2]||(x[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(b),l.value.length>0?(e.openBlock(),e.createElementBlock("div",Sn,[x[0]||(x[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,T=>e.withDirectives((e.openBlock(),e.createBlock(D,{key:T.key,required:T.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(T.label),1),T.description?(e.openBlock(),e.createBlock(_,{key:0,content:T.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(()=>[T.options&&T.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":N(T.key),onChange:d=>E(T.key,d),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.options,(d,c)=>(e.openBlock(),e.createBlock(n,{key:d,label:T.optionLabels?T.optionLabels[c]:d,value:d},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):T.type==="boolean"?(e.openBlock(),e.createBlock(R,{key:1,"model-value":N(T.key),onChange:d=>E(T.key,d)},null,8,["model-value","onChange"])):T.type==="number"||T.type==="integer"?(e.openBlock(),e.createBlock(m,{key:2,"model-value":N(T.key),onChange:d=>E(T.key,d),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",Vn,[e.createVNode(q,{"model-value":F(T.key),onChange:d=>L(T.key,d),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":N(T.key),onChange:d=>E(T.key,d),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.options,(d,c)=>(e.openBlock(),e.createBlock(n,{key:d,label:T.optionLabels?T.optionLabels[c]:d,value:d},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(q,{key:5,"model-value":N(T.key),onInput:d=>E(T.key,d),maxlength:T.maxLength,"show-word-limit":!!T.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!T.dependsOn||V(T)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(u)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",Bn,[...x[1]||(x[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),Dn={class:"config-header"},Ln={class:"config-section"},On={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Mn={key:0,class:"config-section"},In={key:3,class:"array-input"},Rn={key:1,class:"config-section"},$n={key:2,class:"config-section"},Fn=oe({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("editorConfig",null),N=e.computed(()=>(l?.value??l)?.classification?.models??[]),E=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),V=e.ref([]),F=e.ref(!1),L=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:D=>{t.value&&D&&n("modelId",D)}}),p=()=>{V.value=N.value},x=async D=>{if(!t.value||!D)return;const A=V.value.find(s=>s.id===D);if(!A)return;const T=t.value?.data;if(!T)return;const d=A.inputSchema||A.input_schema||E.value?.inputSchema||{},c={};d.properties&&Object.entries(d.properties).forEach(([s,C])=>{C.default!==void 0&&(c[s]=C.default)}),o.updateNodeData(t.value.id,{...T,input_schema:d,extraConfig:A.extraConfig||null,arguments:{...c,modelId:A.id,modelName:A.name}})},b=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},r=e.computed(()=>{if(!t.value)return[];const D=t.value.data.input_schema||t.value.data.inputSchema;if(!D||!D.properties)return[];const A=D.required||[];return Object.entries(D.properties).map(([T,d])=>({key:T,type:d.type,label:d.title||d.label||d.description||T,description:d.description||"",default:d.default,required:A.includes(T)||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,hidden:d["x-hidden"]||!1})).filter(T=>!T.hidden).sort((T,d)=>(T.sort??1/0)-(d.sort??1/0))}),_=D=>{if(t.value)return t.value.data.arguments?.[D]},n=(D,A)=>{if(!t.value)return;const d={...t.value.data.arguments||{},[D]:A};o.updateNodeData(t.value.id,{arguments:d})},w=D=>{if(!D.dependsOn||!t.value)return!0;const{field:A,value:T}=D.dependsOn,d=_(A);if(typeof T=="string"&&T.startsWith("!")){const c=T.substring(1);return d!==c}return Array.isArray(T)?T.includes(d):d===T},R=D=>{const A=_(D);return Array.isArray(A)?JSON.stringify(A):""},m=(D,A)=>{try{const T=JSON.parse(A);Array.isArray(T)&&n(D,T)}catch{}},q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async D=>{if(!D||!t.value)return;V.value.length===0&&p();const A=t.value.data,T=A.input_schema||A.inputSchema,d=A.arguments?.modelId;if(d&&T&&T.properties&&Object.keys(T.properties).length>0||!d)return;const c=V.value.find(B=>B.id===d);if(!c)return;const s=c.inputSchema||c.input_schema||E.value?.inputSchema||{},C={};s.properties&&Object.entries(s.properties).forEach(([B,M])=>{M.default!==void 0&&(C[B]=M.default)});const h=t.value?.data;h&&o.updateNodeData(t.value.id,{...h,input_schema:s,extraConfig:c.extraConfig||null,arguments:{...C,...h.arguments}})},{immediate:!0}),(D,A)=>{const T=e.resolveComponent("el-button"),d=e.resolveComponent("el-divider"),c=e.resolveComponent("el-option"),s=e.resolveComponent("el-select"),C=e.resolveComponent("el-form-item"),h=e.resolveComponent("el-form"),B=e.resolveComponent("el-icon"),M=e.resolveComponent("el-tooltip"),U=e.resolveComponent("el-switch"),G=e.resolveComponent("el-input-number"),H=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Dn,[A[1]||(A[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(d),e.createElementVNode("div",Ln,[A[2]||(A[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(h,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(C,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(s,{modelValue:L.value,"onUpdate:modelValue":A[0]||(A[0]=z=>L.value=z),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:F.value,disabled:y.value,onChange:x,onClear:b},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,z=>(e.openBlock(),e.createBlock(c,{key:z.id,label:z.name,value:z.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),V.value.length===0&&!F.value?(e.openBlock(),e.createElementBlock("div",On," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),L.value&&r.value.length>0?(e.openBlock(),e.createElementBlock("div",Mn,[A[3]||(A[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(h,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,z=>e.withDirectives((e.openBlock(),e.createBlock(C,{key:z.key,required:z.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(z.label),1),z.description?(e.openBlock(),e.createBlock(M,{key:0,content:z.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{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(s,{key:0,"model-value":_(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,f)=>(e.openBlock(),e.createBlock(c,{key:Y,label:z.optionLabels?z.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):z.type==="boolean"?(e.openBlock(),e.createBlock(U,{key:1,"model-value":_(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(G,{key:2,"model-value":_(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",In,[e.createVNode(H,{"model-value":R(z.key),disabled:y.value&&z.key!=="threshold",onChange:Y=>m(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(s,{key:4,"model-value":_(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,f)=>(e.openBlock(),e.createBlock(c,{key:Y,label:z.optionLabels?z.optionLabels[f]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(H,{key:5,"model-value":_(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||w(z)]])),128))]),_:1})])):e.createCommentVNode("",!0),L.value&&F.value&&r.value.length===0?(e.openBlock(),e.createElementBlock("div",Rn,[...A[4]||(A[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!L.value&&!F.value?(e.openBlock(),e.createElementBlock("div",$n,[...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"]]),qn={class:"config-header"},Gn={class:"config-section"},Hn=oe({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("editorConfig",null),N=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),V=(L,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[L]:p}})},F=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,L=>{if(!L||!t.value)return;const p=N.value,x=t.value.data.arguments||{},b={};p?.properties&&Object.entries(p.properties).forEach(([r,_])=>{_.default!==void 0&&(b[r]=_.default)}),o.updateNodeData(t.value.id,{arguments:{...b,...x}})},{immediate:!0}),(L,p)=>{const x=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),_=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",qn,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(b),e.createElementVNode("div",Gn,[p[2]||(p[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":E.value,onChange:p[0]||(p[0]=w=>V("threshold",w)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Pn={class:"config-header"},jn={class:"config-section"},zn=oe({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("editorConfig",null),N=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),V=(L,p)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[L]:p}})},F=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,L=>{if(!L||!t.value)return;const p=N.value,x=t.value.data.arguments||{},b={};p?.properties&&Object.entries(p.properties).forEach(([r,_])=>{_.default!==void 0&&(b[r]=_.default)}),o.updateNodeData(t.value.id,{arguments:{...b,...x}})},{immediate:!0}),(L,p)=>{const x=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),_=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Pn,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(b),e.createElementVNode("div",jn,[p[2]||(p[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":E.value,onChange:p[0]||(p[0]=w=>V("threshold",w)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn={key:0,class:"config-section"},Je=oe({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("editorConfig",null),N=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),E=e.ref(null),V=e.computed(()=>({repositoryId:x.value})),F={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},L=e.computed(()=>t.value?.data.arguments?.threshold??.5),p=_=>t.value?.data.arguments?.[_],x=e.computed(()=>{const _=p("repositoryId");return _?Array.isArray(_)?_:[_]:[]}),b=(_,n)=>{if(!t.value)return;const w=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...w,[_]:n}})},r=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,_=>{if(!_||!t.value)return;const w=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,R=t.value.data.arguments||{},m={};w?.properties&&Object.entries(w.properties).forEach(([q,D])=>{D.default!==void 0&&(m[q]=D.default)}),o.updateNodeData(t.value.id,{arguments:{...m,...R}})},{immediate:!0}),(_,n)=>{const w=e.resolveComponent("el-button"),R=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-form-item"),D=e.resolveComponent("el-form"),A=e.resolveComponent("el-option"),T=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[n[2]||(n[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(w,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(R),e.createElementVNode("div",Wn,[n[3]||(n[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":L.value,onChange:n[0]||(n[0]=d=>b("threshold",d)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(u)==="task"?(e.openBlock(),e.createElementBlock("div",Jn,[n[4]||(n[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(D,{model:V.value,rules:F,ref_key:"faceFormRef",ref:E,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(T,{"model-value":x.value,onChange:n[1]||(n[1]=d=>b("repositoryId",d)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,d=>(e.openBlock(),e.createBlock(A,{key:d.id,label:d.name,value:d.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Yn={class:"config-header"},Xn={key:0,class:"config-section"},Qn={key:3,class:"array-input"},Kn={key:1,class:"config-section"},Zn=oe({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),{schemaLoading:l,fetchSchemaForNodeType:N}=Ee(),E=e.computed(()=>{if(!t.value)return[];const r=t.value.data.input_schema||t.value.data.inputSchema;if(!r||!r.properties)return[];const _=r.required||[];return Object.entries(r.properties).map(([n,w])=>({key:n,type:w.type,label:w.title||w.label||w.description||n,description:w.description||"",default:w.default,required:_.includes(n)||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((n,w)=>(n.sort??1/0)-(w.sort??1/0))}),V=r=>{if(t.value)return t.value.data.arguments?.[r]},F=(r,_)=>{if(!t.value)return;const w={...t.value.data.arguments||{},[r]:_};o.updateNodeData(t.value.id,{arguments:w})},L=r=>{if(!r.dependsOn||!t.value)return!0;const{field:_,value:n}=r.dependsOn,w=V(_);if(typeof n=="string"&&n.startsWith("!")){const R=n.substring(1);return w!==R}return Array.isArray(n)?n.includes(w):w===n},p=r=>{const _=V(r);return Array.isArray(_)?JSON.stringify(_):""},x=(r,_)=>{try{const n=JSON.parse(_);Array.isArray(n)&&F(r,n)}catch{}},b=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async r=>{if(!r||!t.value)return;const _=t.value.type,n=t.value.data,w=n.input_schema||n.inputSchema;if(w&&w.properties&&Object.keys(w.properties).length>0)return;const R=await N(_);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}),(r,_)=>{const n=e.resolveComponent("el-button"),w=e.resolveComponent("el-divider"),R=e.resolveComponent("el-icon"),m=e.resolveComponent("el-tooltip"),q=e.resolveComponent("el-option"),D=e.resolveComponent("el-select"),A=e.resolveComponent("el-switch"),T=e.resolveComponent("el-input-number"),d=e.resolveComponent("el-input"),c=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yn,[_[0]||(_[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:b},null,8,["icon"]))]),e.createVNode(w),E.value.length>0?(e.openBlock(),e.createElementBlock("div",Xn,[_[1]||(_[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.value,C=>e.withDirectives((e.openBlock(),e.createBlock(c,{key:C.key,required:C.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(C.label),1),C.description?(e.openBlock(),e.createBlock(m,{key:0,content:C.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(()=>[C.options&&C.type==="string"?(e.openBlock(),e.createBlock(D,{key:0,"model-value":V(C.key),onChange:h=>F(C.key,h),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.options,(h,B)=>(e.openBlock(),e.createBlock(q,{key:h,label:C.optionLabels?C.optionLabels[B]:h,value:h},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):C.type==="boolean"?(e.openBlock(),e.createBlock(A,{key:1,"model-value":V(C.key),onChange:h=>F(C.key,h)},null,8,["model-value","onChange"])):C.type==="number"||C.type==="integer"?(e.openBlock(),e.createBlock(T,{key:2,"model-value":V(C.key),onChange:h=>F(C.key,h),min:C.min,max:C.max,step:C.step||(C.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):C.type==="array"&&!C.options?(e.openBlock(),e.createElementBlock("div",Qn,[e.createVNode(d,{"model-value":p(C.key),onChange:h=>x(C.key,h),type:"textarea",rows:3,placeholder:C.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):C.type==="array"&&C.options?(e.openBlock(),e.createBlock(D,{key:4,"model-value":V(C.key),onChange:h=>F(C.key,h),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.options,(h,B)=>(e.openBlock(),e.createBlock(q,{key:h,label:C.optionLabels?C.optionLabels[B]:h,value:h},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(d,{key:5,"model-value":V(C.key),onInput:h=>F(C.key,h),maxlength:C.maxLength,"show-word-limit":!!C.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!C.dependsOn||L(C)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&E.value.length===0?(e.openBlock(),e.createElementBlock("div",Kn,[..._[2]||(_[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),vn={class:"config-header"},ea={class:"config-section"},ta={key:0,class:"config-section"},oa={key:1,class:"config-section"},na={key:0,class:"el-form-item__error"},aa={key:2,class:"config-section"},la={key:3,class:"config-section"},ra={key:4,class:"config-section"},sa=oe({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.inject("taskModeConfig",null),l=e.computed(()=>u==="task"),N=e.computed(()=>n("deviceType")??"camera"),E=e.computed(()=>{const c=o.nodes.find(C=>C.type===k.START);return c?.data?.streamType?c.data.streamType:(y?.value??y)?.streamType??"image"}),V=e.computed(()=>{const c=y?.value??y,s=t.value?.id;return c?.datasource?.getDevices?.(s)?.length??0}),F=()=>{const c=y?.value??y,s=t.value?.id,C=t.value?.data?.label??"",h=c?.datasource?.getDevices?.(s)??[],B=o.nodes.filter(U=>U.type===k.DATA_SOURCE).findIndex(U=>U.id===s),M=t.value?.data?.sourceGroupId??c?.datasource?.getSourceGroupIdByIndex?.(B)??s;c?.datasource?.onDeviceClick?.(s,C,M,h,N.value)},{fetchSchemaForNodeType:L}=Ee(),p=e.computed(()=>o.nodes.some(c=>c.type===k.SMALL_MODEL)),x=e.computed(()=>o.getDataSourceCount()>=2),b=e.computed(()=>!o.supportPatrol()),r=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),_=e.computed(()=>{if(!t.value)return[];const c=t.value.data.input_schema||t.value.data.inputSchema;if(!c||!c.properties)return[];const s=c.required||[];return Object.entries(c.properties).map(([C,h])=>({key:C,type:h.type,label:h.title||h.label||h.description||C,description:h.description||"",default:h.default,required:s.includes(C)||h.required||!1,min:h.minimum!==void 0?h.minimum:h.min,max:h.maximum!==void 0?h.maximum:h.max,step:h.step,maxLength:h.maxLength,options:h.enum,optionLabels:h.enumLabels||h.enum,dependsOn:h.dependsOn}))}),n=c=>{if(t.value)return t.value.data.arguments?.[c]},w=e.computed(()=>!!n("enableImageSequence")),R=e.computed(()=>!!n("needCooperativeDetection")),m=(c,s)=>{if(!t.value)return;const h={...t.value.data.arguments||{},[c]:s};o.updateNodeData(t.value.id,{arguments:h})},q=async c=>{if(!t.value)return;if(o.edges.some(C=>C.source===t.value.id))try{await Z.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(h=>h.source===t.value.id).forEach(h=>{o.removeEdge(h.id)}),c&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:c}),m("enableImageSequence",c),c&&o.initializeSubsequentFrames(t.value.id)}catch{return}else c&&m("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:c}),m("enableImageSequence",c),c&&o.initializeSubsequentFrames(t.value.id)},D=c=>{t.value&&(c&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),m("enableImageSequence",!1),m("enablePatrol",!1)),m("needCooperativeDetection",c))};e.watch(E,c=>{c==="stream"&&t.value&&n("deviceType")==="1400"&&m("deviceType","camera")},{immediate:!0});const A=e.computed(()=>l.value&&N.value==="camera"&&E.value!=="stream"&&o.supportPatrol());e.watch(A,c=>{!c&&t.value&&n("enablePatrol")&&m("enablePatrol",!1)}),e.watch(V,c=>{c>0&&n("enablePatrol")&&(n("patrolGroupSize")??1)>c&&m("patrolGroupSize",c)});const T=c=>{if(!c.dependsOn||!t.value)return!0;const{field:s,value:C}=c.dependsOn,h=n(s);if(typeof C=="string"&&C.startsWith("!")){const B=C.substring(1);return h!==B}return Array.isArray(C)?C.includes(h):h===C},d=()=>{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 s=t.value.type,C=t.value.data;if(s==="dataSource"&&l.value){const U=C.arguments||{},G={},H=o.nodes.some(z=>z.type===k.SMALL_MODEL);U.mode===void 0&&(G.mode=H?3:0),U.interval===void 0&&(G.interval=30),E.value==="stream"&&U.sw_decoding===void 0&&(G.sw_decoding="CPU"),Object.keys(G).length>0&&o.updateNodeData(c,{arguments:{...U,...G}})}const h=C.input_schema||C.inputSchema;if(s==="dataSource"&&h&&h.properties&&!h.properties.windowSeconds){h.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},C.arguments.windowSeconds||o.updateNodeData(t.value.id,{...C,input_schema:h,arguments:{...C.arguments,windowSeconds:5}});return}if(h&&h.properties&&Object.keys(h.properties).length>0)return;const B=await L(s);if(!B)return;const M=t.value?.data;M&&o.updateNodeData(t.value.id,{...M,input_schema:B.inputSchema,extraConfig:B.extraConfig,arguments:{...B.arguments,...M.arguments}})},{immediate:!0}),(c,s)=>{const C=e.resolveComponent("el-button"),h=e.resolveComponent("el-divider"),B=e.resolveComponent("el-icon"),M=e.resolveComponent("el-tooltip"),U=e.resolveComponent("el-option"),G=e.resolveComponent("el-select"),H=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),f=e.resolveComponent("el-form-item"),O=e.resolveComponent("el-form"),P=e.resolveComponent("el-radio"),W=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",vn,[s[11]||(s[11]=e.createElementVNode("h3",null,"节点配置",-1)),l.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(C,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:d},null,8,["icon"]))]),e.createVNode(h),e.createElementVNode("div",ea,[s[12]||(s[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(_.value,i=>e.withDirectives((e.openBlock(),e.createBlock(f,{key:i.key,required:i.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(i.label),1),i.description?(e.openBlock(),e.createBlock(M,{key:0,content:i.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{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(G,{key:0,"model-value":n(i.key),onChange:g=>m(i.key,g),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.options,(g,S)=>(e.openBlock(),e.createBlock(U,{key:g,label:i.optionLabels?i.optionLabels[S]:g,value:g},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):i.type==="boolean"?(e.openBlock(),e.createBlock(M,{key:1,content:l.value&&(i.key==="needCooperativeDetection"||i.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":i.key==="needCooperativeDetection"&&w.value?"已开启图片时序,无法同时开启协同检测":i.key==="enableImageSequence"&&R.value?"已开启协同检测,无法同时开启图片时序":i.key==="enableImageSequence"&&x.value?"多数据源场景下不允许开启图片时序":"",disabled:!(l.value&&(i.key==="needCooperativeDetection"||i.key==="enableImageSequence"))&&!(i.key==="needCooperativeDetection"&&w.value)&&!(i.key==="enableImageSequence"&&R.value)&&!(i.key==="enableImageSequence"&&x.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(H,{"model-value":n(i.key),disabled:l.value&&(i.key==="needCooperativeDetection"||i.key==="enableImageSequence")||i.key==="needCooperativeDetection"&&w.value||i.key==="enableImageSequence"&&R.value||i.key==="enableImageSequence"&&x.value,onChange:g=>i.key==="enableImageSequence"?q(g):i.key==="needCooperativeDetection"?D(g):m(i.key,g)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):i.type==="number"||i.type==="integer"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":n(i.key),onChange:g=>m(i.key,g),min:i.min,max:i.max,step:i.step||(i.type==="integer"?1:.1),precision:i.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(i.key),onInput:g=>m(i.key,g),maxlength:i.maxLength,"show-word-limit":!!i.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!i.dependsOn||T(i)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ta,[s[13]||(s[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":t.value?.data.branchLogic||"and",disabled:l.value,onChange:s[0]||(s[0]=i=>e.unref(o).updateNodeData(t.value.id,{branchLogic:i})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(U,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(U,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),l.value?(e.openBlock(),e.createElementBlock("div",oa,[s[16]||(s[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("deviceType")??"camera",onChange:s[1]||(s[1]=i=>m("deviceType",i))},{default:e.withCtx(()=>[e.createVNode(P,{value:"camera"},{default:e.withCtx(()=>[...s[14]||(s[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(P,{value:"1400",disabled:E.value==="stream"},{default:e.withCtx(()=>[...s[15]||(s[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(f,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${V.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":V.value===0}),onClick:F},null,8,["model-value","class"]),V.value===0?(e.openBlock(),e.createElementBlock("div",na,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&N.value==="1400"?(e.openBlock(),e.createElementBlock("div",aa,[s[19]||(s[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("detectionMode")??"platform",onChange:s[2]||(s[2]=i=>m("detectionMode",i))},{default:e.withCtx(()=>[e.createVNode(P,{value:"platform"},{default:e.withCtx(()=>[...s[17]||(s[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(P,{value:"device"},{default:e.withCtx(()=>[...s[18]||(s[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&N.value==="camera"&&E.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",la,[s[21]||(s[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(M,{disabled:!b.value,content:r.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(H,{"model-value":b.value?!1:n("enablePatrol"),disabled:b.value,onChange:s[3]||(s[3]=i=>m("enablePatrol",i))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),n("enablePatrol")?(e.openBlock(),e.createBlock(f,{key:0},{label:e.withCtx(()=>[s[20]||(s[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(M,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{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:s[4]||(s[4]=i=>m("patrolGroupSize",i)),min:1,max:V.value>0?V.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),l.value&&N.value==="camera"?(e.openBlock(),e.createElementBlock("div",ra,[s[22]||(s[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(O,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(f,{label:"抽帧策略"},{default:e.withCtx(()=>[E.value==="image"?(e.openBlock(),e.createBlock(G,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:"按时间间隔抽帧",value:0})]),_:1})):p.value?(e.openBlock(),e.createBlock(G,{key:1,"model-value":n("mode")??3,onChange:s[5]||(s[5]=i=>{m("mode",i),i===1&&m("interval",p.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:"每一帧都检测",value:3}),e.createVNode(U,{label:"跳帧检测",value:1}),e.createVNode(U,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(G,{key:2,"model-value":n("mode")??0,onChange:s[6]||(s[6]=i=>{m("mode",i),i===0&&m("interval",30),i===1&&m("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:"按时间间隔抽帧",value:0}),e.createVNode(U,{label:"跳帧检测",value:1}),e.createVNode(U,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),E.value==="image"||E.value==="stream"&&(n("mode")??0)===0?(e.openBlock(),e.createBlock(f,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("interval")??30,onChange:s[7]||(s[7]=i=>m("interval",i)),min:1,max:E.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),E.value==="stream"&&(n("mode")??0)===1?(e.openBlock(),e.createBlock(f,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[p.value?(e.openBlock(),e.createBlock(z,{key:0,"model-value":n("interval")??5,onChange:s[8]||(s[8]=i=>m("interval",i)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(G,{key:1,"model-value":n("interval")??25,onChange:s[9]||(s[9]=i=>m("interval",i)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:25,value:25}),e.createVNode(U,{label:50,value:50}),e.createVNode(U,{label:75,value:75}),e.createVNode(U,{label:125,value:125}),e.createVNode(U,{label:250,value:250}),e.createVNode(U,{label:375,value:375}),e.createVNode(U,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),E.value==="stream"?(e.openBlock(),e.createBlock(f,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(G,{"model-value":n("sw_decoding")??"CPU",onChange:s[10]||(s[10]=i=>m("sw_decoding",i)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(U,{label:"GPU",value:"GPU"}),e.createVNode(U,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-7f821224"]]),ia={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Ye=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),u=e.ref(null),y=e.ref(""),l=async(b=!1)=>{if(a){o.value=a;return}},N=async()=>{o.value=[],await l(!0)},E=b=>o.value.find(r=>r.id===b||r.title===b),V=b=>{const r=E(b);if(!r)return{};const _=r.inputSchema||r.input_schema;if(!_||!_.properties)return{};const n={};return Object.entries(_.properties).forEach(([w,R])=>{R.default!==void 0&&(n[w]=R.default)}),n},F=b=>{const r=E(b);if(!r)return[];const _=r.inputSchema||r.input_schema;if(!_||!_.properties)return[];const n=_.required||[];return Object.entries(_.properties).map(([w,R])=>({key:w,type:R.type,label:R.title||R.description||w,description:R.description||"",default:R.default,required:n.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}))},L=e.computed(()=>{if(!y.value)return o.value;const b=y.value.toLowerCase();return o.value.filter(r=>r.name?.toLowerCase().includes(b)||r.type?.toLowerCase().includes(b)||r.title?.toLowerCase().includes(b)||r.description&&r.description.toLowerCase().includes(b)||p(r.type).toLowerCase().includes(b))}),p=b=>ia[b]||b;return{models:o,loading:t,error:u,searchKeyword:y,filteredModels:L,loadSmallModels:l,reloadSmallModels:N,getModelConfig:E,getTypeLabel:p,getDefaultArguments:V,getSchemaFields:F,validateArguments:(b,r)=>{const _=E(b);if(!_)return{valid:!1,errors:["模型不存在"]};const n=[],w=_.inputSchema||_.input_schema;return!w||!w.properties?{valid:!0,errors:[]}:(Object.entries(w.properties).forEach(([R,m])=>{const q=r[R];if(m.required&&(q==null||q==="")){n.push(`${m.title||R} 为必填项`);return}if(q!=null&&(m.type==="number"||m.type==="integer")){if(typeof q!="number"){n.push(`${m.title||R} 必须是数字`);return}m.minimum!==void 0&&q<m.minimum&&n.push(`${m.title||R} 不能小于 ${m.minimum}`),m.maximum!==void 0&&q>m.maximum&&n.push(`${m.title||R} 不能大于 ${m.maximum}`)}}),{valid:n.length===0,errors:n})}}},ca={class:"small-model-selector"},da={key:0,class:"loading-state"},ma={key:1,class:"error-state"},pa={key:2,class:"model-list"},ua=["onClick"],fa={class:"model-header"},ga={class:"model-name"},ha={class:"model-description"},ya={class:"model-meta"},_a={key:3,class:"empty-state"},Na=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,u=o,{loading:y,error:l,searchKeyword:N,filteredModels:E,loadSmallModels:V,reloadSmallModels:F,getTypeLabel:L}=Ye(t.externalModels),p=r=>{u("update:modelValue",r.id),u("select",r)},x=()=>{F()},b=r=>({safety:"warning",security:"danger",traffic:"info"})[r]||"info";return e.onMounted(()=>{t.externalModels||V()}),(r,_)=>{const n=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",ca,[e.createVNode(n,{modelValue:e.unref(N),"onUpdate:modelValue":_[0]||(_[0]=q=>e.isRef(N)?N.value=q: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",da,[e.createVNode(w,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),_[2]||(_[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",ma,[e.createVNode(w,{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(R,{type:"primary",onClick:x},{default:e.withCtx(()=>[..._[3]||(_[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(E).length>0?(e.openBlock(),e.createElementBlock("div",pa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(E),q=>(e.openBlock(),e.createElementBlock("div",{key:q.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===q.id}]),onClick:D=>p(q)},[e.createElementVNode("div",fa,[e.createElementVNode("div",ga,[e.createVNode(w,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(q.name),1)]),e.createVNode(m,{type:b(q.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(L)(q.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ha,e.toDisplayString(q.description),1),e.createElementVNode("div",ya,[q.supportDirectAlert?(e.openBlock(),e.createBlock(m,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[..._[4]||(_[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ua))),128))])):(e.openBlock(),e.createElementBlock("div",_a,[e.createVNode(w,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),_[6]||(_[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(R,{text:"",onClick:_[1]||(_[1]=q=>N.value="")},{default:e.withCtx(()=>[..._[5]||(_[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),Ca={class:"position-tooltip"},we=oe({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",Ca,[...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"]]),ka={class:"config-header"},ba={class:"config-section"},xa={key:0,class:"model-selector-wrapper"},Ea={key:1,class:"selected-model-info"},wa={class:"model-info-header"},Ta={class:"model-info-name"},Sa={class:"model-info-description"},Va={key:0,class:"config-section"},Ba={key:3,class:"array-input"},Aa="检测到事件后,连续两次告警上报的时间间隔",Da=oe({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=e.inject("editorConfig",null),N=e.computed(()=>(l?.value??l)?.smallModels??null),{models:E}=Ye(N.value),V=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),F={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},L=e.computed(()=>{if(!t.value)return[];const D=t.value.data.input_schema||t.value.data.inputSchema;if(!D||!D.properties)return[];const A=D.required||[],T=t.value.data.title||"";return Object.entries(D.properties).filter(([d])=>V.has(d)).map(([d,c])=>{const s={key:d,type:c.type,label:c.title||c.label||c.description||d,description:c.description||"",default:c.default,required:A.includes(d)||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};return d==="interval"&&(s.label="告警间隔(秒)",s.description=F[T]||Aa,s.isInterval=!0,s.default=s.default!=null?s.default/1e3:10,s.min=s.min!=null?s.min/1e3:1,s.max=s.max!=null?s.max/1e3:void 0,s.step=1,s.precision=0),d==="threshold"&&(s.label="小模型阈值",s.step=.01,s.precision=2),d==="targetWidth"&&(s.label="最小目标宽度",s.default=60,s.min=20,s.max=1920,s.step=1,s.precision=0),d==="targetHeight"&&(s.label="最小目标高度",s.default=60,s.min=20,s.max=1080,s.step=1,s.precision=0),d==="topScale"&&(s.label="调整目标框高度比例 (上)",s.max=10,s.step=.1,s.precision=1),d==="bottomScale"&&(s.label="调整目标框高度比例 (下)",s.max=10,s.step=.1,s.precision=1),d==="leftScale"&&(s.label="调整目标框宽度比例 (左)",s.max=10,s.step=.1,s.precision=1),d==="rightScale"&&(s.label="调整目标框宽度比例 (右)",s.max=10,s.step=.1,s.precision=1),d==="x_ratio"&&(s.label="X轴位置信息",s.step=.01,s.precision=2),d==="y_ratio"&&(s.label="Y轴位置信息",s.step=.01,s.precision=2),d==="targetDuration"&&(s.label="目标持续时间(秒)",s.default=s.default!=null?s.default/1e3:1,s.min=s.min!=null?s.min/1e3:1,s.max=s.max!=null?s.max/1e3:void 0,s.step=.01,s.precision=2),d==="overloadNumber"&&(s.precision=0),d==="targetNumber"&&(s.precision=0),s}).filter(d=>!["areas","darwin","direction","lines"].includes(d.key)).filter(d=>!(d.key==="targetDuration"&&T==="NonMotorCounter")).sort((d,c)=>(d.sort??1/0)-(c.sort??1/0))}),p=["interval","targetDuration"],x=D=>{if(!t.value)return;const A=t.value.data.arguments?.[D];return p.includes(D)&&A!=null?A/1e3:A},b=(D,A)=>{if(!t.value)return;let T=A;p.includes(D)&&A!=null&&(T=A*1e3);const c={...t.value.data.arguments||{},[D]:T};o.updateNodeData(t.value.id,{arguments:c})},r=D=>{if(!D.dependsOn||!t.value)return!0;const{field:A,value:T}=D.dependsOn,d=x(A);if(typeof T=="string"&&T.startsWith("!")){const c=T.substring(1);return d!==c}return Array.isArray(T)?T.includes(d):d===T},_=D=>{const A=x(D);return Array.isArray(A)?JSON.stringify(A):""},n=(D,A)=>{try{const T=JSON.parse(A);Array.isArray(T)&&b(D,T)}catch{}},w=async D=>{if(!t.value)return;const A=D.inputSchema||D.input_schema||{},T={};A.properties&&Object.entries(A.properties).forEach(([d,c])=>{c.default!==void 0&&(T[d]=c.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:D.id||D.title,title:D.title,modelName:D.name,modelType:D.type,input_schema:A,extraConfig:D.extraConfig,supportDirectAlert:D.supportDirectAlert||!1,arguments:T})},R=()=>{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(()=>{})},m=()=>t.value?.data.modelId?E.value.find(A=>A.id===t.value.data.modelId)?.description||"暂无描述":"",q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(D,A)=>{const T=e.resolveComponent("el-button"),d=e.resolveComponent("el-divider"),c=e.resolveComponent("el-icon"),s=e.resolveComponent("el-tag"),C=e.resolveComponent("el-tooltip"),h=e.resolveComponent("el-option"),B=e.resolveComponent("el-select"),M=e.resolveComponent("el-switch"),U=e.resolveComponent("el-input-number"),G=e.resolveComponent("el-input"),H=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",ka,[A[0]||(A[0]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(d),e.createElementVNode("div",ba,[A[3]||(A[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!y.value?(e.openBlock(),e.createElementBlock("div",xa,[e.createVNode(Na,{"model-value":t.value?.data.modelId,"external-models":N.value,onSelect:w},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ea,[e.createElementVNode("div",wa,[e.createElementVNode("div",Ta,[e.createVNode(c,{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(T,{key:0,type:"text",text:"",size:"small",onClick:R},{default:e.withCtx(()=>[...A[1]||(A[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Sa,e.toDisplayString(m()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(s,{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",Va,[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(L.value,f=>e.withDirectives((e.openBlock(),e.createBlock(z,{key:f.key,required:f.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(f.label),1),f.key==="x_ratio"||f.key==="y_ratio"?(e.openBlock(),e.createBlock(C,{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(c,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):f.description?(e.openBlock(),e.createBlock(C,{key:1,content:f.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[f.options&&f.type==="string"?(e.openBlock(),e.createBlock(B,{key:0,"model-value":x(f.key),onChange:O=>b(f.key,O),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(O,P)=>(e.openBlock(),e.createBlock(h,{key:O,label:f.optionLabels?f.optionLabels[P]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):f.type==="boolean"?(e.openBlock(),e.createBlock(M,{key:1,"model-value":x(f.key),onChange:O=>b(f.key,O)},null,8,["model-value","onChange"])):f.type==="number"||f.type==="integer"||f.type==="float"?(e.openBlock(),e.createBlock(U,{key:2,"model-value":x(f.key),onChange:O=>b(f.key,O),min:f.min,max:f.max,step:f.step||(f.type==="integer"||f.type==="number"?1:.01),precision:f.precision??(f.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):f.type==="array"&&!f.options?(e.openBlock(),e.createElementBlock("div",Ba,[e.createVNode(G,{"model-value":_(f.key),onChange:O=>n(f.key,O),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(H,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):f.type==="array"&&f.options?(e.openBlock(),e.createBlock(B,{key:4,"model-value":x(f.key),onChange:O=>b(f.key,O),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.options,(O,P)=>(e.openBlock(),e.createBlock(h,{key:O,label:f.optionLabels?f.optionLabels[P]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(G,{key:5,"model-value":x(f.key),onInput:O=>b(f.key,O)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!f.dependsOn||r(f)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),La=(a=null)=>{const o=ae(),t=e.ref(a?a.map(p=>xe.backendToFrontend(p)):[]),u=e.ref(!1),y=e.ref(null),l=async(p=!1)=>{if(a){t.value=a.map(x=>xe.backendToFrontend(x));return}},N=p=>t.value.find(x=>x.title===p)||null,E=p=>{const x=N(p);return x?{targetId:x.title,targetName:x.label,threshold:x.data.threshold||.5,targetWidth:x.data.targetWidth||20,targetHeight:x.data.targetHeight||20,postmodel:x.data.postmodel||"ClipVit",areas:x.data.areas||[],expandRect:x.data.expandRect!==void 0?x.data.expandRect:!1,topScale:x.data.topScale||1.6,bottomScale:x.data.bottomScale||1.6,leftScale:x.data.leftScale||1.6,rightScale:x.data.rightScale||1.6,enableStructure:x.data.enableStructure}:{}},V=(p=null)=>o.nodes.filter(x=>x.type==="detectionTarget"&&x.id!==p).map(x=>({value:x.id,label:x.data.targetName||x.data.label})),F=(p=null)=>{const x=[{value:"original",label:"原图"}],b=V(p);return[...x,...b]},L=e.computed(()=>t.value.map(p=>({value:p.title,label:p.label,...p})));return{detectionTargets:t,loading:u,error:y,loadDetectionTargets:l,getTargetById:N,getDefaultConfig:E,getDetectionTargetNodes:V,getDetectionScopeOptions:F,getTargetOptions:L}},Oa={class:"paired-array-input"},Te=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=(L,p)=>{let x;return(...b)=>{clearTimeout(x),x=setTimeout(()=>L(...b),p)}},u=a,y=o,l=e.ref([]),N=()=>{const L=u.primaryValue||[],p=u.pairedValue||[],x=Math.max(L.length,p.length,1);l.value=Array.from({length:x},(b,r)=>({primary:L[r]||"",paired:p[r]!==void 0?p[r]:u.pairedField.default?.[0]||.5}))};e.watch(()=>[u.primaryValue,u.pairedValue],()=>{N()},{immediate:!0,deep:!0});const E=t((L,p)=>{y("update",L,p)},300);e.watch(l,L=>{const p=L.map(b=>b.primary),x=L.map(b=>b.paired);E(p,x)},{deep:!0});const V=()=>{l.value.length>=10||l.value.push({primary:"",paired:u.pairedField.default?.[0]||.5})},F=L=>{l.value.length>1&&l.value.splice(L,1)};return(L,p)=>{const x=e.resolveComponent("el-input"),b=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Oa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(_,n)=>(e.openBlock(),e.createElementBlock("div",{key:n,class:"input-row"},[e.createVNode(x,{modelValue:l.value[n].primary,"onUpdate:modelValue":w=>l.value[n].primary=w,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(b,{modelValue:l.value[n].paired,"onUpdate:modelValue":w=>l.value[n].paired=w,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(r,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:w=>F(n)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(r,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:l.value.length>=10,onClick:V},{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"]]),Ma={class:"config-header"},Ia={class:"config-section"},Ra={class:"flex items-center justify-between"},$a={key:0,class:"config-section"},Fa={key:1,class:"config-section"},qa={key:2,class:"config-section"},Ga={class:"device-list"},Ha=["onClick"],Pa={class:"device-name"},ja={key:0,class:"device-list-empty"},za={key:4,class:"array-input"},Ua={key:4,class:"array-input"},Wa=oe({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u==="task"),l=e.inject("taskModeConfig",null),N=e.inject("echoAlgodata",null),E=e.inject("echoTaskData",null),V=e.computed(()=>{if(!t.value)return null;const f=new Set,O=[t.value.id];for(;O.length;){const P=O.shift();if(f.has(P))continue;f.add(P);const W=o.edges.filter(i=>i.target===P);for(const i of W){const g=o.nodes.find(S=>S.id===i.source);if(g){if(g.type==="dataSource")return g.id;O.push(g.id)}}}return null}),F=e.computed(()=>{const f=V.value;return f?(l?.value??l)?.datasource?.getDevices?.(f)??[]:[]}),L=e.computed(()=>y.value&&F.value.length>0),p=e.ref(""),x=e.ref(""),b=e.computed(()=>{const f=x.value.trim().toLowerCase();return f?F.value.filter(O=>(O.sourceName??O.name??String(O.sourceId??O.id??O)).toLowerCase().includes(f)):F.value}),r=e.computed(()=>{const f={},O=V.value,P=t.value?.id;if(!O||!P)return f;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const i of F.value){const g=String(i.sourceId??i.id??i),S=o.getTaskSourceArguments(O,g,P);if(S===null){f[g]=!1;continue}const $=new Set([...Object.keys(S),...Object.keys(W)]);let j=!1;for(const J of $)if(JSON.stringify(S[J])!==JSON.stringify(W[J])){j=!0;break}f[g]=j}return f});e.watch([F,()=>t.value?.data?.arguments?.configMode],([f])=>{f.length>0?p.value=String(f[0]?.sourceId??f[0]?.id??f[0]):p.value=""},{immediate:!0});const _=(f,O=null)=>{if(O){const g=((E?.value??E)?.graph?.sources??[]).find(S=>String(S.sourceId)===String(O));if(g?.branches)for(const S of g.branches){const $=S.nodes?.find(j=>j.toolTitle===f);if($?.arguments)return{...$.arguments}}return null}const P=N?.value??N;if(!P?.branches)return null;for(const W of P.branches){const i=W.nodes?.find(g=>g.toolTitle===f);if(i?.arguments)return{...i.arguments}}return null},n=f=>{const O=V.value,P=t.value?.id;if(!O||!P||!f||o.getTaskSourceArguments(O,f,P)!==null)return;const W=t.value?.data?.targetId,i=W?_(W,f):null,g=t.value?.data?.arguments??{},S={...i??g};delete S.configMode,o.setTaskSourceArguments(O,f,P,S)};e.watch(p,f=>{f&&t.value?.data?.arguments?.configMode==="perDevice"&&n(f)}),e.watch(()=>t.value?.data?.arguments?.configMode,f=>{f==="perDevice"&&p.value&&n(p.value)});const w=e.inject("editorConfig",null),R=e.computed(()=>(w?.value??w)?.detection??null),{detectionTargets:m,loading:q}=La(R.value),D=e.computed(()=>{if(!t.value)return[];const f=t.value.data.input_schema||t.value.data.inputSchema;if(!f||!f.properties)return[];const O=f.required||[];return Object.entries(f.properties).map(([P,W])=>({key:P,type:W.type,label:W.title||W.label||W.description||P,description:W.description||"",default:W.default,required:O.includes(P)||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((P,W)=>(P.sort??1/0)-(W.sort??1/0))}),A=f=>f.type==="array"&&f["x-component"]==="paired-array"&&f["x-paired-with"],T=f=>{const O=f["x-paired-with"];return D.value.find(P=>P.key===O)},d={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}},c=new Set(Object.keys(d)),s=e.computed(()=>{const f=t.value?.data.targetId,O=new Set;return D.value.forEach(P=>{P["x-paired-with"]&&O.add(P["x-paired-with"])}),D.value.filter(P=>f==="traffic_accident"?P.key==="threshold":c.has(P.key)&&!O.has(P.key)&&!A(P)).map(P=>{const W=d[P.key]||{};return{...P,label:W.label||P.label,description:W.description||P.description,min:W.min??P.min,max:W.max??P.max,step:W.step??P.step,precision:W.precision,default:W.default??P.default}})}),C=e.computed(()=>D.value.filter(f=>A(f))),h=f=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const P=V.value,W=o.getTaskSourceArguments(P,p.value,t.value.id);if(W!==null)return W[f]}return t.value.data.arguments?.[f]},B=(f,O)=>{if(!t.value)return;const P=t.value.data.arguments?.configMode;if(f!=="configMode"&&P==="perDevice"&&p.value){const g=V.value;o.updateTaskSourceArgument(g,p.value,t.value.id,f,O);return}const i={...t.value.data.arguments||{},[f]:O};o.updateNodeData(t.value.id,{arguments:i})},M=f=>{if(!f.dependsOn||!t.value)return!0;const{field:O,value:P}=f.dependsOn,W=h(O);if(typeof P=="string"&&P.startsWith("!")){const i=P.substring(1);return W!==i}return Array.isArray(P)?P.includes(W):W===P},U=f=>{const O=h(f);return Array.isArray(O)?JSON.stringify(O):""},G=(f,O)=>{try{const P=JSON.parse(O);Array.isArray(P)&&B(f,P)}catch{}},H=(f,O,P,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&p.value){const $=V.value;o.updateTaskSourceArgument($,p.value,t.value.id,f,O),o.updateTaskSourceArgument($,p.value,t.value.id,P,W);return}const S={...t.value.data.arguments||{},[f]:O,[P]:W};o.updateNodeData(t.value.id,{arguments:S})},z=async f=>{if(!t.value||!f)return;const O=m.value.find(S=>S.title===f);if(!O)return;let P=O.inputSchema||O.input_schema||{};if(f==="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}}};P={...P,properties:{...P.properties,...S.properties}}}const W={};P.properties&&Object.entries(P.properties).forEach(([S,$])=>{$.default!==void 0&&(W[S]=$.default)});const i=t.value.data,g={...W,target_class:O.title};o.updateNodeData(t.value.id,{...i,targetId:O.title,targetName:O.label,label:O.label,input_schema:P,inputSchema:P,extraConfig:O.extraConfig,arguments:g})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,f=>{if(!f||!t.value)return;const O=m.value.find(i=>i.title===f);if(!O)return;const P=t.value.data;if(P.input_schema&&Object.keys(P.input_schema).length>0)return;const W={...O.defaultArguments,...P.arguments,target_class:O.title};o.updateNodeData(t.value.id,{...P,input_schema:O.inputSchema,arguments:W})}),(f,O)=>{const P=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),i=e.resolveComponent("el-option"),g=e.resolveComponent("el-select"),S=e.resolveComponent("el-form-item"),$=e.resolveComponent("el-form"),j=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",Ma,[O[2]||(O[2]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(P,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:Y},null,8,["icon"]))]),e.createVNode(W),e.createElementVNode("div",Ia,[O[3]||(O[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(S,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":t.value?.data.targetId,disabled:y.value,onChange:z,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(q),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(m),I=>(e.openBlock(),e.createBlock(i,{key:I.title,label:I.label,value:I.title},{default:e.withCtx(()=>[e.createElementVNode("div",Ra,[e.createElementVNode("span",null,e.toDisplayString(I.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),L.value?(e.openBlock(),e.createElementBlock("div",$a,[O[6]||(O[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode($,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(S,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:O[0]||(O[0]=I=>B("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),C.value.length>0?(e.openBlock(),e.createElementBlock("div",Fa,[O[7]||(O[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(C.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(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(Te,{"primary-field":I,"paired-field":T(I),"primary-value":h(I.key),"paired-value":h(I["x-paired-with"]),onUpdate:(K,le)=>H(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",qa,[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:x.value,"onUpdate:modelValue":O[1]||(O[1]=I=>x.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",Ga,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(b.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":r.value[String(I.sourceId??I.id??I)]}]),onClick:K=>p.value=String(I.sourceId??I.id??I)},[e.createElementVNode("span",Pa,e.toDisplayString(I.sourceName??I.name??String(I.sourceId??I.id??I)),1),r.value[String(I.sourceId??I.id??I)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...O[8]||(O[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Ha))),128)),b.value.length===0?(e.openBlock(),e.createElementBlock("div",ja," 无匹配设备 ")):e.createCommentVNode("",!0)]),p.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(s.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(te,{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(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(g,{key:0,"model-value":h(I.key),onChange:K=>B(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(i,{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":h(I.key),onChange:K=>B(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":h(I.key),onChange:K=>B(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"])):A(I)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":I,"paired-field":T(I),"primary-value":h(I.key),"paired-value":h(I["x-paired-with"]),onUpdate:(K,le)=>H(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",za,[e.createVNode(se,{"model-value":U(I.key),onChange:K=>G(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(g,{key:5,"model-value":h(I.key),onChange:K=>B(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(i,{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":h(I.key),onInput:K=>B(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||M(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(s.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(te,{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(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(g,{key:0,"model-value":h(I.key),onChange:K=>B(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(i,{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":h(I.key),onChange:K=>B(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":h(I.key),onChange:K=>B(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"])):A(I)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":I,"paired-field":T(I),"primary-value":h(I.key),"paired-value":h(I["x-paired-with"]),onUpdate:(K,le)=>H(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":U(I.key),onChange:K=>G(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(g,{key:5,"model-value":h(I.key),onChange:K=>B(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(i,{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":h(I.key),onInput:K=>B(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||M(I)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ja={class:"config-header"},Ya={class:"config-section"},Xa={key:0,style:{"margin-bottom":"8px"}},Qa=oe({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=L=>{if(!t.value)return;const p={...t.value.data.arguments,conditionRelation:L};o.updateNodeData(t.value.id,{arguments:p})},N=()=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],x={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:x})},E=(L,p,x)=>{if(!t.value)return;const b=[...t.value.data.arguments?.alertConditions||[]];b[L]={...b[L],[p]:x};const r={...t.value.data.arguments,alertConditions:b};o.updateNodeData(t.value.id,{arguments:r})},V=L=>{if(!t.value)return;const p=[...t.value.data.arguments?.alertConditions||[]];p.splice(L,1);const x={...t.value.data.arguments,alertConditions:p};o.updateNodeData(t.value.id,{arguments:x})},F=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(L,p)=>{const x=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),r=e.resolveComponent("el-text"),_=e.resolveComponent("el-option"),n=e.resolveComponent("el-select"),w=e.resolveComponent("el-input-number"),R=e.resolveComponent("el-radio"),m=e.resolveComponent("el-radio-group"),q=e.resolveComponent("el-form-item"),D=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ja,[p[1]||(p[1]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(b),e.createElementVNode("div",Ya,[p[9]||(p[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(D,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,null,{label:e.withCtx(()=>[p[3]||(p[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(r,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...p[2]||(p[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(r,{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(n,{"model-value":A.operator,onChange:d=>E(T,"operator",d),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(_,{label:"等于 =",value:"="}),e.createVNode(_,{label:"大于 >",value:">"}),e.createVNode(_,{label:"小于 <",value:"<"}),e.createVNode(_,{label:"大于等于 ≥",value:">="}),e.createVNode(_,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(w,{"model-value":A.value,onChange:d=>E(T,"value",d),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(x,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:d=>V(T)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Xa,[e.createVNode(r,{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=>l(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(x,{type:"text",link:"",icon:e.unref(X.Plus),onClick:N},{default:e.withCtx(()=>[...p[8]||(p[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Ka={class:"config-header"},Za={class:"config-section"},va={style:{display:"flex","align-items":"center",gap:"8px"}},el={style:{display:"flex","align-items":"center",gap:"8px"}},tl={style:{display:"flex","align-items":"center",gap:"8px"}},ol=oe({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),u=e.inject("editorMode",ee.ALGORITHM),y=e.computed(()=>u===ee.TASK),l=_=>{if(!t.value)return;const n={...t.value.data.arguments,duration:_};o.updateNodeData(t.value.id,{arguments:n})},N=_=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_enabled:_};o.updateNodeData(t.value.id,{arguments:n})},E=_=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_threshold:_};o.updateNodeData(t.value.id,{arguments:n})},V=_=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_enabled:_};o.updateNodeData(t.value.id,{arguments:n})},F=_=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_operator:_};o.updateNodeData(t.value.id,{arguments:n})},L=_=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_threshold:_};o.updateNodeData(t.value.id,{arguments:n})},p=_=>{if(!t.value)return;const n=t.value.data.arguments?.overlap_detection||{},w={...t.value.data.arguments,overlap_detection:{operator:n.operator??"gt",threshold:n.threshold??90,...n,enabled:_}};o.updateNodeData(t.value.id,{arguments:w})},x=_=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:_}};o.updateNodeData(t.value.id,{arguments:n})},b=_=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:_}};o.updateNodeData(t.value.id,{arguments:n})},r=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(_,n)=>{const w=e.resolveComponent("el-button"),R=e.resolveComponent("el-divider"),m=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-text"),D=e.resolveComponent("el-form-item"),A=e.resolveComponent("el-switch"),T=e.resolveComponent("el-icon"),d=e.resolveComponent("el-tooltip"),c=e.resolveComponent("el-slider"),s=e.resolveComponent("el-option"),C=e.resolveComponent("el-select"),h=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ka,[n[9]||(n[9]=e.createElementVNode("h3",null,"节点配置",-1)),y.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(w,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(R),e.createElementVNode("div",Za,[n[13]||(n[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(h,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(D,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.duration??30,onChange:n[0]||(n[0]=B=>l(B)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(q,{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(D,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",va,[e.createVNode(A,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:n[1]||(n[1]=B=>N(B))},null,8,["model-value"]),e.createVNode(d,{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(D,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:n[2]||(n[2]=B=>E(B)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(q,{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(D,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(A,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:n[3]||(n[3]=B=>V(B))},null,8,["model-value"]),e.createVNode(d,{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(D,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(C,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:n[4]||(n[4]=B=>F(B)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(s,{label:"大于 >",value:"gt"}),e.createVNode(s,{label:"大于等于 >=",value:"gte"}),e.createVNode(s,{label:"等于 =",value:"eq"}),e.createVNode(s,{label:"小于等于 <=",value:"lte"}),e.createVNode(s,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(D,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:n[5]||(n[5]=B=>L(B)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(q,{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(D,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(A,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:n[6]||(n[6]=B=>p(B))},null,8,["model-value"]),e.createVNode(d,{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(D,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(C,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:n[7]||(n[7]=B=>x(B)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(s,{label:"大于 >",value:"gt"}),e.createVNode(s,{label:"等于 =",value:"eq"}),e.createVNode(s,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(D,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:n[8]||(n[8]=B=>b(B)),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"]]),nl={class:"node-config-panel"},al={class:"config-content"},ll=oe({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:vo,group:tn,start:En,end:An,classificationModel:Fn,ocr:Hn,licensePlate:zn,face:Je,stream:Zn,dataSource:sa,smallModel:Da,detectionTarget:Wa,targetCount:Qa,timerTarget:ol,faceRecognition:Je},u=e.computed(()=>{const y=o.selectedEdge;if(y)return o.nodes.find(E=>E.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",nl,[e.createElementVNode("div",al,[u.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(u.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),rl={class:"workflow-editor",id:"workflow-editor"},sl={class:"editor-content"},il={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:a=>Object.values(ee).includes(a)},pageMode:{type:String,default:he.CREATE,validator:a=>Object.values(he).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;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 u=`aiflow-workflow-${Math.random().toString(36).slice(2,9)}`,y=Fe(u)();e.provide(Re,y),e.onUnmounted(()=>{y.$dispose()});const{copyToClipboard:l,downloadJSON:N,exportToJSON:E}=yt(),{runValidation:V}=Nt(),F=e.computed(()=>{if(y.selectedNodeId)return!0;const p=y.selectedEdge;return p?!!y.nodes.find(b=>b.id===p.source)?.data?.enableBranch:!1});return o({reset:()=>{Z.ElMessageBox.confirm("确定要重置工作流吗?所有节点和连接将被清空。","确认重置",{confirmButtonText:"重置",cancelButtonText:"取消",type:"warning"}).then(()=>{y.resetWorkflow(),Z.ElMessage.success("工作流已重置")}).catch(()=>{})},runTest:V,copyJSON:l,exportJSON:E}),(p,x)=>(e.openBlock(),e.createElementBlock("div",rl,[e.createElementVNode("div",sl,[e.createVNode(wt),e.createVNode(Xo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[F.value?(e.openBlock(),e.createBlock(ll,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Xe=oe(il,[["__scopeId","data-v-98506fad"]]),cl={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},Qe=a=>{Object.entries(cl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Xe)},dl={install:Qe};re.EditorMode=ee,re.NodeType=k,re.PageMode=he,re.WorkflowEditor=Xe,re.default=dl,re.install=Qe,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,Ke,v,Ze,ve,et){"use strict";const C={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},tt={[C.DETECTION_TARGET]:"检测目标",[C.CLASSIFICATION_MODEL]:"分类模型",[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时",[C.FACE_RECOGNITION]:"人脸识别",[C.SMALL_MODEL]:"小模型"},ot={cls:C.CLASSIFICATION_MODEL,ocr:C.OCR,license_plate:C.LICENSE_PLATE,target_count:C.TARGET_COUNT,timer_target:C.TIMER_TARGET,face:C.FACE_RECOGNITION,face_recognition:C.FACE_RECOGNITION},ee={ALGORITHM:"algorithm",TASK:"task"},he={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Se=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),ke=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}}}),be=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"}}),Ve=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Be=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Ae=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),De=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Le=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Oe=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"}}}}),Me=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:{}}}),nt=(a,o={width:300,height:160},t="and",f=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:f},selectable:!0,deletable:!1,zIndex:-1}),Ie=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),Re=Symbol("workflowStore"),$e=()=>{const a=Se({x:80,y:300}),o=be({x:320,y:300}),t=ke({x:1e3,y:300}),f={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[f]}},Fe=a=>Ke.defineStore(a,()=>{const o=$e(),t=e.ref(o.nodes),f=e.ref(o.edges),h=e.ref(null),l=e.ref(null),k=e.ref(new Set),E=e.ref(new Set),D=e.ref({}),$=(p,V,R,U)=>{D.value[p]||(D.value[p]={}),D.value[p][V]||(D.value[p][V]={}),D.value[p][V][R]={...U}},O=(p,V,R,U,J)=>{D.value[p]||(D.value[p]={}),D.value[p][V]||(D.value[p][V]={}),D.value[p][V][R]||(D.value[p][V][R]={}),D.value[p][V][R][U]=J},d=(p,V,R)=>D.value[p]?.[V]?.[R]??null,b=()=>{D.value={}},N=e.computed(()=>h.value?t.value.find(p=>p.id===h.value):null),g=e.computed(()=>l.value?f.value.find(p=>p.id===l.value):null),m=p=>t.value.filter(V=>V.type===p).length,n=()=>{const p=t.value.filter(V=>V.type===C.DATA_SOURCE);p.length!==0&&(p.length===1?p[0].data.label="数据源":p.forEach((V,R)=>{V.data.label=`数据源 ${R+1}`}))},x=()=>t.value.filter(p=>p.type===C.DATA_SOURCE).length,P=()=>t.value.filter(V=>V.type===C.DATA_SOURCE).some(V=>V.data.arguments?.needCooperativeDetection===!0),c=()=>{const p=x(),V=P();return!(p>1||V)},q=p=>{t.value.push(p),p.type===C.DATA_SOURCE&&n()},T=p=>{const V=t.value.find(U=>U.id===p),R=V?.type===C.DATA_SOURCE;if(V?.type==="group"){w(p),f.value=f.value.filter(U=>U.source!==p&&U.target!==p),h.value===p&&(h.value=null);return}t.value=t.value.filter(U=>U.id!==p),f.value=f.value.filter(U=>U.source!==p&&U.target!==p),h.value===p&&(h.value=null),R&&n()},L=(p,V)=>{const R=t.value.find(U=>U.id===p);R&&(R.data={...R.data,...V})},S=(p,V)=>{const R=t.value.find(U=>U.id===p);R&&(R.position=V)},B=p=>{const V=t.value.find(R=>R.id===p.source);if(V&&(V.type===C.START||V.type===C.DATA_SOURCE)&&V.data?.enableBranch===!0){const U=f.value.filter(J=>J.source===p.source).length+1;p={...p,data:{...p.data,branchOrder:U}}}f.value=v.addEdge(p,f.value)},i=p=>{const V=f.value.find(R=>R.id===p);if(f.value=f.value.filter(R=>R.id!==p),l.value===p&&(l.value=null),V&&V.data?.branchOrder!==void 0){const R=t.value.find(U=>U.id===V.source);R&&(R.type===C.START||R.type===C.DATA_SOURCE)&&f.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=(p,V="and",R=null)=>{const U=nt(p,{width:300,height:160},V,R);return t.value.unshift(U),U.id},_=(p,V)=>{const R=t.value.find(Q=>Q.id===p),U=t.value.find(Q=>Q.id===V);if(!R||!U||R.parentNode===V)return;R.parentNode&&u(p);const J=t.value.find(Q=>Q.id===p);J&&(t.value=t.value.map(Q=>Q.id!==p?Q:{...Q,position:{x:J.position.x-U.position.x,y:J.position.y-U.position.y},parentNode:V,extent:"parent"}))},u=p=>{const V=t.value.find(Q=>Q.id===p);if(!V||!V.parentNode)return;const R=t.value.find(Q=>Q.id===V.parentNode),U=R?V.position.x+R.position.x:V.position.x,J=R?V.position.y+R.position.y:V.position.y;t.value=t.value.map(Q=>{if(Q.id!==p)return Q;const te={...Q,position:{x:U,y:J}};return delete te.parentNode,delete te.extent,te})},w=p=>{const V=t.value.find(R=>R.id===p);V&&(t.value=t.value.filter(R=>R.id!==p).map(R=>{if(R.parentNode!==p)return R;const U={...R,position:{x:R.position.x+V.position.x,y:R.position.y+V.position.y}};return delete U.parentNode,delete U.extent,U}))};return{nodes:t,edges:f,selectedNodeId:h,selectedEdgeId:l,invalidNodeIds:k,invalidEdgeIds:E,selectedNode:N,selectedEdge:g,getNodeCountByType:m,getDataSourceCount:x,hasCooperativeDetection:P,supportPatrol:c,addNode:q,removeNode:T,updateNodeData:L,updateNodePosition:S,addConnection:B,removeEdge:i,updateEdgeData:(p,V)=>{const R=f.value.find(U=>U.id===p);if(R){if(V.branchOrder!==void 0){const U=t.value.find(J=>J.id===R.source);if(U&&(U.type===C.START||U.type===C.DATA_SOURCE)){const J=R.data?.branchOrder,Q=V.branchOrder;if(J!==Q&&Q!==null){const se=f.value.filter(ce=>ce.source===R.source&&ce.id!==p).find(ce=>ce.data?.branchOrder===Q);se&&(se.data?se.data.branchOrder=J:se.data={branchOrder:J})}}}R.data={...R.data,...V}}},selectNode:p=>{h.value=p,l.value=null},selectEdge:p=>{l.value=p,h.value=null},clearSelection:()=>{h.value=null,l.value=null},resetWorkflow:()=>{const p=$e();t.value=p.nodes,f.value=p.edges,h.value=null,l.value=null,b()},loadWorkflow:(p,V)=>{t.value=p,f.value=V,h.value=null,l.value=null,b()},refreshDataSourceLabels:n,createEmptyGroup:r,addNodeToGroup:_,removeNodeFromGroup:u,dissolveParallelGroup:w,initializeSubsequentFrames:p=>{t.value.find(R=>R.id===p)&&L(p,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(p,V)=>{const R=t.value.find(U=>U.id===p);!R||R.type!=="dataSource"||(R.data.subsequentFrames||(R.data.subsequentFrames=[]),R.data.subsequentFrames.push(V),L(p,{subsequentFrames:[...R.data.subsequentFrames]}))},removeSubsequentFrame:(p,V)=>{const R=t.value.find(Q=>Q.id===p);if(!R||R.type!=="dataSource")return;const U=R.data.subsequentFrames.find(Q=>Q.id===V);U&&f.value.filter(te=>te.source===p&&te.sourceHandle===U.handleId).forEach(te=>i(te.id));const J=R.data.subsequentFrames.filter(Q=>Q.id!==V);J.forEach((Q,te)=>{Q.id==="default-subsequent"?Q.label="后续帧检测":Q.label=`后续帧检测${te+1}`}),L(p,{subsequentFrames:J})},setInvalidIds:(p,V)=>{k.value=new Set(p),E.value=new Set(V)},clearInvalidIds:()=>{k.value=new Set,E.value=new Set},taskSources:D,setTaskSourceArguments:$,updateTaskSourceArgument:O,getTaskSourceArguments:d,clearTaskSources:b}}),ae=()=>{const a=e.inject(Re,null);return a||Fe("aiflow-workflow")()},qe=(a,o,t)=>{const f=[],h=[],l=a.filter(n=>n.type!=="group"),k=l.filter(n=>n.type===C.START);k.length===0?f.push("工作流必须包含一个开始节点"):k.length>1&&f.push("工作流只能包含一个开始节点");const E=l.filter(n=>n.type===C.END);E.length===0?f.push("工作流必须包含一个结束节点"):E.length>1&&f.push("工作流只能包含一个结束节点");const D=l.filter(n=>n.type===C.DATA_SOURCE);D.length===0&&f.push("工作流必须至少包含一个数据源节点"),l.filter(n=>n.type===C.DETECTION_TARGET||n.type===C.SMALL_MODEL||n.type===C.CLASSIFICATION_MODEL).length===0&&f.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(n=>n.type===C.SMALL_MODEL),D.some(n=>n.data.arguments?.needCooperativeDetection===!0),D.length>1,l.forEach(n=>{const x=o.filter(c=>c.target===n.id),P=o.filter(c=>c.source===n.id);if(n.type===C.START&&x.length>0&&h.push("开始节点不应有输入连接"),n.type===C.END&&P.length>0&&h.push("结束节点不应有输出连接"),n.type===C.START&&P.length===0&&f.push("开始节点必须有输出连接"),n.type===C.END&&x.length===0&&f.push("结束节点必须有输入连接"),n.type===C.DATA_SOURCE&&n.data.enableImageSequence)if(P.length===0)f.push({nodeId:n.id,message:`数据源节点"${n.data.label}"开启了图片时序但未连接到任何处理节点`});else{const c=P.filter(S=>S.sourceHandle==="first-frame"),q=n.data.subsequentFrames||[],T=new Set(P.map(S=>S.sourceHandle)),L=q.filter(S=>!T.has(S.handleId));c.length===0&&h.push({nodeId:n.id,message:`数据源节点"${n.data.label}"的首帧检测未连接`}),L.length>0&&h.push({nodeId:n.id,message:`数据源节点"${n.data.label}"有${L.length}个后续帧未连接`})}n.type!==C.START&&n.type!==C.END&&!n.parentNode&&(x.length===0||P.length===0)&&h.push(`节点 "${n.data.label}" 可能未正确连接`)});const O=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)&&f.push({edgeId:n.id,message:`分支"${n.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),O.add(n.source),O.add(n.target)}),l.forEach(n=>{n.parentNode||!O.has(n.id)&&l.length>1&&h.push(`节点 "${n.data.label}" 未连接到工作流`)});const d=at(l,o);f.push(...d);const b=rt(l,o);f.push(...b);const N=lt(l);f.push(...N);const g=st(l,o);f.push(...g);const m=it(l,o);return f.push(...m),t==="task"&&l.filter(x=>x.type===C.FACE_RECOGNITION).forEach(x=>{(!x.data.arguments?.repositoryId||Array.isArray(x.data.arguments.repositoryId)&&x.data.arguments.repositoryId.length===0)&&f.push({nodeId:x.id,message:`人脸识别节点"${x.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:f.length===0,errors:f,warnings:h}},at=(a,o)=>{const t=[],f=a.find(k=>k.type===C.START);if(!f)return t;const h=new Set,l=(k,E,D,$)=>{if(E.includes(k))return;const O=a.find(m=>m.id===k);if(!O)return;const d=[...E,k];let b=[...D],N=[...$];if(O.type===C.TARGET_COUNT&&b.push(O),O.type===C.TIMER_TARGET&&N.push(O),O.type===C.END){const m=d.join("->");h.has(m)||(h.add(m),b.length>1&&t.push(`工作流分支中存在多个目标计数节点(${b.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(n=>`"${n.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const g=o.filter(m=>m.source===k);g.length===0?(b.length>1&&t.push(`工作流分支中存在多个目标计数节点(${b.map(m=>`"${m.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),N.length>1&&t.push(`工作流分支中存在多个目标计时节点(${N.map(m=>`"${m.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):g.forEach(m=>{l(m.target,d,b,N)})};return l(f.id,[],[],[]),t},lt=a=>{const o=[],t=a.filter(h=>h.type===C.DATA_SOURCE),f=a.filter(h=>h.type===C.SMALL_MODEL);return f.length>0&&t.length>1&&f.forEach(h=>{o.push({nodeId:h.id,message:`小模型节点"${h.data.label||h.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},rt=(a,o)=>{const t=[];return a.filter(h=>h.type===C.DATA_SOURCE).forEach(h=>{const l=o.filter(k=>k.source===h.id);if(l.length>1){const k=l.map($=>$.target),D=a.filter($=>k.includes($.id)).filter($=>$.type===C.SMALL_MODEL);if(D.length>0){const $=D.map(O=>`"${O.data.label||O.data.modelName}"`).join("、");t.push(`数据源节点"${h.data.label}"开启了多分支,不能包含小模型节点(${$})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},st=(a,o)=>{const t=[],f=[C.TARGET_COUNT,C.TIMER_TARGET],h={[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时"};return a.filter(k=>k.type===C.SMALL_MODEL).forEach(k=>{o.filter(D=>D.source===k.id).forEach(D=>{const $=a.find(O=>O.id===D.target);if($&&f.includes($.type)){const O=h[$.type]||$.type;t.push(`小模型节点"${k.data.label||k.data.modelName}"不能直接连接${O}节点"${$.data.label}",请先连接检测目标节点`)}})}),t},it=(a,o)=>{const t=[],f=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION],h={[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.FACE_RECOGNITION]:"人脸识别"};return a.filter(k=>f.includes(k.type)).forEach(k=>{const E=o.filter(O=>O.source===k.id),D=f.filter(O=>O!==k.type).concat(C.END),$=k.data.label||h[k.type];E.forEach(O=>{const d=a.find(b=>b.id===O.target);d&&!D.includes(d.type)&&t.push(`${$}节点"${$}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${d.data.label||d.type}"节点`)}),E.length===0&&t.push(`${$}节点"${$}"必须连接到其他辅助节点或结束节点`)}),t},Ge=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},pe=(a,o,t)=>(a[o]||[]).map(f=>t.get(f)).filter(Boolean),He=(a,o)=>{const t={},f=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,k)=>{const E=l.data?.branchOrder??1/0,D=k.data?.branchOrder??1/0;return E-D}).forEach(l=>{if(f.has(l.source)&&f.has(l.target))return;let k=l.source,E=l.target;if(f.has(k)){const D=o.find($=>$.target===k&&!f.has($.source));if(!D)return;k=D.source}if(f.has(E)){const D=o.find($=>$.source===E&&!f.has($.target));if(!D)return;E=D.target}t[k]||(t[k]=[]),t[k].includes(E)||t[k].push(E)}),t},Pe=(a,o)=>{const t=[...o.values()].find(k=>k.type===C.START);if(!t)return[];const f=new Set,h=[],l=k=>{if(f.has(k))return;f.add(k);const E=o.get(k);if(!E)return;E.type!==C.START&&E.type!==C.END&&E.type!=="group"&&h.push(E),(a[k]||[]).forEach($=>l($))};return l(t.id),h},ct=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],Ne=(a,o,t,f)=>{const h=a.nodes.findIndex(k=>k.toolTitle===o);if(h===-1)return;const l=a.nodes[h];l.arguments?.[t]&&(a[f]=l.arguments[t]),a.nodes=a.nodes.filter((k,E)=>E!==h),a.nodes.forEach((k,E)=>{k.sortOrder=E+1})},dt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(f=>({op:f.operator,value:f.value}))}}},mt=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const f={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:f[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const f=t.operator||"gt",h={gt:">",eq:"=",lt:"<"};o.overlap={op:h[f]||">",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}},pt={[C.TARGET_COUNT]:dt,[C.TIMER_TARGET]:mt},ye=(a,o)=>{if(!a)return{};const t=pt[o];if(t)return t(a);const f={...a};return ct.forEach(h=>{delete f[h]}),Object.keys(f).forEach(h=>{const l=f[h];(l==null||l==="")&&delete f[h]}),o===C.FACE_RECOGNITION&&f.repositoryId!==void 0&&(Array.isArray(f.repositoryId)||(f.repositoryId=[f.repositoryId]),f.repositoryId.length===0&&delete f.repositoryId),f},ut=a=>{switch(a.type){case C.DETECTION_TARGET:return a.data.targetId||"";case C.CLASSIFICATION_MODEL:return"cls";case C.OCR:return"ocr";case C.LICENSE_PLATE:return"license_plate";case C.SMALL_MODEL:return a.data.title||a.data.modelName||"";case C.TARGET_COUNT:return"target_count";case C.TIMER_TARGET:return"timer_target";case C.FACE_RECOGNITION:return"face";default:return a.data.label||""}},ft=(a,o,t,f,h=null)=>{const l={toolTitle:ut(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:ye(h??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const k=f.find(E=>E.source===t&&E.target===a.id);k?.data?.branchOrder!==void 0&&k?.data?.branchOrder!==null&&(l.branchOrder=k.data.branchOrder)}return l},je=(a,o,t,f,h,l=null,k=[])=>{const E=[],D=Array.isArray(a)?[...a]:[a],$=new Set;let O=1;for(;D.length>0;){const d=[...D];D.length=0;const b=[];d.forEach(N=>{if($.has(N))return;$.add(N);const g=f.get(N);!g||g.type===C.END||g.type===C.START||g.type===C.DATA_SOURCE||((t[N]||[]).forEach(n=>{const x=f.get(n);x&&x.type!==C.END&&D.push(n)}),k.includes(g.type))||b.push(g)}),b.length>0&&(b.forEach(N=>{const g=l?.(N.id)??null,m=ft(N,O,o,h,g);b.length>1&&(m.nodeLogic="or"),E.push(m)}),O++)}return E},gt=(a=null)=>{const o=a??ae(),t=e.inject("editorMode",ee.ALGORITHM);e.inject("pageMode",he.CREATE);const f=e.inject("editorConfig",null),h=e.computed(()=>qe(o.nodes,o.edges,t)),l=(i,r,_,u)=>{if(_){const w=pe(i,_.id,r).find(G=>G.type===C.SMALL_MODEL);if(w)return w}return u.find(w=>w.type===C.SMALL_MODEL)||null},k=(i,r,_)=>{const w=pe(r,i.id,_).find(F=>F.type===C.SMALL_MODEL);return w?pe(r,w.id,_).filter(F=>F.type!==C.END&&F.type!==C.START&&F.type!==C.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},E=(i,r,_,u,w)=>{if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){const F=l(u,w,_,i);return F?{toolTitle:F.data.title||F.data.modelName||"",toolType:"small",arguments:ye(F.data.arguments,C.SMALL_MODEL)}:null}const G=i.find(F=>F.type===C.DETECTION_TARGET);return G?{toolTitle:G.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:ye(G.data.arguments,C.DETECTION_TARGET)}:null},D=()=>{const i=o.nodes.find(u=>u.type===C.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}),_},$=i=>{if(i.length<=1)return;const r=i.map(u=>u.sortOrder);if(new Set(r).size!==r.length){const u=r.filter((w,G)=>r.indexOf(w)!==G);throw new Error(`分支执行顺序存在重复:${[...new Set(u)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},O=(i,r,_,u,w)=>{let G=[],F;if(i===de.IMAGE_BRANCH)r&&(G=pe(u,r.id,w).filter(I=>I.type!==C.END)),F=r?.id||_.find(I=>I.type===C.DATA_SOURCE)?.id;else if(i===de.SMALL_MODEL_BRANCH){const I=l(u,w,r,_);I&&(G=pe(u,I.id,w).filter(j=>j.type!==C.END),F=I.id)}return{branchStartNodes:G,sourceNodeId:F}},d=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]),b=(i,r,_)=>{const u=new Set,w=[],G=F=>{if(u.has(F))return;u.add(F);const I=_.get(F);if(!I||I.type===C.END)return;d.has(I.type)&&w.push(I),(r[F]||[]).forEach(z=>G(z))};return G(i),w.length>0?w[w.length-1]:null},N=(i,r,_,u,w)=>{const G=`分支${w+1}`,F=b(r,_,u);if(!F)return i?.data?.nodeName||G;if(F.type===C.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===C.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},g=(i,r,_,u,w,G)=>{const{branchStartNodes:F,sourceNodeId:I}=O(r,_,i,u,w);if(F.length===0)return[];const j=[];return F.forEach((z,Y)=>{const y=je([z.id],I,u,w,G);if(y.length===0)return;const A=I?G.find(p=>p.source===I&&p.target===z.id):null,H=A?.data||{},W=H.branchOrder!==void 0&&H.branchOrder!==null?H.branchOrder:Y+1,s={branchName:H.branchName||N(z,z.id,u,w,Y),sortOrder:W,nodes:y};A?.sourceHandle&&(s.sourceHandle=A.sourceHandle),Ne(s,"target_count","targetCount","targetCount"),Ne(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)}),$(j),j},m=()=>{const i=h.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,_=Ge(i),u=He(i,r),w=Pe(u,_),G=[..._.values()].find(F=>F.type===C.START);return{allNodes:i,edges:r,nodeMap:_,adj:u,orderedNodes:w,startNode:G}},x=i=>{const r={ruleName:i?.data?.algorithmName||"",description:"",webhookUrl:""},_=D();Object.keys(_).length>0&&(r.extraConfig=_);const w=(f?.value??f)?.platform;return r.attach=w?{platform:w}:{},r},P=(i,r)=>{const _=i.filter(u=>u.type===C.DATA_SOURCE);if(_.length===0){const u=r.find(w=>w.type===C.DATA_SOURCE);u&&_.push(u)}return _},c=i=>i?.data?.enableImageSequence||i?.data?.arguments?.enableImageSequence||!1?"order":i?.data?.enableBranch&&i.data.branchLogic||"and",q=(i,r,_,u)=>{const{orderedNodes:w,adj:G,nodeMap:F,edges:I}=r,j=k(i,G,F),z=!!i.data.arguments?.needCooperativeDetection,Y=I.find(s=>s.target===i.id),y=Y?.data?.branchOrder!==void 0&&Y?.data?.branchOrder!==null?Y.data.branchOrder:u+1,A={sourceGroupId:null,name:i.data.label||"数据源",sort:y,synEnabled:z};if(z&&(A.windowSeconds=i.data.arguments?.windowSeconds||5),j===de.SMALL_MODEL){const s=E(w,j,i,G,F);return s&&(A.streamConfig=s),A.logic="and",A.children=[],A}if(j===de.SMALL_MODEL_BRANCH){const s=E(w,j,i,G,F);s&&(A.streamConfig=s)}A.logic=c(i);const H=g(w,j,i,G,F,I),W=_.length;return A.children=H.map((s,p)=>({name:s.branchName,branchRefs:[W+p]})),_.push(...H),A},T=(i,r)=>{const u={groupLogic:i?.data?.enableBranch&&i.data.branchLogic||"and",sourceGroups:r};return r.length>=2&&(u.groupWindowSeconds=i.data.groupWindowSeconds),u},L=()=>{if(!m())return null;try{const i=n(),r=x(i.startNode),_=P(i.orderedNodes,i.allNodes),u=[],w=_.map((G,F)=>q(G,i,u,F));return r.ruleSchema=T(i.startNode,w),u.length>0&&(r.branches=u),r}catch(i){return Z.ElMessage.error(i.message||"导出失败"),null}};return{validation:h,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"}),u=URL.createObjectURL(_),w=document.createElement("a");w.href=u,w.download=`workflow_${Date.now()}.json`,w.click(),URL.revokeObjectURL(u),Z.ElMessage.success("导出成功")}}},ht=(a=null)=>{const o=a??ae();e.inject("editorMode",ee.TASK),e.inject("pageMode",he.CREATE);const t=e.inject("editorConfig",null),f=e.inject("taskModeConfig",null),h=e.inject("echoTaskData",null),l=e.computed(()=>({errors:[],warnings:[]})),k=(m,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(T=>T.type===C.DATA_SOURCE).length>=2&&m?.data?.groupWindowSeconds!==void 0&&(x.groupWindowSeconds=m.data.groupWindowSeconds),x.enableVideo=!!m?.data?.enableAlertVideo;const q=m?.data?.schedule;return Array.isArray(q)&&q.length>0?x.schedule=q:x.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],x},E=(m,n,x,P,c="image")=>{const q=pe(n,m.id,x).find(T=>T.type===C.SMALL_MODEL);if(q){const T=m.data?.arguments??{};return{toolTitle:q.data.title||q.data.modelName||"",toolType:"small",arguments:ye(q.data.arguments,C.SMALL_MODEL),decoder:D(T,!0)}}if(c==="stream"){const T=P.find(S=>S.type===C.DETECTION_TARGET);if(!T)return null;const L=m.data?.arguments??{};return{toolTitle:T.data.targetId||"",toolType:"stream",arguments:ye(T.data.arguments,C.DETECTION_TARGET),decoder:D(L,!1)}}return null},D=(m,n)=>{const x=m.mode??(n?3:0),P=m.interval??0,c=m.sw_decoding??(n?"CPU":"GPU");let q=0,T=0;return n?x===3?(q=0,T=0):x===2?(q=1,T=0):x===1&&(q=0,T=P):x===0?(q=0,T=P*25):x===1?(q=0,T=P):x===2&&(q=1,T=0),{sw_decoding:c==="CPU",mode:q,interval:T}},$=(m,n,x,P,c=null)=>{let q=m.id,T=pe(n,m.id,x).filter(B=>B.type!==C.END&&B.type!==C.START);T.length===1&&T[0].type===C.SMALL_MODEL&&(q=T[0].id,T=pe(n,q,x).filter(B=>B.type!==C.END&&B.type!==C.START));const L=T;if(L.length===0)return[];const S=c?B=>o.getTaskSourceArguments(m.id,c,B):null;return L.map((B,i)=>{const r=je([B.id],q,n,x,P,S,[C.SMALL_MODEL]),_=P.find(I=>I.source===q&&I.target===B.id),u=_?.data??{},w=u.branchOrder??i+1,G=u.branchId??null,F={branchId:G,id:G,branchName:u.branchName||B.data?.label||`分支${i+1}`,sortOrder:w,nodes:r};return _?.sourceHandle&&(F.sourceHandle=_.sourceHandle),u.timeWindowSeconds!==void 0&&u.timeWindowSeconds!==null&&(F.timeWindowSeconds=u.timeWindowSeconds),u.branchDescription&&(F.description=u.branchDescription),Ne(F,"target_count","targetCount","targetCount"),Ne(F,"timer_target","duration","duration"),F})},O=(m,n,x,P,c=null,q=null,T=null,L=1,S=!1,B=!1)=>{const i=c??m.deviceType??"",r=i==="1400"||i==="2",_=r?"1400":"camera",u=n==="stream"?2:1,w=r&&q!==null?q==="device"?1:2:m.detectionType??2,F=(h?.value??h)?.graph?.sources??[],I=String(m.sourceId??m.id??""),z=F.find(y=>String(y.sourceId)===I)?.attach??{},Y={deviceType:_,detectionType:w,dataSourceType:u,sourceOrder:x,timeTemplateId:z.timeTemplateId??"",timeTemplateName:z.timeTemplateName??"",platform:P?.platform??"TAI"};if(!r){const y=T?.mode??0;y===3?(Y.frameExtractionType=0,Y.frameInterval=0):y===2?(Y.frameExtractionType=B?1:3,Y.frameInterval=0):(Y.frameExtractionType=y+1,Y.frameInterval=T?.interval??30);const A=T?.sw_decoding??"CPU";Y.frameExtractionSourceType=A==="GPU"?2:1,L===1&&n==="image"&&!S&&!!T?.enablePatrol?Y.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,T?.patrolGroupSize??1)),pollingInterval:"0"}:Y.pollingConfig={enablePolling:0},Y.thirdId=m.thirdId??""}return Y},d=(m,n,x,P,c,q,T)=>{const L=f?.value??f,S=L?.datasource?.getDevices?.(m.id)??[],B=m.data?.sourceGroupId??null,i=!!m.data?.arguments?.needCooperativeDetection,r=i?m.data?.arguments?.windowSeconds??5:void 0,_=n?.data?.streamType??"image",u=pe(x,m.id,P).some(A=>A.type===C.SMALL_MODEL),w=u?"small":_,G=E(m,x,P,T,_),F=m.data?.arguments?.deviceType??null,I=m.data?.arguments?.detectionMode??null,j=m.data?.arguments??null,z=o.getDataSourceCount();if(S.length>0)return S.map((A,H)=>{const W=String(A.sourceId??A.id??""),s=$(m,x,P,c,W),p={sourceId:A.sourceId??A.id??"",sourceName:A.sourceName??A.name??"",sourceType:w,sourceGroupId:B,areas:A.area??A.areas??[],branches:s,attach:O(A,_,H,L,F,I,j,z,i,u),synEnabled:i,...r!==void 0&&{windowSeconds:r}};return G&&(p.streamConfig=G,p.streamUrl="rtsp"),p});const Y=$(m,x,P,c),y={sourceId:"",sourceName:m.data?.label??"数据源",sourceType:w,sourceGroupId:B,areas:[],branches:Y,attach:O({},_,0,L,F,I,j,z,i,u),synEnabled:i};return G&&(y.streamConfig=G,y.streamUrl="rtsp"),[y]},b=()=>{try{const m=o.nodes,n=o.edges,x=Ge(m),P=He(m,n),c=[...x.values()].find(r=>r.type===C.START),q=[...x.values()].find(r=>r.type===C.END),T=t?.value??t,L=Pe(P,x);let S=L.filter(r=>r.type===C.DATA_SOURCE);S.length===0&&(S=m.filter(r=>r.type===C.DATA_SOURCE));const B=S.flatMap((r,_)=>d(r,c,P,x,n,_,L)),i={workflowName:c?.data?.taskName??"",ruleId:T?.ruleId??"",sources:B,extraConfig:k(c,q),description:""};if((T?.platform??"TAI")==="THIRD"){const _=S[0]?.data?.arguments??{},u=_.mode??0,w=_.interval??0;let G,F,I;return u===0?(G="time",F=w,I=0):(G="frame",F=0,u===3?I=0:u===2?I=-1:I=w),{name:i.workflowName,type:"simple",plan:i.extraConfig.schedule??[],inferStrategy:G,timeInterval:F,frameInterval:I,mps:i.extraConfig.enableVideo??!1,graph:i}}return i}catch(m){return Z.ElMessage.error(m.message||"导出失败"),null}};return{validation:l,exportToJSON:b,copyToClipboard:()=>{const m=b();if(!m)return;const n=JSON.stringify(m,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 m=b();if(!m)return;const n=JSON.stringify(m,null,2),x=new Blob([n],{type:"application/json"}),P=URL.createObjectURL(x),c=document.createElement("a");c.href=P,c.download=`task_workflow_${Date.now()}.json`,c.click(),URL.revokeObjectURL(P),Z.ElMessage.success("导出成功")}}},yt=(a=null)=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?ht(a):gt(a),_t=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 Nt(a=null){const o=a??ae(),t=e.inject("editorMode",ee.ALGORITHM),f=e.inject("taskModeConfig",null),h=E=>{const{type:D,data:$}=E,O=$.arguments||{},d=[];switch(D){case C.START:if(t===ee.TASK)if($.taskName?.trim()||d.push("任务名称"),!$.executionTime?.trim())d.push("任务执行时间");else{const b=_t($.executionTime);(!b||!Array.isArray(b.plan)||b.plan.length===0)&&d.push("任务执行时间(计划为空)")}else $.algorithmName?.trim()||d.push("算法名称");break;case C.SMALL_MODEL:$.modelId||d.push("模型选择");break;case C.DETECTION_TARGET:$.targetId||d.push("检测目标选择");break;case C.CLASSIFICATION_MODEL:O.modelId||d.push("分类模型选择");break;case C.DATA_SOURCE:t===ee.TASK&&((f?.value??f)?.datasource?.getDevices?.(E.id)??[]).length===0&&d.push("设备选择");break;case C.TARGET_COUNT:break;case C.TIMER_TARGET:(!O.duration||O.duration<1)&&d.push("持续时间");break}return d},l=E=>{const D=o.nodes.find(O=>O.id===E.source);if(!D)return[];const $=[];return D.type===C.DATA_SOURCE&&D.data?.enableImageSequence===!0&&E.sourceHandle!=="first-frame"&&(!E.data?.timeWindowSeconds||E.data.timeWindowSeconds<1)&&$.push("后续检测帧的持续时间"),$};return{runValidation:()=>{const{nodes:E,edges:D}=o;o.clearInvalidIds();const $=qe(E,D,t),O=$.errors,d=[],b=[],N=[];E.filter(c=>c.type!=="group").forEach(c=>{const q=h(c);q.length>0&&(d.push(c.id),N.push(`节点"${c.data.label}"缺少必填参数:${q.join("、")}`))}),D.forEach(c=>{const q=l(c);q.length>0&&(b.push(c.id),N.push(`分支"${c.data?.branchName||"未命名"}"缺少:${q.join("、")}`))}),O.forEach(c=>{typeof c=="object"&&(c.nodeId&&d.push(c.nodeId),c.edgeId&&b.push(c.edgeId))}),(d.length>0||b.length>0)&&(o.setInvalidIds(d,b),setTimeout(()=>{o.clearInvalidIds()},5e3));const m=O.map(c=>typeof c=="object"?c.message:c),n=$.warnings.map(c=>typeof c=="object"?c.message:c),x=[...m.map(c=>({msg:c,type:"error"})),...N.map(c=>({msg:c,type:"warning"})),...n.map(c=>({msg:c,type:"warning"}))],P=m.length===0&&N.length===0;if(P&&n.length===0)Z.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(x.length>0){const c=x[0];Z.ElMessage[c.type](c.msg)}return P}}}const oe=(a,o)=>{const t=a.__vccOpts||a;for(const[f,h]of o)t[f]=h;return t},Ct={key:0},kt={class:"node-list"},bt={class:"node-list"},xt={class:"node-list"},Et={class:"node-list"},wt=oe({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),f=(h,l)=>{h.dataTransfer&&(h.dataTransfer.setData("application/vueflow",l),h.dataTransfer.effectAllowed="move")};return(h,l)=>{const k=e.resolveComponent("el-icon"),E=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),$=e.resolveComponent("el-collapse-item"),O=e.resolveComponent("FolderOpened"),d=e.resolveComponent("Cpu"),b=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]=g=>!o.value&&(o.value=!0))},[o.value?(e.openBlock(),e.createElementBlock("h3",Ct,"节点工具箱")):(e.openBlock(),e.createBlock(k,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(k,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(g=>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]=g=>t.value=g),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode($,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",kt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=g=>f(g,"start"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),l[14]||(l[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[3]||(l[3]=g=>f(g,"end"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),l[15]||(l[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode($,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=g=>f(g,"dataSource"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(O)]),_:1}),l[16]||(l[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[5]||(l[5]=g=>f(g,"smallModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),l[17]||(l[17]=e.createElementVNode("span",null,"小模型",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[6]||(l[6]=g=>f(g,"detectionTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(b)]),_:1}),l[18]||(l[18]=e.createElementVNode("span",null,"检测目标",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[7]||(l[7]=g=>f(g,"classificationModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode($,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",xt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=g=>f(g,"targetCount"))},[e.createVNode(k,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]=g=>f(g,"timerTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode($,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=g=>f(g,"ocr"))},[e.createVNode(k,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]=g=>f(g,"licensePlate"))},[e.createVNode(k,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]=g=>f(g,"faceRecognition"))},[e.createVNode(k,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 xe{static backendToFrontend(o){const{id:t,title:f,name:h,inputSchema:l,extraConfig:k}=o,E={id:t,title:f,label:h,type:"DETECTION_TARGET",inputSchema:l,extraConfig:k,data:{targetId:f,targetName:h,description:h,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:k?.showStruct!==void 0?!1:void 0}};return Object.keys(E.data).forEach(D=>{E.data[D]===void 0&&delete E.data[D]}),E}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},ze=a=>tt[a]||a,fe=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||ze(a),...t}}),_e=(a,o,t={})=>{const{sourceHandle:f,...h}=t,l={id:`e_${a}_${o}`,source:a,target:o};return f&&(l.sourceHandle=f),Object.keys(h).length>0&&(l.data=h),l},Tt=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(f=>({operator:f.op,value:f.value}))}},St=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}},Vt=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},Bt=()=>({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"]}),At=()=>({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:[]}),Dt=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),Ue=()=>{const a=ae(),o=e.inject("editorConfig",null),t=c=>ot[c]||C.DETECTION_TARGET,f=(c,q)=>c?.find(T=>T.id===String(q))??c?.[q],h=(c,q)=>c.streamConfig?(c.children||[]).some(S=>(S.branchRefs||[]).some(B=>f(q.branches,B)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=c=>!c||typeof c!="object"?"无效的JSON格式":!c.ruleName&&c.ruleName!==""?"缺少 ruleName 字段":c.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",k=c=>{const q=o?.value??o;return c==="small"?q?.smallModels||[]:c==="detection"?q?.detection||[]:c==="classification"?q?.classification?.models||[]:[]},E=()=>{},D=(c,q)=>{c.modelName=q||"",c.title=q||"",c.modelId=q||null;const L=k("small").find(S=>S.title===q);L&&(c.input_schema=L.inputSchema||L.input_schema||{},c.modelId=L.id||L.title,c.modelName=L.name||q,c.modelType=L.type,c.supportDirectAlert=L.supportDirectAlert||!1,c.extraConfig=L.extraConfig)},$=async(c,q)=>{const T=t(c.toolTitle),L={label:c.nodeName||ze(T),arguments:c.arguments||{},input_schema:{}};switch(T){case C.DETECTION_TARGET:L.targetId=c.toolTitle,L.targetName=c.nodeName||"检测目标";{const B=k("detection").find(i=>i.title===c.toolTitle);if(B){let r=xe.backendToFrontend(B).inputSchema||{};if(c.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 C.CLASSIFICATION_MODEL:L.modelName=c.nodeName||"分类模型";break;case C.SMALL_MODEL:D(L,c.toolTitle);break}return c.branchLogic&&(L.enableBranch=!0,L.branchLogic=c.branchLogic),fe(T,q,L)},O=(c,q,T,L)=>{const S={label:"小模型",input_schema:{},arguments:c.arguments||{}};return D(S,c.toolTitle),q===de.SMALL_MODEL_BRANCH&&(S.enableBranch=!0,S.branchLogic=T.logic||"and"),fe("smallModel",L,S)},d=async(c,q,T,L,S,B)=>{let i=q,r=L;const _={branchOrder:c.sortOrder??1,branchName:c.branchName||"",branchId:c.id??null};c.sourceHandle&&(_.sourceHandle=c.sourceHandle);const u=c.timeWindowSeconds??c.extraConfig?.timeWindowSeconds;u!==void 0&&(_.timeWindowSeconds=u),c.description&&(_.branchDescription=c.description);const w=[...c.nodes||[]].sort((y,A)=>(y.sortOrder??0)-(A.sortOrder??0)),G=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]);let F=-1;w.forEach((y,A)=>{G.has(t(y.toolTitle))&&(F=A)});const I=w.map(y=>({kind:"regular",data:y})),j=c.targetCount??c.extraConfig?.targetCount,z=c.duration??c.extraConfig?.duration,Y=[];j&&Y.push({kind:"targetCount",data:j}),z&&Y.push({kind:"timerTarget",data:z}),Y.length>0&&I.splice(F+1,0,...Y);for(let y=0;y<I.length;y++){const A=I[y];let H;if(A.kind==="regular")H=await $(A.data,{x:r,y:T});else if(A.kind==="targetCount"){const W=Tt(A.data);H=fe("targetCount",{x:r,y:T},{label:"目标计数",arguments:W,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const W=St(A.data);H=fe("timerTarget",{x:r,y:T},{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),B.push(_e(i,H.id,y===0?_:void 0)),i=H.id,r+=ie.H_GAP}return{lastNodeId:i,endX:r}},b=c=>{const q=c.ruleSchema.sourceGroups||[],T=c.ruleSchema.groupLogic||"and",L=q.length>1;return fe("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:c.ruleName||"",enableBranch:L?!0:T!=="and",branchLogic:T,groupWindowSeconds:c.ruleSchema.groupWindowSeconds??null})},N=c=>{const q=Vt(c.extraConfig);return fe("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:Bt(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...q}})},g=(c,q)=>[...c||[]].sort((T,L)=>(T.sort??0)-(L.sort??0)).map(T=>{const L=h(T,q),S=[];return(T.children||[]).forEach(B=>{(B.branchRefs||[]).forEach(i=>{const r=f(q.branches,i);r&&S.push(r)})}),S.sort((B,i)=>(B.sortOrder??0)-(i.sortOrder??0)),{sg:T,mode:L,refBranches:S}}),m=c=>{const T=(c.reduce((L,S)=>L+Math.max(S.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-T/2},n=async(c,q,T,L,S,B)=>{const{sg:i,mode:r,refBranches:_}=c,u=Math.max(_.length,1),w=T+(u-1)*ie.V_GAP/2;let G=ie.START_X+ie.H_GAP,F=ie.START_X;const I=i.logic==="order",j=fe("dataSource",{x:G,y:w},{label:i.name||"数据源",sourceGroupId:i.sourceGroupId??null,enableImageSequence:I,input_schema:At(),arguments:{needCooperativeDetection:!!i.synEnabled,windowSeconds:i.windowSeconds||5,enableImageSequence:I},enableBranch:!0,branchLogic:I?"order":i.logic||"and"});L.push(j),S.push(_e(q.id,j.id,{branchOrder:i.sort??null,branchName:i.name||""})),I&&_.forEach((y,A)=>{y.sourceHandle||(y.sourceHandle=A===0?"first-frame":Dt())});const z=I?{dataSourceNode:j,refBranches:_}:null;let Y=j.id;if(r===de.SMALL_MODEL||r===de.SMALL_MODEL_BRANCH){G+=ie.H_GAP;const y=O(i.streamConfig,r,i,{x:G,y:w});L.push(y),S.push(_e(j.id,y.id)),Y=y.id}if(_.length>0)for(let y=0;y<_.length;y++){const A=T+y*ie.V_GAP,{lastNodeId:H,endX:W}=await d(_[y],Y,A,G+ie.H_GAP,L,S);S.push(_e(H,B.id)),W>F&&(F=W)}else{S.push(_e(Y,B.id));const y=G+ie.H_GAP;y>F&&(F=y)}return{branchY:T+u*ie.V_GAP,maxX:F,imageSequenceInfo:z}},x=c=>{for(const{dataSourceNode:q,refBranches:T}of c){const L=T.filter(S=>S.sourceHandle&&S.sourceHandle!=="first-frame");L.length>0&&(q.data.subsequentFrames=L.map((S,B)=>({id:B===0?"default-subsequent":`subsequent-${Date.now()}-${B}`,label:B===0?"后续帧检测":`后续帧检测${B+1}`,handleId:S.sourceHandle})))}};return{importFromJSON:async c=>{const q=l(c);if(q)return Z.ElMessage.error(q),!1;try{E();const T=[],L=[],S=b(c),B=N(c);T.push(S);const i=g(c.ruleSchema.sourceGroups,c);let r=m(i),_=ie.START_X;const u=[];for(const w of i){const G=await n(w,S,r,T,L,B);r=G.branchY,G.maxX>_&&(_=G.maxX),G.imageSequenceInfo&&u.push(G.imageSequenceInfo)}return B.position.x=_+ie.H_GAP,T.push(B),x(u),a.loadWorkflow(T,L),Z.ElMessage.success("导入成功"),!0}catch(T){return Z.ElMessage.error("导入失败: "+(T.message||"未知错误")),!1}},validateImportJSON:l}},Lt=()=>{const a=e.inject("echoTaskData",null),o=e.inject("taskModeConfig",null),t=ae(),{importFromJSON:f,validateImportJSON:h}=Ue(),l=(N,g)=>{const m=N.mode??0,n=N.interval??0,x=N.sw_decoding===!1?"GPU":"CPU";let P,c;return g?m===1?(P=2,c=0):m===0&&n===0?(P=3,c=0):(P=1,c=n):m===1?(P=2,c=0):n===0?(P=0,c=30):(P=0,c=n),{mode:P,interval:c,sw_decoding:x}},k=(N,g)=>{const m=N.frameExtractionType??1,n=N.frameInterval??0,P=(N.frameExtractionSourceType??1)===2?"GPU":"CPU";let c,q;return m===0?(c=3,q=0):m===1&&n===0?(c=g?2:0,q=30):m===1?(c=0,q=n):m===2?(c=1,q=n):m===3?(c=2,q=0):(c=g?3:0,q=30),{mode:c,interval:q,sw_decoding:P}},E=N=>N===1?"device":"platform",D=N=>!N||N.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(N.pollingAmount??1)},$=(N,g,m)=>{if(g){const n=N.find(x=>x.sourceGroupId===g);if(n)return n}return N[m]??null},O=(N,g)=>{if(!N?.branches)return null;for(const m of N.branches){const n=m.nodes?.find(x=>x.toolTitle===g);if(n?.arguments)return{...n.arguments}}return null},d=N=>{if(!Array.isArray(N)||N.length===0)return{timeZone:"",planType:0};const g=N.map(n=>({dayType:Number(n.dayType??0),timePeriod:(n.timePeriod??[]).map(x=>({startTime:x.startTime,endTime:x.endTime}))})),m=g.some(n=>n.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:g}),planType:m}};return{importFromJSON:async N=>{const g=h(N);if(g)return Z.ElMessage.error(g),!1;if(!await f(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??[],c=x.extraConfig??{},q=t.nodes.find(i=>i.type===C.START);if(q){const i=n.name??x.workflowName??"",r=!!c.enableVideo,_=c.schedule??[],{timeZone:u,planType:w}=d(_);t.updateNodeData(q.id,{taskName:i,enableAlertVideo:r,schedule:_,timeZone:u,planType:w,...u?{executionTime:u}:{}})}const T=t.nodes.filter(i=>i.type===C.DATA_SOURCE),L=t.nodes.some(i=>i.type===C.SMALL_MODEL);return T.forEach((i,r)=>{const _=i.data?.sourceGroupId??null,u=$(P,_,r);if(!u)return;const w=u.attach??{},G=u.streamConfig?.decoder??null,F=w.deviceType==="1400"?"1400":"camera",I=F==="camera"?G?l(G,L):k(w,L):{},j=F==="camera"?D(w.pollingConfig):{},z=F==="1400"?{detectionMode:E(w.detectionType)}:{},Y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...Y,deviceType:F,...I,...j,...z}});const y=o?.value??o;if(y?.datasource?.setDevices){const H=(_?P.filter(W=>W.sourceGroupId===_):[u]).map(W=>({sourceId:W.sourceId??"",sourceName:W.sourceName??"",thirdId:W.attach?.thirdId??"",area:W.areas??[]}));y.datasource.setDevices(i.id,H)}}),t.nodes.filter(i=>i.type===C.DETECTION_TARGET).forEach(i=>{const r=new Set,_=[i.id];let u=null;for(;_.length&&!u;){const y=_.shift();if(r.has(y))continue;r.add(y);const A=t.edges.filter(H=>H.target===y);for(const H of A){const W=t.nodes.find(s=>s.id===H.source);if(W){if(W.type===C.DATA_SOURCE){u=W.id;break}_.push(W.id)}}}if(!u)return;const G=(o?.value??o)?.datasource?.getDevices?.(u)??[];if(G.length<=1)return;const F=i.data?.targetId;if(!F)return;const I=G.map(y=>{const A=String(y.sourceId??y.id??""),H=P.find(W=>String(W.sourceId)===A);if(!H?.branches)return{deviceId:A,args:null};for(const W of H.branches){const s=W.nodes?.find(p=>p.toolTitle===F);if(s?.arguments)return{deviceId:A,args:{...s.arguments}}}return{deviceId:A,args:null}}),j=I.filter(y=>y.args!==null);if(j.length===0)return;const z=JSON.stringify(j[0].args);if(j.some(y=>JSON.stringify(y.args)!==z)){const y=i.data?.arguments??{};t.updateNodeData(i.id,{arguments:{...y,configMode:"perDevice"}}),I.forEach(({deviceId:A,args:H})=>{H&&t.setTaskSourceArguments(u,A,i.id,H)})}}),t.nodes.filter(i=>i.type===C.FACE_RECOGNITION).forEach(i=>{const r=new Set,_=[i.id];let u=null;for(;_.length&&!u;){const Y=_.shift();if(r.has(Y))continue;r.add(Y);const y=t.edges.filter(A=>A.target===Y);for(const A of y){const H=t.nodes.find(W=>W.id===A.source);if(H){if(H.type===C.DATA_SOURCE){u=H.id;break}_.push(H.id)}}}const G=(u?t.nodes.find(Y=>Y.id===u):null)?.data?.sourceGroupId??null,F=T.findIndex(Y=>Y.id===u),I=$(P,G,F>=0?F:0);if(!I)return;const j=O(I,"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:h}},Ot=()=>e.inject("editorMode",ee.ALGORITHM)===ee.TASK?Lt():Ue(),Mt={class:"node-content"},It={class:"node-label"},Rt=oe({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const f=e.resolveComponent("VideoPlay"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"]),e.createElementVNode("div",Mt,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("span",It,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),$t={class:"node-content"},Ft={class:"node-label"},qt=oe({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const f=e.resolveComponent("CircleClose"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",$t,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("span",Ft,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Gt={class:"node-content"},Ht={class:"node-info"},Pt={class:"node-label"},jt={key:1,class:"sequence-handles"},zt={class:"handle-item"},Ut={class:"handle-label"},Wt={key:0,class:"handle-item add-button-item"},Jt=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(),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,O=>{const d=Math.random()*16|0;return(O==="x"?d:d&3|8).toString(16)}),k=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let E=!1;const D=()=>{if(E)return;E=!0;const O=o.data.subsequentFrames||[],d={id:l(),label:`后续帧检测${O.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,d),setTimeout(()=>{E=!1},300)},$=async O=>{const d=o.data.subsequentFrames.find(N=>N.id===O);if(t.edges.some(N=>N.source===o.id&&N.sourceHandle===d.handleId))try{await Z.ElMessageBox.confirm(`删除"${d.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,O)};return(O,d)=>{const b=e.resolveComponent("FolderOpened"),N=e.resolveComponent("el-icon"),g=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",Gt,[e.createVNode(N,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(b)]),_:1}),e.createElementVNode("div",Ht,[e.createElementVNode("div",Pt,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(v.Handle),{key:0,type:"source",position:e.unref(v.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",jt,[e.createElementVNode("div",zt,[d[0]||(d[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,m=>(e.openBlock(),e.createElementBlock("div",{key:m.id,class:"handle-item"},[e.createElementVNode("span",Ut,e.toDisplayString(m.label),1),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right,id:m.handleId,class:"handle-right"},null,8,["position","id"]),m.id!=="default-subsequent"&&!h.value?(e.openBlock(),e.createBlock(N,{key:0,class:"delete-icon",onClick:e.withModifiers(n=>$(m.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Wt,[e.createVNode(g,{size:"small",type:"primary",icon:e.unref(X.Plus),circle:"",onClick:e.withModifiers(D,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Yt={class:"node-content"},Xt={class:"node-info"},Qt={class:"node-label"},Kt={key:0,class:"node-model"},Zt={key:1,class:"node-placeholder"},vt={key:0,class:"direct-alert-badge"},eo=oe({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const f=e.resolveComponent("Cpu"),h=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Yt,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("div",Xt,[e.createElementVNode("div",Qt,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",Kt,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",Zt,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",vt,[e.createVNode(h,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),to={class:"node-content"},oo={class:"node-info"},no={class:"node-target"},ao={class:"node-params"},lo=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||"检测目标",f=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),h=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const l=o.data.arguments.object;if(Array.isArray(l))return l.filter(E=>E&&E.trim()!=="").length}return null});return(l,k)=>{const E=e.resolveComponent("View"),D=e.resolveComponent("el-icon"),$=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",to,[e.createVNode(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(E)]),_:1}),e.createElementVNode("div",oo,[k[1]||(k[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",no,e.toDisplayString(t()),1),e.createElementVNode("div",ao,[h.value?(e.openBlock(),e.createBlock($,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),f.value?(e.openBlock(),e.createBlock($,{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($,{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($,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...k[0]||(k[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),ro={class:"node-content"},so={class:"node-info"},io={class:"node-label"},co={key:0,class:"node-model"},mo={key:1,class:"node-placeholder"},po={key:2,class:"node-stats"},uo=oe({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const f=e.resolveComponent("Grid"),h=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",ro,[e.createVNode(h,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(f)]),_:1}),e.createElementVNode("div",so,[e.createElementVNode("div",io,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",co,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",mo,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",po,[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"]]),fo={class:"node-content"},go={class:"node-info"},ho={class:"node-label"},yo={class:"node-params"},_o=oe({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return ae(),(o,t)=>{const f=e.resolveComponent("el-icon"),h=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",fo,[e.createVNode(f,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Document))]),_:1}),e.createElementVNode("div",go,[e.createElementVNode("div",ho,e.toDisplayString(a.data.label),1),e.createElementVNode("div",yo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(h,{key:0,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),No={class:"node-content"},Co={class:"node-info"},ko={class:"node-label"},bo={class:"node-scope"},xo={class:"node-params"},Eo=oe({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),f=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const l=t.nodes.find(k=>k.id===h);return l?l.data.label:"检测范围"};return(h,l)=>{const k=e.resolveComponent("Document"),E=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",No,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(k)]),_:1}),e.createElementVNode("div",Co,[e.createElementVNode("div",ko,e.toDisplayString(a.data.label),1),e.createElementVNode("div",bo,e.toDisplayString(f()),1),e.createElementVNode("div",xo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minPlateWidth!==void 0&&a.data.arguments?.minPlateHeight!==void 0?(e.openBlock(),e.createBlock(D,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minPlateWidth)+"×"+e.toDisplayString(a.data.arguments.minPlateHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),wo={class:"node-content"},To={class:"node-info"},So={class:"node-params"},Vo=oe({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},f=e.computed(()=>{const h=o.data.arguments?.alertConditions||[];if(h.length===0)return"";if(h.length===1){const k=h[0];return`数量 ${t[k.operator]||k.operator} ${k.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${h.length} 个条件(${l})`});return(h,l)=>{const k=e.resolveComponent("el-icon"),E=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",wo,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.DataAnalysis))]),_:1}),e.createElementVNode("div",To,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",So,[f.value?(e.openBlock(),e.createBlock(E,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.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"]]),Bo={class:"node-content"},Ao={class:"node-info"},Do={class:"node-label"},Lo={class:"node-params"},Oo=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||"目标计时"),f=e.computed(()=>`${o.data.arguments?.duration||30}秒`),h=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,k)=>{const E=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:a.selected}])},[e.createVNode(e.unref(v.Handle),{type:"target",position:e.unref(v.Position).Left},null,8,["position"]),e.createElementVNode("div",Bo,[e.createVNode(E,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Timer))]),_:1}),e.createElementVNode("div",Ao,[e.createElementVNode("div",Do,e.toDisplayString(t.value),1),e.createElementVNode("div",Lo,[e.createVNode(D,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.value),1)]),_:1}),h.value?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(v.Handle),{type:"source",position:e.unref(v.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Mo={class:"group-label"},Io=oe({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},f=e.computed(()=>t[o.data.branchLogic]??"ALL"),h=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),l={width:"8px",height:"8px",borderRadius:"2px"},k={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(E,D)=>{const $=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",Mo,[e.createVNode($,{type:h.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.value),1)]),_:1},8,["type"]),D[0]||(D[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(et.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":k})],2)}}},[["__scopeId","data-v-adf6607d"]]),Ro={class:"node-content"},$o={class:"node-info"},Fo={class:"node-label"},qo={class:"node-scope"},Go={class:"node-params"},Ho=oe({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),f=()=>{const h=o.data.arguments?.detectionScope;if(!h)return"";const l=t.nodes.find(k=>k.id===h);return l?l.data.label:"检测范围"};return(h,l)=>{const k=e.resolveComponent("el-icon"),E=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",Ro,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.User))]),_:1}),e.createElementVNode("div",$o,[e.createElementVNode("div",Fo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",qo,e.toDisplayString(f()),1),e.createElementVNode("div",Go,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(E,{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(E,{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"]]),Po={class:"quick-add-menu__list"},jo=["onClick"],zo={class:"quick-add-menu__icon"},Uo={class:"quick-add-menu__label"},Wo={key:0,class:"quick-add-menu__empty"},ue=8,Jo=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),f=e.ref({x:0,y:0});e.watch(()=>o.visible,async E=>{if(!E||(f.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const D=t.value.getBoundingClientRect(),$=window.innerWidth,O=window.innerHeight;let{x:d,y:b}=o.position;d+D.width>$-ue&&(d=$-D.width-ue),b+D.height>O-ue&&(b=O-D.height-ue),d<ue&&(d=ue),b<ue&&(b=ue),f.value={x:d,y:b}});const h=e.computed(()=>({left:f.value.x+"px",top:f.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:"🏁"}],k=e.computed(()=>{switch(o.sourceNodeType){case"start":return l.filter(E=>E.type==="dataSource");case"dataSource":return l.filter(E=>E.type==="smallModel"||E.type==="detectionTarget"||E.type==="classificationModel");case"smallModel":return l.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel"&&E.type!=="targetCount"&&E.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(E=>E.type!=="dataSource"&&E.type!=="smallModel");case"timerTarget":return l.filter(E=>["ocr","faceRecognition","licensePlate","end"].includes(E.type));case"targetCount":return l.filter(E=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(E.type));case"ocr":return l.filter(E=>["licensePlate","faceRecognition","end"].includes(E.type));case"licensePlate":return l.filter(E=>["ocr","faceRecognition","end"].includes(E.type));case"faceRecognition":return l.filter(E=>["ocr","licensePlate","end"].includes(E.type));default:return[]}});return(E,D)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[a.visible?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRef",ref:t,class:"quick-add-menu",style:e.normalizeStyle(h.value)},[D[1]||(D[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Po,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,$=>(e.openBlock(),e.createElementBlock("li",{key:$.type,class:"quick-add-menu__item",onClick:O=>E.$emit("select",$.type)},[e.createElementVNode("span",zo,e.toDisplayString($.icon),1),e.createElementVNode("span",Uo,e.toDisplayString($.label),1)],8,jo))),128)),k.value.length===0?(e.openBlock(),e.createElementBlock("li",Wo," 无可连接节点 ")):e.createCommentVNode("",!0)])],4)):e.createCommentVNode("",!0),a.visible?(e.openBlock(),e.createElementBlock("div",{key:1,class:"quick-add-menu__overlay",onClick:D[0]||(D[0]=$=>E.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Yo={class:"workflow-canvas"},We=5,Xo=oe({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:f,onConnectStart:h,onConnectEnd:l}=v.useVueFlow(),k=e.inject("editorConfig",null),E=e.inject("editorMode",ee.ALGORITHM),D=e.computed(()=>E===ee.TASK),$=e.inject("echoAlgodata",null),{importFromJSON:O}=Ot();e.watch($,async s=>{if(s&&Object.keys(s).length>0&&(await e.nextTick(),await O(s),D.value)){const p=s?.ruleSchema?.sourceGroups??[];let V=null;if(p.some(R=>R.streamConfig)?V="stream":(p.length>1||p.some(R=>(R.children??[]).length>1))&&(V="image"),V){const R=o.nodes.find(U=>U.type===C.START);R&&o.updateNodeData(R.id,{streamType:V})}}},{immediate:!0});const d=(s,p)=>{if(!p?.properties)return s;const V={};return Object.entries(p.properties).forEach(([R,U])=>{U.default!==void 0&&(V[R]=U.default)}),s.data.arguments={...V,...s.data.arguments},s},b=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),N=()=>{b.visible=!1,b.sourceNodeId=null,b.sourceNodeType=null,b.sourceHandleId=null,P=!1};let g=null,m=!1,n=null,x=null,P=!1;const c=()=>{n&&(document.removeEventListener("mousemove",n),n=null),x&&(document.removeEventListener("mouseup",x),x=null)};h(({nodeId:s,handleId:p,handleType:V,event:R})=>{if(V!=="source")return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线");return}const U=o.nodes.find(ne=>ne.id===s);if(!U||U.type==="end")return;if(U.type===C.DATA_SOURCE&&U.data?.enableImageSequence){if(p&&o.edges.filter(M=>M.source===s&&M.sourceHandle===p).length>=1)return}else if(U.type!==C.START&&U.type!==C.DATA_SOURCE&&o.edges.filter(M=>M.source===s).length>=1)return;const J=R?.target;let Q=0,te=0;if(J){const ne=J.getBoundingClientRect();Q=ne.right+12,te=ne.top-8}g={nodeId:s,sourceNodeType:U.type,handleId:p,menuX:Q,menuY:te,flowPos:{...U.position}},m=!1;const se=R?.clientX??0,ce=R?.clientY??0;c(),n=ne=>{(Math.abs(ne.clientX-se)>We||Math.abs(ne.clientY-ce)>We)&&(m=!0,c())},x=()=>{if(c(),!m&&g){P=!0;const ne=g;b.visible=!0,b.screenPos={x:ne.menuX,y:ne.menuY},b.sourceNodeId=ne.nodeId,b.sourceNodeType=ne.sourceNodeType,b.sourceHandleId=ne.handleId,b.flowPos=ne.flowPos}g=null},document.addEventListener("mousemove",n),document.addEventListener("mouseup",x)});const q=s=>{const p=b.sourceNodeId,V=o.nodes.find(K=>K.id===p);if(!V){N();return}if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点"),N();return}const R=V.position.x+250,U=V.position.y;let J={x:R,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-R)<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(Ce=>Ce.source===p&&Ce.target===K.id)){Z.ElMessage.warning("已经连接到结束节点"),N();return}const ge=L(V,K);if(!ge.valid){Z.ElMessage.warning(ge.message),N();return}o.addConnection({source:p,target:K.id,sourceHandle:b.sourceHandleId||null,targetHandle:null}),F(),N(),Z.ElMessage.success("已连接到结束节点");return}}let ne;switch(s){case"end":ne=ke(J);break;case"dataSource":ne=be(J);break;case"smallModel":ne=Ve(J);break;case"detectionTarget":ne=Be(J);break;case"classificationModel":ne=Ae(J);break;case"ocr":{const K=k?.value??k;ne=d(De(J),K?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const K=k?.value??k;ne=d(Le(J),K?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const K=k?.value??k;ne=d(Ie(J),K?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":ne=Oe(J);break;case"timerTarget":ne=Me(J);break;default:N();return}const M=L(V,ne);if(!M.valid){Z.ElMessage.warning(M.message),N();return}o.addNode(ne),o.addConnection({source:p,target:ne.id,sourceHandle:b.sourceHandleId||null,targetHandle:null}),F(),N(),Z.ElMessage.success(`已添加${ne.data.label}并连接`)},T=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],L=(s,p)=>{if(s?.parentNode&&p?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(p?.parentNode&&s?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(s?.type===C.START){if(p?.type!==C.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(U=>U.source===s.id).some(U=>o.nodes.find(Q=>Q.id===U.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(p?.type===C.SMALL_MODEL){if(s?.type!==C.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!==C.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(s?.type===C.DATA_SOURCE){if(p?.type!==C.SMALL_MODEL&&p?.type!==C.DETECTION_TARGET&&p?.type!==C.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===C.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(s?.type===C.SMALL_MODEL&&(p?.type===C.TARGET_COUNT||p?.type===C.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(s?.type===C.TARGET_COUNT&&![C.TIMER_TARGET,C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(p?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(s?.type===C.TIMER_TARGET&&![C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(p?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const V=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION];return V.includes(s?.type)&&!V.filter(U=>U!==s.type).concat(C.END).includes(p?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:p?.type!==C.END&&o.edges.filter(U=>U.target===p?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},S=e.markRaw({start:Rt,end:qt,dataSource:Jt,smallModel:eo,detectionTarget:lo,classificationModel:uo,ocr:_o,licensePlate:Eo,targetCount:Vo,timerTarget:Oo,group:Io,faceRecognition:Ho}),B=e.computed({get:()=>o.nodes,set:s=>{o.nodes=s}}),i=e.computed({get:()=>o.edges,set:s=>{o.edges=s}}),r=s=>{s.forEach(p=>{if(p.type==="position"&&p.position)o.updateNodePosition(p.id,p.position);else if(p.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除节点");return}const V=o.nodes.find(U=>U.id===p.id);if(V&&V.type===C.START){Z.ElMessage.warning("开始节点不可删除");return}if(V&&V.type===C.END){Z.ElMessage.warning("结束节点不可删除");return}if(V&&V.type==="group"){Z.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const R=V?.parentNode;o.removeNode(p.id),R&&o.nodes.filter(J=>J.parentNode===R).length===0&&o.dissolveParallelGroup(R)}})},_=s=>{s.forEach(p=>{if(p.type==="remove"){if(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(p.id)}})},u=s=>{if(P)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加连接线"),N();return}const p=o.nodes.find(U=>U.id===s.source),V=o.nodes.find(U=>U.id===s.target),R=L(p,V);if(!R.valid){Z.ElMessage.warning(R.message),N();return}if(p?.type===C.DATA_SOURCE&&p.data.enableImageSequence&&s.sourceHandle&&o.edges.filter(J=>J.source===s.source&&J.sourceHandle===s.sourceHandle).length>=1){const J=s.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";Z.ElMessage.warning(`${J}连接点只能连接一个节点`);return}if(T.includes(p?.type)&&!p.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 p=o.nodes.find(V=>V.id===s.source);if(!p)return"";if(p.type===C.START){const V=p.data.branchLogic||"and",R=w(V),U=s.data?.branchOrder;return U!=null?`${R} - 执行顺序 ${U}`:R}if(p.type===C.DATA_SOURCE){if(p.data?.enableImageSequence){const J=s.sourceHandle==="first-frame"?"首帧":"后续帧",Q=s.data?.branchOrder;return Q!=null?`${J} - 执行顺序 ${Q}`:J}const V=p.data.branchLogic||"and",R=w(V),U=s.data?.branchOrder;return U!=null?`${R} - 执行顺序 ${U}`:R}return""},F=()=>{o.edges.forEach(s=>{const p=G(s);s.label!==p&&(s.label=p,s.labelStyle=p?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,s.labelBgStyle=p?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,s.labelBgPadding=p?[4,6]:void 0)})},I=()=>{o.nodes.forEach(s=>{if(s.type!=="group")return;const p=s.data.sourceNodeId;if(!p)return;const V=o.nodes.find(R=>R.id===p);V?.data?.enableBranch&&V.data.branchLogic!==s.data.branchLogic&&o.updateNodeData(s.id,{branchLogic:V.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(s=>T.includes(s.type)).map(s=>({id:s.id,enableBranch:s.data.enableBranch,branchLogic:s.data.branchLogic})),(s,p)=>{p&&s.forEach(V=>{const R=p.find(U=>U.id===V.id);if(R){if(V.enableBranch&&!R.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&&R.enableBranch){const U=o.nodes.find(J=>J.type==="group"&&J.data.sourceNodeId===V.id);U&&o.dissolveParallelGroup(U.id)}if(V.enableBranch&&R.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(),I()},{deep:!0}),e.watch(()=>o.edges.map(s=>({id:s.id,branchOrder:s.data?.branchOrder})),(s,p)=>{F(),p&&s.forEach(V=>{const R=p.find(U=>U.id===V.id);if(R&&R.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===C.DATA_SOURCE&&o.updateNodePosition(J.id,{x:J.position.x,y:J.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([s,p])=>{o.nodes.forEach(V=>{s.has(V.id)?V.class="invalid-node":V.class==="invalid-node"&&(V.class="")}),o.edges.forEach(V=>{p.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(D.value){Z.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(s.edge.id)},y=()=>{o.clearSelection()},A=({node:s})=>{if(s.type==="group"||!T.includes(s.type))return;const p=o.nodes.filter(R=>R.type==="group");let V=null;for(const R of p){const U=f(R.id);if(!U)continue;const J=U.dimensions?.width||parseInt(R.style?.width)||300,Q=U.dimensions?.height||parseInt(R.style?.height)||160;let te=s.position.x,se=s.position.y;if(s.parentNode){const ge=o.nodes.find(Ce=>Ce.id===s.parentNode);ge&&(te+=ge.position.x,se+=ge.position.y)}const ce=f(s.id),ne=ce?.dimensions?.width||160,M=ce?.dimensions?.height||60,K=te+ne/2,le=se+M/2;if(K>=R.position.x&&K<=R.position.x+J&&le>=R.position.y&&le<=R.position.y+Q){V=R.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 p=s.dataTransfer?.getData("application/vueflow");if(!p)return;if(D.value){Z.ElMessage.warning("算法任务模式下不允许添加节点");return}if(p===C.START&&o.getNodeCountByType(C.START)>=1){Z.ElMessage.warning("工作流只能有一个开始节点");return}if(p===C.END&&o.getNodeCountByType(C.END)>=1){Z.ElMessage.warning("工作流只能有一个结束节点");return}const V=160,R=60,U=t({x:s.clientX,y:s.clientY}),J={x:U.x-V/2,y:U.y-R/2};let Q;switch(p){case C.START:Q=Se(J);break;case C.END:Q=ke(J);break;case C.DATA_SOURCE:Q=be(J);break;case C.SMALL_MODEL:Q=Ve(J);break;case C.DETECTION_TARGET:Q=Be(J);break;case C.CLASSIFICATION_MODEL:Q=Ae(J);break;case C.OCR:{const te=k?.value??k;Q=d(De(J),te?.ocr?.[0]?.inputSchema);break}case C.LICENSE_PLATE:{const te=k?.value??k;Q=d(Le(J),te?.license_plate?.[0]?.inputSchema);break}case C.TARGET_COUNT:Q=Oe(J);break;case C.TIMER_TARGET:Q=Me(J);break;case C.FACE_RECOGNITION:{const te=k?.value??k;Q=d(Ie(J),te?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(Q),Z.ElMessage.success("节点已添加")};return(s,p)=>(e.openBlock(),e.createElementBlock("div",Yo,[e.createVNode(e.unref(v.VueFlow),{nodes:B.value,"onUpdate:nodes":p[0]||(p[0]=V=>B.value=V),edges:i.value,"onUpdate:edges":p[1]||(p[1]=V=>i.value=V),"node-types":e.unref(S),onNodesChange:r,onEdgesChange:_,onConnect:u,onNodeClick:j,onEdgeClick:z,onEdgeDoubleClick:Y,onPaneClick:y,onDrop:W,onDragover:H,onNodeDragStop:A,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(Ze.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(ve.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Jo,{visible:b.visible,position:b.screenPos,"source-node-type":b.sourceNodeType,onSelect:q,onClose:N},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-8f161693"]]),Qo={class:"config-header"},Ko={key:0,class:"config-section"},Zo={key:1,class:"config-section"},vo=oe({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",ee.ALGORITHM),f=e.computed(()=>t===ee.TASK),h=e.computed(()=>{const O=o.selectedEdge;return O&&o.nodes.find(b=>b.id===O.source)?.data?.enableBranch?O:null}),l=e.computed(()=>h.value&&o.nodes.find(d=>d.id===h.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),k=e.computed(()=>{if(!h.value)return!1;const O=o.nodes.find(d=>d.id===h.value.source);return(O?.type==="dataSource"||O?.type==="start")&&O?.data?.enableBranch}),E=e.computed(()=>{if(!h.value)return 1;const O=o.nodes.find(d=>d.id===h.value.source);return O?o.edges.filter(d=>d.source===O.id).length:1}),D=e.computed(()=>{if(!h.value)return!1;const O=o.nodes.find(d=>d.id===h.value.source);return O?O.type==="dataSource"&&O.data?.enableImageSequence===!0&&h.value.sourceHandle!=="first-frame":!1}),$=O=>{h.value&&o.updateEdgeData(h.value.id,O)};return(O,d)=>{const b=e.resolveComponent("el-divider"),N=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-text"),m=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",Qo,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(b),D.value?(e.openBlock(),e.createElementBlock("div",Ko,[d[3]||(d[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(m,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(N,{"model-value":h.value?.data?.timeWindowSeconds??null,onChange:d[0]||(d[0]=c=>$({timeWindowSeconds:c})),min:1,precision:0,style:{width:"100%"},"controls-position":"right",placeholder:"请输入持续时间"},null,8,["model-value"]),e.createVNode(g,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...d[2]||(d[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),k.value?(e.openBlock(),e.createElementBlock("div",Zo,[d[5]||(d[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(m,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":h.value?.data?.branchOrder??null,disabled:f.value,onChange:d[1]||(d[1]=c=>$({branchOrder:c})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(E.value,c=>(e.openBlock(),e.createBlock(x,{key:c,label:`执行顺序 ${c}`,value:c},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(g,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...d[4]||(d[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),en={class:"config-section"},tn=oe({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const f=e.resolveComponent("el-divider"),h=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(f),e.createElementVNode("div",en,[e.createVNode(h,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),on={class:"time-init-container"},nn={key:0,class:"time-header flex-x-start"},an={class:"tab-type flex-x"},ln={class:"time-content"},rn={id:"time-content-table-body"},sn=["onClick"],cn=["onClick"],dn=["data-sort","data-value","data-day","data-type","onMousedown"],mn={key:1},pn=["data-sort","data-value","data-type","onMousedown"],un={class:"time-list"},fn={key:0,class:"time-list-title"},gn={key:1,style:{"margin-right":"10px"}},hn=oe({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,f=e.ref(0);let h,l,k,E,D;const $=e.ref(new Map),O=e.ref(new Map),d=e.computed(()=>f.value===0?$.value:O.value);e.onMounted(()=>{h=document.querySelector("#time-content-table-body"),l=h.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 b=u=>{f.value!==u&&(f.value=u,e.nextTick(()=>{l=h.querySelectorAll("td.sel-able[data-type]"),l.forEach(G=>G.classList.remove("selected")),(u===0?$.value:O.value).forEach((G,F)=>{G.origin.forEach(I=>{Array.from(l).forEach(j=>{Number(j.dataset.sort)==I.sort&&Number(j.dataset.value)==I.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}]),g=(u,w,G)=>{t.operationType!=3&&G.which==1&&(E=u,k=Number(G.target.dataset.value),G.target.classList.contains("selected")?(G.target.classList.remove("selected"),D=""):(D="selected",G.target.classList.add("selected")),m(),T())},m=()=>{l.forEach(u=>{u.addEventListener("mouseover",x,!1,{once:!0})})},n=()=>{l.forEach(u=>{u.removeEventListener("mouseover",x)})},x=u=>{u.target.classList.remove("selected"),D&&u.target.classList.add(D);let w=Number(u.target.dataset.value),G=Number(u.target.dataset.day),F=G>E?G:E,I=G<E?G:E,j=w>k?w:k,z=w<k?w:k;for(let Y=I;Y<=F;Y++)for(let y=z;y<=j;y++){let A=document.querySelector(`td[data-value="${y}"][data-day="${Y}"]`);A.classList.remove("selected"),D&&A.classList.add(D)}T()},P=u=>{if(t.operationType==3)return;let w=[];l.forEach(G=>{Number(G.dataset.day)==u&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),T()},c=u=>{if(t.operationType==3)return;let w=[];l.forEach(G=>{Number(G.dataset.sort)==u&&w.push(G)}),w.find(G=>!G.classList.contains("selected"))?w.forEach(G=>G.classList.add("selected")):w.forEach(G=>G.classList.remove("selected")),T()},q=()=>{l.forEach(w=>{w.classList.remove("selected")}),(f.value===0?$:O).value.clear()},T=()=>{const u=f.value===0?$:O;u.value.clear(),l.forEach(w=>{if(w.classList.contains("selected")){let G=w.dataset.day,F=w.dataset.sort,I=w.dataset.value;u.value.get(G)?u.value.get(G).origin.push({sort:Number(F),value:Number(I)}):u.value.set(G,{origin:[{sort:Number(F),value:Number(I)}],timeList:[]})}})},L=u=>{let F=d.value.get(u).origin.map(I=>I.value).reduce((I,j,z,Y)=>(z==0?I.push([j]):j==Y[z-1]+1?I[I.length-1].push(j):I.push([j]),I),[]);return F=F.map(I=>{let j=Math.max(...I)+1,z=Math.min(...I)+1,Y=z%2==0?30:0,y=j%2==0?0:30,A=S(Math.ceil(z/2)-1),H=S(Math.ceil(j/2)-(y==0?0:1));return{dayType:u,startTime:A+":"+(Y==0?"00":Y),endTime:H+":"+(y==0?"00":y)}}),d.value.get(u).timeList=F,F.map(I=>I.startTime+"-"+I.endTime).join()};function S(u){return u<10?"0"+u:u}const B=(u,w)=>{$.value.clear(),O.value.clear(),l.forEach(j=>j.classList.remove("selected")),f.value=w;const G=w===0?$:O,F=JSON.parse(u);let I=[];F.plan.forEach(j=>{j.timePeriod.forEach(z=>{I.push({...z,dayType:j.dayType})})}),e.nextTick(()=>{l=h.querySelectorAll("td.sel-able[data-type]"),I.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 y=Number(Y.startTime.split(":")[1]),A=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)y==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(A==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(y=>{Number(y.dataset.sort)==Y.sort&&Number(y.dataset.value)==Y.value&&Number(y.dataset.day)==z&&y.classList.add("selected")})})})})},i=(u,w)=>u.map(I=>I.value).sort((I,j)=>I-j).reduce((I,j,z,Y)=>(z==0?I.push([j]):j==Y[z-1]+1?I[I.length-1].push(j):I.push([j]),I),[]).map(I=>{let j=Math.max(...I)+1,z=Math.min(...I)+1,Y=z%2==0?30:0,y=j%2==0?0:30,A=S(Math.ceil(z/2)-1),H=S(Math.ceil(j/2)-(y==0?0:1));return{dayType:w,startTime:A+":"+(Y==0?"00":Y),endTime:H+":"+(y==0?"00":y)}});return o({getTimeData:()=>{(f.value===0?O:$).value.clear();let w=[];d.value.forEach((I,j)=>{const z=i(I.origin,j);w=w.concat(z)});let G={plan:[]},F=w.map(I=>I.dayType).filter((I,j,z)=>z.indexOf(I)===j);return F.length?(F.forEach(I=>{G.plan.push({dayType:I,timePeriod:w.filter(j=>j.dayType===I).map(j=>({startTime:j.startTime,endTime:j.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(G),planType:f.value}):{validTime:!1}},revertByTime:B,resetFn:()=>{f.value=0,$.value.clear(),O.value.clear(),e.nextTick(()=>{l.forEach(u=>{u.classList.remove("selected")}),l=h.querySelectorAll("td.sel-able[data-type]")})}}),(u,w)=>{const G=e.resolveComponent("el-icon"),F=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",on,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",nn,[e.createElementVNode("div",an,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:f.value==0}]),onClick:w[0]||(w[0]=I=>b(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:f.value==1}]),onClick:w[1]||(w[1]=I=>b(1))}," 日计划 ",2)]),e.createVNode(F,{class:"rm-icon",link:"",type:"danger",onClick:q},{default:e.withCtx(()=>[e.createVNode(G,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",ln,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:w[3]||(w[3]=I=>I.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",rn,[e.createElementVNode("tr",null,[w[4]||(w[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,I=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:j=>c(I-1)},e.toDisplayString(I-1),9,sn)),64))]),f.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(N.value.filter(I=>I.value!=0),I=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:j=>P(I.value)},e.toDisplayString(I.name),9,cn),(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":I.value,"data-type":f.value,onMousedown:z=>g(I.value,j,z)},null,40,dn)),64))]))),256)):e.createCommentVNode("",!0),f.value==1?(e.openBlock(),e.createElementBlock("tr",mn,[e.createElementVNode("th",{onClick:w[2]||(w[2]=I=>P(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,I=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((I-1)/2),"data-value":I-1,"data-day":0,"data-type":f.value,onMousedown:j=>g(0,I,j)},null,40,pn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",un,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value.keys(),I=>(e.openBlock(),e.createElementBlock("div",null,[f.value==0?(e.openBlock(),e.createElementBlock("span",fn,[w[6]||(w[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(N.value.find(j=>j.value==I).name),1)])):(e.openBlock(),e.createElementBlock("span",gn,e.toDisplayString(N.value.find(j=>j.value==I).name),1)),e.createTextVNode(" ("+e.toDisplayString(L(I))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),yn={class:"time-template-dialog"},_n={class:"time-editor-panel"},Nn=oe({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const f=a,h=t,l=e.ref(null),k=e.ref(""),E=e.ref(""),D=e.ref(f.modelValue?.timeTemplateName||""),$=e.ref([]);return e.computed(()=>k.value?$.value.filter(b=>b.name.toLowerCase().includes(k.value.toLowerCase())):$.value),e.watch(D,b=>{h("update:modelValue",{...f.modelValue,timeTemplateName:b})}),o({getFormData:()=>{const b=l.value?.getTimeData();return{timeTemplateId:E.value,timeTemplateName:D.value,...b}},revertByTime:(b,N)=>{l.value?.revertByTime(b,N)}}),(b,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",yn,[e.createCommentVNode("",!0),e.createElementVNode("div",_n,[e.createCommentVNode("",!0),e.createVNode(hn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),Cn={class:"config-section"},kn={key:0,class:"config-section"},bn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},xn={class:"config-section"},En=oe({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("echoAlgodata",null),k=e.computed(()=>{const g=(l?.value??l)?.ruleSchema?.sourceGroups??[];if(g.some(x=>x.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const m=g.length>1,n=g.some(x=>(x.children??[]).length>1);return m||n?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(k,N=>{N.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:N.value})},{immediate:!0});const E=e.ref(!1),D=e.ref(null),$=()=>{const N=D.value?.getFormData();if(N?.validTime){const m=(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:m,timeZone:N.timeZone,planType:N.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});E.value=!1},O=()=>{const N=t.value?.data;N?.timeZone&&D.value?.revertByTime(N.timeZone,N.planType??0)},d=e.computed(()=>t.value?o.edges.filter(g=>g.source===t.value.id).length>=2:!1),b=N=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:N})};return(N,g)=>{const m=e.resolveComponent("el-divider"),n=e.resolveComponent("el-input"),x=e.resolveComponent("el-form-item"),P=e.resolveComponent("el-form"),c=e.resolveComponent("el-option"),q=e.resolveComponent("el-select"),T=e.resolveComponent("el-switch"),L=e.resolveComponent("el-button"),S=e.resolveComponent("el-dialog"),B=e.resolveComponent("el-icon"),i=e.resolveComponent("el-tooltip"),r=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[g[15]||(g[15]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(m),e.createElementVNode("div",Cn,[g[9]||(g[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:h.value,onInput:g[0]||(g[0]=_=>b(_)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),h.value?(e.openBlock(),e.createElementBlock("div",kn,[g[10]||(g[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:g[1]||(g[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(q,{"model-value":k.value.locked?k.value.value:t.value?.data.streamType||"image",disabled:k.value.locked,onChange:g[2]||(g[2]=_=>e.unref(o).updateNodeData(t.value.id,{streamType:_})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(c,{label:"图片流",value:"image"}),e.createVNode(c,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),k.value.locked?(e.openBlock(),e.createElementBlock("div",bn,e.toDisplayString(k.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(x,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(T,{"model-value":t.value?.data.enableAlertVideo,onChange:g[3]||(g[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:g[4]||(g[4]=_=>E.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(S,{modelValue:E.value,"onUpdate:modelValue":g[6]||(g[6]=_=>E.value=_),title:"执行时段",width:"1200px","append-to-body":"",onOpened:O},{footer:e.withCtx(()=>[e.createVNode(L,{onClick:g[5]||(g[5]=_=>E.value=!1)},{default:e.withCtx(()=>[...g[11]||(g[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(L,{type:"primary",onClick:$},{default:e.withCtx(()=>[...g[12]||(g[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(Nn,{ref_key:"timeTemplateRef",ref:D},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",xn,[g[14]||(g[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(q,{"model-value":t.value?.data.branchLogic||"and",disabled:h.value,onChange:g[7]||(g[7]=_=>e.unref(o).updateNodeData(t.value.id,{branchLogic:_})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(c,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(c,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),d.value?(e.openBlock(),e.createBlock(x,{key:0},{label:e.withCtx(()=>[g[13]||(g[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(i,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(B,{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:g[8]||(g[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"]]),wn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Tn=["smallModel","detectionTarget"],Ee=()=>({schemaLoading:e.ref(!1),getToolType:l=>wn[l]||null,needsToolSelection:l=>Tn.includes(l),fetchToolSchema:async(l,k="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(l,k="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Sn={key:0,class:"config-section"},Vn={key:3,class:"array-input"},Bn={key:1,class:"config-section"},An=oe({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:f,fetchSchemaForNodeType:h}=Ee(),l=e.computed(()=>{if(!t.value)return[];const d=t.value.data.input_schema||t.value.data.inputSchema;if(!d||!d.properties)return[];const b=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:b.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}))}),k=d=>{if(t.value)return t.value.data.arguments?.[d]},E=(d,b)=>{if(!t.value)return;const g={...t.value.data.arguments||{},[d]:b};o.updateNodeData(t.value.id,{arguments:g})},D=d=>{if(!d.dependsOn||!t.value)return!0;const{field:b,value:N}=d.dependsOn,g=k(b);if(typeof N=="string"&&N.startsWith("!")){const m=N.substring(1);return g!==m}return Array.isArray(N)?N.includes(g):g===N},$=d=>{const b=k(d);return Array.isArray(b)?JSON.stringify(b):""},O=(d,b)=>{try{const N=JSON.parse(b);Array.isArray(N)&&E(d,N)}catch{}};return e.watch(()=>t.value?.id,async d=>{if(!d||!t.value)return;const b=t.value.type,N=t.value.data,g=N.input_schema||N.inputSchema;if(g&&g.properties&&Object.keys(g.properties).length>0)return;const m=await h(b);if(!m)return;const n=t.value?.data;n&&o.updateNodeData(t.value.id,{...n,input_schema:m.inputSchema,extraConfig:m.extraConfig,arguments:{...m.arguments,...n.arguments}})},{immediate:!0}),(d,b)=>{const N=e.resolveComponent("el-divider"),g=e.resolveComponent("el-icon"),m=e.resolveComponent("el-tooltip"),n=e.resolveComponent("el-option"),x=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),c=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-input"),T=e.resolveComponent("el-form-item"),L=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[b[2]||(b[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(N),l.value.length>0?(e.openBlock(),e.createElementBlock("div",Sn,[b[0]||(b[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(T,{key:S.key,required:S.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(S.label),1),S.description?(e.openBlock(),e.createBlock(m,{key:0,content:S.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{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":k(S.key),onChange:B=>E(S.key,B),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.options,(B,i)=>(e.openBlock(),e.createBlock(n,{key:B,label:S.optionLabels?S.optionLabels[i]:B,value:B},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):S.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":k(S.key),onChange:B=>E(S.key,B)},null,8,["model-value","onChange"])):S.type==="number"||S.type==="integer"?(e.openBlock(),e.createBlock(c,{key:2,"model-value":k(S.key),onChange:B=>E(S.key,B),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",Vn,[e.createVNode(q,{"model-value":$(S.key),onChange:B=>O(S.key,B),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":k(S.key),onChange:B=>E(S.key,B),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.options,(B,i)=>(e.openBlock(),e.createBlock(n,{key:B,label:S.optionLabels?S.optionLabels[i]:B,value:B},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(q,{key:5,"model-value":k(S.key),onInput:B=>E(S.key,B),maxlength:S.maxLength,"show-word-limit":!!S.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!S.dependsOn||D(S)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(f)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",Bn,[...b[1]||(b[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),Dn={class:"config-header"},Ln={class:"config-section"},On={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Mn={key:0,class:"config-section"},In={key:3,class:"array-input"},Rn={key:1,class:"config-section"},$n={key:2,class:"config-section"},Fn=oe({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.classification?.models??[]),E=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),D=e.ref([]),$=e.ref(!1),O=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:T=>{t.value&&T&&n("modelId",T)}}),d=()=>{D.value=k.value},b=async T=>{if(!t.value||!T)return;const L=D.value.find(r=>r.id===T);if(!L)return;const S=t.value?.data;if(!S)return;const B=L.inputSchema||L.input_schema||E.value?.inputSchema||{},i={};B.properties&&Object.entries(B.properties).forEach(([r,_])=>{_.default!==void 0&&(i[r]=_.default)}),o.updateNodeData(t.value.id,{...S,input_schema:B,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})},g=e.computed(()=>{if(!t.value)return[];const T=t.value.data.input_schema||t.value.data.inputSchema;if(!T||!T.properties)return[];const L=T.required||[];return Object.entries(T.properties).map(([S,B])=>({key:S,type:B.type,label:B.title||B.label||B.description||S,description:B.description||"",default:B.default,required:L.includes(S)||B.required||!1,min:B.minimum!==void 0?B.minimum:B.min,max:B.maximum!==void 0?B.maximum:B.max,step:B.step,maxLength:B.maxLength,options:B.enum,optionLabels:B.enumLabels||B.enum,dependsOn:B.dependsOn,sort:B.sort,hidden:B["x-hidden"]||!1})).filter(S=>!S.hidden).sort((S,B)=>(S.sort??1/0)-(B.sort??1/0))}),m=T=>{if(t.value)return t.value.data.arguments?.[T]},n=(T,L)=>{if(!t.value)return;const B={...t.value.data.arguments||{},[T]:L};o.updateNodeData(t.value.id,{arguments:B})},x=T=>{if(!T.dependsOn||!t.value)return!0;const{field:L,value:S}=T.dependsOn,B=m(L);if(typeof S=="string"&&S.startsWith("!")){const i=S.substring(1);return B!==i}return Array.isArray(S)?S.includes(B):B===S},P=T=>{const L=m(T);return Array.isArray(L)?JSON.stringify(L):""},c=(T,L)=>{try{const S=JSON.parse(L);Array.isArray(S)&&n(T,S)}catch{}},q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async T=>{if(!T||!t.value)return;D.value.length===0&&d();const L=t.value.data,S=L.input_schema||L.inputSchema,B=L.arguments?.modelId;if(B&&S&&S.properties&&Object.keys(S.properties).length>0||!B)return;const i=D.value.find(w=>w.id===B);if(!i)return;const r=i.inputSchema||i.input_schema||E.value?.inputSchema||{},_={};r.properties&&Object.entries(r.properties).forEach(([w,G])=>{G.default!==void 0&&(_[w]=G.default)});const u=t.value?.data;u&&o.updateNodeData(t.value.id,{...u,input_schema:r,extraConfig:i.extraConfig||null,arguments:{..._,...u.arguments}})},{immediate:!0}),(T,L)=>{const S=e.resolveComponent("el-button"),B=e.resolveComponent("el-divider"),i=e.resolveComponent("el-option"),r=e.resolveComponent("el-select"),_=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-switch"),I=e.resolveComponent("el-input-number"),j=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Dn,[L[1]||(L[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(B),e.createElementVNode("div",Ln,[L[2]||(L[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(_,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(r,{modelValue:O.value,"onUpdate:modelValue":L[0]||(L[0]=z=>O.value=z),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:$.value,disabled:h.value,onChange:b,onClear:N},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.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"]),D.value.length===0&&!$.value?(e.openBlock(),e.createElementBlock("div",On," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),O.value&&g.value.length>0?(e.openBlock(),e.createElementBlock("div",Mn,[L[3]||(L[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.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":m(z.key),disabled:h.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,y)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[y]: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":m(z.key),disabled:h.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(I,{key:2,"model-value":m(z.key),disabled:h.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",In,[e.createVNode(j,{"model-value":P(z.key),disabled:h.value&&z.key!=="threshold",onChange:Y=>c(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":m(z.key),disabled:h.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,y)=>(e.openBlock(),e.createBlock(i,{key:Y,label:z.optionLabels?z.optionLabels[y]:Y,value:Y},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(j,{key:5,"model-value":m(z.key),disabled:h.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),O.value&&$.value&&g.value.length===0?(e.openBlock(),e.createElementBlock("div",Rn,[...L[4]||(L[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!O.value&&!$.value?(e.openBlock(),e.createElementBlock("div",$n,[...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"]]),qn={class:"config-header"},Gn={class:"config-section"},Hn=oe({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(O,d)=>{if(!t.value)return;const b=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...b,[O]:d}})},$=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,O=>{if(!O||!t.value)return;const d=k.value,b=t.value.data.arguments||{},N={};d?.properties&&Object.entries(d.properties).forEach(([g,m])=>{m.default!==void 0&&(N[g]=m.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...b}})},{immediate:!0}),(O,d)=>{const b=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),m=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",qn,[d[1]||(d[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(b,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:$},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",Gn,[d[2]||(d[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(m,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":E.value,onChange:d[0]||(d[0]=x=>D("threshold",x)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Pn={class:"config-header"},jn={class:"config-section"},zn=oe({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),E=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(O,d)=>{if(!t.value)return;const b=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...b,[O]:d}})},$=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,O=>{if(!O||!t.value)return;const d=k.value,b=t.value.data.arguments||{},N={};d?.properties&&Object.entries(d.properties).forEach(([g,m])=>{m.default!==void 0&&(N[g]=m.default)}),o.updateNodeData(t.value.id,{arguments:{...N,...b}})},{immediate:!0}),(O,d)=>{const b=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),g=e.resolveComponent("el-input-number"),m=e.resolveComponent("el-form-item"),n=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Pn,[d[1]||(d[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(b,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:$},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",jn,[d[2]||(d[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(n,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(m,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":E.value,onChange:d[0]||(d[0]=x=>D("threshold",x)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn={key:0,class:"config-section"},Je=oe({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),E=e.ref(null),D=e.computed(()=>({repositoryId:b.value})),$={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},O=e.computed(()=>t.value?.data.arguments?.threshold??.5),d=m=>t.value?.data.arguments?.[m],b=e.computed(()=>{const m=d("repositoryId");return m?Array.isArray(m)?m:[m]:[]}),N=(m,n)=>{if(!t.value)return;const x=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...x,[m]:n}})},g=()=>{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 x=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,P=t.value.data.arguments||{},c={};x?.properties&&Object.entries(x.properties).forEach(([q,T])=>{T.default!==void 0&&(c[q]=T.default)}),o.updateNodeData(t.value.id,{arguments:{...c,...P}})},{immediate:!0}),(m,n)=>{const x=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-form-item"),T=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),S=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[n[2]||(n[2]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:g},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",Wn,[n[3]||(n[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":O.value,onChange:n[0]||(n[0]=B=>N("threshold",B)),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",Jn,[n[4]||(n[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(T,{model:D.value,rules:$,ref_key:"faceFormRef",ref:E,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(S,{"model-value":b.value,onChange:n[1]||(n[1]=B=>N("repositoryId",B)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,B=>(e.openBlock(),e.createBlock(L,{key:B.id,label:B.name,value:B.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),Yn={class:"config-header"},Xn={key:0,class:"config-section"},Qn={key:3,class:"array-input"},Kn={key:1,class:"config-section"},Zn=oe({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),{schemaLoading:l,fetchSchemaForNodeType:k}=Ee(),E=e.computed(()=>{if(!t.value)return[];const g=t.value.data.input_schema||t.value.data.inputSchema;if(!g||!g.properties)return[];const m=g.required||[];return Object.entries(g.properties).map(([n,x])=>({key:n,type:x.type,label:x.title||x.label||x.description||n,description:x.description||"",default:x.default,required:m.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))}),D=g=>{if(t.value)return t.value.data.arguments?.[g]},$=(g,m)=>{if(!t.value)return;const x={...t.value.data.arguments||{},[g]:m};o.updateNodeData(t.value.id,{arguments:x})},O=g=>{if(!g.dependsOn||!t.value)return!0;const{field:m,value:n}=g.dependsOn,x=D(m);if(typeof n=="string"&&n.startsWith("!")){const P=n.substring(1);return x!==P}return Array.isArray(n)?n.includes(x):x===n},d=g=>{const m=D(g);return Array.isArray(m)?JSON.stringify(m):""},b=(g,m)=>{try{const n=JSON.parse(m);Array.isArray(n)&&$(g,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 g=>{if(!g||!t.value)return;const m=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 k(m);if(!P)return;const c=t.value?.data;c&&o.updateNodeData(t.value.id,{...c,input_schema:P.inputSchema,extraConfig:P.extraConfig,arguments:{...P.arguments,...c.arguments}})},{immediate:!0}),(g,m)=>{const n=e.resolveComponent("el-button"),x=e.resolveComponent("el-divider"),P=e.resolveComponent("el-icon"),c=e.resolveComponent("el-tooltip"),q=e.resolveComponent("el-option"),T=e.resolveComponent("el-select"),L=e.resolveComponent("el-switch"),S=e.resolveComponent("el-input-number"),B=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",Yn,[m[0]||(m[0]=e.createElementVNode("h3",null,"节点配置",-1)),h.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),E.value.length>0?(e.openBlock(),e.createElementBlock("div",Xn,[m[1]||(m[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(E.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(c,{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(T,{key:0,"model-value":D(_.key),onChange:u=>$(_.key,u),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(u,w)=>(e.openBlock(),e.createBlock(q,{key:u,label:_.optionLabels?_.optionLabels[w]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):_.type==="boolean"?(e.openBlock(),e.createBlock(L,{key:1,"model-value":D(_.key),onChange:u=>$(_.key,u)},null,8,["model-value","onChange"])):_.type==="number"||_.type==="integer"?(e.openBlock(),e.createBlock(S,{key:2,"model-value":D(_.key),onChange:u=>$(_.key,u),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",Qn,[e.createVNode(B,{"model-value":d(_.key),onChange:u=>b(_.key,u),type:"textarea",rows:3,placeholder:_.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):_.type==="array"&&_.options?(e.openBlock(),e.createBlock(T,{key:4,"model-value":D(_.key),onChange:u=>$(_.key,u),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.options,(u,w)=>(e.openBlock(),e.createBlock(q,{key:u,label:_.optionLabels?_.optionLabels[w]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(B,{key:5,"model-value":D(_.key),onInput:u=>$(_.key,u),maxlength:_.maxLength,"show-word-limit":!!_.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!_.dependsOn||O(_)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&E.value.length===0?(e.openBlock(),e.createElementBlock("div",Kn,[...m[2]||(m[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),vn={class:"config-header"},ea={class:"config-section"},ta={key:0,class:"config-section"},oa={key:1,class:"config-section"},na={key:0,class:"el-form-item__error"},aa={key:2,class:"config-section"},la={key:3,class:"config-section"},ra={key:4,class:"config-section"},sa=oe({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.inject("taskModeConfig",null),l=e.computed(()=>f==="task"),k=e.computed(()=>n("deviceType")??"camera"),E=e.computed(()=>{const i=o.nodes.find(_=>_.type===C.START);return i?.data?.streamType?i.data.streamType:(h?.value??h)?.streamType??"image"}),D=e.computed(()=>{const i=h?.value??h,r=t.value?.id;return i?.datasource?.getDevices?.(r)?.length??0}),$=()=>{const i=h?.value??h,r=t.value?.id,_=t.value?.data?.label??"",u=i?.datasource?.getDevices?.(r)??[],w=o.nodes.filter(F=>F.type===C.DATA_SOURCE).findIndex(F=>F.id===r),G=t.value?.data?.sourceGroupId??i?.datasource?.getSourceGroupIdByIndex?.(w)??r;i?.datasource?.onDeviceClick?.(r,_,G,u,k.value)},{fetchSchemaForNodeType:O}=Ee(),d=e.computed(()=>o.nodes.some(i=>i.type===C.SMALL_MODEL)),b=e.computed(()=>o.getDataSourceCount()>=2),N=e.computed(()=>!o.supportPatrol()),g=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),m=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(([_,u])=>({key:_,type:u.type,label:u.title||u.label||u.description||_,description:u.description||"",default:u.default,required:r.includes(_)||u.required||!1,min:u.minimum!==void 0?u.minimum:u.min,max:u.maximum!==void 0?u.maximum:u.max,step:u.step,maxLength:u.maxLength,options:u.enum,optionLabels:u.enumLabels||u.enum,dependsOn:u.dependsOn}))}),n=i=>{if(t.value)return t.value.data.arguments?.[i]},x=e.computed(()=>!!n("enableImageSequence")),P=e.computed(()=>!!n("needCooperativeDetection")),c=(i,r)=>{if(!t.value)return;const u={...t.value.data.arguments||{},[i]:r};o.updateNodeData(t.value.id,{arguments:u})},q=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(u=>u.source===t.value.id).forEach(u=>{o.removeEdge(u.id)}),i&&c("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),c("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)}catch{return}else i&&c("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:i}),c("enableImageSequence",i),i&&o.initializeSubsequentFrames(t.value.id)},T=i=>{t.value&&(i&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),c("enableImageSequence",!1),c("enablePatrol",!1)),c("needCooperativeDetection",i))};e.watch(E,i=>{i==="stream"&&t.value&&n("deviceType")==="1400"&&c("deviceType","camera")},{immediate:!0});const L=e.computed(()=>l.value&&k.value==="camera"&&E.value!=="stream"&&o.supportPatrol());e.watch(L,i=>{!i&&t.value&&n("enablePatrol")&&c("enablePatrol",!1)}),e.watch(D,i=>{i>0&&n("enablePatrol")&&(n("patrolGroupSize")??1)>i&&c("patrolGroupSize",i)});const S=i=>{if(!i.dependsOn||!t.value)return!0;const{field:r,value:_}=i.dependsOn,u=n(r);if(typeof _=="string"&&_.startsWith("!")){const w=_.substring(1);return u!==w}return Array.isArray(_)?_.includes(u):u===_},B=()=>{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||{},I={},j=o.nodes.some(z=>z.type===C.SMALL_MODEL);F.mode===void 0&&(I.mode=j?3:0),F.interval===void 0&&(I.interval=30),E.value==="stream"&&F.sw_decoding===void 0&&(I.sw_decoding="CPU"),Object.keys(I).length>0&&o.updateNodeData(i,{arguments:{...F,...I}})}const u=_.input_schema||_.inputSchema;if(r==="dataSource"&&u&&u.properties&&!u.properties.windowSeconds){u.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},_.arguments.windowSeconds||o.updateNodeData(t.value.id,{..._,input_schema:u,arguments:{..._.arguments,windowSeconds:5}});return}if(u&&u.properties&&Object.keys(u.properties).length>0)return;const w=await O(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"),u=e.resolveComponent("el-divider"),w=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-option"),I=e.resolveComponent("el-select"),j=e.resolveComponent("el-switch"),z=e.resolveComponent("el-input-number"),Y=e.resolveComponent("el-input"),y=e.resolveComponent("el-form-item"),A=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",vn,[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:B},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",ea,[r[12]||(r[12]=e.createElementVNode("h4",null,"数据源配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,s=>e.withDirectives((e.openBlock(),e.createBlock(y,{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(I,{key:0,"model-value":n(s.key),onChange:p=>c(s.key,p),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.options,(p,V)=>(e.openBlock(),e.createBlock(F,{key:p,label:s.optionLabels?s.optionLabels[V]:p,value:p},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"&&b.value?"多数据源场景下不允许开启图片时序":"",disabled:!(l.value&&(s.key==="needCooperativeDetection"||s.key==="enableImageSequence"))&&!(s.key==="needCooperativeDetection"&&x.value)&&!(s.key==="enableImageSequence"&&P.value)&&!(s.key==="enableImageSequence"&&b.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"&&b.value,onChange:p=>s.key==="enableImageSequence"?q(p):s.key==="needCooperativeDetection"?T(p):c(s.key,p)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):s.type==="number"||s.type==="integer"?(e.openBlock(),e.createBlock(z,{key:2,"model-value":n(s.key),onChange:p=>c(s.key,p),min:s.min,max:s.max,step:s.step||(s.type==="integer"?1:.1),precision:s.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(Y,{key:3,"model-value":n(s.key),onInput:p=>c(s.key,p),maxlength:s.maxLength,"show-word-limit":!!s.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!s.dependsOn||S(s)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",ta,[r[13]||(r[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(I,{"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",oa,[r[16]||(r[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("deviceType")??"camera",onChange:r[1]||(r[1]=s=>c("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:E.value==="stream"},{default:e.withCtx(()=>[...r[15]||(r[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(y,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":`已选 ${D.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":D.value===0}),onClick:$},null,8,["model-value","class"]),D.value===0?(e.openBlock(),e.createElementBlock("div",na,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),l.value&&k.value==="1400"?(e.openBlock(),e.createElementBlock("div",aa,[r[19]||(r[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":n("detectionMode")??"platform",onChange:r[2]||(r[2]=s=>c("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&&k.value==="camera"&&E.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",la,[r[21]||(r[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(G,{disabled:!N.value,content:g.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=>c("enablePatrol",s))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),n("enablePatrol")?(e.openBlock(),e.createBlock(y,{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=>c("patrolGroupSize",s)),min:1,max:D.value>0?D.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),l.value&&k.value==="camera"?(e.openBlock(),e.createElementBlock("div",ra,[r[22]||(r[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(A,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"抽帧策略"},{default:e.withCtx(()=>[E.value==="image"?(e.openBlock(),e.createBlock(I,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(F,{label:"按时间间隔抽帧",value:0})]),_:1})):d.value?(e.openBlock(),e.createBlock(I,{key:1,"model-value":n("mode")??3,onChange:r[5]||(r[5]=s=>{c("mode",s),s===1&&c("interval",d.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(I,{key:2,"model-value":n("mode")??0,onChange:r[6]||(r[6]=s=>{c("mode",s),s===0&&c("interval",30),s===1&&c("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}),E.value==="image"||E.value==="stream"&&(n("mode")??0)===0?(e.openBlock(),e.createBlock(y,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(z,{"model-value":n("interval")??30,onChange:r[7]||(r[7]=s=>c("interval",s)),min:1,max:E.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),E.value==="stream"&&(n("mode")??0)===1?(e.openBlock(),e.createBlock(y,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[d.value?(e.openBlock(),e.createBlock(z,{key:0,"model-value":n("interval")??5,onChange:r[8]||(r[8]=s=>c("interval",s)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(I,{key:1,"model-value":n("interval")??25,onChange:r[9]||(r[9]=s=>c("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),E.value==="stream"?(e.openBlock(),e.createBlock(y,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(I,{"model-value":n("sw_decoding")??"CPU",onChange:r[10]||(r[10]=s=>c("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"]]),ia={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Ye=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),f=e.ref(null),h=e.ref(""),l=async(N=!1)=>{if(a){o.value=a;return}},k=async()=>{o.value=[],await l(!0)},E=N=>o.value.find(g=>g.id===N||g.title===N),D=N=>{const g=E(N);if(!g)return{};const m=g.inputSchema||g.input_schema;if(!m||!m.properties)return{};const n={};return Object.entries(m.properties).forEach(([x,P])=>{P.default!==void 0&&(n[x]=P.default)}),n},$=N=>{const g=E(N);if(!g)return[];const m=g.inputSchema||g.input_schema;if(!m||!m.properties)return[];const n=m.required||[];return Object.entries(m.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}))},O=e.computed(()=>{if(!h.value)return o.value;const N=h.value.toLowerCase();return o.value.filter(g=>g.name?.toLowerCase().includes(N)||g.type?.toLowerCase().includes(N)||g.title?.toLowerCase().includes(N)||g.description&&g.description.toLowerCase().includes(N)||d(g.type).toLowerCase().includes(N))}),d=N=>ia[N]||N;return{models:o,loading:t,error:f,searchKeyword:h,filteredModels:O,loadSmallModels:l,reloadSmallModels:k,getModelConfig:E,getTypeLabel:d,getDefaultArguments:D,getSchemaFields:$,validateArguments:(N,g)=>{const m=E(N);if(!m)return{valid:!1,errors:["模型不存在"]};const n=[],x=m.inputSchema||m.input_schema;return!x||!x.properties?{valid:!0,errors:[]}:(Object.entries(x.properties).forEach(([P,c])=>{const q=g[P];if(c.required&&(q==null||q==="")){n.push(`${c.title||P} 为必填项`);return}if(q!=null&&(c.type==="number"||c.type==="integer")){if(typeof q!="number"){n.push(`${c.title||P} 必须是数字`);return}c.minimum!==void 0&&q<c.minimum&&n.push(`${c.title||P} 不能小于 ${c.minimum}`),c.maximum!==void 0&&q>c.maximum&&n.push(`${c.title||P} 不能大于 ${c.maximum}`)}}),{valid:n.length===0,errors:n})}}},ca={class:"small-model-selector"},da={key:0,class:"loading-state"},ma={key:1,class:"error-state"},pa={key:2,class:"model-list"},ua=["onClick"],fa={class:"model-header"},ga={class:"model-name"},ha={class:"model-description"},ya={class:"model-meta"},_a={key:3,class:"empty-state"},Na=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,f=o,{loading:h,error:l,searchKeyword:k,filteredModels:E,loadSmallModels:D,reloadSmallModels:$,getTypeLabel:O}=Ye(t.externalModels),d=g=>{f("update:modelValue",g.id),f("select",g)},b=()=>{$()},N=g=>({safety:"warning",security:"danger",traffic:"info"})[g]||"info";return e.onMounted(()=>{t.externalModels||D()}),(g,m)=>{const n=e.resolveComponent("el-input"),x=e.resolveComponent("el-icon"),P=e.resolveComponent("el-button"),c=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",ca,[e.createVNode(n,{modelValue:e.unref(k),"onUpdate:modelValue":m[0]||(m[0]=q=>e.isRef(k)?k.value=q:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(X.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(h)?(e.openBlock(),e.createElementBlock("div",da,[e.createVNode(x,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Loading))]),_:1}),m[2]||(m[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",ma,[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:b},{default:e.withCtx(()=>[...m[3]||(m[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(E).length>0?(e.openBlock(),e.createElementBlock("div",pa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(E),q=>(e.openBlock(),e.createElementBlock("div",{key:q.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===q.id}]),onClick:T=>d(q)},[e.createElementVNode("div",fa,[e.createElementVNode("div",ga,[e.createVNode(x,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(q.name),1)]),e.createVNode(c,{type:N(q.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(O)(q.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ha,e.toDisplayString(q.description),1),e.createElementVNode("div",ya,[q.supportDirectAlert?(e.openBlock(),e.createBlock(c,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...m[4]||(m[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ua))),128))])):(e.openBlock(),e.createElementBlock("div",_a,[e.createVNode(x,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1}),m[6]||(m[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(P,{text:"",onClick:m[1]||(m[1]=q=>k.value="")},{default:e.withCtx(()=>[...m[5]||(m[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),Ca={class:"position-tooltip"},we=oe({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",Ca,[...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"]]),ka={class:"config-header"},ba={class:"config-section"},xa={key:0,class:"model-selector-wrapper"},Ea={key:1,class:"selected-model-info"},wa={class:"model-info-header"},Ta={class:"model-info-name"},Sa={class:"model-info-description"},Va={key:0,class:"config-section"},Ba={key:3,class:"array-input"},Aa="检测到事件后,连续两次告警上报的时间间隔",Da=oe({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.smallModels??null),{models:E}=Ye(k.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),$={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},O=e.computed(()=>{if(!t.value)return[];const T=t.value.data.input_schema||t.value.data.inputSchema;if(!T||!T.properties)return[];const L=T.required||[],S=t.value.data.title||"";return Object.entries(T.properties).filter(([B])=>D.has(B)).map(([B,i])=>{const r={key:B,type:i.type,label:i.title||i.label||i.description||B,description:i.description||"",default:i.default,required:L.includes(B)||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 B==="interval"&&(r.label="告警间隔(秒)",r.description=$[S]||Aa,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),B==="threshold"&&(r.label="小模型阈值",r.step=.01,r.precision=2),B==="targetWidth"&&(r.label="最小目标宽度",r.default=60,r.min=20,r.max=1920,r.step=1,r.precision=0),B==="targetHeight"&&(r.label="最小目标高度",r.default=60,r.min=20,r.max=1080,r.step=1,r.precision=0),B==="topScale"&&(r.label="调整目标框高度比例 (上)",r.max=10,r.step=.1,r.precision=1),B==="bottomScale"&&(r.label="调整目标框高度比例 (下)",r.max=10,r.step=.1,r.precision=1),B==="leftScale"&&(r.label="调整目标框宽度比例 (左)",r.max=10,r.step=.1,r.precision=1),B==="rightScale"&&(r.label="调整目标框宽度比例 (右)",r.max=10,r.step=.1,r.precision=1),B==="x_ratio"&&(r.label="X轴位置信息",r.step=.01,r.precision=2),B==="y_ratio"&&(r.label="Y轴位置信息",r.step=.01,r.precision=2),B==="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),B==="overloadNumber"&&(r.precision=0),B==="targetNumber"&&(r.precision=0),r}).filter(B=>!["areas","darwin","direction","lines"].includes(B.key)).filter(B=>!(B.key==="targetDuration"&&S==="NonMotorCounter")).sort((B,i)=>(B.sort??1/0)-(i.sort??1/0))}),d=["interval","targetDuration"],b=T=>{if(!t.value)return;const L=t.value.data.arguments?.[T];return d.includes(T)&&L!=null?L/1e3:L},N=(T,L)=>{if(!t.value)return;let S=L;d.includes(T)&&L!=null&&(S=L*1e3);const i={...t.value.data.arguments||{},[T]:S};o.updateNodeData(t.value.id,{arguments:i})},g=T=>{if(!T.dependsOn||!t.value)return!0;const{field:L,value:S}=T.dependsOn,B=b(L);if(typeof S=="string"&&S.startsWith("!")){const i=S.substring(1);return B!==i}return Array.isArray(S)?S.includes(B):B===S},m=T=>{const L=b(T);return Array.isArray(L)?JSON.stringify(L):""},n=(T,L)=>{try{const S=JSON.parse(L);Array.isArray(S)&&N(T,S)}catch{}},x=async T=>{if(!t.value)return;const L=T.inputSchema||T.input_schema||{},S={};L.properties&&Object.entries(L.properties).forEach(([B,i])=>{i.default!==void 0&&(S[B]=i.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:T.id||T.title,title:T.title,modelName:T.name,modelType:T.type,input_schema:L,extraConfig:T.extraConfig,supportDirectAlert:T.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(()=>{})},c=()=>t.value?.data.modelId?E.value.find(L=>L.id===t.value.data.modelId)?.description||"暂无描述":"",q=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(T,L)=>{const S=e.resolveComponent("el-button"),B=e.resolveComponent("el-divider"),i=e.resolveComponent("el-icon"),r=e.resolveComponent("el-tag"),_=e.resolveComponent("el-tooltip"),u=e.resolveComponent("el-option"),w=e.resolveComponent("el-select"),G=e.resolveComponent("el-switch"),F=e.resolveComponent("el-input-number"),I=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",ka,[L[0]||(L[0]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(B),e.createElementVNode("div",ba,[L[3]||(L[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!h.value?(e.openBlock(),e.createElementBlock("div",xa,[e.createVNode(Na,{"model-value":t.value?.data.modelId,"external-models":k.value,onSelect:x},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Ea,[e.createElementVNode("div",wa,[e.createElementVNode("div",Ta,[e.createVNode(i,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"text",text:"",size:"small",onClick:P},{default:e.withCtx(()=>[...L[1]||(L[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Sa,e.toDisplayString(c()),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",Va,[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(O.value,y=>e.withDirectives((e.openBlock(),e.createBlock(z,{key:y.key,required:y.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(y.label),1),y.key==="x_ratio"||y.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(we)]),default:e.withCtx(()=>[e.createVNode(i,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):y.description?(e.openBlock(),e.createBlock(_,{key:1,content:y.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(()=>[y.options&&y.type==="string"?(e.openBlock(),e.createBlock(w,{key:0,"model-value":b(y.key),onChange:A=>N(y.key,A),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(A,H)=>(e.openBlock(),e.createBlock(u,{key:A,label:y.optionLabels?y.optionLabels[H]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):y.type==="boolean"?(e.openBlock(),e.createBlock(G,{key:1,"model-value":b(y.key),onChange:A=>N(y.key,A)},null,8,["model-value","onChange"])):y.type==="number"||y.type==="integer"||y.type==="float"?(e.openBlock(),e.createBlock(F,{key:2,"model-value":b(y.key),onChange:A=>N(y.key,A),min:y.min,max:y.max,step:y.step||(y.type==="integer"||y.type==="number"?1:.01),precision:y.precision??(y.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):y.type==="array"&&!y.options?(e.openBlock(),e.createElementBlock("div",Ba,[e.createVNode(I,{"model-value":m(y.key),onChange:A=>n(y.key,A),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(y.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):y.type==="array"&&y.options?(e.openBlock(),e.createBlock(w,{key:4,"model-value":b(y.key),onChange:A=>N(y.key,A),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.options,(A,H)=>(e.openBlock(),e.createBlock(u,{key:A,label:y.optionLabels?y.optionLabels[H]:A,value:A},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(I,{key:5,"model-value":b(y.key),onInput:A=>N(y.key,A)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!y.dependsOn||g(y)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),La=(a=null)=>{const o=ae(),t=e.ref(a?a.map(d=>xe.backendToFrontend(d)):[]),f=e.ref(!1),h=e.ref(null),l=async(d=!1)=>{if(a){t.value=a.map(b=>xe.backendToFrontend(b));return}},k=d=>t.value.find(b=>b.title===d)||null,E=d=>{const b=k(d);return b?{targetId:b.title,targetName:b.label,threshold:b.data.threshold||.5,targetWidth:b.data.targetWidth||20,targetHeight:b.data.targetHeight||20,postmodel:b.data.postmodel||"ClipVit",areas:b.data.areas||[],expandRect:b.data.expandRect!==void 0?b.data.expandRect:!1,topScale:b.data.topScale||1.6,bottomScale:b.data.bottomScale||1.6,leftScale:b.data.leftScale||1.6,rightScale:b.data.rightScale||1.6,enableStructure:b.data.enableStructure}:{}},D=(d=null)=>o.nodes.filter(b=>b.type==="detectionTarget"&&b.id!==d).map(b=>({value:b.id,label:b.data.targetName||b.data.label})),$=(d=null)=>{const b=[{value:"original",label:"原图"}],N=D(d);return[...b,...N]},O=e.computed(()=>t.value.map(d=>({value:d.title,label:d.label,...d})));return{detectionTargets:t,loading:f,error:h,loadDetectionTargets:l,getTargetById:k,getDefaultConfig:E,getDetectionTargetNodes:D,getDetectionScopeOptions:$,getTargetOptions:O}},Oa={class:"paired-array-input"},Te=oe({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(a,{emit:o}){const t=(O,d)=>{let b;return(...N)=>{clearTimeout(b),b=setTimeout(()=>O(...N),d)}},f=a,h=o,l=e.ref([]),k=()=>{const O=f.primaryValue||[],d=f.pairedValue||[],b=Math.max(O.length,d.length,1);l.value=Array.from({length:b},(N,g)=>({primary:O[g]||"",paired:d[g]!==void 0?d[g]:f.pairedField.default?.[0]||.5}))};e.watch(()=>[f.primaryValue,f.pairedValue],()=>{k()},{immediate:!0,deep:!0});const E=t((O,d)=>{h("update",O,d)},300);e.watch(l,O=>{const d=O.map(N=>N.primary),b=O.map(N=>N.paired);E(d,b)},{deep:!0});const D=()=>{l.value.length>=10||l.value.push({primary:"",paired:f.pairedField.default?.[0]||.5})},$=O=>{l.value.length>1&&l.value.splice(O,1)};return(O,d)=>{const b=e.resolveComponent("el-input"),N=e.resolveComponent("el-input-number"),g=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Oa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(m,n)=>(e.openBlock(),e.createElementBlock("div",{key:n,class:"input-row"},[e.createVNode(b,{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(g,{type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:x=>$(n)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(g,{type:"primary",icon:e.unref(X.Plus),size:"small",disabled:l.value.length>=10,onClick:D},{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"]]),Ma={class:"config-header"},Ia={class:"config-section"},Ra={class:"flex items-center justify-between"},$a={key:0,class:"config-section"},Fa={key:1,class:"config-section"},qa={key:2,class:"config-section"},Ga={class:"device-list"},Ha=["onClick"],Pa={class:"device-name"},ja={key:0,class:"device-list-empty"},za={key:4,class:"array-input"},Ua={key:4,class:"array-input"},Wa=oe({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f==="task"),l=e.inject("taskModeConfig",null),k=e.inject("echoAlgodata",null),E=e.inject("echoTaskData",null),D=e.computed(()=>{if(!t.value)return null;const y=new Set,A=[t.value.id];for(;A.length;){const H=A.shift();if(y.has(H))continue;y.add(H);const W=o.edges.filter(s=>s.target===H);for(const s of W){const p=o.nodes.find(V=>V.id===s.source);if(p){if(p.type==="dataSource")return p.id;A.push(p.id)}}}return null}),$=e.computed(()=>{const y=D.value;return y?(l?.value??l)?.datasource?.getDevices?.(y)??[]:[]}),O=e.computed(()=>h.value&&$.value.length>0),d=e.ref(""),b=e.ref(""),N=e.computed(()=>{const y=b.value.trim().toLowerCase();return y?$.value.filter(A=>(A.sourceName??A.name??String(A.sourceId??A.id??A)).toLowerCase().includes(y)):$.value}),g=e.computed(()=>{const y={},A=D.value,H=t.value?.id;if(!A||!H)return y;const W={...t.value?.data?.arguments??{}};delete W.configMode;for(const s of $.value){const p=String(s.sourceId??s.id??s),V=o.getTaskSourceArguments(A,p,H);if(V===null){y[p]=!1;continue}const R=new Set([...Object.keys(V),...Object.keys(W)]);let U=!1;for(const J of R)if(JSON.stringify(V[J])!==JSON.stringify(W[J])){U=!0;break}y[p]=U}return y});e.watch([$,()=>t.value?.data?.arguments?.configMode],([y])=>{y.length>0?d.value=String(y[0]?.sourceId??y[0]?.id??y[0]):d.value=""},{immediate:!0});const m=(y,A=null)=>{if(A){const p=((E?.value??E)?.graph?.sources??[]).find(V=>String(V.sourceId)===String(A));if(p?.branches)for(const V of p.branches){const R=V.nodes?.find(U=>U.toolTitle===y);if(R?.arguments)return{...R.arguments}}return null}const H=k?.value??k;if(!H?.branches)return null;for(const W of H.branches){const s=W.nodes?.find(p=>p.toolTitle===y);if(s?.arguments)return{...s.arguments}}return null},n=y=>{const A=D.value,H=t.value?.id;if(!A||!H||!y||o.getTaskSourceArguments(A,y,H)!==null)return;const W=t.value?.data?.targetId,s=W?m(W,y):null,p=t.value?.data?.arguments??{},V={...s??p};delete V.configMode,o.setTaskSourceArguments(A,y,H,V)};e.watch(d,y=>{y&&t.value?.data?.arguments?.configMode==="perDevice"&&n(y)}),e.watch(()=>t.value?.data?.arguments?.configMode,y=>{y==="perDevice"&&d.value&&n(d.value)});const x=e.inject("editorConfig",null),P=e.computed(()=>(x?.value??x)?.detection??null),{detectionTargets:c,loading:q}=La(P.value),T=e.computed(()=>{if(!t.value)return[];const y=t.value.data.input_schema||t.value.data.inputSchema;if(!y||!y.properties)return[];const A=y.required||[];return Object.entries(y.properties).map(([H,W])=>({key:H,type:W.type,label:W.title||W.label||W.description||H,description:W.description||"",default:W.default,required:A.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=y=>y.type==="array"&&y["x-component"]==="paired-array"&&y["x-paired-with"],S=y=>{const A=y["x-paired-with"];return T.value.find(H=>H.key===A)},B={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(B)),r=e.computed(()=>{const y=t.value?.data.targetId,A=new Set;return T.value.forEach(H=>{H["x-paired-with"]&&A.add(H["x-paired-with"])}),T.value.filter(H=>y==="traffic_accident"?H.key==="threshold":i.has(H.key)&&!A.has(H.key)&&!L(H)).map(H=>{const W=B[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(()=>T.value.filter(y=>L(y))),u=y=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&d.value){const H=D.value,W=o.getTaskSourceArguments(H,d.value,t.value.id);if(W!==null)return W[y]}return t.value.data.arguments?.[y]},w=(y,A)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(y!=="configMode"&&H==="perDevice"&&d.value){const p=D.value;o.updateTaskSourceArgument(p,d.value,t.value.id,y,A);return}const s={...t.value.data.arguments||{},[y]:A};o.updateNodeData(t.value.id,{arguments:s})},G=y=>{if(!y.dependsOn||!t.value)return!0;const{field:A,value:H}=y.dependsOn,W=u(A);if(typeof H=="string"&&H.startsWith("!")){const s=H.substring(1);return W!==s}return Array.isArray(H)?H.includes(W):W===H},F=y=>{const A=u(y);return Array.isArray(A)?JSON.stringify(A):""},I=(y,A)=>{try{const H=JSON.parse(A);Array.isArray(H)&&w(y,H)}catch{}},j=(y,A,H,W)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&d.value){const R=D.value;o.updateTaskSourceArgument(R,d.value,t.value.id,y,A),o.updateTaskSourceArgument(R,d.value,t.value.id,H,W);return}const V={...t.value.data.arguments||{},[y]:A,[H]:W};o.updateNodeData(t.value.id,{arguments:V})},z=async y=>{if(!t.value||!y)return;const A=c.value.find(V=>V.title===y);if(!A)return;let H=A.inputSchema||A.input_schema||{};if(y==="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,R])=>{R.default!==void 0&&(W[V]=R.default)});const s=t.value.data,p={...W,target_class:A.title};o.updateNodeData(t.value.id,{...s,targetId:A.title,targetName:A.label,label:A.label,input_schema:H,inputSchema:H,extraConfig:A.extraConfig,arguments:p})},Y=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,y=>{if(!y||!t.value)return;const A=c.value.find(s=>s.title===y);if(!A)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const W={...A.defaultArguments,...H.arguments,target_class:A.title};o.updateNodeData(t.value.id,{...H,input_schema:A.inputSchema,arguments:W})}),(y,A)=>{const H=e.resolveComponent("el-button"),W=e.resolveComponent("el-divider"),s=e.resolveComponent("el-option"),p=e.resolveComponent("el-select"),V=e.resolveComponent("el-form-item"),R=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",Ma,[A[2]||(A[2]=e.createElementVNode("h3",null,"节点配置",-1)),h.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",Ia,[A[3]||(A[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(R,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.targetId,disabled:h.value,onChange:z,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(q),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(c),M=>(e.openBlock(),e.createBlock(s,{key:M.title,label:M.label,value:M.title},{default:e.withCtx(()=>[e.createElementVNode("div",Ra,[e.createElementVNode("span",null,e.toDisplayString(M.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),O.value?(e.openBlock(),e.createElementBlock("div",$a,[A[6]||(A[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(R,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(V,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(J,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:A[0]||(A[0]=M=>w("configMode",M))},{default:e.withCtx(()=>[e.createVNode(U,{value:"unified"},{default:e.withCtx(()=>[...A[4]||(A[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(U,{value:"perDevice"},{default:e.withCtx(()=>[...A[5]||(A[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),_.value.length>0?(e.openBlock(),e.createElementBlock("div",Fa,[A[7]||(A[7]=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(_.value,M=>(e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.description?(e.openBlock(),e.createBlock(te,{key:0,content:M.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Te,{"primary-field":M,"paired-field":S(M),"primary-value":u(M.key),"paired-value":u(M["x-paired-with"]),onUpdate:(K,le)=>j(M.key,K,M["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",qa,[A[9]||(A[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&$.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(se,{modelValue:b.value,"onUpdate:modelValue":A[1]||(A[1]=M=>b.value=M),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(Q,null,{default:e.withCtx(()=>[e.createVNode(e.unref(X.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Ga,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(N.value,M=>(e.openBlock(),e.createElementBlock("div",{key:String(M.sourceId??M.id??M),class:e.normalizeClass(["device-list-item",{"is-active":d.value===String(M.sourceId??M.id??M),"has-custom":g.value[String(M.sourceId??M.id??M)]}]),onClick:K=>d.value=String(M.sourceId??M.id??M)},[e.createElementVNode("span",Pa,e.toDisplayString(M.sourceName??M.name??String(M.sourceId??M.id??M)),1),g.value[String(M.sourceId??M.id??M)]?(e.openBlock(),e.createBlock(te,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...A[8]||(A[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Ha))),128)),N.value.length===0?(e.openBlock(),e.createElementBlock("div",ja," 无匹配设备 ")):e.createCommentVNode("",!0)]),d.value?(e.openBlock(),e.createBlock(R,{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,M=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.key==="x_ratio"||M.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(we)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):M.description?(e.openBlock(),e.createBlock(te,{key:1,content:M.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[M.options&&M.type==="string"?(e.openBlock(),e.createBlock(p,{key:0,"model-value":u(M.key),onChange:K=>w(M.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):M.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":u(M.key),onChange:K=>w(M.key,K)},null,8,["model-value","onChange"])):M.type==="number"||M.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":u(M.key),onChange:K=>w(M.key,K),min:M.min,max:M.max,step:M.step||(M.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):L(M)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":M,"paired-field":S(M),"primary-value":u(M.key),"paired-value":u(M["x-paired-with"]),onUpdate:(K,le)=>j(M.key,K,M["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):M.type==="array"&&!M.options?(e.openBlock(),e.createElementBlock("div",za,[e.createVNode(se,{"model-value":F(M.key),onChange:K=>I(M.key,K),type:"textarea",rows:3,placeholder:M.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):M.type==="array"&&M.options?(e.openBlock(),e.createBlock(p,{key:5,"model-value":u(M.key),onChange:K=>w(M.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":u(M.key),onInput:K=>w(M.key,K),maxlength:M.maxLength,"show-word-limit":!!M.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!M.dependsOn||G(M)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(R,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,M=>e.withDirectives((e.openBlock(),e.createBlock(V,{key:M.key,required:M.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(M.label),1),M.key==="x_ratio"||M.key==="y_ratio"?(e.openBlock(),e.createBlock(te,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(we)]),default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1})):M.description?(e.openBlock(),e.createBlock(te,{key:1,content:M.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(Q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(X.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[M.options&&M.type==="string"?(e.openBlock(),e.createBlock(p,{key:0,"model-value":u(M.key),onChange:K=>w(M.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):M.type==="boolean"?(e.openBlock(),e.createBlock(ce,{key:1,"model-value":u(M.key),onChange:K=>w(M.key,K)},null,8,["model-value","onChange"])):M.type==="number"||M.type==="integer"?(e.openBlock(),e.createBlock(ne,{key:2,"model-value":u(M.key),onChange:K=>w(M.key,K),min:M.min,max:M.max,step:M.step||(M.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):L(M)?(e.openBlock(),e.createBlock(Te,{key:3,"primary-field":M,"paired-field":S(M),"primary-value":u(M.key),"paired-value":u(M["x-paired-with"]),onUpdate:(K,le)=>j(M.key,K,M["x-paired-with"],le)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):M.type==="array"&&!M.options?(e.openBlock(),e.createElementBlock("div",Ua,[e.createVNode(se,{"model-value":F(M.key),onChange:K=>I(M.key,K),type:"textarea",rows:3,placeholder:M.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):M.type==="array"&&M.options?(e.openBlock(),e.createBlock(p,{key:5,"model-value":u(M.key),onChange:K=>w(M.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.options,(K,le)=>(e.openBlock(),e.createBlock(s,{key:K,label:M.optionLabels?M.optionLabels[le]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(se,{key:6,"model-value":u(M.key),onInput:K=>w(M.key,K),maxlength:M.maxLength,"show-word-limit":!!M.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!M.dependsOn||G(M)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-4e165a2e"]]),Ja={class:"config-header"},Ya={class:"config-section"},Xa={key:0,style:{"margin-bottom":"8px"}},Qa=oe({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=O=>{if(!t.value)return;const d={...t.value.data.arguments,conditionRelation:O};o.updateNodeData(t.value.id,{arguments:d})},k=()=>{if(!t.value)return;const d=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],b={...t.value.data.arguments,alertConditions:d};o.updateNodeData(t.value.id,{arguments:b})},E=(O,d,b)=>{if(!t.value)return;const N=[...t.value.data.arguments?.alertConditions||[]];N[O]={...N[O],[d]:b};const g={...t.value.data.arguments,alertConditions:N};o.updateNodeData(t.value.id,{arguments:g})},D=O=>{if(!t.value)return;const d=[...t.value.data.arguments?.alertConditions||[]];d.splice(O,1);const b={...t.value.data.arguments,alertConditions:d};o.updateNodeData(t.value.id,{arguments:b})},$=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(O,d)=>{const b=e.resolveComponent("el-button"),N=e.resolveComponent("el-divider"),g=e.resolveComponent("el-text"),m=e.resolveComponent("el-option"),n=e.resolveComponent("el-select"),x=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-radio"),c=e.resolveComponent("el-radio-group"),q=e.resolveComponent("el-form-item"),T=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ja,[d[1]||(d[1]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(b,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:$},null,8,["icon"]))]),e.createVNode(N),e.createElementVNode("div",Ya,[d[9]||(d[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(T,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,null,{label:e.withCtx(()=>[d[3]||(d[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(g,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...d[2]||(d[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(g,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...d[4]||(d[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:B=>E(S,"operator",B),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"等于 =",value:"="}),e.createVNode(m,{label:"大于 >",value:">"}),e.createVNode(m,{label:"小于 <",value:"<"}),e.createVNode(m,{label:"大于等于 ≥",value:">="}),e.createVNode(m,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(x,{"model-value":L.value,onChange:B=>E(S,"value",B),min:0,precision:0,max:9999,style:{flex:"1"},"controls-position":"right",placeholder:"请输入数值"},null,8,["model-value","onChange"]),(t.value?.data.arguments?.alertConditions||[]).length>1?(e.openBlock(),e.createBlock(b,{key:0,type:"danger",icon:e.unref(X.Delete),circle:"",size:"small",onClick:B=>D(S)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Xa,[e.createVNode(g,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...d[5]||(d[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(c,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:d[0]||(d[0]=L=>l(L))},{default:e.withCtx(()=>[e.createVNode(P,{value:"OR"},{default:e.withCtx(()=>[...d[6]||(d[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(P,{value:"AND"},{default:e.withCtx(()=>[...d[7]||(d[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(b,{type:"text",link:"",icon:e.unref(X.Plus),onClick:k},{default:e.withCtx(()=>[...d[8]||(d[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),Ka={class:"config-header"},Za={class:"config-section"},va={style:{display:"flex","align-items":"center",gap:"8px"}},el={style:{display:"flex","align-items":"center",gap:"8px"}},tl={style:{display:"flex","align-items":"center",gap:"8px"}},ol=oe({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),f=e.inject("editorMode",ee.ALGORITHM),h=e.computed(()=>f===ee.TASK),l=m=>{if(!t.value)return;const n={...t.value.data.arguments,duration:m};o.updateNodeData(t.value.id,{arguments:n})},k=m=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_enabled:m};o.updateNodeData(t.value.id,{arguments:n})},E=m=>{if(!t.value)return;const n={...t.value.data.arguments,similarity_threshold:m};o.updateNodeData(t.value.id,{arguments:n})},D=m=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_enabled:m};o.updateNodeData(t.value.id,{arguments:n})},$=m=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_operator:m};o.updateNodeData(t.value.id,{arguments:n})},O=m=>{if(!t.value)return;const n={...t.value.data.arguments,hit_rate_threshold:m};o.updateNodeData(t.value.id,{arguments:n})},d=m=>{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:m}};o.updateNodeData(t.value.id,{arguments:x})},b=m=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:m}};o.updateNodeData(t.value.id,{arguments:n})},N=m=>{if(!t.value)return;const n={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:m}};o.updateNodeData(t.value.id,{arguments:n})},g=()=>{t.value&&Z.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(m,n)=>{const x=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),c=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-text"),T=e.resolveComponent("el-form-item"),L=e.resolveComponent("el-switch"),S=e.resolveComponent("el-icon"),B=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-slider"),r=e.resolveComponent("el-option"),_=e.resolveComponent("el-select"),u=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ka,[n[9]||(n[9]=e.createElementVNode("h3",null,"节点配置",-1)),h.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(x,{key:0,type:"danger",size:"small",icon:e.unref(X.Delete),circle:"",onClick:g},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",Za,[n[13]||(n[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(T,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"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(q,{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(T,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",va,[e.createVNode(L,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:n[1]||(n[1]=w=>k(w))},null,8,["model-value"]),e.createVNode(B,{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(T,{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=>E(w)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(q,{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(T,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",el,[e.createVNode(L,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:n[3]||(n[3]=w=>D(w))},null,8,["model-value"]),e.createVNode(B,{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(T,{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=>$(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(T,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:n[5]||(n[5]=w=>O(w)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(q,{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(T,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",tl,[e.createVNode(L,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:n[6]||(n[6]=w=>d(w))},null,8,["model-value"]),e.createVNode(B,{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(T,{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=>b(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(T,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"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"]]),nl={class:"node-config-panel"},al={class:"config-content"},ll=oe({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:vo,group:tn,start:En,end:An,classificationModel:Fn,ocr:Hn,licensePlate:zn,face:Je,stream:Zn,dataSource:sa,smallModel:Da,detectionTarget:Wa,targetCount:Qa,timerTarget:ol,faceRecognition:Je},f=e.computed(()=>{const h=o.selectedEdge;if(h)return o.nodes.find(E=>E.id===h.source)?.data?.enableBranch&&t.edge||null;const l=o.selectedNode;return l&&t[l.type]||null});return(h,l)=>(e.openBlock(),e.createElementBlock("div",nl,[e.createElementVNode("div",al,[f.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(f.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),rl={class:"workflow-editor",id:"workflow-editor"},sl={class:"editor-content"},il={__name:"WorkflowEditor",props:{mode:{type:String,default:ee.ALGORITHM,validator:a=>Object.values(ee).includes(a)},pageMode:{type:String,default:he.CREATE,validator:a=>Object.values(he).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;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=`aiflow-workflow-${Math.random().toString(36).slice(2,9)}`,h=Fe(f)();e.provide(Re,h),e.onUnmounted(()=>{h.$dispose()});const{copyToClipboard:l,downloadJSON:k,exportToJSON:E}=yt(h),{runValidation:D}=Nt(h),$=e.computed(()=>{if(h.selectedNodeId)return!0;const d=h.selectedEdge;return d?!!h.nodes.find(N=>N.id===d.source)?.data?.enableBranch:!1});return o({reset:()=>{Z.ElMessageBox.confirm("确定要重置工作流吗?所有节点和连接将被清空。","确认重置",{confirmButtonText:"重置",cancelButtonText:"取消",type:"warning"}).then(()=>{h.resetWorkflow(),Z.ElMessage.success("工作流已重置")}).catch(()=>{})},runTest:D,copyJSON:l,exportJSON:E}),(d,b)=>(e.openBlock(),e.createElementBlock("div",rl,[e.createElementVNode("div",sl,[e.createVNode(wt),e.createVNode(Xo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[$.value?(e.openBlock(),e.createBlock(ll,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Xe=oe(il,[["__scopeId","data-v-3541628d"]]),cl={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},Qe=a=>{Object.entries(cl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Xe)},dl={install:Qe};re.EditorMode=ee,re.NodeType=C,re.PageMode=he,re.WorkflowEditor=Xe,re.default=dl,re.install=Qe,Object.defineProperties(re,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|