aiflowui 1.0.18 → 1.0.19
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 +3148 -3077
- package/dist-lib/aiflowui.umd.js +1 -1
- package/dist-lib/style.css +1 -1
- package/package.json +1 -1
package/dist-lib/aiflowui.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(se,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(se=typeof globalThis<"u"?globalThis:se||self,e(se.AIFlowUI={},se.Vue,se.ElementPlusIconsVue,se.ElementPlus,se.Pinia,se.VueFlowCore,se.VueFlowBackground,se.VueFlowControls,se.VueFlowNodeResizer))})(this,(function(se,e,K,v,Ze,ee,ve,et,tt){"use strict";const C={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},ot={[C.DETECTION_TARGET]:"检测目标",[C.CLASSIFICATION_MODEL]:"分类模型",[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.TARGET_COUNT]:"目标计数",[C.TIMER_TARGET]:"目标计时",[C.FACE_RECOGNITION]:"人脸识别",[C.SMALL_MODEL]:"小模型"},nt={cls:C.CLASSIFICATION_MODEL,ocr:C.OCR,license_plate:C.LICENSE_PLATE,target_count:C.TARGET_COUNT,timer_target:C.TIMER_TARGET,face:C.FACE_RECOGNITION,face_recognition:C.FACE_RECOGNITION},oe={ALGORITHM:"algorithm",TASK:"task"},Ne={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ae=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),Ee=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}}}),we=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"}}),De=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Le=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Me=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Oe=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Ie=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Re=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"}}}}),$e=a=>({id:me("timerTarget"),type:"timerTarget",position:a,data:{label:"目标计时",description:"",arguments:{duration:30,similarity_enabled:!1,similarity_threshold:90,hit_rate_enabled:!1,hit_rate_operator:"gte",hit_rate_threshold:2,overlap_detection:{enabled:!1,operator:"gt",threshold:90}},input_schema:{}}}),at=(a,o={width:300,height:160},t="and",d=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:d},selectable:!0,deletable:!1,zIndex:-1}),Fe=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ye=new Map,qe=()=>{const a=Ae({x:80,y:300}),o=we({x:320,y:300}),t=Ee({x:1e3,y:300}),d={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[d]}},lt=a=>Ze.defineStore(`aiflow-workflow-${a}`,()=>{const o=qe(),t=e.ref(o.nodes),d=e.ref(o.edges),_=e.ref(null),l=e.ref(null),k=e.ref(new Set),V=e.ref(new Set),D=e.ref({}),H=(R,n,x,j)=>{D.value[R]||(D.value[R]={}),D.value[R][n]||(D.value[R][n]={}),D.value[R][n][x]={...j}},I=(R,n,x,j,Y)=>{D.value[R]||(D.value[R]={}),D.value[R][n]||(D.value[R][n]={}),D.value[R][n][x]||(D.value[R][n][x]={}),D.value[R][n][x][j]=Y},g=(R,n,x)=>D.value[R]?.[n]?.[x]??null,T=()=>{D.value={}},S=e.computed(()=>_.value?t.value.find(R=>R.id===_.value):null),r=e.computed(()=>l.value?d.value.find(R=>R.id===l.value):null),y=R=>t.value.filter(n=>n.type===R).length,s=()=>{const R=t.value.filter(n=>n.type===C.DATA_SOURCE);R.length!==0&&(R.length===1?R[0].data.label="数据源":R.forEach((n,x)=>{n.data.label=`数据源 ${x+1}`}))},L=()=>t.value.filter(R=>R.type===C.DATA_SOURCE).length,P=()=>t.value.filter(n=>n.type===C.DATA_SOURCE).some(n=>n.data.arguments?.needCooperativeDetection===!0),f=()=>{const R=L(),n=P();return!(R>1||n)},F=R=>{t.value.push(R),R.type===C.DATA_SOURCE&&s()},u=R=>{const n=t.value.find(j=>j.id===R),x=n?.type===C.DATA_SOURCE;if(n?.type==="group"){N(R),d.value=d.value.filter(j=>j.source!==R&&j.target!==R),_.value===R&&(_.value=null);return}t.value=t.value.filter(j=>j.id!==R),d.value=d.value.filter(j=>j.source!==R&&j.target!==R),_.value===R&&(_.value=null),x&&s()},w=(R,n)=>{const x=t.value.find(j=>j.id===R);x&&(x.data={...x.data,...n})},c=(R,n)=>{const x=t.value.find(j=>j.id===R);x&&(x.position=n)},b=R=>{const n=t.value.find(x=>x.id===R.source);if(n&&(n.type===C.START||n.type===C.DATA_SOURCE)&&n.data?.enableBranch===!0){const j=d.value.filter(Y=>Y.source===R.source).length+1;R={...R,data:{...R.data,branchOrder:j}}}d.value=ee.addEdge(R,d.value)},q=R=>{const n=d.value.find(x=>x.id===R);if(d.value=d.value.filter(x=>x.id!==R),l.value===R&&(l.value=null),n&&n.data?.branchOrder!==void 0){const x=t.value.find(j=>j.id===n.source);x&&(x.type===C.START||x.type===C.DATA_SOURCE)&&d.value.filter(Y=>Y.source===n.source).sort((Y,z)=>(Y.data?.branchOrder||0)-(z.data?.branchOrder||0)).forEach((Y,z)=>{Y.data?Y.data.branchOrder=z+1:Y.data={branchOrder:z+1}})}},m=(R,n="and",x=null)=>{const j=at(R,{width:300,height:160},n,x);return t.value.unshift(j),j.id},p=(R,n)=>{const x=t.value.find(z=>z.id===R),j=t.value.find(z=>z.id===n);if(!x||!j||x.parentNode===n)return;x.parentNode&&i(R);const Y=t.value.find(z=>z.id===R);Y&&(t.value=t.value.map(z=>z.id!==R?z:{...z,position:{x:Y.position.x-j.position.x,y:Y.position.y-j.position.y},parentNode:n,extent:"parent"}))},i=R=>{const n=t.value.find(z=>z.id===R);if(!n||!n.parentNode)return;const x=t.value.find(z=>z.id===n.parentNode),j=x?n.position.x+x.position.x:n.position.x,Y=x?n.position.y+x.position.y:n.position.y;t.value=t.value.map(z=>{if(z.id!==R)return z;const X={...z,position:{x:j,y:Y}};return delete X.parentNode,delete X.extent,X})},N=R=>{const n=t.value.find(x=>x.id===R);n&&(t.value=t.value.filter(x=>x.id!==R).map(x=>{if(x.parentNode!==R)return x;const j={...x,position:{x:x.position.x+n.position.x,y:x.position.y+n.position.y}};return delete j.parentNode,delete j.extent,j}))};return{nodes:t,edges:d,selectedNodeId:_,selectedEdgeId:l,invalidNodeIds:k,invalidEdgeIds:V,selectedNode:S,selectedEdge:r,getNodeCountByType:y,getDataSourceCount:L,hasCooperativeDetection:P,supportPatrol:f,addNode:F,removeNode:u,updateNodeData:w,updateNodePosition:c,addConnection:b,removeEdge:q,updateEdgeData:(R,n)=>{const x=d.value.find(j=>j.id===R);if(x){if(n.branchOrder!==void 0){const j=t.value.find(Y=>Y.id===x.source);if(j&&(j.type===C.START||j.type===C.DATA_SOURCE)){const Y=x.data?.branchOrder,z=n.branchOrder;if(Y!==z&&z!==null){const te=d.value.filter(ae=>ae.source===x.source&&ae.id!==R).find(ae=>ae.data?.branchOrder===z);te&&(te.data?te.data.branchOrder=Y:te.data={branchOrder:Y})}}}x.data={...x.data,...n}}},selectNode:R=>{_.value=R,l.value=null},selectEdge:R=>{l.value=R,_.value=null},clearSelection:()=>{_.value=null,l.value=null},resetWorkflow:()=>{const R=qe();t.value=R.nodes,d.value=R.edges,_.value=null,l.value=null,T()},loadWorkflow:(R,n)=>{t.value=R,d.value=n,_.value=null,l.value=null,T()},refreshDataSourceLabels:s,createEmptyGroup:m,addNodeToGroup:p,removeNodeFromGroup:i,dissolveParallelGroup:N,initializeSubsequentFrames:R=>{t.value.find(x=>x.id===R)&&w(R,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(R,n)=>{const x=t.value.find(j=>j.id===R);!x||x.type!=="dataSource"||(x.data.subsequentFrames||(x.data.subsequentFrames=[]),x.data.subsequentFrames.push(n),w(R,{subsequentFrames:[...x.data.subsequentFrames]}))},removeSubsequentFrame:(R,n)=>{const x=t.value.find(z=>z.id===R);if(!x||x.type!=="dataSource")return;const j=x.data.subsequentFrames.find(z=>z.id===n);j&&d.value.filter(X=>X.source===R&&X.sourceHandle===j.handleId).forEach(X=>q(X.id));const Y=x.data.subsequentFrames.filter(z=>z.id!==n);Y.forEach((z,X)=>{z.id==="default-subsequent"?z.label="后续帧检测":z.label=`后续帧检测${X+1}`}),w(R,{subsequentFrames:Y})},setInvalidIds:(R,n)=>{k.value=new Set(R),V.value=new Set(n)},clearInvalidIds:()=>{k.value=new Set,V.value=new Set},taskSources:D,setTaskSourceArguments:H,updateTaskSourceArgument:I,getTaskSourceArguments:g,clearTaskSources:T}}),le=(a=null)=>{const o=a??e.inject("workflowInstanceId","default");return ye.has(o)||ye.set(o,lt(o)),ye.get(o)()},rt=a=>{if(ye.has(a)){try{ye.get(a)().$dispose()}catch{}ye.delete(a)}},Ge=(a,o,t)=>{const d=[],_=[],l=a.filter(s=>s.type!=="group"),k=l.filter(s=>s.type===C.START);k.length===0?d.push("工作流必须包含一个开始节点"):k.length>1&&d.push("工作流只能包含一个开始节点");const V=l.filter(s=>s.type===C.END);V.length===0?d.push("工作流必须包含一个结束节点"):V.length>1&&d.push("工作流只能包含一个结束节点");const D=l.filter(s=>s.type===C.DATA_SOURCE);D.length===0&&d.push("工作流必须至少包含一个数据源节点"),l.filter(s=>s.type===C.DETECTION_TARGET||s.type===C.SMALL_MODEL||s.type===C.CLASSIFICATION_MODEL).length===0&&d.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(s=>s.type===C.SMALL_MODEL),D.some(s=>s.data.arguments?.needCooperativeDetection===!0),D.length>1,l.forEach(s=>{const L=o.filter(f=>f.target===s.id),P=o.filter(f=>f.source===s.id);if(s.type===C.START&&L.length>0&&_.push("开始节点不应有输入连接"),s.type===C.END&&P.length>0&&_.push("结束节点不应有输出连接"),s.type===C.START&&P.length===0&&d.push("开始节点必须有输出连接"),s.type===C.END&&L.length===0&&d.push("结束节点必须有输入连接"),s.type===C.DATA_SOURCE&&s.data.enableImageSequence)if(P.length===0)d.push({nodeId:s.id,message:`数据源节点"${s.data.label}"开启了图片时序但未连接到任何处理节点`});else{const f=P.filter(c=>c.sourceHandle==="first-frame"),F=s.data.subsequentFrames||[],u=new Set(P.map(c=>c.sourceHandle)),w=F.filter(c=>!u.has(c.handleId));f.length===0&&_.push({nodeId:s.id,message:`数据源节点"${s.data.label}"的首帧检测未连接`}),w.length>0&&_.push({nodeId:s.id,message:`数据源节点"${s.data.label}"有${w.length}个后续帧未连接`})}s.type!==C.START&&s.type!==C.END&&!s.parentNode&&(L.length===0||P.length===0)&&_.push(`节点 "${s.data.label}" 可能未正确连接`)});const I=new Set;o.forEach(s=>{const L=a.find(P=>P.id===s.source);L?.type==="dataSource"&&L.data?.enableImageSequence===!0&&s.sourceHandle!=="first-frame"&&(!s.data?.timeWindowSeconds||s.data.timeWindowSeconds<1)&&d.push({edgeId:s.id,message:`分支"${s.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),I.add(s.source),I.add(s.target)}),l.forEach(s=>{s.parentNode||!I.has(s.id)&&l.length>1&&_.push(`节点 "${s.data.label}" 未连接到工作流`)});const g=st(l,o);d.push(...g);const T=ct(l,o);d.push(...T);const S=it(l);d.push(...S);const r=dt(l,o);d.push(...r);const y=mt(l,o);return d.push(...y),t==="task"&&l.filter(L=>L.type===C.FACE_RECOGNITION).forEach(L=>{(!L.data.arguments?.repositoryId||Array.isArray(L.data.arguments.repositoryId)&&L.data.arguments.repositoryId.length===0)&&d.push({nodeId:L.id,message:`人脸识别节点"${L.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:d.length===0,errors:d,warnings:_}},st=(a,o)=>{const t=[],d=a.find(k=>k.type===C.START);if(!d)return t;const _=new Set,l=(k,V,D,H)=>{if(V.includes(k))return;const I=a.find(y=>y.id===k);if(!I)return;const g=[...V,k];let T=[...D],S=[...H];if(I.type===C.TARGET_COUNT&&T.push(I),I.type===C.TIMER_TARGET&&S.push(I),I.type===C.END){const y=g.join("->");_.has(y)||(_.add(y),T.length>1&&t.push(`工作流分支中存在多个目标计数节点(${T.map(s=>`"${s.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),S.length>1&&t.push(`工作流分支中存在多个目标计时节点(${S.map(s=>`"${s.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const r=o.filter(y=>y.source===k);r.length===0?(T.length>1&&t.push(`工作流分支中存在多个目标计数节点(${T.map(y=>`"${y.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),S.length>1&&t.push(`工作流分支中存在多个目标计时节点(${S.map(y=>`"${y.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):r.forEach(y=>{l(y.target,g,T,S)})};return l(d.id,[],[],[]),t},it=a=>{const o=[],t=a.filter(_=>_.type===C.DATA_SOURCE),d=a.filter(_=>_.type===C.SMALL_MODEL);return d.length>0&&t.length>1&&d.forEach(_=>{o.push({nodeId:_.id,message:`小模型节点"${_.data.label||_.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},ct=(a,o)=>{const t=[];return a.filter(_=>_.type===C.DATA_SOURCE).forEach(_=>{const l=o.filter(k=>k.source===_.id);if(l.length>1){const k=l.map(H=>H.target),D=a.filter(H=>k.includes(H.id)).filter(H=>H.type===C.SMALL_MODEL);if(D.length>0){const H=D.map(I=>`"${I.data.label||I.data.modelName}"`).join("、");t.push(`数据源节点"${_.data.label}"开启了多分支,不能包含小模型节点(${H})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},dt=(a,o)=>{const t=[],d=[C.TARGET_COUNT,C.TIMER_TARGET],_={[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 H=a.find(I=>I.id===D.target);if(H&&d.includes(H.type)){const I=_[H.type]||H.type;t.push(`小模型节点"${k.data.label||k.data.modelName}"不能直接连接${I}节点"${H.data.label}",请先连接检测目标节点`)}})}),t},mt=(a,o)=>{const t=[],d=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION],_={[C.OCR]:"OCR识别",[C.LICENSE_PLATE]:"车牌识别",[C.FACE_RECOGNITION]:"人脸识别"};return a.filter(k=>d.includes(k.type)).forEach(k=>{const V=o.filter(I=>I.source===k.id),D=d.filter(I=>I!==k.type).concat(C.END),H=k.data.label||_[k.type];V.forEach(I=>{const g=a.find(T=>T.id===I.target);g&&!D.includes(g.type)&&t.push(`${H}节点"${H}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${g.data.label||g.type}"节点`)}),V.length===0&&t.push(`${H}节点"${H}"必须连接到其他辅助节点或结束节点`)}),t},He=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},ue=(a,o,t)=>(a[o]||[]).map(d=>t.get(d)).filter(Boolean),je=(a,o)=>{const t={},d=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,k)=>{const V=l.data?.branchOrder??1/0,D=k.data?.branchOrder??1/0;return V-D}).forEach(l=>{if(d.has(l.source)&&d.has(l.target))return;let k=l.source,V=l.target;if(d.has(k)){const D=o.find(H=>H.target===k&&!d.has(H.source));if(!D)return;k=D.source}if(d.has(V)){const D=o.find(H=>H.source===V&&!d.has(H.target));if(!D)return;V=D.target}t[k]||(t[k]=[]),t[k].includes(V)||t[k].push(V)}),t},Pe=(a,o)=>{const t=[...o.values()].find(k=>k.type===C.START);if(!t)return[];const d=new Set,_=[],l=k=>{if(d.has(k))return;d.add(k);const V=o.get(k);if(!V)return;V.type!==C.START&&V.type!==C.END&&V.type!=="group"&&_.push(V),(a[k]||[]).forEach(H=>l(H))};return l(t.id),_},pt=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],be=(a,o,t,d)=>{const _=a.nodes.findIndex(k=>k.toolTitle===o);if(_===-1)return;const l=a.nodes[_];l.arguments?.[t]&&(a[d]=l.arguments[t]),a.nodes=a.nodes.filter((k,V)=>V!==_),a.nodes.forEach((k,V)=>{k.sortOrder=V+1})},ut=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(d=>({op:d.operator,value:d.value}))}}},ft=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const d={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:d[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const d=t.operator||"gt",_={gt:">",eq:"=",lt:"<"};o.overlap={op:_[d]||">",value:t.threshold,matchFrames:3}}return a.similarity_enabled&&a.similarity_threshold!==void 0&&(o.similarity={op:">",value:a.similarity_threshold,matchFrames:3}),{duration:o}},gt={[C.TARGET_COUNT]:ut,[C.TIMER_TARGET]:ft},Ce=(a,o)=>{if(!a)return{};const t=gt[o];if(t)return t(a);const d={...a};return pt.forEach(_=>{delete d[_]}),Object.keys(d).forEach(_=>{const l=d[_];(l==null||l==="")&&delete d[_]}),o===C.FACE_RECOGNITION&&d.repositoryId!==void 0&&(Array.isArray(d.repositoryId)||(d.repositoryId=[d.repositoryId]),d.repositoryId.length===0&&delete d.repositoryId),d},ht=a=>{switch(a.type){case 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||""}},yt=(a,o,t,d,_=null)=>{const l={toolTitle:ht(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:Ce(_??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const k=d.find(V=>V.source===t&&V.target===a.id);k?.data?.branchOrder!==void 0&&k?.data?.branchOrder!==null&&(l.branchOrder=k.data.branchOrder)}return l},ze=(a,o,t,d,_,l=null,k=[])=>{const V=[],D=Array.isArray(a)?[...a]:[a],H=new Set;let I=1;for(;D.length>0;){const g=[...D];D.length=0;const T=[];g.forEach(S=>{if(H.has(S))return;H.add(S);const r=d.get(S);!r||r.type===C.END||r.type===C.START||r.type===C.DATA_SOURCE||((t[S]||[]).forEach(s=>{const L=d.get(s);L&&L.type!==C.END&&D.push(s)}),k.includes(r.type))||T.push(r)}),T.length>0&&(T.forEach(S=>{const r=l?.(S.id)??null,y=yt(S,I,o,_,r);T.length>1&&(y.nodeLogic="or"),V.push(y)}),I++)}return V},_t=(a=null,o=null)=>{const t=a??le(),d=e.inject("editorMode",oe.ALGORITHM);e.inject("pageMode",Ne.CREATE);const _=o??e.inject("editorConfig",null),l=e.computed(()=>Ge(t.nodes,t.edges,d)),k=(m,p,i,N)=>{if(i){const E=ue(m,i.id,p).find(J=>J.type===C.SMALL_MODEL);if(E)return E}return N.find(E=>E.type===C.SMALL_MODEL)||null},V=(m,p,i)=>{const E=ue(p,m.id,i).find(A=>A.type===C.SMALL_MODEL);return E?ue(p,E.id,i).filter(A=>A.type!==C.END&&A.type!==C.START&&A.type!==C.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},D=(m,p,i,N,E)=>{if(p===de.SMALL_MODEL||p===de.SMALL_MODEL_BRANCH){const A=k(N,E,i,m);return A?{toolTitle:A.data.title||A.data.modelName||"",toolType:"small",arguments:Ce(A.data.arguments,C.SMALL_MODEL)}:null}const J=m.find(A=>A.type===C.DETECTION_TARGET);return J?{toolTitle:J.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:Ce(J.data.arguments,C.DETECTION_TARGET)}:null},H=()=>{const m=t.nodes.find(N=>N.type===C.END);if(!m||!m.data.arguments)return{};const p=m.data.arguments,i={};return p.reportFrequency==="interval"&&p.reportInterval&&(i.interval={value:p.reportInterval}),p.enableDeduplication&&p.similarityThreshold!==void 0&&(i.dedup={value:p.similarityThreshold}),i},I=m=>{if(m.length<=1)return;const p=m.map(N=>N.sortOrder);if(new Set(p).size!==p.length){const N=p.filter((E,J)=>p.indexOf(E)!==J);throw new Error(`分支执行顺序存在重复:${[...new Set(N)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},g=(m,p,i,N,E)=>{let J=[],A;if(m===de.IMAGE_BRANCH)p&&(J=ue(N,p.id,E).filter(B=>B.type!==C.END)),A=p?.id||i.find(B=>B.type===C.DATA_SOURCE)?.id;else if(m===de.SMALL_MODEL_BRANCH){const B=k(N,E,p,i);B&&(J=ue(N,B.id,E).filter($=>$.type!==C.END),A=B.id)}return{branchStartNodes:J,sourceNodeId:A}},T=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]),S=(m,p,i)=>{const N=new Set,E=[],J=A=>{if(N.has(A))return;N.add(A);const B=i.get(A);if(!B||B.type===C.END)return;T.has(B.type)&&E.push(B),(p[A]||[]).forEach(W=>J(W))};return J(m),E.length>0?E[E.length-1]:null},r=(m,p,i,N,E)=>{const J=`分支${E+1}`,A=S(p,i,N);if(!A)return m?.data?.nodeName||J;if(A.type===C.DETECTION_TARGET&&A.data?.targetId==="other"){const $=A.data?.arguments?.object;if(Array.isArray($)&&$.length>0){const W=$.join(",");return W.length>32?W.slice(0,32):W}}if(A.type===C.CLASSIFICATION_MODEL){const $=A.data?.arguments?.modelName||A.data?.label;if(!$)return J;const W=A.data?.arguments?.resultNegate?"(取反)":"";return $+W}return A.data?.label||A.data?.targetName||J},y=(m,p,i,N,E,J)=>{const{branchStartNodes:A,sourceNodeId:B}=g(p,i,m,N,E);if(A.length===0)return[];const $=[];return A.forEach((W,h)=>{const M=ze([W.id],B,N,E,J);if(M.length===0)return;const G=B?J.find(n=>n.source===B&&n.target===W.id):null,U=G?.data||{},Z=U.branchOrder!==void 0&&U.branchOrder!==null?U.branchOrder:h+1,R={branchName:U.branchName||r(W,W.id,N,E,h),sortOrder:Z,nodes:M};G?.sourceHandle&&(R.sourceHandle=G.sourceHandle),be(R,"target_count","targetCount","targetCount"),be(R,"timer_target","duration","duration"),U.timeWindowSeconds!==void 0&&U.timeWindowSeconds!==null&&(R.timeWindowSeconds=U.timeWindowSeconds),U.branchDescription&&(R.description=U.branchDescription),$.push(R)}),I($),$},s=()=>{const m=l.value;if(m.errors.length>0){const p=m.errors.map(i=>typeof i=="object"?i.message:i);return v.ElMessage.error(`验证失败: ${p.join(", ")}`),!1}return m.warnings.length>0&&v.ElMessage.warning(`警告: ${m.warnings.join(", ")}`),!0},L=()=>{const m=t.nodes,p=t.edges,i=He(m),N=je(m,p),E=Pe(N,i),J=[...i.values()].find(A=>A.type===C.START);return{allNodes:m,edges:p,nodeMap:i,adj:N,orderedNodes:E,startNode:J}},P=m=>{const p={ruleName:m?.data?.algorithmName||"",description:"",webhookUrl:""},i=H();Object.keys(i).length>0&&(p.extraConfig=i);const E=(_?.value??_)?.platform;return p.attach=E?{platform:E}:{},p},f=(m,p)=>{const i=m.filter(N=>N.type===C.DATA_SOURCE);if(i.length===0){const N=p.find(E=>E.type===C.DATA_SOURCE);N&&i.push(N)}return i},F=m=>m?.data?.enableImageSequence||m?.data?.arguments?.enableImageSequence||!1?"order":m?.data?.enableBranch&&m.data.branchLogic||"and",u=(m,p,i,N)=>{const{orderedNodes:E,adj:J,nodeMap:A,edges:B}=p,$=V(m,J,A),W=!!m.data.arguments?.needCooperativeDetection,h=B.find(R=>R.target===m.id),M=h?.data?.branchOrder!==void 0&&h?.data?.branchOrder!==null?h.data.branchOrder:N+1,G={sourceGroupId:null,name:m.data.label||"数据源",sort:M,synEnabled:W};if(W&&(G.windowSeconds=m.data.arguments?.windowSeconds||5),$===de.SMALL_MODEL){const R=D(E,$,m,J,A);return R&&(G.streamConfig=R),G.logic="and",G.children=[],G}if($===de.SMALL_MODEL_BRANCH){const R=D(E,$,m,J,A);R&&(G.streamConfig=R)}G.logic=F(m);const U=y(E,$,m,J,A,B),Z=i.length;return G.children=U.map((R,n)=>({name:R.branchName,branchRefs:[Z+n]})),i.push(...U),G},w=(m,p)=>{const N={groupLogic:m?.data?.enableBranch&&m.data.branchLogic||"and",sourceGroups:p};return p.length>=2&&(N.groupWindowSeconds=m.data.groupWindowSeconds),N},c=()=>{if(!s())return null;try{const m=L(),p=P(m.startNode),i=f(m.orderedNodes,m.allNodes),N=[],E=i.map((J,A)=>u(J,m,N,A));return p.ruleSchema=w(m.startNode,E),N.length>0&&(p.branches=N),{name:p.ruleName,description:p.description,grapg:p}}catch(m){return v.ElMessage.error(m.message||"导出失败"),null}};return{validation:l,exportToJSON:c,copyToClipboard:()=>{try{const m=c();if(!m)return;const p=JSON.stringify(m,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(p).then(()=>{v.ElMessage.success("已复制到剪贴板")}).catch(()=>{v.ElMessage.error("复制失败")});else{const i=document.createElement("textarea");i.value=p,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),v.ElMessage.success("已复制到剪贴板")}}catch(m){console.error("复制JSON失败:",m),v.ElMessage.error(`复制失败: ${m.message}`)}},downloadJSON:()=>{const m=c();if(!m)return;const p=JSON.stringify(m,null,2),i=new Blob([p],{type:"application/json"}),N=URL.createObjectURL(i),E=document.createElement("a");E.href=N,E.download=`workflow_${Date.now()}.json`,E.click(),URL.revokeObjectURL(N),v.ElMessage.success("导出成功")}}},Nt=(a=null,o=null)=>{const t=a??le();e.inject("editorMode",oe.TASK),e.inject("pageMode",Ne.CREATE);const d=e.inject("editorConfig",null),_=e.inject("taskModeConfig",null),l=o??d,k=o??_,V=e.inject("echoTaskData",null),D=e.inject("selectedDevicesMap",null),H=e.computed(()=>({errors:[],warnings:[]})),I=(f,F)=>{const u={},w=F?.data?.arguments??{};w.reportFrequency==="interval"&&w.reportInterval&&(u.interval={value:w.reportInterval}),w.enableDeduplication&&w.similarityThreshold!==void 0&&(u.dedup={value:w.similarityThreshold}),t.nodes.filter(q=>q.type===C.DATA_SOURCE).length>=2&&f?.data?.groupWindowSeconds!==void 0&&(u.groupWindowSeconds=f.data.groupWindowSeconds),u.enableVideo=!!f?.data?.enableAlertVideo;const b=f?.data?.schedule;return Array.isArray(b)&&b.length>0?u.schedule=b:u.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],u},g=(f,F,u,w,c="image")=>{const b=ue(F,f.id,u).find(q=>q.type===C.SMALL_MODEL);if(b){const q=f.data?.arguments??{};return{toolTitle:b.data.title||b.data.modelName||"",toolType:"small",arguments:Ce(b.data.arguments,C.SMALL_MODEL),decoder:T(q,!0)}}if(c==="stream"){const q=w.find(p=>p.type===C.DETECTION_TARGET);if(!q)return null;const m=f.data?.arguments??{};return{toolTitle:q.data.targetId||"",toolType:"stream",arguments:Ce(q.data.arguments,C.DETECTION_TARGET),decoder:T(m,!1)}}return null},T=(f,F)=>{const u=f.mode??(F?3:0),w=f.interval??0,c=f.sw_decoding??(F?"CPU":"GPU");let b=0,q=0;return F?u===3?(b=0,q=0):u===2?(b=1,q=0):u===1&&(b=0,q=w):u===0?(b=0,q=w*25):u===1?(b=0,q=w):u===2&&(b=1,q=0),{sw_decoding:c==="CPU",mode:b,interval:q}},S=(f,F,u,w,c=null)=>{let b=f.id,q=ue(F,f.id,u).filter(i=>i.type!==C.END&&i.type!==C.START);q.length===1&&q[0].type===C.SMALL_MODEL&&(b=q[0].id,q=ue(F,b,u).filter(i=>i.type!==C.END&&i.type!==C.START));const m=q;if(m.length===0)return[];const p=c?i=>t.getTaskSourceArguments(f.id,c,i):null;return m.map((i,N)=>{const E=ze([i.id],b,F,u,w,p,[C.SMALL_MODEL]),J=w.find(h=>h.source===b&&h.target===i.id),A=J?.data??{},B=A.branchOrder??N+1,$=A.branchId??null,W={branchId:$,id:$,branchName:A.branchName||i.data?.label||`分支${N+1}`,sortOrder:B,nodes:E};return J?.sourceHandle&&(W.sourceHandle=J.sourceHandle),A.timeWindowSeconds!==void 0&&A.timeWindowSeconds!==null&&(W.timeWindowSeconds=A.timeWindowSeconds),A.branchDescription&&(W.description=A.branchDescription),be(W,"target_count","targetCount","targetCount"),be(W,"timer_target","duration","duration"),W})},r=(f,F,u,w,c=null,b=null,q=null,m=1,p=!1,i=!1)=>{const N=c??f.deviceType??"",E=N==="1400"||N==="2",J=E?"1400":"camera",A=F==="stream"?2:1,B=E&&b!==null?b==="device"?1:2:f.detectionType??2,W=(V?.value??V)?.graph?.sources??[],h=String(f.sourceId??f.id??""),G=W.find(Z=>String(Z.sourceId)===h)?.attach??{},U={deviceType:J,detectionType:B,dataSourceType:A,sourceOrder:u,timeTemplateId:G.timeTemplateId??"",timeTemplateName:G.timeTemplateName??"",platform:w?.platform??"TAI"};if(!E){const Z=q?.mode??0;Z===3?(U.frameExtractionType=0,U.frameInterval=0):Z===2?(U.frameExtractionType=i?1:3,U.frameInterval=0):(U.frameExtractionType=Z+1,U.frameInterval=q?.interval??30);const R=q?.sw_decoding??"CPU";U.frameExtractionSourceType=R==="GPU"?2:1,m===1&&F==="image"&&!p&&!!q?.enablePatrol?U.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,q?.patrolGroupSize??1)),pollingInterval:"0"}:U.pollingConfig={enablePolling:0},U.thirdId=f.thirdId??""}return U},y=(f,F,u,w,c,b,q)=>{const m=k?.value??k,p=m?.value??m,i=D?.value?.[f.id]??[],N=f.data?.sourceGroupId??null,E=!!f.data?.arguments?.needCooperativeDetection,J=E?f.data?.arguments?.windowSeconds??5:void 0,A=F?.data?.streamType??"image",B=ue(u,f.id,w).some(n=>n.type===C.SMALL_MODEL),$=B?"small":A,W=g(f,u,w,q,A),h=f.data?.arguments?.deviceType??null,M=f.data?.arguments?.detectionMode??null,G=f.data?.arguments??null,U=t.getDataSourceCount();if(i.length>0)return i.map((n,x)=>{const j=String(n.sourceId??n.id??""),Y=S(f,u,w,c,j),z={sourceId:n.sourceId??n.id??"",sourceName:n.sourceName??n.name??"",sourceType:$,sourceGroupId:N,areas:n.area??n.areas??[],lines:n.lines??null,direction:n.direction??null,branches:Y,attach:r(n,A,x,p,h,M,G,U,E,B),synEnabled:E,...J!==void 0&&{windowSeconds:J}};return W&&(z.streamConfig=W,z.streamUrl="rtsp"),z});const Z=S(f,u,w,c),R={sourceId:"",sourceName:f.data?.label??"数据源",sourceType:$,sourceGroupId:N,areas:[],branches:Z,attach:r({},A,0,p,h,M,G,U,E,B),synEnabled:E};return W&&(R.streamConfig=W,R.streamUrl="rtsp"),[R]},s=()=>{try{const f=t.nodes,F=t.edges,u=He(f),w=je(f,F),c=[...u.values()].find(G=>G.type===C.START),b=[...u.values()].find(G=>G.type===C.END),q=l?.value??l,m=q?.value??q,p=Pe(w,u);let i=p.filter(G=>G.type===C.DATA_SOURCE);i.length===0&&(i=f.filter(G=>G.type===C.DATA_SOURCE));const N=i.flatMap((G,U)=>y(G,c,w,u,F,U,p)),E={workflowName:c?.data?.taskName??"",ruleId:m?.ruleId??"",sources:N,extraConfig:I(c,b),description:""},A=i[0]?.data?.arguments??{},B=A.mode??0,$=A.interval??0;let W,h,M;return B===0?(W="time",h=$,M=0):(W="frame",h=0,B===3?M=0:B===2?M=-1:M=$),{name:E.workflowName,type:"simple",plan:E.extraConfig.schedule??[],inferStrategy:W,timeInterval:h,frameInterval:M,mps:E.extraConfig.enableVideo??!1,graph:E}}catch(f){return v.ElMessage.error(f.message||"导出失败"),null}};return{validation:H,exportToJSON:s,copyToClipboard:()=>{const f=s();if(!f)return;const F=JSON.stringify(f,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(F).then(()=>v.ElMessage.success("已复制到剪贴板")).catch(()=>v.ElMessage.error("复制失败"));else{const u=document.createElement("textarea");u.value=F,u.style.position="fixed",u.style.opacity="0",document.body.appendChild(u),u.select(),document.execCommand("copy"),document.body.removeChild(u),v.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const f=s();if(!f)return;const F=JSON.stringify(f,null,2),u=new Blob([F],{type:"application/json"}),w=URL.createObjectURL(u),c=document.createElement("a");c.href=w,c.download=`task_workflow_${Date.now()}.json`,c.click(),URL.revokeObjectURL(w),v.ElMessage.success("导出成功")}}},Ct=(a=null,o=null,t=null)=>{const d=e.inject("editorMode",oe.ALGORITHM);return(a??d)===oe.TASK?Nt(o,t):_t(o,t)},kt=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 bt(a=null,o=null,t=null){const d=o??le(),_=e.inject("editorMode",oe.ALGORITHM),l=a??_,k=e.inject("taskModeConfig",null),V=t??k,D=g=>{const{type:T,data:S}=g,r=S.arguments||{},y=[];switch(T){case C.START:if(l===oe.TASK)if(S.taskName?.trim()||y.push("任务名称"),!S.executionTime?.trim())y.push("任务执行时间");else{const s=kt(S.executionTime);(!s||!Array.isArray(s.plan)||s.plan.length===0)&&y.push("任务执行时间(计划为空)")}else S.algorithmName?.trim()||y.push("算法名称");break;case C.SMALL_MODEL:S.modelId||y.push("模型选择");break;case C.DETECTION_TARGET:S.targetId||y.push("检测目标选择");break;case C.CLASSIFICATION_MODEL:r.modelId||y.push("分类模型选择");break;case C.DATA_SOURCE:l===oe.TASK&&((V?.value??V)?.datasource?.getDevices?.(g.id)??[]).length===0&&y.push("设备选择");break;case C.TARGET_COUNT:break;case C.TIMER_TARGET:(!r.duration||r.duration<1)&&y.push("持续时间");break}return y},H=g=>{const T=d.nodes.find(r=>r.id===g.source);if(!T)return[];const S=[];return T.type===C.DATA_SOURCE&&T.data?.enableImageSequence===!0&&g.sourceHandle!=="first-frame"&&(!g.data?.timeWindowSeconds||g.data.timeWindowSeconds<1)&&S.push("后续检测帧的持续时间"),S};return{runValidation:()=>{const{nodes:g,edges:T}=d;d.clearInvalidIds();const S=Ge(g,T,l),r=S.errors,y=[],s=[],L=[];g.filter(c=>c.type!=="group").forEach(c=>{const b=D(c);b.length>0&&(y.push(c.id),L.push(`节点"${c.data.label}"缺少必填参数:${b.join("、")}`))}),T.forEach(c=>{const b=H(c);b.length>0&&(s.push(c.id),L.push(`分支"${c.data?.branchName||"未命名"}"缺少:${b.join("、")}`))}),r.forEach(c=>{typeof c=="object"&&(c.nodeId&&y.push(c.nodeId),c.edgeId&&s.push(c.edgeId))}),(y.length>0||s.length>0)&&(d.setInvalidIds(y,s),setTimeout(()=>{d.clearInvalidIds()},5e3));const f=r.map(c=>typeof c=="object"?c.message:c),F=S.warnings.map(c=>typeof c=="object"?c.message:c),u=[...f.map(c=>({msg:c,type:"error"})),...L.map(c=>({msg:c,type:"warning"})),...F.map(c=>({msg:c,type:"warning"}))],w=f.length===0&&L.length===0;if(w&&F.length===0)v.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(u.length>0){const c=u[0];v.ElMessage[c.type](c.msg)}return{passed:w,errors:[...f,...L],warnings:F}}}}const ne=(a,o)=>{const t=a.__vccOpts||a;for(const[d,_]of o)t[d]=_;return t},xt={key:0},Et={class:"node-list"},wt={class:"node-list"},Tt={class:"node-list"},St={class:"node-list"},Vt=ne({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),d=(_,l)=>{_.dataTransfer&&(_.dataTransfer.setData("application/vueflow",l),_.dataTransfer.effectAllowed="move")};return(_,l)=>{const k=e.resolveComponent("el-icon"),V=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),H=e.resolveComponent("el-collapse-item"),I=e.resolveComponent("FolderOpened"),g=e.resolveComponent("Cpu"),T=e.resolveComponent("View"),S=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",xt,"节点工具箱")):(e.openBlock(),e.createBlock(k,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(k,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(r=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(K.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(S,{key:0,modelValue:t.value,"onUpdate:modelValue":l[13]||(l[13]=r=>t.value=r),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(H,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",Et,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=r=>d(r,"start"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(V)]),_: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=>d(r,"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(H,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",wt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=r=>d(r,"dataSource"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(I)]),_: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=>d(r,"smallModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(g)]),_: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=>d(r,"detectionTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(T)]),_: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=>d(r,"classificationModel"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(H,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Tt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=r=>d(r,"targetCount"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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=>d(r,"timerTarget"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(H,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",St,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=r=>d(r,"ocr"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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=>d(r,"licensePlate"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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=>d(r,"faceRecognition"))},[e.createVNode(k,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.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 Te{static backendToFrontend(o){const{id:t,title:d,name:_,inputSchema:l,extraConfig:k}=o,V={id:t,title:d,label:_,type:"DETECTION_TARGET",inputSchema:l,extraConfig:k,data:{targetId:d,targetName:_,description:_,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(V.data).forEach(D=>{V.data[D]===void 0&&delete V.data[D]}),V}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Ue=a=>ot[a]||a,he=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||Ue(a),...t}}),ke=(a,o,t={})=>{const{sourceHandle:d,..._}=t,l={id:`e_${a}_${o}`,source:a,target:o};return d&&(l.sourceHandle=d),Object.keys(_).length>0&&(l.data=_),l},Bt=a=>{if(!a)return{targets:[],alertConditions:[{operator:">",value:0}],conditionRelation:"AND"};const o=a.rules||[],t=a.logic||"AND";return{targets:[],countType:"conditional_count",conditionRelation:t,alertConditions:o.map(d=>({operator:d.op,value:d.value}))}},At=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}},Dt=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},Lt=()=>({properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]}),Mt=()=>({properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",default:!1}},required:[]}),Ot=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),We=()=>{const a=le(),o=e.inject("editorConfig",null),t=f=>nt[f]||C.DETECTION_TARGET,d=(f,F)=>f?.find(u=>u.id===String(F))??f?.[F],_=(f,F)=>f.streamConfig?(f.children||[]).some(c=>(c.branchRefs||[]).some(b=>d(F.branches,b)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=f=>!f||typeof f!="object"?"无效的JSON格式":!f.ruleName&&f.ruleName!==""?"缺少 ruleName 字段":f.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",k=f=>{const F=o?.value??o;return f==="small"?F?.smallModels||[]:f==="detection"?F?.detection||[]:f==="classification"?F?.classification?.models||[]:[]},V=()=>{},D=(f,F)=>{f.modelName=F||"",f.title=F||"",f.modelId=F||null;const w=k("small").find(c=>c.title===F);w&&(f.input_schema=w.inputSchema||w.input_schema||{},f.modelId=w.id||w.title,f.modelName=w.name||F,f.modelType=w.type,f.supportDirectAlert=w.supportDirectAlert||!1,f.extraConfig=w.extraConfig)},H=async(f,F)=>{const u=t(f.toolTitle),w={label:f.nodeName||Ue(u),arguments:f.arguments||{},input_schema:{}};switch(u){case C.DETECTION_TARGET:w.targetId=f.toolTitle,w.targetName=f.nodeName||"检测目标";{const b=k("detection").find(q=>q.title===f.toolTitle);if(b){let m=Te.backendToFrontend(b).inputSchema||{};if(f.toolTitle==="other"){const p={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}}};m={...m,properties:{...m.properties,...p.properties}}}w.input_schema=m}}break;case C.CLASSIFICATION_MODEL:w.modelName=f.nodeName||"分类模型";break;case C.SMALL_MODEL:D(w,f.toolTitle);break}return f.branchLogic&&(w.enableBranch=!0,w.branchLogic=f.branchLogic),he(u,F,w)},I=(f,F,u,w)=>{const c={label:"小模型",input_schema:{},arguments:f.arguments||{}};return D(c,f.toolTitle),F===de.SMALL_MODEL_BRANCH&&(c.enableBranch=!0,c.branchLogic=u.logic||"and"),he("smallModel",w,c)},g=async(f,F,u,w,c,b)=>{let q=F,m=w;const p={branchOrder:f.sortOrder??1,branchName:f.branchName||"",branchId:f.id??null};f.sourceHandle&&(p.sourceHandle=f.sourceHandle);const i=f.timeWindowSeconds??f.extraConfig?.timeWindowSeconds;i!==void 0&&(p.timeWindowSeconds=i),f.description&&(p.branchDescription=f.description);const N=[...f.nodes||[]].sort((h,M)=>(h.sortOrder??0)-(M.sortOrder??0)),E=new Set([C.DETECTION_TARGET,C.CLASSIFICATION_MODEL,C.SMALL_MODEL]);let J=-1;N.forEach((h,M)=>{E.has(t(h.toolTitle))&&(J=M)});const A=N.map(h=>({kind:"regular",data:h})),B=f.targetCount??f.extraConfig?.targetCount,$=f.duration??f.extraConfig?.duration,W=[];B&&W.push({kind:"targetCount",data:B}),$&&W.push({kind:"timerTarget",data:$}),W.length>0&&A.splice(J+1,0,...W);for(let h=0;h<A.length;h++){const M=A[h];let G;if(M.kind==="regular")G=await H(M.data,{x:m,y:u});else if(M.kind==="targetCount"){const U=Bt(M.data);G=he("targetCount",{x:m,y:u},{label:"目标计数",arguments:U,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const U=At(M.data);G=he("timerTarget",{x:m,y:u},{label:"目标计时",arguments:U,input_schema:{duration:{required:!0,type:"integer",min:1,max:3600},condition_type:{required:!0,type:"string",enum:["similarity","hit_rate"]},similarity_threshold:{required:!1,type:"integer",min:0,max:100},hit_rate_threshold:{required:!1,type:"integer",min:0,max:100},reset_timer:{required:!0,type:"boolean"}}})}c.push(G),b.push(ke(q,G.id,h===0?p:void 0)),q=G.id,m+=ie.H_GAP}return{lastNodeId:q,endX:m}},T=f=>{const F=f.ruleSchema.sourceGroups||[],u=f.ruleSchema.groupLogic||"and",w=F.length>1;return he("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:f.ruleName||"",enableBranch:w?!0:u!=="and",branchLogic:u,groupWindowSeconds:f.ruleSchema.groupWindowSeconds??null})},S=f=>{const F=Dt(f.extraConfig);return he("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:Lt(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...F}})},r=(f,F)=>[...f||[]].sort((u,w)=>(u.sort??0)-(w.sort??0)).map(u=>{const w=_(u,F),c=[];return(u.children||[]).forEach(b=>{(b.branchRefs||[]).forEach(q=>{const m=d(F.branches,q);m&&c.push(m)})}),c.sort((b,q)=>(b.sortOrder??0)-(q.sortOrder??0)),{sg:u,mode:w,refBranches:c}}),y=f=>{const u=(f.reduce((w,c)=>w+Math.max(c.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-u/2},s=async(f,F,u,w,c,b)=>{const{sg:q,mode:m,refBranches:p}=f,i=Math.max(p.length,1),N=u+(i-1)*ie.V_GAP/2;let E=ie.START_X+ie.H_GAP,J=ie.START_X;const A=q.logic==="order",B=he("dataSource",{x:E,y:N},{label:q.name||"数据源",sourceGroupId:q.sourceGroupId??null,enableImageSequence:A,input_schema:Mt(),arguments:{needCooperativeDetection:!!q.synEnabled,windowSeconds:q.windowSeconds||5,enableImageSequence:A},enableBranch:!0,branchLogic:A?"order":q.logic||"and"});w.push(B),c.push(ke(F.id,B.id,{branchOrder:q.sort??null,branchName:q.name||""})),A&&p.forEach((h,M)=>{h.sourceHandle||(h.sourceHandle=M===0?"first-frame":Ot())});const $=A?{dataSourceNode:B,refBranches:p}:null;let W=B.id;if(m===de.SMALL_MODEL||m===de.SMALL_MODEL_BRANCH){E+=ie.H_GAP;const h=I(q.streamConfig,m,q,{x:E,y:N});w.push(h),c.push(ke(B.id,h.id)),W=h.id}if(p.length>0)for(let h=0;h<p.length;h++){const M=u+h*ie.V_GAP,{lastNodeId:G,endX:U}=await g(p[h],W,M,E+ie.H_GAP,w,c);c.push(ke(G,b.id)),U>J&&(J=U)}else{c.push(ke(W,b.id));const h=E+ie.H_GAP;h>J&&(J=h)}return{branchY:u+i*ie.V_GAP,maxX:J,imageSequenceInfo:$}},L=f=>{for(const{dataSourceNode:F,refBranches:u}of f){const w=u.filter(c=>c.sourceHandle&&c.sourceHandle!=="first-frame");w.length>0&&(F.data.subsequentFrames=w.map((c,b)=>({id:b===0?"default-subsequent":`subsequent-${Date.now()}-${b}`,label:b===0?"后续帧检测":`后续帧检测${b+1}`,handleId:c.sourceHandle})))}};return{importFromJSON:async f=>{const F=l(f);if(F)return v.ElMessage.error(F),!1;try{V();const u=[],w=[],c=T(f),b=S(f);u.push(c);const q=r(f.ruleSchema.sourceGroups,f);let m=y(q),p=ie.START_X;const i=[];for(const N of q){const E=await s(N,c,m,u,w,b);m=E.branchY,E.maxX>p&&(p=E.maxX),E.imageSequenceInfo&&i.push(E.imageSequenceInfo)}return b.position.x=p+ie.H_GAP,u.push(b),L(i),a.loadWorkflow(u,w),v.ElMessage.success("导入成功"),!0}catch(u){return v.ElMessage.error("导入失败: "+(u.message||"未知错误")),!1}},validateImportJSON:l}},It=()=>{const a=e.inject("echoTaskData",null);e.inject("taskModeConfig",null);const o=e.inject("selectedDevicesMap",null),t=le(),{importFromJSON:d,validateImportJSON:_}=We(),l=(r,y)=>{const s=r.mode??0,L=r.interval??0,P=r.sw_decoding===!1?"GPU":"CPU";let f,F;return y?s===1?(f=2,F=0):s===0&&L===0?(f=3,F=0):(f=1,F=L):s===1?(f=2,F=0):L===0?(f=0,F=30):(f=0,F=L),{mode:f,interval:F,sw_decoding:P}},k=(r,y)=>{const s=r.frameExtractionType??1,L=r.frameInterval??0,f=(r.frameExtractionSourceType??1)===2?"GPU":"CPU";let F,u;return s===0?(F=3,u=0):s===1&&L===0?(F=y?2:0,u=30):s===1?(F=0,u=L):s===2?(F=1,u=L):s===3?(F=2,u=0):(F=y?3:0,u=30),{mode:F,interval:u,sw_decoding:f}},V=r=>r===1?"device":"platform",D=r=>!r||r.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(r.pollingAmount??1)},H=(r,y,s)=>{if(y){const L=r.find(P=>P.sourceGroupId===y);if(L)return L}return r[s]??null},I=(r,y)=>{if(!r?.branches)return null;for(const s of r.branches){const L=s.nodes?.find(P=>P.toolTitle===y);if(L?.arguments)return{...L.arguments}}return null},g=r=>{if(!Array.isArray(r)||r.length===0)return{timeZone:"",planType:0};const y=r.map(L=>({dayType:Number(L.dayType??0),timePeriod:(L.timePeriod??[]).map(P=>({startTime:P.startTime,endTime:P.endTime}))})),s=y.some(L=>L.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:y}),planType:s}},T=async()=>{const r=a?.value??a;if(!r||typeof r!="object"||Object.keys(r).length===0)return;const y=r.graph??{},s=y.sources??[],L=y.extraConfig??{},P=t.nodes.find(c=>c.type===C.START);if(P){const c=r.name??y.workflowName??"",b=!!L.enableVideo,q=L.schedule??[],{timeZone:m,planType:p}=g(q);t.updateNodeData(P.id,{taskName:c,enableAlertVideo:b,schedule:q,timeZone:m,planType:p,...m?{executionTime:m}:{}})}const f=t.nodes.filter(c=>c.type===C.DATA_SOURCE),F=t.nodes.some(c=>c.type===C.SMALL_MODEL);return f.forEach((c,b)=>{const q=c.data?.sourceGroupId??null,m=H(s,q,b);if(!m)return;const p=m.attach??{},i=m.streamConfig?.decoder??null,N=p.deviceType==="1400"?"1400":"camera",E=N==="camera"?i?l(i,F):k(p,F):{},J=N==="camera"?D(p.pollingConfig):{},A=N==="1400"?{detectionMode:V(p.detectionType)}:{},B=c.data?.arguments??{};if(t.updateNodeData(c.id,{arguments:{...B,deviceType:N,...E,...J,...A}}),o){const $=q?s.filter(M=>M.sourceGroupId===q):[],h=($.length>0?$:[m]).map(M=>({sourceId:M.sourceId??"",sourceName:M.sourceName??"",thirdId:M.attach?.thirdId??"",area:M.areas??[],lines:M.lines??[],direction:M.direction??[]}));o.value[c.id]=h}}),t.nodes.filter(c=>c.type===C.DETECTION_TARGET).forEach(c=>{const b=new Set,q=[c.id];let m=null;for(;q.length&&!m;){const B=q.shift();if(b.has(B))continue;b.add(B);const $=t.edges.filter(W=>W.target===B);for(const W of $){const h=t.nodes.find(M=>M.id===W.source);if(h){if(h.type===C.DATA_SOURCE){m=h.id;break}q.push(h.id)}}}if(!m)return;const p=o?.value?.[m]??[];if(p.length<=1)return;const i=c.data?.targetId;if(!i)return;const N=p.map(B=>{const $=String(B.sourceId??B.id??""),W=s.find(h=>String(h.sourceId)===$);if(!W?.branches)return{deviceId:$,args:null};for(const h of W.branches){const M=h.nodes?.find(G=>G.toolTitle===i);if(M?.arguments)return{deviceId:$,args:{...M.arguments}}}return{deviceId:$,args:null}}),E=N.filter(B=>B.args!==null);if(E.length===0)return;const J=JSON.stringify(E[0].args);if(E.some(B=>JSON.stringify(B.args)!==J)){const B=c.data?.arguments??{};t.updateNodeData(c.id,{arguments:{...B,configMode:"perDevice"}}),N.forEach(({deviceId:$,args:W})=>{W&&t.setTaskSourceArguments(m,$,c.id,W)})}}),t.nodes.filter(c=>c.type===C.FACE_RECOGNITION).forEach(c=>{const b=new Set,q=[c.id];let m=null;for(;q.length&&!m;){const B=q.shift();if(b.has(B))continue;b.add(B);const $=t.edges.filter(W=>W.target===B);for(const W of $){const h=t.nodes.find(M=>M.id===W.source);if(h){if(h.type===C.DATA_SOURCE){m=h.id;break}q.push(h.id)}}}const i=(m?t.nodes.find(B=>B.id===m):null)?.data?.sourceGroupId??null,N=f.findIndex(B=>B.id===m),E=H(s,i,N>=0?N:0);if(!E)return;const J=I(E,"face");if(!J?.repositoryId)return;const A=c.data?.arguments??{};t.updateNodeData(c.id,{arguments:{...A,repositoryId:Array.isArray(J.repositoryId)?J.repositoryId:[J.repositoryId]}})}),!0};return{importFromJSON:async r=>{const y=_(r);return y?(v.ElMessage.error(y),!1):await d(r)?(await T(),!0):!1},applyTaskData:T,validateImportJSON:_}},Rt=()=>{if(e.inject("editorMode",oe.ALGORITHM)===oe.TASK)return It();const{importFromJSON:o,validateImportJSON:t}=We();return{importFromJSON:o,validateImportJSON:t,applyTaskData:async()=>{}}},$t={class:"node-content"},Ft={class:"node-label"},qt=ne({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const d=e.resolveComponent("VideoPlay"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",$t,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("span",Ft,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Gt={class:"node-content"},Ht={class:"node-label"},jt=ne({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const d=e.resolveComponent("CircleClose"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Gt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("span",Ht,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Pt={class:"node-content"},zt={class:"node-info"},Ut={class:"node-label"},Wt={key:1,class:"sequence-handles"},Jt={class:"handle-item"},Yt={class:"handle-label"},Xt={key:0,class:"handle-item add-button-item"},Qt=ne({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=le(),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,I=>{const g=Math.random()*16|0;return(I==="x"?g:g&3|8).toString(16)}),k=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let V=!1;const D=()=>{if(V)return;V=!0;const I=o.data.subsequentFrames||[],g={id:l(),label:`后续帧检测${I.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,g),setTimeout(()=>{V=!1},300)},H=async I=>{const g=o.data.subsequentFrames.find(S=>S.id===I);if(t.edges.some(S=>S.source===o.id&&S.sourceHandle===g.handleId))try{await v.ElMessageBox.confirm(`删除"${g.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,I)};return(I,g)=>{const T=e.resolveComponent("FolderOpened"),S=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Pt,[e.createVNode(S,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",zt,[e.createElementVNode("div",Ut,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(ee.Handle),{key:0,type:"source",position:e.unref(ee.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",Wt,[e.createElementVNode("div",Jt,[g[0]||(g[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,y=>(e.openBlock(),e.createElementBlock("div",{key:y.id,class:"handle-item"},[e.createElementVNode("span",Yt,e.toDisplayString(y.label),1),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:y.handleId,class:"handle-right"},null,8,["position","id"]),y.id!=="default-subsequent"&&!_.value?(e.openBlock(),e.createBlock(S,{key:0,class:"delete-icon",onClick:e.withModifiers(s=>H(y.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Xt,[e.createVNode(r,{size:"small",type:"primary",icon:e.unref(K.Plus),circle:"",onClick:e.withModifiers(D,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),Kt={class:"node-content"},Zt={class:"node-info"},vt={class:"node-label"},eo={key:0,class:"node-model"},to={key:1,class:"node-placeholder"},oo={key:0,class:"direct-alert-badge"},no=ne({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const d=e.resolveComponent("Cpu"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Kt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",Zt,[e.createElementVNode("div",vt,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",eo,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",to,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",oo,[e.createVNode(_,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),ao={class:"node-content"},lo={class:"node-info"},ro={class:"node-target"},so={class:"node-params"},io=ne({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=()=>o.data.targetName||o.data.label||"检测目标",d=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),_=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const l=o.data.arguments.object;if(Array.isArray(l))return l.filter(V=>V&&V.trim()!=="").length}return null});return(l,k)=>{const V=e.resolveComponent("View"),D=e.resolveComponent("el-icon"),H=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",ao,[e.createVNode(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(V)]),_:1}),e.createElementVNode("div",lo,[k[1]||(k[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",ro,e.toDisplayString(t()),1),e.createElementVNode("div",so,[_.value?(e.openBlock(),e.createBlock(H,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),d.value?(e.openBlock(),e.createBlock(H,{key:1,size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments?.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.targetHeight&&a.data.arguments?.targetWidth?(e.openBlock(),e.createBlock(H,{key:2,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 尺寸: "+e.toDisplayString(a.data.arguments.targetWidth)+"x"+e.toDisplayString(a.data.arguments.targetHeight),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.enableStructure?(e.openBlock(),e.createBlock(H,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...k[0]||(k[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),co={class:"node-content"},mo={class:"node-info"},po={class:"node-label"},uo={key:0,class:"node-model"},fo={key:1,class:"node-placeholder"},go={key:2,class:"node-stats"},ho=ne({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const d=e.resolveComponent("Grid"),_=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",co,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(d)]),_:1}),e.createElementVNode("div",mo,[e.createElementVNode("div",po,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",uo,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",fo,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",go,[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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),yo={class:"node-content"},_o={class:"node-info"},No={class:"node-label"},Co={class:"node-params"},ko=ne({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return le(),(o,t)=>{const d=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",yo,[e.createVNode(d,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Document))]),_:1}),e.createElementVNode("div",_o,[e.createElementVNode("div",No,e.toDisplayString(a.data.label),1),e.createElementVNode("div",Co,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(_,{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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),bo={class:"node-content"},xo={class:"node-info"},Eo={class:"node-label"},wo={class:"node-scope"},To={class:"node-params"},So=ne({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=le(),d=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const l=t.nodes.find(k=>k.id===_);return l?l.data.label:"检测范围"};return(_,l)=>{const k=e.resolveComponent("Document"),V=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",bo,[e.createVNode(V,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(k)]),_:1}),e.createElementVNode("div",xo,[e.createElementVNode("div",Eo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",wo,e.toDisplayString(d()),1),e.createElementVNode("div",To,[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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),Vo={class:"node-content"},Bo={class:"node-info"},Ao={class:"node-params"},Do=ne({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},d=e.computed(()=>{const _=o.data.arguments?.alertConditions||[];if(_.length===0)return"";if(_.length===1){const k=_[0];return`数量 ${t[k.operator]||k.operator} ${k.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${_.length} 个条件(${l})`});return(_,l)=>{const k=e.resolveComponent("el-icon"),V=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Vo,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.DataAnalysis))]),_:1}),e.createElementVNode("div",Bo,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Ao,[d.value?(e.openBlock(),e.createBlock(V,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Lo={class:"node-content"},Mo={class:"node-info"},Oo={class:"node-label"},Io={class:"node-params"},Ro=ne({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=e.computed(()=>o.data.description||"目标计时"),d=e.computed(()=>`${o.data.arguments?.duration||30}秒`),_=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 V=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Lo,[e.createVNode(V,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Timer))]),_:1}),e.createElementVNode("div",Mo,[e.createElementVNode("div",Oo,e.toDisplayString(t.value),1),e.createElementVNode("div",Io,[e.createVNode(D,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1}),_.value?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),$o={class:"group-label"},Fo=ne({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},d=e.computed(()=>t[o.data.branchLogic]??"ALL"),_=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(V,D)=>{const H=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",$o,[e.createVNode(H,{type:_.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),_:1},8,["type"]),D[0]||(D[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(tt.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":k})],2)}}},[["__scopeId","data-v-adf6607d"]]),qo={class:"node-content"},Go={class:"node-info"},Ho={class:"node-label"},jo={class:"node-scope"},Po={class:"node-params"},zo=ne({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=le(),d=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const l=t.nodes.find(k=>k.id===_);return l?l.data.label:"检测范围"};return(_,l)=>{const k=e.resolveComponent("el-icon"),V=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",qo,[e.createVNode(k,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.User))]),_:1}),e.createElementVNode("div",Go,[e.createElementVNode("div",Ho,e.toDisplayString(a.data.label),1),e.createElementVNode("div",jo,e.toDisplayString(d()),1),e.createElementVNode("div",Po,[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?.minFaceWidth!==void 0&&a.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(V,{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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),Uo={class:"quick-add-menu__list"},Wo=["onClick"],Jo={class:"quick-add-menu__icon"},Yo={class:"quick-add-menu__label"},Xo={key:0,class:"quick-add-menu__empty"},fe=8,Qo=ne({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(a){const o=a,t=e.ref(null),d=e.ref({x:0,y:0});e.watch(()=>o.visible,async V=>{if(!V||(d.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const D=t.value.getBoundingClientRect(),H=window.innerWidth,I=window.innerHeight;let{x:g,y:T}=o.position;g+D.width>H-fe&&(g=H-D.width-fe),T+D.height>I-fe&&(T=I-D.height-fe),g<fe&&(g=fe),T<fe&&(T=fe),d.value={x:g,y:T}});const _=e.computed(()=>({left:d.value.x+"px",top:d.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(V=>V.type==="dataSource");case"dataSource":return l.filter(V=>V.type==="smallModel"||V.type==="detectionTarget"||V.type==="classificationModel");case"smallModel":return l.filter(V=>V.type!=="dataSource"&&V.type!=="smallModel"&&V.type!=="targetCount"&&V.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(V=>V.type!=="dataSource"&&V.type!=="smallModel");case"timerTarget":return l.filter(V=>["ocr","faceRecognition","licensePlate","end"].includes(V.type));case"targetCount":return l.filter(V=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(V.type));case"ocr":return l.filter(V=>["licensePlate","faceRecognition","end"].includes(V.type));case"licensePlate":return l.filter(V=>["ocr","faceRecognition","end"].includes(V.type));case"faceRecognition":return l.filter(V=>["ocr","licensePlate","end"].includes(V.type));default:return[]}});return(V,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(_.value)},[D[1]||(D[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Uo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k.value,H=>(e.openBlock(),e.createElementBlock("li",{key:H.type,class:"quick-add-menu__item",onClick:I=>V.$emit("select",H.type)},[e.createElementVNode("span",Jo,e.toDisplayString(H.icon),1),e.createElementVNode("span",Yo,e.toDisplayString(H.label),1)],8,Wo))),128)),k.value.length===0?(e.openBlock(),e.createElementBlock("li",Xo," 无可连接节点 ")):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]=H=>V.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),Ko={class:"workflow-canvas"},Je=5,Zo=ne({__name:"WorkflowCanvas",setup(a){const o=le(),{screenToFlowCoordinate:t,findNode:d,onConnectStart:_,onConnectEnd:l}=ee.useVueFlow(),k=e.inject("editorConfig",null),V=e.inject("editorMode",oe.ALGORITHM),D=e.computed(()=>V===oe.TASK),H=e.inject("echoAlgodata",null),I=e.inject("echoTaskData",null),{importFromJSON:g,applyTaskData:T}=Rt();e.watch(H,async n=>{if(n&&Object.keys(n).length>0){await e.nextTick();const x=n.graph??n;if(await g(x),D.value){const j=x?.ruleSchema?.sourceGroups??[];let Y=null;if(j.some(z=>z.streamConfig)?Y="stream":(j.length>1||j.some(z=>(z.children??[]).length>1))&&(Y="image"),Y){const z=o.nodes.find(X=>X.type===C.START);z&&o.updateNodeData(z.id,{streamType:Y})}await T()}}},{immediate:!0}),e.watch(I,async n=>{D.value&&(!n||typeof n!="object"||Object.keys(n).length===0||o.nodes.length!==0&&await T())},{immediate:!1});const S=(n,x)=>{if(!x?.properties)return n;const j={};return Object.entries(x.properties).forEach(([Y,z])=>{z.default!==void 0&&(j[Y]=z.default)}),n.data.arguments={...j,...n.data.arguments},n},r=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),y=()=>{r.visible=!1,r.sourceNodeId=null,r.sourceNodeType=null,r.sourceHandleId=null,F=!1};let s=null,L=!1,P=null,f=null,F=!1;const u=()=>{P&&(document.removeEventListener("mousemove",P),P=null),f&&(document.removeEventListener("mouseup",f),f=null)};e.onUnmounted(()=>{u()}),_(({nodeId:n,handleId:x,handleType:j,event:Y})=>{if(j!=="source")return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线");return}const z=o.nodes.find(Q=>Q.id===n);if(!z||z.type==="end")return;if(z.type===C.DATA_SOURCE&&z.data?.enableImageSequence){if(x&&o.edges.filter(re=>re.source===n&&re.sourceHandle===x).length>=1)return}else if(z.type!==C.START&&z.type!==C.DATA_SOURCE&&o.edges.filter(re=>re.source===n).length>=1)return;const X=Y?.target;let te=0,ae=0;if(X){const Q=X.getBoundingClientRect();te=Q.right+12,ae=Q.top-8}s={nodeId:n,sourceNodeType:z.type,handleId:x,menuX:te,menuY:ae,flowPos:{...z.position}},L=!1;const pe=Y?.clientX??0,O=Y?.clientY??0;u(),P=Q=>{(Math.abs(Q.clientX-pe)>Je||Math.abs(Q.clientY-O)>Je)&&(L=!0,u())},f=()=>{if(u(),!L&&s){F=!0;const Q=s;r.visible=!0,r.screenPos={x:Q.menuX,y:Q.menuY},r.sourceNodeId=Q.nodeId,r.sourceNodeType=Q.sourceNodeType,r.sourceHandleId=Q.handleId,r.flowPos=Q.flowPos}s=null},document.addEventListener("mousemove",P),document.addEventListener("mouseup",f)});const w=n=>{const x=r.sourceNodeId,j=o.nodes.find(ce=>ce.id===x);if(!j){y();return}if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点"),y();return}const Y=j.position.x+250,z=j.position.y;let X={x:Y,y:z};const te=60,ae=80;let pe=0,O=!0;for(;O;){O=!1;const ce=z+pe;for(const ge of o.nodes)if(Math.abs(ge.position.x-Y)<100&&Math.abs(ge.position.y-ce)<te+20){O=!0,pe+=ae;break}}if(X.y=z+pe,n==="end"){const ce=o.nodes.find(ge=>ge.type==="end");if(ce){if(o.edges.some(xe=>xe.source===x&&xe.target===ce.id)){v.ElMessage.warning("已经连接到结束节点"),y();return}const _e=b(j,ce);if(!_e.valid){v.ElMessage.warning(_e.message),y();return}o.addConnection({source:x,target:ce.id,sourceHandle:r.sourceHandleId||null,targetHandle:null}),B(),y(),v.ElMessage.success("已连接到结束节点");return}}let Q;switch(n){case"end":Q=Ee(X);break;case"dataSource":Q=we(X);break;case"smallModel":Q=De(X);break;case"detectionTarget":Q=Le(X);break;case"classificationModel":Q=Me(X);break;case"ocr":{const ce=k?.value??k;Q=S(Oe(X),ce?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const ce=k?.value??k;Q=S(Ie(X),ce?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const ce=k?.value??k;Q=S(Fe(X),ce?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":Q=Re(X);break;case"timerTarget":Q=$e(X);break;default:y();return}const re=b(j,Q);if(!re.valid){v.ElMessage.warning(re.message),y();return}o.addNode(Q),o.addConnection({source:x,target:Q.id,sourceHandle:r.sourceHandleId||null,targetHandle:null}),B(),y(),v.ElMessage.success(`已添加${Q.data.label}并连接`)},c=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],b=(n,x)=>{if(n?.parentNode&&x?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(x?.parentNode&&n?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(n?.type===C.START){if(x?.type!==C.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(z=>z.source===n.id).some(z=>o.nodes.find(te=>te.id===z.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(x?.type===C.SMALL_MODEL){if(n?.type!==C.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(X=>X.source===n.id).some(X=>o.nodes.find(ae=>ae.id===X.target)?.type!==C.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(n?.type===C.DATA_SOURCE){if(x?.type!==C.SMALL_MODEL&&x?.type!==C.DETECTION_TARGET&&x?.type!==C.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(X=>X.source===n.id).some(X=>o.nodes.find(ae=>ae.id===X.target)?.type===C.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(n?.type===C.SMALL_MODEL&&(x?.type===C.TARGET_COUNT||x?.type===C.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(n?.type===C.TARGET_COUNT&&![C.TIMER_TARGET,C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(x?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(n?.type===C.TIMER_TARGET&&![C.OCR,C.FACE_RECOGNITION,C.LICENSE_PLATE,C.END].includes(x?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const j=[C.OCR,C.LICENSE_PLATE,C.FACE_RECOGNITION];return j.includes(n?.type)&&!j.filter(z=>z!==n.type).concat(C.END).includes(x?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:x?.type!==C.END&&o.edges.filter(z=>z.target===x?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},q=e.markRaw({start:qt,end:jt,dataSource:Qt,smallModel:no,detectionTarget:io,classificationModel:ho,ocr:ko,licensePlate:So,targetCount:Do,timerTarget:Ro,group:Fo,faceRecognition:zo}),m=e.computed({get:()=>o.nodes,set:n=>{o.nodes=n}}),p=e.computed({get:()=>o.edges,set:n=>{o.edges=n}}),i=n=>{n.forEach(x=>{if(x.type==="position"&&x.position)o.updateNodePosition(x.id,x.position);else if(x.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除节点");return}const j=o.nodes.find(z=>z.id===x.id);if(j&&j.type===C.START){v.ElMessage.warning("开始节点不可删除");return}if(j&&j.type===C.END){v.ElMessage.warning("结束节点不可删除");return}if(j&&j.type==="group"){v.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const Y=j?.parentNode;o.removeNode(x.id),Y&&o.nodes.filter(X=>X.parentNode===Y).length===0&&o.dissolveParallelGroup(Y)}})},N=n=>{n.forEach(x=>{if(x.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(x.id)}})},E=n=>{if(F)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线"),y();return}const x=o.nodes.find(z=>z.id===n.source),j=o.nodes.find(z=>z.id===n.target),Y=b(x,j);if(!Y.valid){v.ElMessage.warning(Y.message),y();return}if(x?.type===C.DATA_SOURCE&&x.data.enableImageSequence&&n.sourceHandle&&o.edges.filter(X=>X.source===n.source&&X.sourceHandle===n.sourceHandle).length>=1){const X=n.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";v.ElMessage.warning(`${X}连接点只能连接一个节点`);return}if(c.includes(x?.type)&&!x.data.enableBranch&&o.edges.filter(X=>X.source===n.source).length>=1){v.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(n),B(),y()},J=n=>({and:"ALL",or:"SOME"})[n]||"ALL",A=n=>{const x=o.nodes.find(j=>j.id===n.source);if(!x)return"";if(x.type===C.START){const j=x.data.branchLogic||"and",Y=J(j),z=n.data?.branchOrder;return z!=null?`${Y} - 执行顺序 ${z}`:Y}if(x.type===C.DATA_SOURCE){if(x.data?.enableImageSequence){const X=n.sourceHandle==="first-frame"?"首帧":"后续帧",te=n.data?.branchOrder;return te!=null?`${X} - 执行顺序 ${te}`:X}const j=x.data.branchLogic||"and",Y=J(j),z=n.data?.branchOrder;return z!=null?`${Y} - 执行顺序 ${z}`:Y}return""},B=()=>{o.edges.forEach(n=>{const x=A(n);n.label!==x&&(n.label=x,n.labelStyle=x?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,n.labelBgStyle=x?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,n.labelBgPadding=x?[4,6]:void 0)})},$=()=>{o.nodes.forEach(n=>{if(n.type!=="group")return;const x=n.data.sourceNodeId;if(!x)return;const j=o.nodes.find(Y=>Y.id===x);j?.data?.enableBranch&&j.data.branchLogic!==n.data.branchLogic&&o.updateNodeData(n.id,{branchLogic:j.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(n=>c.includes(n.type)).map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic})),(n,x)=>{x&&n.forEach(j=>{const Y=x.find(z=>z.id===j.id);if(Y){if(j.enableBranch&&!Y.enableBranch){const z=o.nodes.find(X=>X.id===j.id);if(!z)return;o.createEmptyGroup({x:z.position.x+200,y:z.position.y-30},z.data.branchLogic||"and",j.id)}else if(!j.enableBranch&&Y.enableBranch){const z=o.nodes.find(X=>X.type==="group"&&X.data.sourceNodeId===j.id);z&&o.dissolveParallelGroup(z.id)}if(j.enableBranch&&Y.branchLogic!==j.branchLogic){const z=o.nodes.find(X=>X.type==="group"&&X.data.sourceNodeId===j.id);z&&o.updateNodeData(z.id,{branchLogic:j.branchLogic})}}})}),e.watch(()=>o.nodes.filter(n=>n.type!=="group").map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic,branchOrder:n.data.branchOrder})),()=>{B(),$()},{deep:!0}),e.watch(()=>o.edges.map(n=>({id:n.id,branchOrder:n.data?.branchOrder})),(n,x)=>{B(),x&&n.forEach(j=>{const Y=x.find(z=>z.id===j.id);if(Y&&Y.branchOrder!==j.branchOrder&&j.branchOrder!==void 0){const z=o.edges.find(X=>X.id===j.id);if(z){const X=o.nodes.find(te=>te.id===z.source);X&&X.type===C.DATA_SOURCE&&o.updateNodePosition(X.id,{x:X.position.x,y:X.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([n,x])=>{o.nodes.forEach(j=>{n.has(j.id)?j.class="invalid-node":j.class==="invalid-node"&&(j.class="")}),o.edges.forEach(j=>{x.has(j.id)?j.class="invalid-edge":j.class==="invalid-edge"&&(j.class="")})},{deep:!0});const W=n=>{n.event?.target?.closest(".vue-flow__handle")||o.selectNode(n.node.id)},h=n=>{o.selectEdge(n.edge.id)},M=n=>{if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(n.edge.id)},G=()=>{o.clearSelection()},U=({node:n})=>{if(n.type==="group"||!c.includes(n.type))return;const x=o.nodes.filter(Y=>Y.type==="group");let j=null;for(const Y of x){const z=d(Y.id);if(!z)continue;const X=z.dimensions?.width||parseInt(Y.style?.width)||300,te=z.dimensions?.height||parseInt(Y.style?.height)||160;let ae=n.position.x,pe=n.position.y;if(n.parentNode){const _e=o.nodes.find(xe=>xe.id===n.parentNode);_e&&(ae+=_e.position.x,pe+=_e.position.y)}const O=d(n.id),Q=O?.dimensions?.width||160,re=O?.dimensions?.height||60,ce=ae+Q/2,ge=pe+re/2;if(ce>=Y.position.x&&ce<=Y.position.x+X&&ge>=Y.position.y&&ge<=Y.position.y+te){j=Y.id;break}}j?n.parentNode!==j&&o.addNodeToGroup(n.id,j):n.parentNode&&o.removeNodeFromGroup(n.id)},Z=n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect="move")},R=n=>{n.preventDefault();const x=n.dataTransfer?.getData("application/vueflow");if(!x)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点");return}if(x===C.START&&o.getNodeCountByType(C.START)>=1){v.ElMessage.warning("工作流只能有一个开始节点");return}if(x===C.END&&o.getNodeCountByType(C.END)>=1){v.ElMessage.warning("工作流只能有一个结束节点");return}const j=160,Y=60,z=t({x:n.clientX,y:n.clientY}),X={x:z.x-j/2,y:z.y-Y/2};let te;switch(x){case C.START:te=Ae(X);break;case C.END:te=Ee(X);break;case C.DATA_SOURCE:te=we(X);break;case C.SMALL_MODEL:te=De(X);break;case C.DETECTION_TARGET:te=Le(X);break;case C.CLASSIFICATION_MODEL:te=Me(X);break;case C.OCR:{const ae=k?.value??k;te=S(Oe(X),ae?.ocr?.[0]?.inputSchema);break}case C.LICENSE_PLATE:{const ae=k?.value??k;te=S(Ie(X),ae?.license_plate?.[0]?.inputSchema);break}case C.TARGET_COUNT:te=Re(X);break;case C.TIMER_TARGET:te=$e(X);break;case C.FACE_RECOGNITION:{const ae=k?.value??k;te=S(Fe(X),ae?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(te),v.ElMessage.success("节点已添加")};return(n,x)=>(e.openBlock(),e.createElementBlock("div",Ko,[e.createVNode(e.unref(ee.VueFlow),{nodes:m.value,"onUpdate:nodes":x[0]||(x[0]=j=>m.value=j),edges:p.value,"onUpdate:edges":x[1]||(x[1]=j=>p.value=j),"node-types":e.unref(q),onNodesChange:i,onEdgesChange:N,onConnect:E,onNodeClick:W,onEdgeClick:h,onEdgeDoubleClick:M,onPaneClick:G,onDrop:R,onDragover:Z,onNodeDragStop:U,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(ve.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(et.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(Qo,{visible:r.visible,position:r.screenPos,"source-node-type":r.sourceNodeType,onSelect:w,onClose:y},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-cf0301e9"]]),vo={class:"config-header"},en={key:0,class:"config-section"},tn={key:1,class:"config-section"},on=ne({__name:"EdgeConfig",setup(a){const o=le(),t=e.inject("editorMode",oe.ALGORITHM),d=e.computed(()=>t===oe.TASK),_=e.computed(()=>{const I=o.selectedEdge;return I&&o.nodes.find(T=>T.id===I.source)?.data?.enableBranch?I:null}),l=e.computed(()=>_.value&&o.nodes.find(g=>g.id===_.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),k=e.computed(()=>{if(!_.value)return!1;const I=o.nodes.find(g=>g.id===_.value.source);return(I?.type==="dataSource"||I?.type==="start")&&I?.data?.enableBranch}),V=e.computed(()=>{if(!_.value)return 1;const I=o.nodes.find(g=>g.id===_.value.source);return I?o.edges.filter(g=>g.source===I.id).length:1}),D=e.computed(()=>{if(!_.value)return!1;const I=o.nodes.find(g=>g.id===_.value.source);return I?I.type==="dataSource"&&I.data?.enableImageSequence===!0&&_.value.sourceHandle!=="first-frame":!1}),H=I=>{_.value&&o.updateEdgeData(_.value.id,I)};return(I,g)=>{const T=e.resolveComponent("el-divider"),S=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-text"),y=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),P=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",vo,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(T),D.value?(e.openBlock(),e.createElementBlock("div",en,[g[3]||(g[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(S,{"model-value":_.value?.data?.timeWindowSeconds??null,onChange:g[0]||(g[0]=f=>H({timeWindowSeconds:f})),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(()=>[...g[2]||(g[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),k.value?(e.openBlock(),e.createElementBlock("div",tn,[g[5]||(g[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":_.value?.data?.branchOrder??null,disabled:d.value,onChange:g[1]||(g[1]=f=>H({branchOrder:f})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,f=>(e.openBlock(),e.createBlock(L,{key:f,label:`执行顺序 ${f}`,value:f},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(r,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...g[4]||(g[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),nn={class:"config-section"},an=ne({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const d=e.resolveComponent("el-divider"),_=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(d),e.createElementVNode("div",nn,[e.createVNode(_,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),ln={class:"time-init-container"},rn={key:0,class:"time-header flex-x-start"},sn={class:"tab-type flex-x"},cn={class:"time-content"},dn={id:"time-content-table-body"},mn=["onClick"],pn=["onClick"],un=["data-sort","data-value","data-day","data-type","onMousedown"],fn={key:1},gn=["data-sort","data-value","data-type","onMousedown"],hn={class:"time-list"},yn={key:0,class:"time-list-title"},_n={key:1,style:{"margin-right":"10px"}},Nn=ne({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,d=e.ref(0);let _,l,k,V,D;const H=e.ref(new Map),I=e.ref(new Map),g=e.computed(()=>d.value===0?H.value:I.value);e.onMounted(()=>{_=document.querySelector("#time-content-table-body"),l=_.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",s)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",s)});const T=i=>{d.value!==i&&(d.value=i,e.nextTick(()=>{l=_.querySelectorAll("td.sel-able[data-type]"),l.forEach(E=>E.classList.remove("selected")),(i===0?H.value:I.value).forEach((E,J)=>{E.origin.forEach(A=>{Array.from(l).forEach(B=>{Number(B.dataset.sort)==A.sort&&Number(B.dataset.value)==A.value&&Number(B.dataset.day)==J&&B.classList.add("selected")})})})}))},S=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=(i,N,E)=>{t.operationType!=3&&E.which==1&&(V=i,k=Number(E.target.dataset.value),E.target.classList.contains("selected")?(E.target.classList.remove("selected"),D=""):(D="selected",E.target.classList.add("selected")),y(),u())},y=()=>{l.forEach(i=>{i.addEventListener("mouseover",L,!1,{once:!0})})},s=()=>{l.forEach(i=>{i.removeEventListener("mouseover",L)})},L=i=>{i.target.classList.remove("selected"),D&&i.target.classList.add(D);let N=Number(i.target.dataset.value),E=Number(i.target.dataset.day),J=E>V?E:V,A=E<V?E:V,B=N>k?N:k,$=N<k?N:k;for(let W=A;W<=J;W++)for(let h=$;h<=B;h++){let M=document.querySelector(`td[data-value="${h}"][data-day="${W}"]`);M.classList.remove("selected"),D&&M.classList.add(D)}u()},P=i=>{if(t.operationType==3)return;let N=[];l.forEach(E=>{Number(E.dataset.day)==i&&N.push(E)}),N.find(E=>!E.classList.contains("selected"))?N.forEach(E=>E.classList.add("selected")):N.forEach(E=>E.classList.remove("selected")),u()},f=i=>{if(t.operationType==3)return;let N=[];l.forEach(E=>{Number(E.dataset.sort)==i&&N.push(E)}),N.find(E=>!E.classList.contains("selected"))?N.forEach(E=>E.classList.add("selected")):N.forEach(E=>E.classList.remove("selected")),u()},F=()=>{l.forEach(N=>{N.classList.remove("selected")}),(d.value===0?H:I).value.clear()},u=()=>{const i=d.value===0?H:I;i.value.clear(),l.forEach(N=>{if(N.classList.contains("selected")){let E=N.dataset.day,J=N.dataset.sort,A=N.dataset.value;i.value.get(E)?i.value.get(E).origin.push({sort:Number(J),value:Number(A)}):i.value.set(E,{origin:[{sort:Number(J),value:Number(A)}],timeList:[]})}})},w=i=>{let J=g.value.get(i).origin.map(A=>A.value).reduce((A,B,$,W)=>($==0?A.push([B]):B==W[$-1]+1?A[A.length-1].push(B):A.push([B]),A),[]);return J=J.map(A=>{let B=Math.max(...A)+1,$=Math.min(...A)+1,W=$%2==0?30:0,h=B%2==0?0:30,M=c(Math.ceil($/2)-1),G=c(Math.ceil(B/2)-(h==0?0:1));return{dayType:i,startTime:M+":"+(W==0?"00":W),endTime:G+":"+(h==0?"00":h)}}),g.value.get(i).timeList=J,J.map(A=>A.startTime+"-"+A.endTime).join()};function c(i){return i<10?"0"+i:i}const b=(i,N)=>{H.value.clear(),I.value.clear(),l.forEach(B=>B.classList.remove("selected")),d.value=N;const E=N===0?H:I,J=JSON.parse(i);let A=[];J.plan.forEach(B=>{B.timePeriod.forEach($=>{A.push({...$,dayType:B.dayType})})}),e.nextTick(()=>{l=_.querySelectorAll("td.sel-able[data-type]"),A.forEach(B=>{E.value.get(B.dayType)?E.value.get(B.dayType).timeList.push(B):E.value.set(B.dayType,{origin:[],timeList:[{...B}]})}),E.value.forEach((B,$)=>{B.timeList.forEach(W=>{let h=Number(W.startTime.split(":")[1]),M=Number(W.endTime.split(":")[1]),G=Number(W.startTime.split(":")[0]),U=Number(W.endTime.split(":")[0]);if(G==U){B.origin.push({sort:G,value:2*G});return}for(let Z=G;Z<=U;Z++)if(Z==G)h==0?(B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1})):B.origin.push({sort:Z,value:2*Z+1});else if(Z>G&&Z<U)B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1});else if(M==0){if(Z==U)return;B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1})}else B.origin.push({sort:Z,value:2*Z})}),B.origin.forEach(W=>{Array.from(l).find(h=>{Number(h.dataset.sort)==W.sort&&Number(h.dataset.value)==W.value&&Number(h.dataset.day)==$&&h.classList.add("selected")})})})})},q=(i,N)=>i.map(A=>A.value).sort((A,B)=>A-B).reduce((A,B,$,W)=>($==0?A.push([B]):B==W[$-1]+1?A[A.length-1].push(B):A.push([B]),A),[]).map(A=>{let B=Math.max(...A)+1,$=Math.min(...A)+1,W=$%2==0?30:0,h=B%2==0?0:30,M=c(Math.ceil($/2)-1),G=c(Math.ceil(B/2)-(h==0?0:1));return{dayType:N,startTime:M+":"+(W==0?"00":W),endTime:G+":"+(h==0?"00":h)}});return o({getTimeData:()=>{(d.value===0?I:H).value.clear();let N=[];g.value.forEach((A,B)=>{const $=q(A.origin,B);N=N.concat($)});let E={plan:[]},J=N.map(A=>A.dayType).filter((A,B,$)=>$.indexOf(A)===B);return J.length?(J.forEach(A=>{E.plan.push({dayType:A,timePeriod:N.filter(B=>B.dayType===A).map(B=>({startTime:B.startTime,endTime:B.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(E),planType:d.value}):{validTime:!1}},revertByTime:b,resetFn:()=>{d.value=0,H.value.clear(),I.value.clear(),e.nextTick(()=>{l.forEach(i=>{i.classList.remove("selected")}),l=_.querySelectorAll("td.sel-able[data-type]")})}}),(i,N)=>{const E=e.resolveComponent("el-icon"),J=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",ln,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",rn,[e.createElementVNode("div",sn,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==0}]),onClick:N[0]||(N[0]=A=>T(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:d.value==1}]),onClick:N[1]||(N[1]=A=>T(1))}," 日计划 ",2)]),e.createVNode(J,{class:"rm-icon",link:"",type:"danger",onClick:F},{default:e.withCtx(()=>[e.createVNode(E,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",cn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:N[3]||(N[3]=A=>A.preventDefault())},[N[5]||(N[5]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th"),e.createElementVNode("th",{colspan:"24"},"上午"),e.createElementVNode("th",{colspan:"24"},"下午")])],-1)),e.createElementVNode("tbody",dn,[e.createElementVNode("tr",null,[N[4]||(N[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,A=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:B=>f(A-1)},e.toDisplayString(A-1),9,mn)),64))]),d.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(S.value.filter(A=>A.value!=0),A=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:B=>P(A.value)},e.toDisplayString(A.name),9,pn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,B=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((B-1)/2),"data-value":B-1,"data-day":A.value,"data-type":d.value,onMousedown:$=>r(A.value,B,$)},null,40,un)),64))]))),256)):e.createCommentVNode("",!0),d.value==1?(e.openBlock(),e.createElementBlock("tr",fn,[e.createElementVNode("th",{onClick:N[2]||(N[2]=A=>P(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,A=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((A-1)/2),"data-value":A-1,"data-day":0,"data-type":d.value,onMousedown:B=>r(0,A,B)},null,40,gn)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",hn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value.keys(),A=>(e.openBlock(),e.createElementBlock("div",null,[d.value==0?(e.openBlock(),e.createElementBlock("span",yn,[N[6]||(N[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(S.value.find(B=>B.value==A).name),1)])):(e.openBlock(),e.createElementBlock("span",_n,e.toDisplayString(S.value.find(B=>B.value==A).name),1)),e.createTextVNode(" ("+e.toDisplayString(w(A))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),Cn={class:"time-template-dialog"},kn={class:"time-editor-panel"},bn=ne({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const d=a,_=t,l=e.ref(null),k=e.ref(""),V=e.ref(""),D=e.ref(d.modelValue?.timeTemplateName||""),H=e.ref([]);return e.computed(()=>k.value?H.value.filter(T=>T.name.toLowerCase().includes(k.value.toLowerCase())):H.value),e.watch(D,T=>{_("update:modelValue",{...d.modelValue,timeTemplateName:T})}),o({getFormData:()=>{const T=l.value?.getTimeData();return{timeTemplateId:V.value,timeTemplateName:D.value,...T}},revertByTime:(T,S)=>{l.value?.revertByTime(T,S)}}),(T,S)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",Cn,[e.createCommentVNode("",!0),e.createElementVNode("div",kn,[e.createCommentVNode("",!0),e.createVNode(Nn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),xn={class:"config-section"},En={key:0,class:"config-section"},wn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},Tn={class:"config-section"},Sn=ne({__name:"StartNodeConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("echoAlgodata",null),k=e.computed(()=>{const S=l?.value??l,y=(S?.graph??S)?.ruleSchema?.sourceGroups??[];if(y.some(P=>P.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const s=y.length>1,L=y.some(P=>(P.children??[]).length>1);return s||L?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(k,S=>{S.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:S.value})},{immediate:!0});const V=e.ref(!1),D=e.ref(null),H=()=>{const S=D.value?.getFormData();if(S?.validTime){const y=(JSON.parse(S.timeZone)?.plan??[]).map(s=>({dayType:String(s.dayType),timePeriod:s.timePeriod.map(L=>({startTime:L.startTime,endTime:L.endTime}))}));o.updateNodeData(t.value.id,{executionTime:S.timeZone,schedule:y,timeZone:S.timeZone,planType:S.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});V.value=!1},I=()=>{const S=t.value?.data;S?.timeZone&&D.value?.revertByTime(S.timeZone,S.planType??0)},g=e.computed(()=>t.value?o.edges.filter(r=>r.source===t.value.id).length>=2:!1),T=S=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:S})};return(S,r)=>{const y=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input"),L=e.resolveComponent("el-form-item"),P=e.resolveComponent("el-form"),f=e.resolveComponent("el-option"),F=e.resolveComponent("el-select"),u=e.resolveComponent("el-switch"),w=e.resolveComponent("el-button"),c=e.resolveComponent("el-dialog"),b=e.resolveComponent("el-icon"),q=e.resolveComponent("el-tooltip"),m=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(y),e.createElementVNode("div",xn,[r[9]||(r[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.algorithmName,disabled:_.value,onInput:r[0]||(r[0]=p=>T(p)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),_.value?(e.openBlock(),e.createElementBlock("div",En,[r[10]||(r[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.taskName,onInput:r[1]||(r[1]=p=>e.unref(o).updateNodeData(t.value.id,{taskName:p})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(F,{"model-value":k.value.locked?k.value.value:t.value?.data.streamType||"image",disabled:k.value.locked,onChange:r[2]||(r[2]=p=>e.unref(o).updateNodeData(t.value.id,{streamType:p})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"图片流",value:"image"}),e.createVNode(f,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),k.value.locked?(e.openBlock(),e.createElementBlock("div",wn,e.toDisplayString(k.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(L,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(u,{"model-value":t.value?.data.enableAlertVideo,onChange:r[3]||(r[3]=p=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:p}))},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:r[4]||(r[4]=p=>V.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(c,{modelValue:V.value,"onUpdate:modelValue":r[6]||(r[6]=p=>V.value=p),title:"执行时段",width:"1200px","append-to-body":"",onOpened:I},{footer:e.withCtx(()=>[e.createVNode(w,{onClick:r[5]||(r[5]=p=>V.value=!1)},{default:e.withCtx(()=>[...r[11]||(r[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(w,{type:"primary",onClick:H},{default:e.withCtx(()=>[...r[12]||(r[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(bn,{ref_key:"timeTemplateRef",ref:D},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",Tn,[r[14]||(r[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(F,{"model-value":t.value?.data.branchLogic||"and",disabled:_.value,onChange:r[7]||(r[7]=p=>e.unref(o).updateNodeData(t.value.id,{branchLogic:p})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(f,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),g.value?(e.openBlock(),e.createBlock(L,{key:0},{label:e.withCtx(()=>[r[13]||(r[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode(q,{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(K.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:r[8]||(r[8]=p=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:p})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-40d5bdc3"]]),Vn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Bn=["smallModel","detectionTarget"],Se=()=>({schemaLoading:e.ref(!1),getToolType:l=>Vn[l]||null,needsToolSelection:l=>Bn.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)}),An={key:0,class:"config-section"},Dn={key:3,class:"array-input"},Ln={key:1,class:"config-section"},Mn=ne({__name:"EndNodeConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),{schemaLoading:d,fetchSchemaForNodeType:_}=Se(),l=e.computed(()=>{if(!t.value)return[];const g=t.value.data.input_schema||t.value.data.inputSchema;if(!g||!g.properties)return[];const T=g.required||[];return Object.entries(g.properties).map(([S,r])=>({key:S,type:r.type,label:r.title||r.label||r.description||S,description:r.description||"",default:r.default,required:T.includes(S)||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}))}),k=g=>{if(t.value)return t.value.data.arguments?.[g]},V=(g,T)=>{if(!t.value)return;const r={...t.value.data.arguments||{},[g]:T};o.updateNodeData(t.value.id,{arguments:r})},D=g=>{if(!g.dependsOn||!t.value)return!0;const{field:T,value:S}=g.dependsOn,r=k(T);if(typeof S=="string"&&S.startsWith("!")){const y=S.substring(1);return r!==y}return Array.isArray(S)?S.includes(r):r===S},H=g=>{const T=k(g);return Array.isArray(T)?JSON.stringify(T):""},I=(g,T)=>{try{const S=JSON.parse(T);Array.isArray(S)&&V(g,S)}catch{}};return e.watch(()=>t.value?.id,async g=>{if(!g||!t.value)return;const T=t.value.type,S=t.value.data,r=S.input_schema||S.inputSchema;if(r&&r.properties&&Object.keys(r.properties).length>0)return;const y=await _(T);if(!y)return;const s=t.value?.data;s&&o.updateNodeData(t.value.id,{...s,input_schema:y.inputSchema,extraConfig:y.extraConfig,arguments:{...y.arguments,...s.arguments}})},{immediate:!0}),(g,T)=>{const S=e.resolveComponent("el-divider"),r=e.resolveComponent("el-icon"),y=e.resolveComponent("el-tooltip"),s=e.resolveComponent("el-option"),L=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),f=e.resolveComponent("el-input-number"),F=e.resolveComponent("el-input"),u=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[T[2]||(T[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(S),l.value.length>0?(e.openBlock(),e.createElementBlock("div",An,[T[0]||(T[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(w,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,c=>e.withDirectives((e.openBlock(),e.createBlock(u,{key:c.key,required:c.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(c.label),1),c.description?(e.openBlock(),e.createBlock(y,{key:0,content:c.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(r,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[c.options&&c.type==="string"?(e.openBlock(),e.createBlock(L,{key:0,"model-value":k(c.key),onChange:b=>V(c.key,b),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.options,(b,q)=>(e.openBlock(),e.createBlock(s,{key:b,label:c.optionLabels?c.optionLabels[q]:b,value:b},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):c.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":k(c.key),onChange:b=>V(c.key,b)},null,8,["model-value","onChange"])):c.type==="number"||c.type==="integer"?(e.openBlock(),e.createBlock(f,{key:2,"model-value":k(c.key),onChange:b=>V(c.key,b),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",Dn,[e.createVNode(F,{"model-value":H(c.key),onChange:b=>I(c.key,b),type:"textarea",rows:3,placeholder:c.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):c.type==="array"&&c.options?(e.openBlock(),e.createBlock(L,{key:4,"model-value":k(c.key),onChange:b=>V(c.key,b),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.options,(b,q)=>(e.openBlock(),e.createBlock(s,{key:b,label:c.optionLabels?c.optionLabels[q]:b,value:b},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(F,{key:5,"model-value":k(c.key),onInput:b=>V(c.key,b),maxlength:c.maxLength,"show-word-limit":!!c.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!c.dependsOn||D(c)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(d)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",Ln,[...T[1]||(T[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),On={class:"config-header"},In={class:"config-section"},Rn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},$n={key:0,class:"config-section"},Fn={key:3,class:"array-input"},qn={key:1,class:"config-section"},Gn={key:2,class:"config-section"},Hn=ne({__name:"ClassificationModelConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.classification?.models??[]),V=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),D=e.ref([]),H=e.ref(!1),I=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:u=>{t.value&&u&&s("modelId",u)}}),g=()=>{D.value=k.value},T=async u=>{if(!t.value||!u)return;const w=D.value.find(m=>m.id===u);if(!w)return;const c=t.value?.data;if(!c)return;const b=w.inputSchema||w.input_schema||V.value?.inputSchema||{},q={};b.properties&&Object.entries(b.properties).forEach(([m,p])=>{p.default!==void 0&&(q[m]=p.default)}),o.updateNodeData(t.value.id,{...c,input_schema:b,extraConfig:w.extraConfig||null,arguments:{...q,modelId:w.id,modelName:w.name}})},S=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},r=e.computed(()=>{if(!t.value)return[];const u=t.value.data.input_schema||t.value.data.inputSchema;if(!u||!u.properties)return[];const w=u.required||[];return Object.entries(u.properties).map(([c,b])=>({key:c,type:b.type,label:b.title||b.label||b.description||c,description:b.description||"",default:b.default,required:w.includes(c)||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(c=>!c.hidden).sort((c,b)=>(c.sort??1/0)-(b.sort??1/0))}),y=u=>{if(t.value)return t.value.data.arguments?.[u]},s=(u,w)=>{if(!t.value)return;const b={...t.value.data.arguments||{},[u]:w};o.updateNodeData(t.value.id,{arguments:b})},L=u=>{if(!u.dependsOn||!t.value)return!0;const{field:w,value:c}=u.dependsOn,b=y(w);if(typeof c=="string"&&c.startsWith("!")){const q=c.substring(1);return b!==q}return Array.isArray(c)?c.includes(b):b===c},P=u=>{const w=y(u);return Array.isArray(w)?JSON.stringify(w):""},f=(u,w)=>{try{const c=JSON.parse(w);Array.isArray(c)&&s(u,c)}catch{}},F=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async u=>{if(!u||!t.value)return;D.value.length===0&&g();const w=t.value.data,c=w.input_schema||w.inputSchema,b=w.arguments?.modelId;if(b&&c&&c.properties&&Object.keys(c.properties).length>0||!b)return;const q=D.value.find(N=>N.id===b);if(!q)return;const m=q.inputSchema||q.input_schema||V.value?.inputSchema||{},p={};m.properties&&Object.entries(m.properties).forEach(([N,E])=>{E.default!==void 0&&(p[N]=E.default)});const i=t.value?.data;i&&o.updateNodeData(t.value.id,{...i,input_schema:m,extraConfig:q.extraConfig||null,arguments:{...p,...i.arguments}})},{immediate:!0}),(u,w)=>{const c=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),q=e.resolveComponent("el-option"),m=e.resolveComponent("el-select"),p=e.resolveComponent("el-form-item"),i=e.resolveComponent("el-form"),N=e.resolveComponent("el-icon"),E=e.resolveComponent("el-tooltip"),J=e.resolveComponent("el-switch"),A=e.resolveComponent("el-input-number"),B=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",On,[w[1]||(w[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(b),e.createElementVNode("div",In,[w[2]||(w[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(p,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(m,{modelValue:I.value,"onUpdate:modelValue":w[0]||(w[0]=$=>I.value=$),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:H.value,disabled:_.value,onChange:T,onClear:S},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,$=>(e.openBlock(),e.createBlock(q,{key:$.id,label:$.name,value:$.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),D.value.length===0&&!H.value?(e.openBlock(),e.createElementBlock("div",Rn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),I.value&&r.value.length>0?(e.openBlock(),e.createElementBlock("div",$n,[w[3]||(w[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,$=>e.withDirectives((e.openBlock(),e.createBlock(p,{key:$.key,required:$.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString($.label),1),$.description?(e.openBlock(),e.createBlock(E,{key:0,content:$.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(N,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[$.options&&$.type==="string"?(e.openBlock(),e.createBlock(m,{key:0,"model-value":y($.key),disabled:_.value&&$.key!=="threshold",onChange:W=>s($.key,W),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(W,h)=>(e.openBlock(),e.createBlock(q,{key:W,label:$.optionLabels?$.optionLabels[h]:W,value:W},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):$.type==="boolean"?(e.openBlock(),e.createBlock(J,{key:1,"model-value":y($.key),disabled:_.value&&$.key!=="threshold",onChange:W=>s($.key,W)},null,8,["model-value","disabled","onChange"])):$.type==="number"||$.type==="integer"?(e.openBlock(),e.createBlock(A,{key:2,"model-value":y($.key),disabled:_.value&&$.key!=="threshold",onChange:W=>s($.key,W),min:$.min,max:$.max,step:$.step||($.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):$.type==="array"&&!$.options?(e.openBlock(),e.createElementBlock("div",Fn,[e.createVNode(B,{"model-value":P($.key),disabled:_.value&&$.key!=="threshold",onChange:W=>f($.key,W),type:"textarea",rows:3,placeholder:$.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):$.type==="array"&&$.options?(e.openBlock(),e.createBlock(m,{key:4,"model-value":y($.key),disabled:_.value&&$.key!=="threshold",onChange:W=>s($.key,W),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList($.options,(W,h)=>(e.openBlock(),e.createBlock(q,{key:W,label:$.optionLabels?$.optionLabels[h]:W,value:W},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(B,{key:5,"model-value":y($.key),disabled:_.value&&$.key!=="threshold",onInput:W=>s($.key,W),maxlength:$.maxLength,"show-word-limit":!!$.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!$.dependsOn||L($)]])),128))]),_:1})])):e.createCommentVNode("",!0),I.value&&H.value&&r.value.length===0?(e.openBlock(),e.createElementBlock("div",qn,[...w[4]||(w[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!I.value&&!H.value?(e.openBlock(),e.createElementBlock("div",Gn,[...w[5]||(w[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),jn={class:"config-header"},Pn={class:"config-section"},zn=ne({__name:"OcrConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),V=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(I,g)=>{if(!t.value)return;const T=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...T,[I]:g}})},H=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,I=>{if(!I||!t.value)return;const g=k.value,T=t.value.data.arguments||{},S={};g?.properties&&Object.entries(g.properties).forEach(([r,y])=>{y.default!==void 0&&(S[r]=y.default)}),o.updateNodeData(t.value.id,{arguments:{...S,...T}})},{immediate:!0}),(I,g)=>{const T=e.resolveComponent("el-button"),S=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),y=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",jn,[g[1]||(g[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(S),e.createElementVNode("div",Pn,[g[2]||(g[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":V.value,onChange:g[0]||(g[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn=ne({__name:"LicensePlateConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),V=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(I,g)=>{if(!t.value)return;const T=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...T,[I]:g}})},H=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,I=>{if(!I||!t.value)return;const g=k.value,T=t.value.data.arguments||{},S={};g?.properties&&Object.entries(g.properties).forEach(([r,y])=>{y.default!==void 0&&(S[r]=y.default)}),o.updateNodeData(t.value.id,{arguments:{...S,...T}})},{immediate:!0}),(I,g)=>{const T=e.resolveComponent("el-button"),S=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),y=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[g[1]||(g[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(S),e.createElementVNode("div",Wn,[g[2]||(g[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(y,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":V.value,onChange:g[0]||(g[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Yn={class:"config-header"},Xn={class:"config-section"},Qn={key:0,class:"config-section"},Ye=ne({__name:"FaceConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),V=e.ref(null),D=e.computed(()=>({repositoryId:T.value})),H={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},I=e.computed(()=>t.value?.data.arguments?.threshold??.5),g=y=>t.value?.data.arguments?.[y],T=e.computed(()=>{const y=g("repositoryId");return y?Array.isArray(y)?y:[y]:[]}),S=(y,s)=>{if(!t.value)return;const L=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...L,[y]:s}})},r=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,y=>{if(!y||!t.value)return;const L=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,P=t.value.data.arguments||{},f={};L?.properties&&Object.entries(L.properties).forEach(([F,u])=>{u.default!==void 0&&(f[F]=u.default)}),o.updateNodeData(t.value.id,{arguments:{...f,...P}})},{immediate:!0}),(y,s)=>{const L=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),F=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form"),w=e.resolveComponent("el-option"),c=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yn,[s[2]||(s[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",Xn,[s[3]||(s[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(F,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":I.value,onChange:s[0]||(s[0]=b=>S("threshold",b)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(d)==="task"?(e.openBlock(),e.createElementBlock("div",Qn,[s[4]||(s[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(u,{model:D.value,rules:H,ref_key:"faceFormRef",ref:V,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(F,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(c,{"model-value":T.value,onChange:s[1]||(s[1]=b=>S("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(w,{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"]]),Kn={class:"config-header"},Zn={key:0,class:"config-section"},vn={key:3,class:"array-input"},ea={key:1,class:"config-section"},ta=ne({__name:"StreamConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),{schemaLoading:l,fetchSchemaForNodeType:k}=Se(),V=e.computed(()=>{if(!t.value)return[];const r=t.value.data.input_schema||t.value.data.inputSchema;if(!r||!r.properties)return[];const y=r.required||[];return Object.entries(r.properties).map(([s,L])=>({key:s,type:L.type,label:L.title||L.label||L.description||s,description:L.description||"",default:L.default,required:y.includes(s)||L.required||!1,min:L.minimum!==void 0?L.minimum:L.min,max:L.maximum!==void 0?L.maximum:L.max,step:L.step,maxLength:L.maxLength,options:L.enum,optionLabels:L.enumLabels||L.enum,dependsOn:L.dependsOn,sort:L.sort})).sort((s,L)=>(s.sort??1/0)-(L.sort??1/0))}),D=r=>{if(t.value)return t.value.data.arguments?.[r]},H=(r,y)=>{if(!t.value)return;const L={...t.value.data.arguments||{},[r]:y};o.updateNodeData(t.value.id,{arguments:L})},I=r=>{if(!r.dependsOn||!t.value)return!0;const{field:y,value:s}=r.dependsOn,L=D(y);if(typeof s=="string"&&s.startsWith("!")){const P=s.substring(1);return L!==P}return Array.isArray(s)?s.includes(L):L===s},g=r=>{const y=D(r);return Array.isArray(y)?JSON.stringify(y):""},T=(r,y)=>{try{const s=JSON.parse(y);Array.isArray(s)&&H(r,s)}catch{}},S=()=>{t.value&&v.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 y=t.value.type,s=t.value.data,L=s.input_schema||s.inputSchema;if(L&&L.properties&&Object.keys(L.properties).length>0)return;const P=await k(y);if(!P)return;const f=t.value?.data;f&&o.updateNodeData(t.value.id,{...f,input_schema:P.inputSchema,extraConfig:P.extraConfig,arguments:{...P.arguments,...f.arguments}})},{immediate:!0}),(r,y)=>{const s=e.resolveComponent("el-button"),L=e.resolveComponent("el-divider"),P=e.resolveComponent("el-icon"),f=e.resolveComponent("el-tooltip"),F=e.resolveComponent("el-option"),u=e.resolveComponent("el-select"),w=e.resolveComponent("el-switch"),c=e.resolveComponent("el-input-number"),b=e.resolveComponent("el-input"),q=e.resolveComponent("el-form-item"),m=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Kn,[y[0]||(y[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(s,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:S},null,8,["icon"]))]),e.createVNode(L),V.value.length>0?(e.openBlock(),e.createElementBlock("div",Zn,[y[1]||(y[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(m,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,p=>e.withDirectives((e.openBlock(),e.createBlock(q,{key:p.key,required:p.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(p.label),1),p.description?(e.openBlock(),e.createBlock(f,{key:0,content:p.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[p.options&&p.type==="string"?(e.openBlock(),e.createBlock(u,{key:0,"model-value":D(p.key),onChange:i=>H(p.key,i),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.options,(i,N)=>(e.openBlock(),e.createBlock(F,{key:i,label:p.optionLabels?p.optionLabels[N]:i,value:i},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):p.type==="boolean"?(e.openBlock(),e.createBlock(w,{key:1,"model-value":D(p.key),onChange:i=>H(p.key,i)},null,8,["model-value","onChange"])):p.type==="number"||p.type==="integer"?(e.openBlock(),e.createBlock(c,{key:2,"model-value":D(p.key),onChange:i=>H(p.key,i),min:p.min,max:p.max,step:p.step||(p.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):p.type==="array"&&!p.options?(e.openBlock(),e.createElementBlock("div",vn,[e.createVNode(b,{"model-value":g(p.key),onChange:i=>T(p.key,i),type:"textarea",rows:3,placeholder:p.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):p.type==="array"&&p.options?(e.openBlock(),e.createBlock(u,{key:4,"model-value":D(p.key),onChange:i=>H(p.key,i),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.options,(i,N)=>(e.openBlock(),e.createBlock(F,{key:i,label:p.optionLabels?p.optionLabels[N]:i,value:i},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(b,{key:5,"model-value":D(p.key),onInput:i=>H(p.key,i),maxlength:p.maxLength,"show-word-limit":!!p.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!p.dependsOn||I(p)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&V.value.length===0?(e.openBlock(),e.createElementBlock("div",ea,[...y[2]||(y[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),oa={class:"config-header"},na={class:"config-section"},aa={key:0,class:"config-section"},la={key:1,class:"config-section"},ra={key:0,class:"el-form-item__error"},sa={key:2,class:"config-section"},ia={key:3,class:"config-section"},ca={key:4,class:"config-section"},da=ne({__name:"DataSourceConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.inject("taskModeConfig",null),l=e.inject("selectedDevicesMap",null),k=e.inject("echoAlgodata",null),V=e.computed(()=>d==="task"),D=e.computed(()=>P("deviceType")??"camera"),H=e.computed(()=>{const p=o.nodes.find(N=>N.type===C.START);return p?.data?.streamType?p.data.streamType:(_?.value??_)?.streamType??"image"}),I=e.computed(()=>{const p=t.value?.id;return l?.value?.[p]?.length??0}),g=()=>{const p=_?.value??_,i=t.value?.id,N=t.value?.data?.label??"",E=l?.value?.[i]??[],J=o.nodes.filter(h=>h.type===C.DATA_SOURCE).findIndex(h=>h.id===i),A=k?.value??k,B=A?.graph??A,$=t.value?.data?.sourceGroupId??B?.ruleSchema?.sourceGroups?.[J]?.sourceGroupId??i,W=h=>{l&&(l.value[i]=h)};p?.datasource?.onDeviceClick?.(i,N,$,E,D.value,W)},{fetchSchemaForNodeType:T}=Se(),S=e.computed(()=>o.nodes.some(p=>p.type===C.SMALL_MODEL)),r=e.computed(()=>o.getDataSourceCount()>=2),y=e.computed(()=>!o.supportPatrol()),s=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),L=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const i=p.required||[];return Object.entries(p.properties).map(([N,E])=>({key:N,type:E.type,label:E.title||E.label||E.description||N,description:E.description||"",default:E.default,required:i.includes(N)||E.required||!1,min:E.minimum!==void 0?E.minimum:E.min,max:E.maximum!==void 0?E.maximum:E.max,step:E.step,maxLength:E.maxLength,options:E.enum,optionLabels:E.enumLabels||E.enum,dependsOn:E.dependsOn}))}),P=p=>{if(t.value)return t.value.data.arguments?.[p]},f=e.computed(()=>!!P("enableImageSequence")),F=e.computed(()=>!!P("needCooperativeDetection")),u=(p,i)=>{if(!t.value)return;const E={...t.value.data.arguments||{},[p]:i};o.updateNodeData(t.value.id,{arguments:E})},w=async p=>{if(!t.value)return;if(o.edges.some(N=>N.source===t.value.id))try{await v.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(E=>E.source===t.value.id).forEach(E=>{o.removeEdge(E.id)}),p&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:p}),u("enableImageSequence",p),p&&o.initializeSubsequentFrames(t.value.id)}catch{return}else p&&u("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:p}),u("enableImageSequence",p),p&&o.initializeSubsequentFrames(t.value.id)},c=p=>{t.value&&(p&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),u("enableImageSequence",!1),u("enablePatrol",!1)),u("needCooperativeDetection",p))};e.watch(H,p=>{p==="stream"&&t.value&&P("deviceType")==="1400"&&u("deviceType","camera")},{immediate:!0});const b=e.computed(()=>V.value&&D.value==="camera"&&H.value!=="stream"&&o.supportPatrol());e.watch(b,p=>{!p&&t.value&&P("enablePatrol")&&u("enablePatrol",!1)}),e.watch(I,p=>{p>0&&P("enablePatrol")&&(P("patrolGroupSize")??1)>p&&u("patrolGroupSize",p)});const q=p=>{if(!p.dependsOn||!t.value)return!0;const{field:i,value:N}=p.dependsOn,E=P(i);if(typeof N=="string"&&N.startsWith("!")){const J=N.substring(1);return E!==J}return Array.isArray(N)?N.includes(E):E===N},m=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;const i=t.value.type,N=t.value.data;if(i==="dataSource"&&V.value){const B=N.arguments||{},$={},W=o.nodes.some(h=>h.type===C.SMALL_MODEL);B.mode===void 0&&($.mode=W?3:0),B.interval===void 0&&($.interval=30),H.value==="stream"&&B.sw_decoding===void 0&&($.sw_decoding="CPU"),Object.keys($).length>0&&o.updateNodeData(p,{arguments:{...B,...$}})}const E=N.input_schema||N.inputSchema;if(i==="dataSource"&&E&&E.properties&&!E.properties.windowSeconds){E.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},N.arguments.windowSeconds||o.updateNodeData(t.value.id,{...N,input_schema:E,arguments:{...N.arguments,windowSeconds:5}});return}if(E&&E.properties&&Object.keys(E.properties).length>0)return;const J=await T(i);if(!J)return;const A=t.value?.data;A&&o.updateNodeData(t.value.id,{...A,input_schema:J.inputSchema,extraConfig:J.extraConfig,arguments:{...J.arguments,...A.arguments}})},{immediate:!0}),(p,i)=>{const N=e.resolveComponent("el-button"),E=e.resolveComponent("el-divider"),J=e.resolveComponent("el-icon"),A=e.resolveComponent("el-tooltip"),B=e.resolveComponent("el-option"),$=e.resolveComponent("el-select"),W=e.resolveComponent("el-switch"),h=e.resolveComponent("el-input-number"),M=e.resolveComponent("el-input"),G=e.resolveComponent("el-form-item"),U=e.resolveComponent("el-form"),Z=e.resolveComponent("el-radio"),R=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",oa,[i[11]||(i[11]=e.createElementVNode("h3",null,"节点配置",-1)),V.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(N,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:m},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",na,[i[12]||(i[12]=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(L.value,n=>e.withDirectives((e.openBlock(),e.createBlock(G,{key:n.key,required:n.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(n.label),1),n.description?(e.openBlock(),e.createBlock(A,{key:0,content:n.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(J,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[n.options&&n.type==="string"?(e.openBlock(),e.createBlock($,{key:0,"model-value":P(n.key),onChange:x=>u(n.key,x),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,(x,j)=>(e.openBlock(),e.createBlock(B,{key:x,label:n.optionLabels?n.optionLabels[j]:x,value:x},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):n.type==="boolean"?(e.openBlock(),e.createBlock(A,{key:1,content:V.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":n.key==="needCooperativeDetection"&&f.value?"已开启图片时序,无法同时开启协同检测":n.key==="enableImageSequence"&&F.value?"已开启协同检测,无法同时开启图片时序":n.key==="enableImageSequence"&&r.value?"多数据源场景下不允许开启图片时序":"",disabled:!(V.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence"))&&!(n.key==="needCooperativeDetection"&&f.value)&&!(n.key==="enableImageSequence"&&F.value)&&!(n.key==="enableImageSequence"&&r.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":P(n.key),disabled:V.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")||n.key==="needCooperativeDetection"&&f.value||n.key==="enableImageSequence"&&F.value||n.key==="enableImageSequence"&&r.value,onChange:x=>n.key==="enableImageSequence"?w(x):n.key==="needCooperativeDetection"?c(x):u(n.key,x)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):n.type==="number"||n.type==="integer"?(e.openBlock(),e.createBlock(h,{key:2,"model-value":P(n.key),onChange:x=>u(n.key,x),min:n.min,max:n.max,step:n.step||(n.type==="integer"?1:.1),precision:n.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(M,{key:3,"model-value":P(n.key),onInput:x=>u(n.key,x),maxlength:n.maxLength,"show-word-limit":!!n.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!n.dependsOn||q(n)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",aa,[i[13]||(i[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":t.value?.data.branchLogic||"and",disabled:V.value,onChange:i[0]||(i[0]=n=>e.unref(o).updateNodeData(t.value.id,{branchLogic:n})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(B,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(B,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),V.value?(e.openBlock(),e.createElementBlock("div",la,[i[16]||(i[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":P("deviceType")??"camera",onChange:i[1]||(i[1]=n=>u("deviceType",n))},{default:e.withCtx(()=>[e.createVNode(Z,{value:"camera"},{default:e.withCtx(()=>[...i[14]||(i[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(Z,{value:"1400",disabled:H.value==="stream"},{default:e.withCtx(()=>[...i[15]||(i[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(G,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(M,{"model-value":`已选 ${I.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":I.value===0}),onClick:g},null,8,["model-value","class"]),I.value===0?(e.openBlock(),e.createElementBlock("div",ra,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),V.value&&D.value==="1400"?(e.openBlock(),e.createElementBlock("div",sa,[i[19]||(i[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":P("detectionMode")??"platform",onChange:i[2]||(i[2]=n=>u("detectionMode",n))},{default:e.withCtx(()=>[e.createVNode(Z,{value:"platform"},{default:e.withCtx(()=>[...i[17]||(i[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(Z,{value:"device"},{default:e.withCtx(()=>[...i[18]||(i[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),V.value&&D.value==="camera"&&H.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ia,[i[21]||(i[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(A,{disabled:!y.value,content:s.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":y.value?!1:P("enablePatrol"),disabled:y.value,onChange:i[3]||(i[3]=n=>u("enablePatrol",n))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),P("enablePatrol")?(e.openBlock(),e.createBlock(G,{key:0},{label:e.withCtx(()=>[i[20]||(i[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(A,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(J,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(h,{"model-value":P("patrolGroupSize")??1,onChange:i[4]||(i[4]=n=>u("patrolGroupSize",n)),min:1,max:I.value>0?I.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),V.value&&D.value==="camera"?(e.openBlock(),e.createElementBlock("div",ca,[i[22]||(i[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(G,{label:"抽帧策略"},{default:e.withCtx(()=>[H.value==="image"?(e.openBlock(),e.createBlock($,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"按时间间隔抽帧",value:0})]),_:1})):S.value?(e.openBlock(),e.createBlock($,{key:1,"model-value":P("mode")??3,onChange:i[5]||(i[5]=n=>{u("mode",n),n===1&&u("interval",S.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"每一帧都检测",value:3}),e.createVNode(B,{label:"跳帧检测",value:1}),e.createVNode(B,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock($,{key:2,"model-value":P("mode")??0,onChange:i[6]||(i[6]=n=>{u("mode",n),n===0&&u("interval",30),n===1&&u("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"按时间间隔抽帧",value:0}),e.createVNode(B,{label:"跳帧检测",value:1}),e.createVNode(B,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),H.value==="image"||H.value==="stream"&&(P("mode")??0)===0?(e.openBlock(),e.createBlock(G,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(h,{"model-value":P("interval")??30,onChange:i[7]||(i[7]=n=>u("interval",n)),min:1,max:H.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),H.value==="stream"&&(P("mode")??0)===1?(e.openBlock(),e.createBlock(G,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[S.value?(e.openBlock(),e.createBlock(h,{key:0,"model-value":P("interval")??5,onChange:i[8]||(i[8]=n=>u("interval",n)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock($,{key:1,"model-value":P("interval")??25,onChange:i[9]||(i[9]=n=>u("interval",n)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:25,value:25}),e.createVNode(B,{label:50,value:50}),e.createVNode(B,{label:75,value:75}),e.createVNode(B,{label:125,value:125}),e.createVNode(B,{label:250,value:250}),e.createVNode(B,{label:375,value:375}),e.createVNode(B,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),H.value==="stream"?(e.openBlock(),e.createBlock(G,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode($,{"model-value":P("sw_decoding")??"CPU",onChange:i[10]||(i[10]=n=>u("sw_decoding",n)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"GPU",value:"GPU"}),e.createVNode(B,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-a941b904"]]),ma={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Xe=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),d=e.ref(null),_=e.ref(""),l=async(S=!1)=>{if(a){o.value=a;return}},k=async()=>{o.value=[],await l(!0)},V=S=>o.value.find(r=>r.id===S||r.title===S),D=S=>{const r=V(S);if(!r)return{};const y=r.inputSchema||r.input_schema;if(!y||!y.properties)return{};const s={};return Object.entries(y.properties).forEach(([L,P])=>{P.default!==void 0&&(s[L]=P.default)}),s},H=S=>{const r=V(S);if(!r)return[];const y=r.inputSchema||r.input_schema;if(!y||!y.properties)return[];const s=y.required||[];return Object.entries(y.properties).map(([L,P])=>({key:L,type:P.type,label:P.title||P.description||L,description:P.description||"",default:P.default,required:s.includes(L)||P.required||!1,min:P.minimum,max:P.maximum,step:P.step,options:P.enum,optionLabels:P.enumLabels||P.enum,dependsOn:P.dependsOn}))},I=e.computed(()=>{if(!_.value)return o.value;const S=_.value.toLowerCase();return o.value.filter(r=>r.name?.toLowerCase().includes(S)||r.type?.toLowerCase().includes(S)||r.title?.toLowerCase().includes(S)||r.description&&r.description.toLowerCase().includes(S)||g(r.type).toLowerCase().includes(S))}),g=S=>ma[S]||S;return{models:o,loading:t,error:d,searchKeyword:_,filteredModels:I,loadSmallModels:l,reloadSmallModels:k,getModelConfig:V,getTypeLabel:g,getDefaultArguments:D,getSchemaFields:H,validateArguments:(S,r)=>{const y=V(S);if(!y)return{valid:!1,errors:["模型不存在"]};const s=[],L=y.inputSchema||y.input_schema;return!L||!L.properties?{valid:!0,errors:[]}:(Object.entries(L.properties).forEach(([P,f])=>{const F=r[P];if(f.required&&(F==null||F==="")){s.push(`${f.title||P} 为必填项`);return}if(F!=null&&(f.type==="number"||f.type==="integer")){if(typeof F!="number"){s.push(`${f.title||P} 必须是数字`);return}f.minimum!==void 0&&F<f.minimum&&s.push(`${f.title||P} 不能小于 ${f.minimum}`),f.maximum!==void 0&&F>f.maximum&&s.push(`${f.title||P} 不能大于 ${f.maximum}`)}}),{valid:s.length===0,errors:s})}}},pa={class:"small-model-selector"},ua={key:0,class:"loading-state"},fa={key:1,class:"error-state"},ga={key:2,class:"model-list"},ha=["onClick"],ya={class:"model-header"},_a={class:"model-name"},Na={class:"model-description"},Ca={class:"model-meta"},ka={key:3,class:"empty-state"},ba=ne({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(a,{emit:o}){const t=a,d=o,{loading:_,error:l,searchKeyword:k,filteredModels:V,loadSmallModels:D,reloadSmallModels:H,getTypeLabel:I}=Xe(t.externalModels),g=r=>{d("update:modelValue",r.id),d("select",r)},T=()=>{H()},S=r=>({safety:"warning",security:"danger",traffic:"info"})[r]||"info";return e.onMounted(()=>{t.externalModels||D()}),(r,y)=>{const s=e.resolveComponent("el-input"),L=e.resolveComponent("el-icon"),P=e.resolveComponent("el-button"),f=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",pa,[e.createVNode(s,{modelValue:e.unref(k),"onUpdate:modelValue":y[0]||(y[0]=F=>e.isRef(k)?k.value=F:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(K.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(_)?(e.openBlock(),e.createElementBlock("div",ua,[e.createVNode(L,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Loading))]),_:1}),y[2]||(y[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",fa,[e.createVNode(L,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(l)),1),e.createVNode(P,{type:"primary",onClick:T},{default:e.withCtx(()=>[...y[3]||(y[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(V).length>0?(e.openBlock(),e.createElementBlock("div",ga,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(V),F=>(e.openBlock(),e.createElementBlock("div",{key:F.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===F.id}]),onClick:u=>g(F)},[e.createElementVNode("div",ya,[e.createElementVNode("div",_a,[e.createVNode(L,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(F.name),1)]),e.createVNode(f,{type:S(F.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(I)(F.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",Na,e.toDisplayString(F.description),1),e.createElementVNode("div",Ca,[F.supportDirectAlert?(e.openBlock(),e.createBlock(f,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...y[4]||(y[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,ha))),128))])):(e.openBlock(),e.createElementBlock("div",ka,[e.createVNode(L,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Search))]),_:1}),y[6]||(y[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(P,{text:"",onClick:y[1]||(y[1]=F=>k.value="")},{default:e.withCtx(()=>[...y[5]||(y[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),xa={class:"position-tooltip"},Ve=ne({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",xa,[...t[0]||(t[0]=[e.createStaticVNode('<div class="tooltip-title" data-v-6ac23ee8>提示说明</div><div class="tooltip-desc" data-v-6ac23ee8> 目标点为点位代表目标位置的点,系统默认使用目标框的中心点表示目标的位置。只有当目标的重心点满足检测框完整落在检测区域时,才表示目标进入检测框或者离开检测区域。 </div><div class="tooltip-examples" data-v-6ac23ee8><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例1:以目标框的中心点代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="60" cy="90" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0.5 Y轴: 0.5</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例2:以目标框的最左上角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="5" cy="5" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0 Y轴: 0</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例3:以目标框的最右下角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="115" cy="175" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 1 Y轴: 1</div></div></div>',3)])]))}},[["__scopeId","data-v-6ac23ee8"]]),Ea={class:"config-header"},wa={class:"config-section"},Ta={key:0,class:"model-selector-wrapper"},Sa={key:1,class:"selected-model-info"},Va={class:"model-info-header"},Ba={class:"model-info-name"},Aa={class:"model-info-description"},Da={key:0,class:"config-section"},La={key:3,class:"array-input"},Ma="检测到事件后,连续两次告警上报的时间间隔",Oa=ne({__name:"SmallModelConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=e.inject("editorConfig",null),k=e.computed(()=>(l?.value??l)?.smallModels??null),{models:V}=Xe(k.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),H={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},I=e.computed(()=>{if(!t.value)return[];const u=t.value.data.input_schema||t.value.data.inputSchema;if(!u||!u.properties)return[];const w=u.required||[],c=t.value.data.title||"";return Object.entries(u.properties).filter(([b])=>D.has(b)).map(([b,q])=>{const m={key:b,type:q.type,label:q.title||q.label||q.description||b,description:q.description||"",default:q.default,required:w.includes(b)||q.required||!1,min:q.minimum!==void 0?q.minimum:q.min,max:q.maximum!==void 0?q.maximum:q.max,step:q.step,maxLength:q.maxLength,options:q.enum,optionLabels:q.enumLabels||q.enum,dependsOn:q.dependsOn,sort:q.sort};return b==="interval"&&(m.label="告警间隔(秒)",m.description=H[c]||Ma,m.isInterval=!0,m.default=m.default!=null?m.default/1e3:10,m.min=m.min!=null?m.min/1e3:1,m.max=m.max!=null?m.max/1e3:void 0,m.step=1,m.precision=0),b==="threshold"&&(m.label="小模型阈值",m.step=.01,m.precision=2),b==="targetWidth"&&(m.label="最小目标宽度",m.default=60,m.min=20,m.max=1920,m.step=1,m.precision=0),b==="targetHeight"&&(m.label="最小目标高度",m.default=60,m.min=20,m.max=1080,m.step=1,m.precision=0),b==="topScale"&&(m.label="调整目标框高度比例 (上)",m.max=10,m.step=.1,m.precision=1),b==="bottomScale"&&(m.label="调整目标框高度比例 (下)",m.max=10,m.step=.1,m.precision=1),b==="leftScale"&&(m.label="调整目标框宽度比例 (左)",m.max=10,m.step=.1,m.precision=1),b==="rightScale"&&(m.label="调整目标框宽度比例 (右)",m.max=10,m.step=.1,m.precision=1),b==="x_ratio"&&(m.label="X轴位置信息",m.step=.01,m.precision=2),b==="y_ratio"&&(m.label="Y轴位置信息",m.step=.01,m.precision=2),b==="targetDuration"&&(m.label="目标持续时间(秒)",m.default=m.default!=null?m.default/1e3:1,m.min=m.min!=null?m.min/1e3:1,m.max=m.max!=null?m.max/1e3:void 0,m.step=.01,m.precision=2),b==="overloadNumber"&&(m.precision=0),b==="targetNumber"&&(m.precision=0),m}).filter(b=>!["areas","darwin","direction","lines"].includes(b.key)).filter(b=>!(b.key==="targetDuration"&&c==="NonMotorCounter")).sort((b,q)=>(b.sort??1/0)-(q.sort??1/0))}),g=["interval","targetDuration"],T=u=>{if(!t.value)return;const w=t.value.data.arguments?.[u];return g.includes(u)&&w!=null?w/1e3:w},S=(u,w)=>{if(!t.value)return;let c=w;g.includes(u)&&w!=null&&(c=w*1e3);const q={...t.value.data.arguments||{},[u]:c};o.updateNodeData(t.value.id,{arguments:q})},r=u=>{if(!u.dependsOn||!t.value)return!0;const{field:w,value:c}=u.dependsOn,b=T(w);if(typeof c=="string"&&c.startsWith("!")){const q=c.substring(1);return b!==q}return Array.isArray(c)?c.includes(b):b===c},y=u=>{const w=T(u);return Array.isArray(w)?JSON.stringify(w):""},s=(u,w)=>{try{const c=JSON.parse(w);Array.isArray(c)&&S(u,c)}catch{}},L=async u=>{if(!t.value)return;const w=u.inputSchema||u.input_schema||{},c={};w.properties&&Object.entries(w.properties).forEach(([b,q])=>{q.default!==void 0&&(c[b]=q.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:u.id||u.title,title:u.title,modelName:u.name,modelType:u.type,input_schema:w,extraConfig:u.extraConfig,supportDirectAlert:u.supportDirectAlert||!1,arguments:c})},P=()=>{t.value&&v.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},f=()=>t.value?.data.modelId?V.value.find(w=>w.id===t.value.data.modelId)?.description||"暂无描述":"",F=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(u,w)=>{const c=e.resolveComponent("el-button"),b=e.resolveComponent("el-divider"),q=e.resolveComponent("el-icon"),m=e.resolveComponent("el-tag"),p=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-option"),N=e.resolveComponent("el-select"),E=e.resolveComponent("el-switch"),J=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),B=e.resolveComponent("el-text"),$=e.resolveComponent("el-form-item"),W=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ea,[w[0]||(w[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:F},null,8,["icon"]))]),e.createVNode(b),e.createElementVNode("div",wa,[w[3]||(w[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!_.value?(e.openBlock(),e.createElementBlock("div",Ta,[e.createVNode(ba,{"model-value":t.value?.data.modelId,"external-models":k.value,onSelect:L},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Sa,[e.createElementVNode("div",Va,[e.createElementVNode("div",Ba,[e.createVNode(q,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(c,{key:0,type:"text",text:"",size:"small",onClick:P},{default:e.withCtx(()=>[...w[1]||(w[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Aa,e.toDisplayString(f()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(m,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...w[2]||(w[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Da,[w[4]||(w[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(W,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.value,h=>e.withDirectives((e.openBlock(),e.createBlock($,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.key==="x_ratio"||h.key==="y_ratio"?(e.openBlock(),e.createBlock(p,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):h.description?(e.openBlock(),e.createBlock(p,{key:1,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(q,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(N,{key:0,"model-value":T(h.key),onChange:M=>S(h.key,M),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(M,G)=>(e.openBlock(),e.createBlock(i,{key:M,label:h.optionLabels?h.optionLabels[G]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(E,{key:1,"model-value":T(h.key),onChange:M=>S(h.key,M)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"||h.type==="float"?(e.openBlock(),e.createBlock(J,{key:2,"model-value":T(h.key),onChange:M=>S(h.key,M),min:h.min,max:h.max,step:h.step||(h.type==="integer"||h.type==="number"?1:.01),precision:h.precision??(h.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",La,[e.createVNode(A,{"model-value":y(h.key),onChange:M=>s(h.key,M),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(B,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(N,{key:4,"model-value":T(h.key),onChange:M=>S(h.key,M),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(M,G)=>(e.openBlock(),e.createBlock(i,{key:M,label:h.optionLabels?h.optionLabels[G]:M,value:M},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":T(h.key),onInput:M=>S(h.key,M)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||r(h)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Ia=(a=null)=>{const o=le(),t=e.ref(a?a.map(g=>Te.backendToFrontend(g)):[]),d=e.ref(!1),_=e.ref(null),l=async(g=!1)=>{if(a){t.value=a.map(T=>Te.backendToFrontend(T));return}},k=g=>t.value.find(T=>T.title===g)||null,V=g=>{const T=k(g);return T?{targetId:T.title,targetName:T.label,threshold:T.data.threshold||.5,targetWidth:T.data.targetWidth||20,targetHeight:T.data.targetHeight||20,postmodel:T.data.postmodel||"ClipVit",areas:T.data.areas||[],expandRect:T.data.expandRect!==void 0?T.data.expandRect:!1,topScale:T.data.topScale||1.6,bottomScale:T.data.bottomScale||1.6,leftScale:T.data.leftScale||1.6,rightScale:T.data.rightScale||1.6,enableStructure:T.data.enableStructure}:{}},D=(g=null)=>o.nodes.filter(T=>T.type==="detectionTarget"&&T.id!==g).map(T=>({value:T.id,label:T.data.targetName||T.data.label})),H=(g=null)=>{const T=[{value:"original",label:"原图"}],S=D(g);return[...T,...S]},I=e.computed(()=>t.value.map(g=>({value:g.title,label:g.label,...g})));return{detectionTargets:t,loading:d,error:_,loadDetectionTargets:l,getTargetById:k,getDefaultConfig:V,getDetectionTargetNodes:D,getDetectionScopeOptions:H,getTargetOptions:I}},Ra={class:"paired-array-input"},Be=ne({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(a,{emit:o}){const t=(I,g)=>{let T;return(...S)=>{clearTimeout(T),T=setTimeout(()=>I(...S),g)}},d=a,_=o,l=e.ref([]),k=()=>{const I=d.primaryValue||[],g=d.pairedValue||[],T=Math.max(I.length,g.length,1);l.value=Array.from({length:T},(S,r)=>({primary:I[r]||"",paired:g[r]!==void 0?g[r]:d.pairedField.default?.[0]||.5}))};e.watch(()=>[d.primaryValue,d.pairedValue],()=>{k()},{immediate:!0,deep:!0});const V=t((I,g)=>{_("update",I,g)},300);e.watch(l,I=>{const g=I.map(S=>S.primary),T=I.map(S=>S.paired);V(g,T)},{deep:!0});const D=()=>{l.value.length>=10||l.value.push({primary:"",paired:d.pairedField.default?.[0]||.5})},H=I=>{l.value.length>1&&l.value.splice(I,1)};return(I,g)=>{const T=e.resolveComponent("el-input"),S=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",Ra,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(y,s)=>(e.openBlock(),e.createElementBlock("div",{key:s,class:"input-row"},[e.createVNode(T,{modelValue:l.value[s].primary,"onUpdate:modelValue":L=>l.value[s].primary=L,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!l.value[s].primary||l.value[s].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(S,{modelValue:l.value[s].paired,"onUpdate:modelValue":L=>l.value[s].paired=L,min:a.pairedField.min||0,max:a.pairedField.max||1,step:a.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(r,{type:"danger",icon:e.unref(K.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:L=>H(s)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(r,{type:"primary",icon:e.unref(K.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"]]),$a={class:"config-header"},Fa={class:"config-section"},qa={class:"flex items-center justify-between"},Ga={key:0,class:"config-section"},Ha={key:1,class:"config-section"},ja={key:2,class:"config-section"},Pa={class:"device-list"},za=["onClick"],Ua={class:"device-name"},Wa={key:0,class:"device-list-empty"},Ja={key:4,class:"array-input"},Ya={key:4,class:"array-input"},Xa=ne({__name:"DetectionTargetConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d==="task");e.inject("taskModeConfig",null);const l=e.inject("echoAlgodata",null),k=e.inject("echoTaskData",null),V=e.inject("selectedDevicesMap",null),D=e.computed(()=>{if(!t.value)return null;const h=new Set,M=[t.value.id];for(;M.length;){const G=M.shift();if(h.has(G))continue;h.add(G);const U=o.edges.filter(Z=>Z.target===G);for(const Z of U){const R=o.nodes.find(n=>n.id===Z.source);if(R){if(R.type==="dataSource")return R.id;M.push(R.id)}}}return null}),H=e.computed(()=>{const h=D.value;return h?V?.value?.[h]??[]:[]}),I=e.computed(()=>_.value&&H.value.length>0),g=e.ref(""),T=e.ref(""),S=e.computed(()=>{const h=T.value.trim().toLowerCase();return h?H.value.filter(M=>(M.sourceName??M.name??String(M.sourceId??M.id??M)).toLowerCase().includes(h)):H.value}),r=e.computed(()=>{const h={},M=D.value,G=t.value?.id;if(!M||!G)return h;const U={...t.value?.data?.arguments??{}};delete U.configMode;for(const Z of H.value){const R=String(Z.sourceId??Z.id??Z),n=o.getTaskSourceArguments(M,R,G);if(n===null){h[R]=!1;continue}const x=new Set([...Object.keys(n),...Object.keys(U)]);let j=!1;for(const Y of x)if(JSON.stringify(n[Y])!==JSON.stringify(U[Y])){j=!0;break}h[R]=j}return h});e.watch([H,()=>t.value?.data?.arguments?.configMode],([h])=>{h.length>0?g.value=String(h[0]?.sourceId??h[0]?.id??h[0]):g.value=""},{immediate:!0});const y=(h,M=null)=>{if(M){const n=((k?.value??k)?.graph?.sources??[]).find(x=>String(x.sourceId)===String(M));if(n?.branches)for(const x of n.branches){const j=x.nodes?.find(Y=>Y.toolTitle===h);if(j?.arguments)return{...j.arguments}}return null}const G=l?.value??l,U=G?.graph??G;if(!U?.branches)return null;for(const Z of U.branches){const R=Z.nodes?.find(n=>n.toolTitle===h);if(R?.arguments)return{...R.arguments}}return null},s=h=>{const M=D.value,G=t.value?.id;if(!M||!G||!h||o.getTaskSourceArguments(M,h,G)!==null)return;const U=t.value?.data?.targetId,Z=U?y(U,h):null,R=t.value?.data?.arguments??{},n={...Z??R};delete n.configMode,o.setTaskSourceArguments(M,h,G,n)};e.watch(g,h=>{h&&t.value?.data?.arguments?.configMode==="perDevice"&&s(h)}),e.watch(()=>t.value?.data?.arguments?.configMode,h=>{h==="perDevice"&&g.value&&s(g.value)});const L=e.inject("editorConfig",null),P=e.computed(()=>(L?.value??L)?.detection??null),{detectionTargets:f,loading:F}=Ia(P.value),u=e.computed(()=>{if(!t.value)return[];const h=t.value.data.input_schema||t.value.data.inputSchema;if(!h||!h.properties)return[];const M=h.required||[];return Object.entries(h.properties).map(([G,U])=>({key:G,type:U.type,label:U.title||U.label||U.description||G,description:U.description||"",default:U.default,required:M.includes(G)||U.required||!1,min:U.minimum!==void 0?U.minimum:U.min,max:U.maximum!==void 0?U.maximum:U.max,step:U.step,maxLength:U.maxLength,options:U.enum,optionLabels:U.enumLabels||U.enum,dependsOn:U.dependsOn,"x-component":U["x-component"],"x-paired-with":U["x-paired-with"],sort:U.sort})).sort((G,U)=>(G.sort??1/0)-(U.sort??1/0))}),w=h=>h.type==="array"&&h["x-component"]==="paired-array"&&h["x-paired-with"],c=h=>{const M=h["x-paired-with"];return u.value.find(G=>G.key===M)},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}},q=new Set(Object.keys(b)),m=e.computed(()=>{const h=t.value?.data.targetId,M=new Set;return u.value.forEach(G=>{G["x-paired-with"]&&M.add(G["x-paired-with"])}),u.value.filter(G=>h==="traffic_accident"?G.key==="threshold":q.has(G.key)&&!M.has(G.key)&&!w(G)).map(G=>{const U=b[G.key]||{};return{...G,label:U.label||G.label,description:U.description||G.description,min:U.min??G.min,max:U.max??G.max,step:U.step??G.step,precision:U.precision,default:U.default??G.default}})}),p=e.computed(()=>u.value.filter(h=>w(h))),i=h=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&g.value){const G=D.value,U=o.getTaskSourceArguments(G,g.value,t.value.id);if(U!==null)return U[h]}return t.value.data.arguments?.[h]},N=(h,M)=>{if(!t.value)return;const G=t.value.data.arguments?.configMode;if(h!=="configMode"&&G==="perDevice"&&g.value){const R=D.value;o.updateTaskSourceArgument(R,g.value,t.value.id,h,M);return}const Z={...t.value.data.arguments||{},[h]:M};o.updateNodeData(t.value.id,{arguments:Z})},E=h=>{if(!h.dependsOn||!t.value)return!0;const{field:M,value:G}=h.dependsOn,U=i(M);if(typeof G=="string"&&G.startsWith("!")){const Z=G.substring(1);return U!==Z}return Array.isArray(G)?G.includes(U):U===G},J=h=>{const M=i(h);return Array.isArray(M)?JSON.stringify(M):""},A=(h,M)=>{try{const G=JSON.parse(M);Array.isArray(G)&&N(h,G)}catch{}},B=(h,M,G,U)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&g.value){const x=D.value;o.updateTaskSourceArgument(x,g.value,t.value.id,h,M),o.updateTaskSourceArgument(x,g.value,t.value.id,G,U);return}const n={...t.value.data.arguments||{},[h]:M,[G]:U};o.updateNodeData(t.value.id,{arguments:n})},$=async h=>{if(!t.value||!h)return;const M=f.value.find(n=>n.title===h);if(!M)return;let G=M.inputSchema||M.input_schema||{};if(h==="other"){const n={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};G={...G,properties:{...G.properties,...n.properties}}}const U={};G.properties&&Object.entries(G.properties).forEach(([n,x])=>{x.default!==void 0&&(U[n]=x.default)});const Z=t.value.data,R={...U,target_class:M.title};o.updateNodeData(t.value.id,{...Z,targetId:M.title,targetName:M.label,label:M.label,input_schema:G,inputSchema:G,extraConfig:M.extraConfig,arguments:R})},W=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,h=>{if(!h||!t.value)return;const M=f.value.find(Z=>Z.title===h);if(!M)return;const G=t.value.data;if(G.input_schema&&Object.keys(G.input_schema).length>0)return;const U={...M.defaultArguments,...G.arguments,target_class:M.title};o.updateNodeData(t.value.id,{...G,input_schema:M.inputSchema,arguments:U})}),(h,M)=>{const G=e.resolveComponent("el-button"),U=e.resolveComponent("el-divider"),Z=e.resolveComponent("el-option"),R=e.resolveComponent("el-select"),n=e.resolveComponent("el-form-item"),x=e.resolveComponent("el-form"),j=e.resolveComponent("el-radio"),Y=e.resolveComponent("el-radio-group"),z=e.resolveComponent("el-icon"),X=e.resolveComponent("el-tooltip"),te=e.resolveComponent("el-input"),ae=e.resolveComponent("el-switch"),pe=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",$a,[M[2]||(M[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(G,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:W},null,8,["icon"]))]),e.createVNode(U),e.createElementVNode("div",Fa,[M[3]||(M[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(n,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":t.value?.data.targetId,disabled:_.value,onChange:$,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(F),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f),O=>(e.openBlock(),e.createBlock(Z,{key:O.title,label:O.label,value:O.title},{default:e.withCtx(()=>[e.createElementVNode("div",qa,[e.createElementVNode("span",null,e.toDisplayString(O.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),I.value?(e.openBlock(),e.createElementBlock("div",Ga,[M[6]||(M[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(n,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:M[0]||(M[0]=O=>N("configMode",O))},{default:e.withCtx(()=>[e.createVNode(j,{value:"unified"},{default:e.withCtx(()=>[...M[4]||(M[4]=[e.createTextVNode("所有设备统一配置",-1)])]),_:1}),e.createVNode(j,{value:"perDevice"},{default:e.withCtx(()=>[...M[5]||(M[5]=[e.createTextVNode("单设备分别配置",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),p.value.length>0?(e.openBlock(),e.createElementBlock("div",Ha,[M[7]||(M[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(p.value,O=>(e.openBlock(),e.createBlock(n,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.description?(e.openBlock(),e.createBlock(X,{key:0,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Be,{"primary-field":O,"paired-field":c(O),"primary-value":i(O.key),"paired-value":i(O["x-paired-with"]),onUpdate:(Q,re)=>B(O.key,Q,O["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",ja,[M[9]||(M[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&H.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(te,{modelValue:T.value,"onUpdate:modelValue":M[1]||(M[1]=O=>T.value=O),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(z,null,{default:e.withCtx(()=>[e.createVNode(e.unref(K.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Pa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(S.value,O=>(e.openBlock(),e.createElementBlock("div",{key:String(O.sourceId??O.id??O),class:e.normalizeClass(["device-list-item",{"is-active":g.value===String(O.sourceId??O.id??O),"has-custom":r.value[String(O.sourceId??O.id??O)]}]),onClick:Q=>g.value=String(O.sourceId??O.id??O)},[e.createElementVNode("span",Ua,e.toDisplayString(O.sourceName??O.name??String(O.sourceId??O.id??O)),1),r.value[String(O.sourceId??O.id??O)]?(e.openBlock(),e.createBlock(X,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...M[8]||(M[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,za))),128)),S.value.length===0?(e.openBlock(),e.createElementBlock("div",Wa," 无匹配设备 ")):e.createCommentVNode("",!0)]),g.value?(e.openBlock(),e.createBlock(x,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,O=>e.withDirectives((e.openBlock(),e.createBlock(n,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(X,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(X,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":i(O.key),onChange:Q=>N(O.key,Q),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(Q,re)=>(e.openBlock(),e.createBlock(Z,{key:Q,label:O.optionLabels?O.optionLabels[re]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ae,{key:1,"model-value":i(O.key),onChange:Q=>N(O.key,Q)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":i(O.key),onChange:Q=>N(O.key,Q),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):w(O)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":O,"paired-field":c(O),"primary-value":i(O.key),"paired-value":i(O["x-paired-with"]),onUpdate:(Q,re)=>B(O.key,Q,O["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Ja,[e.createVNode(te,{"model-value":J(O.key),onChange:Q=>A(O.key,Q),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(R,{key:5,"model-value":i(O.key),onChange:Q=>N(O.key,Q),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(Q,re)=>(e.openBlock(),e.createBlock(Z,{key:Q,label:O.optionLabels?O.optionLabels[re]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":i(O.key),onInput:Q=>N(O.key,Q),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||E(O)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(x,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,O=>e.withDirectives((e.openBlock(),e.createBlock(n,{key:O.key,required:O.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(O.label),1),O.key==="x_ratio"||O.key==="y_ratio"?(e.openBlock(),e.createBlock(X,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})):O.description?(e.openBlock(),e.createBlock(X,{key:1,content:O.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[O.options&&O.type==="string"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":i(O.key),onChange:Q=>N(O.key,Q),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(Q,re)=>(e.openBlock(),e.createBlock(Z,{key:Q,label:O.optionLabels?O.optionLabels[re]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):O.type==="boolean"?(e.openBlock(),e.createBlock(ae,{key:1,"model-value":i(O.key),onChange:Q=>N(O.key,Q)},null,8,["model-value","onChange"])):O.type==="number"||O.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":i(O.key),onChange:Q=>N(O.key,Q),min:O.min,max:O.max,step:O.step||(O.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):w(O)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":O,"paired-field":c(O),"primary-value":i(O.key),"paired-value":i(O["x-paired-with"]),onUpdate:(Q,re)=>B(O.key,Q,O["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):O.type==="array"&&!O.options?(e.openBlock(),e.createElementBlock("div",Ya,[e.createVNode(te,{"model-value":J(O.key),onChange:Q=>A(O.key,Q),type:"textarea",rows:3,placeholder:O.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):O.type==="array"&&O.options?(e.openBlock(),e.createBlock(R,{key:5,"model-value":i(O.key),onChange:Q=>N(O.key,Q),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(O.options,(Q,re)=>(e.openBlock(),e.createBlock(Z,{key:Q,label:O.optionLabels?O.optionLabels[re]:Q,value:Q},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":i(O.key),onInput:Q=>N(O.key,Q),maxlength:O.maxLength,"show-word-limit":!!O.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!O.dependsOn||E(O)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-d53c8063"]]),Qa={class:"config-header"},Ka={class:"config-section"},Za={key:0,style:{"margin-bottom":"8px"}},va=ne({__name:"TargetCountConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=I=>{if(!t.value)return;const g={...t.value.data.arguments,conditionRelation:I};o.updateNodeData(t.value.id,{arguments:g})},k=()=>{if(!t.value)return;const g=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],T={...t.value.data.arguments,alertConditions:g};o.updateNodeData(t.value.id,{arguments:T})},V=(I,g,T)=>{if(!t.value)return;const S=[...t.value.data.arguments?.alertConditions||[]];S[I]={...S[I],[g]:T};const r={...t.value.data.arguments,alertConditions:S};o.updateNodeData(t.value.id,{arguments:r})},D=I=>{if(!t.value)return;const g=[...t.value.data.arguments?.alertConditions||[]];g.splice(I,1);const T={...t.value.data.arguments,alertConditions:g};o.updateNodeData(t.value.id,{arguments:T})},H=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(I,g)=>{const T=e.resolveComponent("el-button"),S=e.resolveComponent("el-divider"),r=e.resolveComponent("el-text"),y=e.resolveComponent("el-option"),s=e.resolveComponent("el-select"),L=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-radio"),f=e.resolveComponent("el-radio-group"),F=e.resolveComponent("el-form-item"),u=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Qa,[g[1]||(g[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(T,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:H},null,8,["icon"]))]),e.createVNode(S),e.createElementVNode("div",Ka,[g[9]||(g[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(u,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(F,null,{label:e.withCtx(()=>[g[3]||(g[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(r,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...g[2]||(g[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(r,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...g[4]||(g[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(w,c)=>(e.openBlock(),e.createElementBlock("div",{key:c,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(s,{"model-value":w.operator,onChange:b=>V(c,"operator",b),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(y,{label:"等于 =",value:"="}),e.createVNode(y,{label:"大于 >",value:">"}),e.createVNode(y,{label:"小于 <",value:"<"}),e.createVNode(y,{label:"大于等于 ≥",value:">="}),e.createVNode(y,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(L,{"model-value":w.value,onChange:b=>V(c,"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(T,{key:0,type:"danger",icon:e.unref(K.Delete),circle:"",size:"small",onClick:b=>D(c)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",Za,[e.createVNode(r,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...g[5]||(g[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(f,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:g[0]||(g[0]=w=>l(w))},{default:e.withCtx(()=>[e.createVNode(P,{value:"OR"},{default:e.withCtx(()=>[...g[6]||(g[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(P,{value:"AND"},{default:e.withCtx(()=>[...g[7]||(g[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(T,{type:"text",link:"",icon:e.unref(K.Plus),onClick:k},{default:e.withCtx(()=>[...g[8]||(g[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),el={class:"config-header"},tl={class:"config-section"},ol={style:{display:"flex","align-items":"center",gap:"8px"}},nl={style:{display:"flex","align-items":"center",gap:"8px"}},al={style:{display:"flex","align-items":"center",gap:"8px"}},ll=ne({__name:"TimerTargetConfig",setup(a){const o=le(),t=e.computed(()=>o.selectedNode),d=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>d===oe.TASK),l=y=>{if(!t.value)return;const s={...t.value.data.arguments,duration:y};o.updateNodeData(t.value.id,{arguments:s})},k=y=>{if(!t.value)return;const s={...t.value.data.arguments,similarity_enabled:y};o.updateNodeData(t.value.id,{arguments:s})},V=y=>{if(!t.value)return;const s={...t.value.data.arguments,similarity_threshold:y};o.updateNodeData(t.value.id,{arguments:s})},D=y=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_enabled:y};o.updateNodeData(t.value.id,{arguments:s})},H=y=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_operator:y};o.updateNodeData(t.value.id,{arguments:s})},I=y=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_threshold:y};o.updateNodeData(t.value.id,{arguments:s})},g=y=>{if(!t.value)return;const s=t.value.data.arguments?.overlap_detection||{},L={...t.value.data.arguments,overlap_detection:{operator:s.operator??"gt",threshold:s.threshold??90,...s,enabled:y}};o.updateNodeData(t.value.id,{arguments:L})},T=y=>{if(!t.value)return;const s={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:y}};o.updateNodeData(t.value.id,{arguments:s})},S=y=>{if(!t.value)return;const s={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:y}};o.updateNodeData(t.value.id,{arguments:s})},r=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(y,s)=>{const L=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),F=e.resolveComponent("el-text"),u=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-switch"),c=e.resolveComponent("el-icon"),b=e.resolveComponent("el-tooltip"),q=e.resolveComponent("el-slider"),m=e.resolveComponent("el-option"),p=e.resolveComponent("el-select"),i=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",el,[s[9]||(s[9]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(K.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",tl,[s[13]||(s[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(u,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.duration??30,onChange:s[0]||(s[0]=N=>l(N)),min:1,max:3600,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(F,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...s[10]||(s[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(u,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",ol,[e.createVNode(w,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:s[1]||(s[1]=N=>k(N))},null,8,["model-value"]),e.createVNode(b,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(u,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:s[2]||(s[2]=N=>V(N)),min:0,max:100,step:1,"show-input":"","show-input-controls":!1},null,8,["model-value"]),e.createVNode(F,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...s[11]||(s[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(u,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",nl,[e.createVNode(w,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:s[3]||(s[3]=N=>D(N))},null,8,["model-value"]),e.createVNode(b,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(u,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:s[4]||(s[4]=N=>H(N)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"大于 >",value:"gt"}),e.createVNode(m,{label:"大于等于 >=",value:"gte"}),e.createVNode(m,{label:"等于 =",value:"eq"}),e.createVNode(m,{label:"小于等于 <=",value:"lte"}),e.createVNode(m,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(u,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:s[5]||(s[5]=N=>I(N)),min:2,max:1e3,precision:0,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"]),e.createVNode(F,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...s[12]||(s[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(u,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",al,[e.createVNode(w,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:s[6]||(s[6]=N=>g(N))},null,8,["model-value"]),e.createVNode(b,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(c,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(K.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(u,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:s[7]||(s[7]=N=>T(N)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(m,{label:"大于 >",value:"gt"}),e.createVNode(m,{label:"等于 =",value:"eq"}),e.createVNode(m,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(u,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:s[8]||(s[8]=N=>S(N)),min:0,max:100,precision:2,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-2969d123"]]),rl={class:"node-config-panel"},sl={class:"config-content"},il=ne({__name:"NodeConfigPanel",setup(a){const o=le(),t={edge:on,group:an,start:Sn,end:Mn,classificationModel:Hn,ocr:zn,licensePlate:Jn,face:Ye,stream:ta,dataSource:da,smallModel:Oa,detectionTarget:Xa,targetCount:va,timerTarget:ll,faceRecognition:Ye},d=e.computed(()=>{const _=o.selectedEdge;if(_)return o.nodes.find(V=>V.id===_.source)?.data?.enableBranch&&t.edge||null;const l=o.selectedNode;return l&&t[l.type]||null});return(_,l)=>(e.openBlock(),e.createElementBlock("div",rl,[e.createElementVNode("div",sl,[d.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(d.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),cl={class:"workflow-editor",id:"workflow-editor"},dl={class:"editor-content"},ml={__name:"WorkflowEditor",props:{mode:{type:String,default:oe.ALGORITHM,validator:a=>Object.values(oe).includes(a)},pageMode:{type:String,default:Ne.CREATE,validator:a=>Object.values(Ne).includes(a)},taskModeConfig:{type:Object,default:()=>null},algorithmModeConfig:{type:Object,default:()=>null},echoAlgodata:{type:Object,default:()=>null},echoTaskData:{type:Object,default:()=>null}},setup(a,{expose:o}){const t=a,d=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",d),e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig)),e.provide("selectedDevicesMap",e.ref({}));const _=e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig);e.provide("editorConfig",_),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const l=le(d),{copyToClipboard:k,downloadJSON:V,exportToJSON:D}=Ct(t.mode,l,_),{runValidation:H}=bt(t.mode,l,e.computed(()=>t.taskModeConfig));e.onUnmounted(()=>{rt(d)});const I=e.computed(()=>{if(l.selectedNodeId)return!0;const T=l.selectedEdge;return T?!!l.nodes.find(r=>r.id===T.source)?.data?.enableBranch:!1});return o({reset:()=>{l.resetWorkflow()},runTest:H,copyJSON:k,exportJSON:D}),(T,S)=>(e.openBlock(),e.createElementBlock("div",cl,[e.createElementVNode("div",dl,[e.createVNode(Vt),e.createVNode(Zo),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[I.value?(e.openBlock(),e.createBlock(il,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Qe=ne(ml,[["__scopeId","data-v-5e761567"]]),pl={Box:K.Box,CircleCheck:K.CircleCheck,CircleClose:K.CircleClose,Close:K.Close,CopyDocument:K.CopyDocument,Cpu:K.Cpu,DArrowLeft:K.DArrowLeft,DataAnalysis:K.DataAnalysis,Delete:K.Delete,Document:K.Document,Download:K.Download,FolderOpened:K.FolderOpened,Grid:K.Grid,Loading:K.Loading,Plus:K.Plus,QuestionFilled:K.QuestionFilled,RefreshLeft:K.RefreshLeft,Search:K.Search,Timer:K.Timer,Upload:K.Upload,User:K.User,View:K.View,VideoPlay:K.VideoPlay,Warning:K.Warning},Ke=a=>{Object.entries(pl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Qe)},ul={install:Ke};se.EditorMode=oe,se.NodeType=C,se.PageMode=Ne,se.WorkflowEditor=Qe,se.default=ul,se.install=Ke,Object.defineProperties(se,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
1
|
+
(function(se,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@element-plus/icons-vue"),require("element-plus"),require("pinia"),require("@vue-flow/core"),require("@vue-flow/background"),require("@vue-flow/controls"),require("@vue-flow/node-resizer")):typeof define=="function"&&define.amd?define(["exports","vue","@element-plus/icons-vue","element-plus","pinia","@vue-flow/core","@vue-flow/background","@vue-flow/controls","@vue-flow/node-resizer"],e):(se=typeof globalThis<"u"?globalThis:se||self,e(se.AIFlowUI={},se.Vue,se.ElementPlusIconsVue,se.ElementPlus,se.Pinia,se.VueFlowCore,se.VueFlowBackground,se.VueFlowControls,se.VueFlowNodeResizer))})(this,(function(se,e,Q,v,et,ee,tt,ot,nt){"use strict";const b={START:"start",END:"end",DATA_SOURCE:"dataSource",SMALL_MODEL:"smallModel",DETECTION_TARGET:"detectionTarget",CLASSIFICATION_MODEL:"classificationModel",OCR:"ocr",LICENSE_PLATE:"licensePlate",TARGET_COUNT:"targetCount",TIMER_TARGET:"timerTarget",FACE_RECOGNITION:"faceRecognition"},de={IMAGE_BRANCH:"imageBranch",SMALL_MODEL:"smallModel",SMALL_MODEL_BRANCH:"smallModelBranch"},at={[b.DETECTION_TARGET]:"检测目标",[b.CLASSIFICATION_MODEL]:"分类模型",[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时",[b.FACE_RECOGNITION]:"人脸识别",[b.SMALL_MODEL]:"小模型"},lt={cls:b.CLASSIFICATION_MODEL,ocr:b.OCR,license_plate:b.LICENSE_PLATE,target_count:b.TARGET_COUNT,timer_target:b.TIMER_TARGET,face:b.FACE_RECOGNITION,face_recognition:b.FACE_RECOGNITION},oe={ALGORITHM:"algorithm",TASK:"task"},Ne={CREATE:"create",EDIT:"edit",DETAIL:"detail"},me=a=>`${a}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,Ae=a=>({id:me("start"),type:"start",position:a,data:{label:"开始",algorithmName:"",enableBranch:!0,branchLogic:"and",groupWindowSeconds:5,taskName:"",streamType:"image",enableAlertVideo:!1,executionTime:"",schedule:[]}}),Ee=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}}}),we=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"}}),De=(a,o="默认模型")=>({id:me("smallModel"),type:"smallModel",position:a,data:{label:"小模型",modelName:o,modelId:null,input_schema:{},arguments:{}}}),Le=(a,o="检测目标")=>({id:me("detectionTarget"),type:"detectionTarget",position:a,data:{label:"检测目标",targetName:o,targetId:null,input_schema:{},arguments:{}}}),Me=(a,o="分类模型")=>({id:me("classificationModel"),type:"classificationModel",position:a,data:{label:"分类模型",modelName:o,input_schema:{},arguments:{}}}),Oe=a=>({id:me("ocr"),type:"ocr",position:a,data:{label:"OCR识别",input_schema:{},arguments:{}}}),Ie=a=>({id:me("licensePlate"),type:"licensePlate",position:a,data:{label:"车牌识别",input_schema:{},arguments:{}}}),Re=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"}}}}),$e=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:{}}}),rt=(a,o={width:300,height:160},t="and",c=null)=>({id:me("group"),type:"group",position:a,style:{width:`${o.width}px`,height:`${o.height}px`},data:{label:"并行组",branchLogic:t,sourceNodeId:c},selectable:!0,deletable:!1,zIndex:-1}),Fe=a=>({id:me("faceRecognition"),type:"faceRecognition",position:a,data:{label:"人脸识别",input_schema:{},arguments:{}}}),ye=new Map,qe=()=>{const a=Ae({x:80,y:300}),o=we({x:320,y:300}),t=Ee({x:1e3,y:300}),c={id:`e_${a.id}_${o.id}`,source:a.id,target:o.id,data:{branchOrder:1}};return{nodes:[a,o,t],edges:[c]}},st=a=>et.defineStore(`aiflow-workflow-${a}`,()=>{const o=qe(),t=e.ref(o.nodes),c=e.ref(o.edges),_=e.ref(null),l=e.ref(null),C=e.ref(new Set),T=e.ref(new Set),D=e.ref({}),G=(R,n,x,j)=>{D.value[R]||(D.value[R]={}),D.value[R][n]||(D.value[R][n]={}),D.value[R][n][x]={...j}},M=(R,n,x,j,Y)=>{D.value[R]||(D.value[R]={}),D.value[R][n]||(D.value[R][n]={}),D.value[R][n][x]||(D.value[R][n][x]={}),D.value[R][n][x][j]=Y},y=(R,n,x)=>D.value[R]?.[n]?.[x]??null,S=()=>{D.value={}},V=e.computed(()=>_.value?t.value.find(R=>R.id===_.value):null),r=e.computed(()=>l.value?c.value.find(R=>R.id===l.value):null),N=R=>t.value.filter(n=>n.type===R).length,s=()=>{const R=t.value.filter(n=>n.type===b.DATA_SOURCE);R.length!==0&&(R.length===1?R[0].data.label="数据源":R.forEach((n,x)=>{n.data.label=`数据源 ${x+1}`}))},L=()=>t.value.filter(R=>R.type===b.DATA_SOURCE).length,P=()=>t.value.filter(n=>n.type===b.DATA_SOURCE).some(n=>n.data.arguments?.needCooperativeDetection===!0),f=()=>{const R=L(),n=P();return!(R>1||n)},q=R=>{t.value.push(R),R.type===b.DATA_SOURCE&&s()},p=R=>{const n=t.value.find(j=>j.id===R),x=n?.type===b.DATA_SOURCE;if(n?.type==="group"){k(R),c.value=c.value.filter(j=>j.source!==R&&j.target!==R),_.value===R&&(_.value=null);return}t.value=t.value.filter(j=>j.id!==R),c.value=c.value.filter(j=>j.source!==R&&j.target!==R),_.value===R&&(_.value=null),x&&s()},w=(R,n)=>{const x=t.value.find(j=>j.id===R);x&&(x.data={...x.data,...n})},g=(R,n)=>{const x=t.value.find(j=>j.id===R);x&&(x.position=n)},u=R=>{const n=t.value.find(x=>x.id===R.source);if(n&&(n.type===b.START||n.type===b.DATA_SOURCE)&&n.data?.enableBranch===!0){const j=c.value.filter(Y=>Y.source===R.source).length+1;R={...R,data:{...R.data,branchOrder:j}}}c.value=ee.addEdge(R,c.value)},$=R=>{const n=c.value.find(x=>x.id===R);if(c.value=c.value.filter(x=>x.id!==R),l.value===R&&(l.value=null),n&&n.data?.branchOrder!==void 0){const x=t.value.find(j=>j.id===n.source);x&&(x.type===b.START||x.type===b.DATA_SOURCE)&&c.value.filter(Y=>Y.source===n.source).sort((Y,z)=>(Y.data?.branchOrder||0)-(z.data?.branchOrder||0)).forEach((Y,z)=>{Y.data?Y.data.branchOrder=z+1:Y.data={branchOrder:z+1}})}},d=(R,n="and",x=null)=>{const j=rt(R,{width:300,height:160},n,x);return t.value.unshift(j),j.id},m=(R,n)=>{const x=t.value.find(z=>z.id===R),j=t.value.find(z=>z.id===n);if(!x||!j||x.parentNode===n)return;x.parentNode&&i(R);const Y=t.value.find(z=>z.id===R);Y&&(t.value=t.value.map(z=>z.id!==R?z:{...z,position:{x:Y.position.x-j.position.x,y:Y.position.y-j.position.y},parentNode:n,extent:"parent"}))},i=R=>{const n=t.value.find(z=>z.id===R);if(!n||!n.parentNode)return;const x=t.value.find(z=>z.id===n.parentNode),j=x?n.position.x+x.position.x:n.position.x,Y=x?n.position.y+x.position.y:n.position.y;t.value=t.value.map(z=>{if(z.id!==R)return z;const X={...z,position:{x:j,y:Y}};return delete X.parentNode,delete X.extent,X})},k=R=>{const n=t.value.find(x=>x.id===R);n&&(t.value=t.value.filter(x=>x.id!==R).map(x=>{if(x.parentNode!==R)return x;const j={...x,position:{x:x.position.x+n.position.x,y:x.position.y+n.position.y}};return delete j.parentNode,delete j.extent,j}))};return{nodes:t,edges:c,selectedNodeId:_,selectedEdgeId:l,invalidNodeIds:C,invalidEdgeIds:T,selectedNode:V,selectedEdge:r,getNodeCountByType:N,getDataSourceCount:L,hasCooperativeDetection:P,supportPatrol:f,addNode:q,removeNode:p,updateNodeData:w,updateNodePosition:g,addConnection:u,removeEdge:$,updateEdgeData:(R,n)=>{const x=c.value.find(j=>j.id===R);if(x){if(n.branchOrder!==void 0){const j=t.value.find(Y=>Y.id===x.source);if(j&&(j.type===b.START||j.type===b.DATA_SOURCE)){const Y=x.data?.branchOrder,z=n.branchOrder;if(Y!==z&&z!==null){const te=c.value.filter(le=>le.source===x.source&&le.id!==R).find(le=>le.data?.branchOrder===z);te&&(te.data?te.data.branchOrder=Y:te.data={branchOrder:Y})}}}x.data={...x.data,...n}}},selectNode:R=>{_.value=R,l.value=null},selectEdge:R=>{l.value=R,_.value=null},clearSelection:()=>{_.value=null,l.value=null},resetWorkflow:()=>{const R=qe();t.value=R.nodes,c.value=R.edges,_.value=null,l.value=null,S()},loadWorkflow:(R,n)=>{t.value=R,c.value=n,_.value=null,l.value=null,S()},refreshDataSourceLabels:s,createEmptyGroup:d,addNodeToGroup:m,removeNodeFromGroup:i,dissolveParallelGroup:k,initializeSubsequentFrames:R=>{t.value.find(x=>x.id===R)&&w(R,{subsequentFrames:[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]})},addSubsequentFrame:(R,n)=>{const x=t.value.find(j=>j.id===R);!x||x.type!=="dataSource"||(x.data.subsequentFrames||(x.data.subsequentFrames=[]),x.data.subsequentFrames.push(n),w(R,{subsequentFrames:[...x.data.subsequentFrames]}))},removeSubsequentFrame:(R,n)=>{const x=t.value.find(z=>z.id===R);if(!x||x.type!=="dataSource")return;const j=x.data.subsequentFrames.find(z=>z.id===n);j&&c.value.filter(X=>X.source===R&&X.sourceHandle===j.handleId).forEach(X=>$(X.id));const Y=x.data.subsequentFrames.filter(z=>z.id!==n);Y.forEach((z,X)=>{z.id==="default-subsequent"?z.label="后续帧检测":z.label=`后续帧检测${X+1}`}),w(R,{subsequentFrames:Y})},setInvalidIds:(R,n)=>{C.value=new Set(R),T.value=new Set(n)},clearInvalidIds:()=>{C.value=new Set,T.value=new Set},taskSources:D,setTaskSourceArguments:G,updateTaskSourceArgument:M,getTaskSourceArguments:y,clearTaskSources:S}}),ae=(a=null)=>{const o=a??e.inject("workflowInstanceId","default");return ye.has(o)||ye.set(o,st(o)),ye.get(o)()},it=a=>{if(ye.has(a)){try{ye.get(a)().$dispose()}catch{}ye.delete(a)}},Ge=(a,o,t)=>{const c=[],_=[],l=a.filter(s=>s.type!=="group"),C=l.filter(s=>s.type===b.START);C.length===0?c.push("工作流必须包含一个开始节点"):C.length>1&&c.push("工作流只能包含一个开始节点");const T=l.filter(s=>s.type===b.END);T.length===0?c.push("工作流必须包含一个结束节点"):T.length>1&&c.push("工作流只能包含一个结束节点");const D=l.filter(s=>s.type===b.DATA_SOURCE);D.length===0&&c.push("工作流必须至少包含一个数据源节点"),l.filter(s=>s.type===b.DETECTION_TARGET||s.type===b.SMALL_MODEL||s.type===b.CLASSIFICATION_MODEL).length===0&&c.push("工作流必须至少包含一个检测目标、内置小模型或分类模型"),l.some(s=>s.type===b.SMALL_MODEL),D.some(s=>s.data.arguments?.needCooperativeDetection===!0),D.length>1,l.forEach(s=>{const L=o.filter(f=>f.target===s.id),P=o.filter(f=>f.source===s.id);if(s.type===b.START&&L.length>0&&_.push("开始节点不应有输入连接"),s.type===b.END&&P.length>0&&_.push("结束节点不应有输出连接"),s.type===b.START&&P.length===0&&c.push("开始节点必须有输出连接"),s.type===b.END&&L.length===0&&c.push("结束节点必须有输入连接"),s.type===b.DATA_SOURCE&&s.data.enableImageSequence)if(P.length===0)c.push({nodeId:s.id,message:`数据源节点"${s.data.label}"开启了图片时序但未连接到任何处理节点`});else{const f=P.filter(g=>g.sourceHandle==="first-frame"),q=s.data.subsequentFrames||[],p=new Set(P.map(g=>g.sourceHandle)),w=q.filter(g=>!p.has(g.handleId));f.length===0&&_.push({nodeId:s.id,message:`数据源节点"${s.data.label}"的首帧检测未连接`}),w.length>0&&_.push({nodeId:s.id,message:`数据源节点"${s.data.label}"有${w.length}个后续帧未连接`})}s.type!==b.START&&s.type!==b.END&&!s.parentNode&&(L.length===0||P.length===0)&&_.push(`节点 "${s.data.label}" 可能未正确连接`)});const M=new Set;o.forEach(s=>{const L=a.find(P=>P.id===s.source);L?.type==="dataSource"&&L.data?.enableImageSequence===!0&&s.sourceHandle!=="first-frame"&&(!s.data?.timeWindowSeconds||s.data.timeWindowSeconds<1)&&c.push({edgeId:s.id,message:`分支"${s.data?.branchName||"未命名"}"缺少必填项:后续检测帧的持续时间`}),M.add(s.source),M.add(s.target)}),l.forEach(s=>{s.parentNode||!M.has(s.id)&&l.length>1&&_.push(`节点 "${s.data.label}" 未连接到工作流`)});const y=ct(l,o);c.push(...y);const S=mt(l,o);c.push(...S);const V=dt(l);c.push(...V);const r=pt(l,o);c.push(...r);const N=ut(l,o);return c.push(...N),t==="task"&&l.filter(L=>L.type===b.FACE_RECOGNITION).forEach(L=>{(!L.data.arguments?.repositoryId||Array.isArray(L.data.arguments.repositoryId)&&L.data.arguments.repositoryId.length===0)&&c.push({nodeId:L.id,message:`人脸识别节点"${L.data.label}"未选择人脸库,任务模式下人脸库为必选项`})}),{valid:c.length===0,errors:c,warnings:_}},ct=(a,o)=>{const t=[],c=a.find(C=>C.type===b.START);if(!c)return t;const _=new Set,l=(C,T,D,G)=>{if(T.includes(C))return;const M=a.find(N=>N.id===C);if(!M)return;const y=[...T,C];let S=[...D],V=[...G];if(M.type===b.TARGET_COUNT&&S.push(M),M.type===b.TIMER_TARGET&&V.push(M),M.type===b.END){const N=y.join("->");_.has(N)||(_.add(N),S.length>1&&t.push(`工作流分支中存在多个目标计数节点(${S.map(s=>`"${s.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),V.length>1&&t.push(`工作流分支中存在多个目标计时节点(${V.map(s=>`"${s.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`));return}const r=o.filter(N=>N.source===C);r.length===0?(S.length>1&&t.push(`工作流分支中存在多个目标计数节点(${S.map(N=>`"${N.data.label}"`).join("、")}),每条分支只允许一个目标计数节点`),V.length>1&&t.push(`工作流分支中存在多个目标计时节点(${V.map(N=>`"${N.data.label}"`).join("、")}),每条分支只允许一个目标计时节点`)):r.forEach(N=>{l(N.target,y,S,V)})};return l(c.id,[],[],[]),t},dt=a=>{const o=[],t=a.filter(_=>_.type===b.DATA_SOURCE),c=a.filter(_=>_.type===b.SMALL_MODEL);return c.length>0&&t.length>1&&c.forEach(_=>{o.push({nodeId:_.id,message:`小模型节点"${_.data.label||_.data.modelName}"不支持多数据源场景,请确保工作流中只有一个数据源节点`})}),o},mt=(a,o)=>{const t=[];return a.filter(_=>_.type===b.DATA_SOURCE).forEach(_=>{const l=o.filter(C=>C.source===_.id);if(l.length>1){const C=l.map(G=>G.target),D=a.filter(G=>C.includes(G.id)).filter(G=>G.type===b.SMALL_MODEL);if(D.length>0){const G=D.map(M=>`"${M.data.label||M.data.modelName}"`).join("、");t.push(`数据源节点"${_.data.label}"开启了多分支,不能包含小模型节点(${G})。小模型节点只能出现在单分支场景中(数据源只有一个直连下游节点)`)}}}),t},pt=(a,o)=>{const t=[],c=[b.TARGET_COUNT,b.TIMER_TARGET],_={[b.TARGET_COUNT]:"目标计数",[b.TIMER_TARGET]:"目标计时"};return a.filter(C=>C.type===b.SMALL_MODEL).forEach(C=>{o.filter(D=>D.source===C.id).forEach(D=>{const G=a.find(M=>M.id===D.target);if(G&&c.includes(G.type)){const M=_[G.type]||G.type;t.push(`小模型节点"${C.data.label||C.data.modelName}"不能直接连接${M}节点"${G.data.label}",请先连接检测目标节点`)}})}),t},ut=(a,o)=>{const t=[],c=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION],_={[b.OCR]:"OCR识别",[b.LICENSE_PLATE]:"车牌识别",[b.FACE_RECOGNITION]:"人脸识别"};return a.filter(C=>c.includes(C.type)).forEach(C=>{const T=o.filter(M=>M.source===C.id),D=c.filter(M=>M!==C.type).concat(b.END),G=C.data.label||_[C.type];T.forEach(M=>{const y=a.find(S=>S.id===M.target);y&&!D.includes(y.type)&&t.push(`${G}节点"${G}"只能连接除自身外的辅助节点或结束节点,当前连接到了"${y.data.label||y.type}"节点`)}),T.length===0&&t.push(`${G}节点"${G}"必须连接到其他辅助节点或结束节点`)}),t},He=a=>{const o=new Map;return a.forEach(t=>o.set(t.id,t)),o},ue=(a,o,t)=>(a[o]||[]).map(c=>t.get(c)).filter(Boolean),je=(a,o)=>{const t={},c=new Set(a.filter(l=>l.type==="group").map(l=>l.id));return[...o].sort((l,C)=>{const T=l.data?.branchOrder??1/0,D=C.data?.branchOrder??1/0;return T-D}).forEach(l=>{if(c.has(l.source)&&c.has(l.target))return;let C=l.source,T=l.target;if(c.has(C)){const D=o.find(G=>G.target===C&&!c.has(G.source));if(!D)return;C=D.source}if(c.has(T)){const D=o.find(G=>G.source===T&&!c.has(G.target));if(!D)return;T=D.target}t[C]||(t[C]=[]),t[C].includes(T)||t[C].push(T)}),t},Pe=(a,o)=>{const t=[...o.values()].find(C=>C.type===b.START);if(!t)return[];const c=new Set,_=[],l=C=>{if(c.has(C))return;c.add(C);const T=o.get(C);if(!T)return;T.type!==b.START&&T.type!==b.END&&T.type!=="group"&&_.push(T),(a[C]||[]).forEach(G=>l(G))};return l(t.id),_},ft=["detectionScope","description","detectionType","builtinTarget","universalTargetName","customModel","cloudModel","enableMultiFrame","continuousTime","lines","target_class"],be=(a,o,t,c)=>{const _=a.nodes.findIndex(C=>C.toolTitle===o);if(_===-1)return;const l=a.nodes[_];l.arguments?.[t]&&(a[c]=l.arguments[t]),a.nodes=a.nodes.filter((C,T)=>T!==_),a.nodes.forEach((C,T)=>{C.sortOrder=T+1})},gt=a=>{const o=a.alertConditions||[];return{targetCount:{logic:a.conditionRelation||"AND",rules:o.map(c=>({op:c.operator,value:c.value}))}}},ht=a=>{const o={op:">",value:a.duration??30,unit:"seconds"};if(a.hit_rate_enabled&&a.hit_rate_threshold!==void 0){const c={gt:">",gte:">=",eq:"=",lte:"<=",lt:"<"};o.hitCount={op:c[a.hit_rate_operator||"gte"]||">=",value:a.hit_rate_threshold}}const t=a.overlap_detection;if(t?.enabled&&t?.threshold!==void 0){const c=t.operator||"gt",_={gt:">",eq:"=",lt:"<"};o.overlap={op:_[c]||">",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}},yt={[b.TARGET_COUNT]:gt,[b.TIMER_TARGET]:ht},Ce=(a,o)=>{if(!a)return{};const t=yt[o];if(t)return t(a);const c={...a};return ft.forEach(_=>{delete c[_]}),Object.keys(c).forEach(_=>{const l=c[_];(l==null||l==="")&&delete c[_]}),o===b.FACE_RECOGNITION&&c.repositoryId!==void 0&&(Array.isArray(c.repositoryId)||(c.repositoryId=[c.repositoryId]),c.repositoryId.length===0&&delete c.repositoryId),c},_t=a=>{switch(a.type){case b.DETECTION_TARGET:return a.data.targetId||"";case b.CLASSIFICATION_MODEL:return"cls";case b.OCR:return"ocr";case b.LICENSE_PLATE:return"license_plate";case b.SMALL_MODEL:return a.data.title||a.data.modelName||"";case b.TARGET_COUNT:return"target_count";case b.TIMER_TARGET:return"timer_target";case b.FACE_RECOGNITION:return"face";default:return a.data.label||""}},Nt=(a,o,t,c,_=null)=>{const l={toolTitle:_t(a),nodeName:a.data.label||a.data.targetName||"",sortOrder:o,arguments:Ce(_??a.data.arguments,a.type)};if(a.data.enableBranch&&a.data.branchLogic&&(l.branchLogic=a.data.branchLogic),t){const C=c.find(T=>T.source===t&&T.target===a.id);C?.data?.branchOrder!==void 0&&C?.data?.branchOrder!==null&&(l.branchOrder=C.data.branchOrder)}return l},ze=(a,o,t,c,_,l=null,C=[])=>{const T=[],D=Array.isArray(a)?[...a]:[a],G=new Set;let M=1;for(;D.length>0;){const y=[...D];D.length=0;const S=[];y.forEach(V=>{if(G.has(V))return;G.add(V);const r=c.get(V);!r||r.type===b.END||r.type===b.START||r.type===b.DATA_SOURCE||((t[V]||[]).forEach(s=>{const L=c.get(s);L&&L.type!==b.END&&D.push(s)}),C.includes(r.type))||S.push(r)}),S.length>0&&(S.forEach(V=>{const r=l?.(V.id)??null,N=Nt(V,M,o,_,r);S.length>1&&(N.nodeLogic="or"),T.push(N)}),M++)}return T},Ct=(a=null,o=null)=>{const t=a??ae(),c=e.inject("editorMode",oe.ALGORITHM);e.inject("pageMode",Ne.CREATE);const _=o??e.inject("editorConfig",null),l=e.computed(()=>Ge(t.nodes,t.edges,c)),C=(d,m,i,k)=>{if(i){const E=ue(d,i.id,m).find(J=>J.type===b.SMALL_MODEL);if(E)return E}return k.find(E=>E.type===b.SMALL_MODEL)||null},T=(d,m,i)=>{const E=ue(m,d.id,i).find(A=>A.type===b.SMALL_MODEL);return E?ue(m,E.id,i).filter(A=>A.type!==b.END&&A.type!==b.START&&A.type!==b.DATA_SOURCE).length>0?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH},D=(d,m,i,k,E)=>{if(m===de.SMALL_MODEL||m===de.SMALL_MODEL_BRANCH){const A=C(k,E,i,d);return A?{toolTitle:A.data.title||A.data.modelName||"",toolType:"small",arguments:Ce(A.data.arguments,b.SMALL_MODEL)}:null}const J=d.find(A=>A.type===b.DETECTION_TARGET);return J?{toolTitle:J.data.targetId||"",toolType:"stream",decoder:{swDecoding:!1,mode:0,interval:0},arguments:Ce(J.data.arguments,b.DETECTION_TARGET)}:null},G=()=>{const d=t.nodes.find(k=>k.type===b.END);if(!d||!d.data.arguments)return{};const m=d.data.arguments,i={};return m.reportFrequency==="interval"&&m.reportInterval&&(i.interval={value:m.reportInterval}),m.enableDeduplication&&m.similarityThreshold!==void 0&&(i.dedup={value:m.similarityThreshold}),i},M=d=>{if(d.length<=1)return;const m=d.map(k=>k.sortOrder);if(new Set(m).size!==m.length){const k=m.filter((E,J)=>m.indexOf(E)!==J);throw new Error(`分支执行顺序存在重复:${[...new Set(k)].join(", ")}。请在配置面板中修改分支边的执行顺序,确保每个分支的执行顺序唯一。`)}},y=(d,m,i,k,E)=>{let J=[],A;if(d===de.IMAGE_BRANCH)m&&(J=ue(k,m.id,E).filter(B=>B.type!==b.END)),A=m?.id||i.find(B=>B.type===b.DATA_SOURCE)?.id;else if(d===de.SMALL_MODEL_BRANCH){const B=C(k,E,m,i);B&&(J=ue(k,B.id,E).filter(F=>F.type!==b.END),A=B.id)}return{branchStartNodes:J,sourceNodeId:A}},S=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]),V=(d,m,i)=>{const k=new Set,E=[],J=A=>{if(k.has(A))return;k.add(A);const B=i.get(A);if(!B||B.type===b.END)return;S.has(B.type)&&E.push(B),(m[A]||[]).forEach(W=>J(W))};return J(d),E.length>0?E[E.length-1]:null},r=(d,m,i,k,E)=>{const J=`分支${E+1}`,A=V(m,i,k);if(!A)return d?.data?.nodeName||J;if(A.type===b.DETECTION_TARGET&&A.data?.targetId==="other"){const F=A.data?.arguments?.object;if(Array.isArray(F)&&F.length>0){const W=F.join(",");return W.length>32?W.slice(0,32):W}}if(A.type===b.CLASSIFICATION_MODEL){const F=A.data?.arguments?.modelName||A.data?.label;if(!F)return J;const W=A.data?.arguments?.resultNegate?"(取反)":"";return F+W}return A.data?.label||A.data?.targetName||J},N=(d,m,i,k,E,J)=>{const{branchStartNodes:A,sourceNodeId:B}=y(m,i,d,k,E);if(A.length===0)return[];const F=[];return A.forEach((W,h)=>{const O=ze([W.id],B,k,E,J);if(O.length===0)return;const H=B?J.find(n=>n.source===B&&n.target===W.id):null,U=H?.data||{},Z=U.branchOrder!==void 0&&U.branchOrder!==null?U.branchOrder:h+1,R={branchName:U.branchName||r(W,W.id,k,E,h),sortOrder:Z,nodes:O};H?.sourceHandle&&(R.sourceHandle=H.sourceHandle),be(R,"target_count","targetCount","targetCount"),be(R,"timer_target","duration","duration"),U.timeWindowSeconds!==void 0&&U.timeWindowSeconds!==null&&(R.timeWindowSeconds=U.timeWindowSeconds),U.branchDescription&&(R.description=U.branchDescription),F.push(R)}),M(F),F},s=()=>{const d=l.value;if(d.errors.length>0){const m=d.errors.map(i=>typeof i=="object"?i.message:i);return v.ElMessage.error(`验证失败: ${m.join(", ")}`),!1}return d.warnings.length>0&&v.ElMessage.warning(`警告: ${d.warnings.join(", ")}`),!0},L=()=>{const d=t.nodes,m=t.edges,i=He(d),k=je(d,m),E=Pe(k,i),J=[...i.values()].find(A=>A.type===b.START);return{allNodes:d,edges:m,nodeMap:i,adj:k,orderedNodes:E,startNode:J}},P=d=>{const m={ruleName:d?.data?.algorithmName||"",description:"",webhookUrl:""},i=G();Object.keys(i).length>0&&(m.extraConfig=i);const E=(_?.value??_)?.platform;return m.attach=E?{platform:E}:{},m},f=(d,m)=>{const i=d.filter(k=>k.type===b.DATA_SOURCE);if(i.length===0){const k=m.find(E=>E.type===b.DATA_SOURCE);k&&i.push(k)}return i},q=d=>d?.data?.enableImageSequence||d?.data?.arguments?.enableImageSequence||!1?"order":d?.data?.enableBranch&&d.data.branchLogic||"and",p=(d,m,i,k)=>{const{orderedNodes:E,adj:J,nodeMap:A,edges:B}=m,F=T(d,J,A),W=!!d.data.arguments?.needCooperativeDetection,h=B.find(R=>R.target===d.id),O=h?.data?.branchOrder!==void 0&&h?.data?.branchOrder!==null?h.data.branchOrder:k+1,H={sourceGroupId:null,name:d.data.label||"数据源",sort:O,synEnabled:W};if(W&&(H.windowSeconds=d.data.arguments?.windowSeconds||5),F===de.SMALL_MODEL){const R=D(E,F,d,J,A);return R&&(H.streamConfig=R),H.logic="and",H.children=[],H}if(F===de.SMALL_MODEL_BRANCH){const R=D(E,F,d,J,A);R&&(H.streamConfig=R)}H.logic=q(d);const U=N(E,F,d,J,A,B),Z=i.length;return H.children=U.map((R,n)=>({name:R.branchName,branchRefs:[Z+n]})),i.push(...U),H},w=(d,m)=>{const k={groupLogic:d?.data?.enableBranch&&d.data.branchLogic||"and",sourceGroups:m};return m.length>=2&&(k.groupWindowSeconds=d.data.groupWindowSeconds),k},g=()=>{if(!s())return null;try{const d=L(),m=P(d.startNode),i=f(d.orderedNodes,d.allNodes),k=[],E=i.map((J,A)=>p(J,d,k,A));return m.ruleSchema=w(d.startNode,E),k.length>0&&(m.branches=k),{name:m.ruleName,description:m.description,graph:m}}catch(d){return v.ElMessage.error(d.message||"导出失败"),null}};return{validation:l,exportToJSON:g,copyToClipboard:()=>{try{const d=g();if(!d)return;const m=JSON.stringify(d,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(m).then(()=>{v.ElMessage.success("已复制到剪贴板")}).catch(()=>{v.ElMessage.error("复制失败")});else{const i=document.createElement("textarea");i.value=m,i.style.position="fixed",i.style.opacity="0",document.body.appendChild(i),i.select(),document.execCommand("copy"),document.body.removeChild(i),v.ElMessage.success("已复制到剪贴板")}}catch(d){console.error("复制JSON失败:",d),v.ElMessage.error(`复制失败: ${d.message}`)}},downloadJSON:()=>{const d=g();if(!d)return;const m=JSON.stringify(d,null,2),i=new Blob([m],{type:"application/json"}),k=URL.createObjectURL(i),E=document.createElement("a");E.href=k,E.download=`workflow_${Date.now()}.json`,E.click(),URL.revokeObjectURL(k),v.ElMessage.success("导出成功")}}},kt=(a=null,o=null)=>{const t=a??ae();e.inject("editorMode",oe.TASK),e.inject("pageMode",Ne.CREATE);const c=e.inject("editorConfig",null),_=e.inject("taskModeConfig",null),l=o??c,C=o??_,T=e.inject("echoTaskData",null),D=e.inject("selectedDevicesMap",null),G=e.computed(()=>({errors:[],warnings:[]})),M=(f,q)=>{const p={},w=q?.data?.arguments??{};w.reportFrequency==="interval"&&w.reportInterval&&(p.interval={value:w.reportInterval}),w.enableDeduplication&&w.similarityThreshold!==void 0&&(p.dedup={value:w.similarityThreshold}),t.nodes.filter($=>$.type===b.DATA_SOURCE).length>=2&&f?.data?.groupWindowSeconds!==void 0&&(p.groupWindowSeconds=f.data.groupWindowSeconds),p.enableVideo=!!f?.data?.enableAlertVideo;const u=f?.data?.schedule;return Array.isArray(u)&&u.length>0?p.schedule=u:p.schedule=[{dayType:"0",timePeriod:[{startTime:"00:00",endTime:"24:00"}]}],p},y=(f,q,p,w,g="image")=>{const u=ue(q,f.id,p).find($=>$.type===b.SMALL_MODEL);if(u){const $=f.data?.arguments??{};return{toolTitle:u.data.title||u.data.modelName||"",toolType:"small",arguments:Ce(u.data.arguments,b.SMALL_MODEL),decoder:S($,!0)}}if(g==="stream"){const $=w.find(m=>m.type===b.DETECTION_TARGET);if(!$)return null;const d=f.data?.arguments??{};return{toolTitle:$.data.targetId||"",toolType:"stream",arguments:Ce($.data.arguments,b.DETECTION_TARGET),decoder:S(d,!1)}}return null},S=(f,q)=>{const p=f.mode??(q?3:0),w=f.interval??0,g=f.sw_decoding??(q?"CPU":"GPU");let u=0,$=0;return q?p===3?(u=0,$=0):p===2?(u=1,$=0):p===1&&(u=0,$=w):p===0?(u=0,$=w*25):p===1?(u=0,$=w):p===2&&(u=1,$=0),{sw_decoding:g==="CPU",mode:u,interval:$}},V=(f,q,p,w,g=null)=>{let u=f.id,$=ue(q,f.id,p).filter(i=>i.type!==b.END&&i.type!==b.START);$.length===1&&$[0].type===b.SMALL_MODEL&&(u=$[0].id,$=ue(q,u,p).filter(i=>i.type!==b.END&&i.type!==b.START));const d=$;if(d.length===0)return[];const m=g?i=>t.getTaskSourceArguments(f.id,g,i):null;return d.map((i,k)=>{const E=ze([i.id],u,q,p,w,m,[b.SMALL_MODEL]),J=w.find(h=>h.source===u&&h.target===i.id),A=J?.data??{},B=A.branchOrder??k+1,F=A.branchId??null,W={branchId:F,id:F,branchName:A.branchName||i.data?.label||`分支${k+1}`,sortOrder:B,nodes:E};return J?.sourceHandle&&(W.sourceHandle=J.sourceHandle),A.timeWindowSeconds!==void 0&&A.timeWindowSeconds!==null&&(W.timeWindowSeconds=A.timeWindowSeconds),A.branchDescription&&(W.description=A.branchDescription),be(W,"target_count","targetCount","targetCount"),be(W,"timer_target","duration","duration"),W})},r=(f,q,p,w,g=null,u=null,$=null,d=1,m=!1,i=!1)=>{const k=g??f.deviceType??"",E=k==="1400"||k==="2",J=E?"1400":"camera",A=q==="stream"?2:1,B=E&&u!==null?u==="device"?1:2:f.detectionType??2,W=(T?.value??T)?.graph?.sources??[],h=String(f.sourceId??f.id??""),H=W.find(Z=>String(Z.sourceId)===h)?.attach??{},U={deviceType:J,detectionType:B,dataSourceType:A,sourceOrder:p,timeTemplateId:H.timeTemplateId??"",timeTemplateName:H.timeTemplateName??"",platform:w?.platform??"TAI"};if(!E){const Z=$?.mode??0;Z===3?(U.frameExtractionType=0,U.frameInterval=0):Z===2?(U.frameExtractionType=i?1:3,U.frameInterval=0):(U.frameExtractionType=Z+1,U.frameInterval=$?.interval??30);const R=$?.sw_decoding??"CPU";U.frameExtractionSourceType=R==="GPU"?2:1,d===1&&q==="image"&&!m&&!!$?.enablePatrol?U.pollingConfig={enablePolling:1,pollingAmount:String(Math.max(1,$?.patrolGroupSize??1)),pollingInterval:"0"}:U.pollingConfig={enablePolling:0},U.thirdId=f.thirdId??""}return U},N=(f,q,p,w,g,u,$)=>{const d=C?.value??C,m=d?.value??d,i=D?.value?.[f.id]??[],k=f.data?.sourceGroupId??null,E=!!f.data?.arguments?.needCooperativeDetection,J=E?f.data?.arguments?.windowSeconds??5:void 0,A=q?.data?.streamType??"image",B=ue(p,f.id,w).some(n=>n.type===b.SMALL_MODEL),F=B?"small":A,W=y(f,p,w,$,A),h=f.data?.arguments?.deviceType??null,O=f.data?.arguments?.detectionMode??null,H=f.data?.arguments??null,U=t.getDataSourceCount();if(i.length>0)return i.map((n,x)=>{const j=String(n.sourceId??n.id??""),Y=V(f,p,w,g,j),z={sourceId:n.sourceId??n.id??"",sourceName:n.sourceName??n.name??"",sourceType:F,sourceGroupId:k,areas:n.area??n.areas??[],lines:n.lines??null,direction:n.direction??null,branches:Y,attach:r(n,A,x,m,h,O,H,U,E,B),synEnabled:E,...J!==void 0&&{windowSeconds:J}};return W&&(z.streamConfig=W,z.streamUrl="rtsp"),z});const Z=V(f,p,w,g),R={sourceId:"",sourceName:f.data?.label??"数据源",sourceType:F,sourceGroupId:k,areas:[],branches:Z,attach:r({},A,0,m,h,O,H,U,E,B),synEnabled:E};return W&&(R.streamConfig=W,R.streamUrl="rtsp"),[R]},s=()=>{try{const f=t.nodes,q=t.edges,p=He(f),w=je(f,q),g=[...p.values()].find(H=>H.type===b.START),u=[...p.values()].find(H=>H.type===b.END),$=l?.value??l,d=$?.value??$,m=Pe(w,p);let i=m.filter(H=>H.type===b.DATA_SOURCE);i.length===0&&(i=f.filter(H=>H.type===b.DATA_SOURCE));const k=i.flatMap((H,U)=>N(H,g,w,p,q,U,m)),E={workflowName:g?.data?.taskName??"",ruleId:d?.ruleId??"",sources:k,extraConfig:M(g,u),description:""},A=i[0]?.data?.arguments??{},B=A.mode??0,F=A.interval??0;let W,h,O;return B===0?(W="time",h=F,O=0):(W="frame",h=0,B===3?O=0:B===2?O=-1:O=F),{name:E.workflowName,type:"simple",plan:E.extraConfig.schedule??[],inferStrategy:W,timeInterval:h,frameInterval:O,mps:E.extraConfig.enableVideo??!1,graph:E}}catch(f){return v.ElMessage.error(f.message||"导出失败"),null}};return{validation:G,exportToJSON:s,copyToClipboard:()=>{const f=s();if(!f)return;const q=JSON.stringify(f,null,2);if(navigator.clipboard?.writeText)navigator.clipboard.writeText(q).then(()=>v.ElMessage.success("已复制到剪贴板")).catch(()=>v.ElMessage.error("复制失败"));else{const p=document.createElement("textarea");p.value=q,p.style.position="fixed",p.style.opacity="0",document.body.appendChild(p),p.select(),document.execCommand("copy"),document.body.removeChild(p),v.ElMessage.success("已复制到剪贴板")}},downloadJSON:()=>{const f=s();if(!f)return;const q=JSON.stringify(f,null,2),p=new Blob([q],{type:"application/json"}),w=URL.createObjectURL(p),g=document.createElement("a");g.href=w,g.download=`task_workflow_${Date.now()}.json`,g.click(),URL.revokeObjectURL(w),v.ElMessage.success("导出成功")}}},Ue=(a=null,o=null,t=null)=>{const c=e.inject("editorMode",oe.ALGORITHM);return(a??c)===oe.TASK?kt(o,t):Ct(o,t)},bt=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 We(a=null,o=null,t=null,c=null){const _=o??ae(),l=e.inject("editorMode",oe.ALGORITHM),C=a??l;e.inject("taskModeConfig",null);const T=e.inject("selectedDevicesMap",null),D=c??T,G=S=>{const{type:V,data:r}=S,N=r.arguments||{},s=[];switch(V){case b.START:if(C===oe.TASK)if(r.taskName?.trim()||s.push("任务名称"),!r.executionTime?.trim())s.push("任务执行时间");else{const L=bt(r.executionTime);(!L||!Array.isArray(L.plan)||L.plan.length===0)&&s.push("任务执行时间(计划为空)")}else r.algorithmName?.trim()||s.push("算法名称");break;case b.SMALL_MODEL:r.modelId||s.push("模型选择");break;case b.DETECTION_TARGET:r.targetId||s.push("检测目标选择");break;case b.CLASSIFICATION_MODEL:N.modelId||s.push("分类模型选择");break;case b.DATA_SOURCE:C===oe.TASK&&(D?.value?.[S.id]??[]).length===0&&s.push("设备选择");break;case b.TARGET_COUNT:break;case b.TIMER_TARGET:(!N.duration||N.duration<1)&&s.push("持续时间");break}return s},M=S=>{const V=_.nodes.find(N=>N.id===S.source);if(!V)return[];const r=[];return V.type===b.DATA_SOURCE&&V.data?.enableImageSequence===!0&&S.sourceHandle!=="first-frame"&&(!S.data?.timeWindowSeconds||S.data.timeWindowSeconds<1)&&r.push("后续检测帧的持续时间"),r};return{runValidation:()=>{const{nodes:S,edges:V}=_;_.clearInvalidIds();const r=Ge(S,V,C),N=r.errors,s=[],L=[],P=[];S.filter(u=>u.type!=="group").forEach(u=>{const $=G(u);$.length>0&&(s.push(u.id),P.push(`节点"${u.data.label}"缺少必填参数:${$.join("、")}`))}),V.forEach(u=>{const $=M(u);$.length>0&&(L.push(u.id),P.push(`分支"${u.data?.branchName||"未命名"}"缺少:${$.join("、")}`))}),N.forEach(u=>{typeof u=="object"&&(u.nodeId&&s.push(u.nodeId),u.edgeId&&L.push(u.edgeId))}),(s.length>0||L.length>0)&&(_.setInvalidIds(s,L),setTimeout(()=>{_.clearInvalidIds()},5e3));const q=N.map(u=>typeof u=="object"?u.message:u),p=r.warnings.map(u=>typeof u=="object"?u.message:u),w=[...q.map(u=>({msg:u,type:"error"})),...P.map(u=>({msg:u,type:"warning"})),...p.map(u=>({msg:u,type:"warning"}))],g=q.length===0&&P.length===0;if(g&&p.length===0)v.ElMessage.success("校验通过,所有节点和分支参数配置正确");else if(w.length>0){const u=w[0];v.ElMessage[u.type](u.msg)}return{passed:g,errors:[...q,...P],warnings:p}}}}const ne=(a,o)=>{const t=a.__vccOpts||a;for(const[c,_]of o)t[c]=_;return t},xt={class:"toolbar"},Et={class:"toolbar-right"},wt=ne({__name:"WorkflowToolbar",setup(a){const o=ae(),{copyToClipboard:t,downloadJSON:c}=Ue(),{runValidation:_}=We(),l=()=>{o.resetWorkflow()},C=()=>{_()},T=()=>{t()},D=()=>{c()};return(G,M)=>{const y=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",xt,[M[4]||(M[4]=e.createElementVNode("div",{class:"toolbar-left"},[e.createElementVNode("h2",null,"AIPass 算法编排系统")],-1)),e.createElementVNode("div",Et,[e.createVNode(y,{type:"info",icon:e.unref(Q.RefreshLeft),onClick:l},{default:e.withCtx(()=>[...M[0]||(M[0]=[e.createTextVNode(" 重置 ",-1)])]),_:1},8,["icon"]),e.createVNode(y,{type:"danger",icon:e.unref(Q.CircleCheck),onClick:C},{default:e.withCtx(()=>[...M[1]||(M[1]=[e.createTextVNode(" 运行测试 ",-1)])]),_:1},8,["icon"]),e.createVNode(y,{type:"success",icon:e.unref(Q.CopyDocument),onClick:T},{default:e.withCtx(()=>[...M[2]||(M[2]=[e.createTextVNode(" 复制JSON ",-1)])]),_:1},8,["icon"]),e.createVNode(y,{type:"warning",icon:e.unref(Q.Download),onClick:D},{default:e.withCtx(()=>[...M[3]||(M[3]=[e.createTextVNode(" 导出JSON ",-1)])]),_:1},8,["icon"])])])}}},[["__scopeId","data-v-17ee463c"]]),Tt={key:0},St={class:"node-list"},Vt={class:"node-list"},Bt={class:"node-list"},At={class:"node-list"},Dt=ne({__name:"NodeToolbox",setup(a){const o=e.ref(!0),t=e.ref(["basic","data","calculation","algorithm"]),c=(_,l)=>{_.dataTransfer&&(_.dataTransfer.setData("application/vueflow",l),_.dataTransfer.effectAllowed="move")};return(_,l)=>{const C=e.resolveComponent("el-icon"),T=e.resolveComponent("VideoPlay"),D=e.resolveComponent("CircleClose"),G=e.resolveComponent("el-collapse-item"),M=e.resolveComponent("FolderOpened"),y=e.resolveComponent("Cpu"),S=e.resolveComponent("View"),V=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",Tt,"节点工具箱")):(e.openBlock(),e.createBlock(C,{key:1,class:"collapsed-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Grid))]),_:1})),o.value?(e.openBlock(),e.createBlock(C,{key:2,class:"toggle-btn",onClick:l[0]||(l[0]=e.withModifiers(r=>o.value=!1,["stop"]))},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.DArrowLeft))]),_:1})):e.createCommentVNode("",!0)]),o.value?(e.openBlock(),e.createBlock(V,{key:0,modelValue:t.value,"onUpdate:modelValue":l[13]||(l[13]=r=>t.value=r),class:"toolbox-content"},{default:e.withCtx(()=>[e.createVNode(G,{title:"基础节点",name:"basic"},{default:e.withCtx(()=>[e.createElementVNode("div",St,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[2]||(l[2]=r=>c(r,"start"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),l[14]||(l[14]=e.createElementVNode("span",null,"开始节点",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[3]||(l[3]=r=>c(r,"end"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(D)]),_:1}),l[15]||(l[15]=e.createElementVNode("span",null,"结束节点",-1))],32)])]),_:1}),e.createVNode(G,{title:"规则节点",name:"data"},{default:e.withCtx(()=>[e.createElementVNode("div",Vt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[4]||(l[4]=r=>c(r,"dataSource"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(M)]),_:1}),l[16]||(l[16]=e.createElementVNode("span",null,"数据源",-1))],32),e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[5]||(l[5]=r=>c(r,"smallModel"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(y)]),_: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=>c(r,"detectionTarget"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(S)]),_: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=>c(r,"classificationModel"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Grid))]),_:1}),l[19]||(l[19]=e.createElementVNode("span",null,"分类模型",-1))],32)])]),_:1}),e.createVNode(G,{title:"计算节点",name:"calculation"},{default:e.withCtx(()=>[e.createElementVNode("div",Bt,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[8]||(l[8]=r=>c(r,"targetCount"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.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=>c(r,"timerTarget"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Timer))]),_:1}),l[21]||(l[21]=e.createElementVNode("span",null,"目标计时",-1))],32)])]),_:1}),e.createVNode(G,{title:"辅助节点",name:"algorithm"},{default:e.withCtx(()=>[e.createElementVNode("div",At,[e.createElementVNode("div",{class:"toolbox-node",draggable:"true",onDragstart:l[10]||(l[10]=r=>c(r,"ocr"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.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=>c(r,"licensePlate"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.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=>c(r,"faceRecognition"))},[e.createVNode(C,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.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 Te{static backendToFrontend(o){const{id:t,title:c,name:_,inputSchema:l,extraConfig:C}=o,T={id:t,title:c,label:_,type:"DETECTION_TARGET",inputSchema:l,extraConfig:C,data:{targetId:c,targetName:_,description:_,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:C?.showStruct!==void 0?!1:void 0}};return Object.keys(T.data).forEach(D=>{T.data[D]===void 0&&delete T.data[D]}),T}}const ie={START_X:80,START_Y:300,H_GAP:240,V_GAP:180},Je=a=>at[a]||a,he=(a,o,t={})=>({id:me(a),type:a,position:{...o},data:{label:t.label||Je(a),...t}}),ke=(a,o,t={})=>{const{sourceHandle:c,..._}=t,l={id:`e_${a}_${o}`,source:a,target:o};return c&&(l.sourceHandle=c),Object.keys(_).length>0&&(l.data=_),l},Lt=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(c=>({operator:c.op,value:c.value}))}},Mt=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}},Ot=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},It=()=>({properties:{reportFrequency:{type:"string",title:"上报频率",description:"选择告警上报的频率方式",enum:["always","interval"],enumLabels:["实时上报","按时间间隔上报"],default:"always"},reportInterval:{type:"integer",title:"上报间隔(秒)",description:"按时间间隔上报时的间隔秒数",minimum:1,maximum:3600,default:30,dependsOn:{field:"reportFrequency",value:"interval"}},enableDeduplication:{type:"boolean",title:"相同预警自动去重",description:"开启后,系统会自动过滤相似度高于阈值的重复告警",default:!1},similarityThreshold:{type:"integer",title:"预警目标相似度(%)",description:"相似度高于此阈值的告警将被自动去重",minimum:0,maximum:100,default:80,dependsOn:{field:"enableDeduplication",value:!0}}},required:["reportFrequency"]}),Rt=()=>({properties:{needCooperativeDetection:{type:"boolean",title:"是否需要协同检测",default:!1},windowSeconds:{type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},enableImageSequence:{type:"boolean",title:"开启图片时序",default:!1}},required:[]}),$t=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,a=>{const o=Math.random()*16|0;return(a==="x"?o:o&3|8).toString(16)}),Ye=()=>{const a=ae(),o=e.inject("editorConfig",null),t=f=>lt[f]||b.DETECTION_TARGET,c=(f,q)=>f?.find(p=>p.id===String(q))??f?.[q],_=(f,q)=>f.streamConfig?(f.children||[]).some(g=>(g.branchRefs||[]).some(u=>c(q.branches,u)))?de.SMALL_MODEL_BRANCH:de.SMALL_MODEL:de.IMAGE_BRANCH,l=f=>!f||typeof f!="object"?"无效的JSON格式":!f.ruleName&&f.ruleName!==""?"缺少 ruleName 字段":f.ruleSchema?.sourceGroups?.length?null:"缺少 ruleSchema.sourceGroups",C=f=>{const q=o?.value??o;return f==="small"?q?.smallModels||[]:f==="detection"?q?.detection||[]:f==="classification"?q?.classification?.models||[]:[]},T=()=>{},D=(f,q)=>{f.modelName=q||"",f.title=q||"",f.modelId=q||null;const w=C("small").find(g=>g.title===q);w&&(f.input_schema=w.inputSchema||w.input_schema||{},f.modelId=w.id||w.title,f.modelName=w.name||q,f.modelType=w.type,f.supportDirectAlert=w.supportDirectAlert||!1,f.extraConfig=w.extraConfig)},G=async(f,q)=>{const p=t(f.toolTitle),w={label:f.nodeName||Je(p),arguments:f.arguments||{},input_schema:{}};switch(p){case b.DETECTION_TARGET:w.targetId=f.toolTitle,w.targetName=f.nodeName||"检测目标";{const u=C("detection").find($=>$.title===f.toolTitle);if(u){let d=Te.backendToFrontend(u).inputSchema||{};if(f.toolTitle==="other"){const m={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}}};d={...d,properties:{...d.properties,...m.properties}}}w.input_schema=d}}break;case b.CLASSIFICATION_MODEL:w.modelName=f.nodeName||"分类模型";break;case b.SMALL_MODEL:D(w,f.toolTitle);break}return f.branchLogic&&(w.enableBranch=!0,w.branchLogic=f.branchLogic),he(p,q,w)},M=(f,q,p,w)=>{const g={label:"小模型",input_schema:{},arguments:f.arguments||{}};return D(g,f.toolTitle),q===de.SMALL_MODEL_BRANCH&&(g.enableBranch=!0,g.branchLogic=p.logic||"and"),he("smallModel",w,g)},y=async(f,q,p,w,g,u)=>{let $=q,d=w;const m={branchOrder:f.sortOrder??1,branchName:f.branchName||"",branchId:f.id??null};f.sourceHandle&&(m.sourceHandle=f.sourceHandle);const i=f.timeWindowSeconds??f.extraConfig?.timeWindowSeconds;i!==void 0&&(m.timeWindowSeconds=i),f.description&&(m.branchDescription=f.description);const k=[...f.nodes||[]].sort((h,O)=>(h.sortOrder??0)-(O.sortOrder??0)),E=new Set([b.DETECTION_TARGET,b.CLASSIFICATION_MODEL,b.SMALL_MODEL]);let J=-1;k.forEach((h,O)=>{E.has(t(h.toolTitle))&&(J=O)});const A=k.map(h=>({kind:"regular",data:h})),B=f.targetCount??f.extraConfig?.targetCount,F=f.duration??f.extraConfig?.duration,W=[];B&&W.push({kind:"targetCount",data:B}),F&&W.push({kind:"timerTarget",data:F}),W.length>0&&A.splice(J+1,0,...W);for(let h=0;h<A.length;h++){const O=A[h];let H;if(O.kind==="regular")H=await G(O.data,{x:d,y:p});else if(O.kind==="targetCount"){const U=Lt(O.data);H=he("targetCount",{x:d,y:p},{label:"目标计数",arguments:U,input_schema:{targets:{required:!0,type:"array",minLength:1},alertConditions:{required:!1,type:"array"}}})}else{const U=Mt(O.data);H=he("timerTarget",{x:d,y:p},{label:"目标计时",arguments:U,input_schema:{duration:{required:!0,type:"integer",min:1,max:3600},condition_type:{required:!0,type:"string",enum:["similarity","hit_rate"]},similarity_threshold:{required:!1,type:"integer",min:0,max:100},hit_rate_threshold:{required:!1,type:"integer",min:0,max:100},reset_timer:{required:!0,type:"boolean"}}})}g.push(H),u.push(ke($,H.id,h===0?m:void 0)),$=H.id,d+=ie.H_GAP}return{lastNodeId:$,endX:d}},S=f=>{const q=f.ruleSchema.sourceGroups||[],p=f.ruleSchema.groupLogic||"and",w=q.length>1;return he("start",{x:ie.START_X,y:ie.START_Y},{label:"开始",algorithmName:f.ruleName||"",enableBranch:w?!0:p!=="and",branchLogic:p,groupWindowSeconds:f.ruleSchema.groupWindowSeconds??null})},V=f=>{const q=Ot(f.extraConfig);return he("end",{x:0,y:ie.START_Y},{label:"结束",input_schema:It(),arguments:{reportFrequency:"always",reportInterval:30,enableDeduplication:!1,similarityThreshold:80,...q}})},r=(f,q)=>[...f||[]].sort((p,w)=>(p.sort??0)-(w.sort??0)).map(p=>{const w=_(p,q),g=[];return(p.children||[]).forEach(u=>{(u.branchRefs||[]).forEach($=>{const d=c(q.branches,$);d&&g.push(d)})}),g.sort((u,$)=>(u.sortOrder??0)-($.sortOrder??0)),{sg:p,mode:w,refBranches:g}}),N=f=>{const p=(f.reduce((w,g)=>w+Math.max(g.refBranches.length,1),0)-1)*ie.V_GAP;return ie.START_Y-p/2},s=async(f,q,p,w,g,u)=>{const{sg:$,mode:d,refBranches:m}=f,i=Math.max(m.length,1),k=p+(i-1)*ie.V_GAP/2;let E=ie.START_X+ie.H_GAP,J=ie.START_X;const A=$.logic==="order",B=he("dataSource",{x:E,y:k},{label:$.name||"数据源",sourceGroupId:$.sourceGroupId??null,enableImageSequence:A,input_schema:Rt(),arguments:{needCooperativeDetection:!!$.synEnabled,windowSeconds:$.windowSeconds||5,enableImageSequence:A},enableBranch:!0,branchLogic:A?"order":$.logic||"and"});w.push(B),g.push(ke(q.id,B.id,{branchOrder:$.sort??null,branchName:$.name||""})),A&&m.forEach((h,O)=>{h.sourceHandle||(h.sourceHandle=O===0?"first-frame":$t())});const F=A?{dataSourceNode:B,refBranches:m}:null;let W=B.id;if(d===de.SMALL_MODEL||d===de.SMALL_MODEL_BRANCH){E+=ie.H_GAP;const h=M($.streamConfig,d,$,{x:E,y:k});w.push(h),g.push(ke(B.id,h.id)),W=h.id}if(m.length>0)for(let h=0;h<m.length;h++){const O=p+h*ie.V_GAP,{lastNodeId:H,endX:U}=await y(m[h],W,O,E+ie.H_GAP,w,g);g.push(ke(H,u.id)),U>J&&(J=U)}else{g.push(ke(W,u.id));const h=E+ie.H_GAP;h>J&&(J=h)}return{branchY:p+i*ie.V_GAP,maxX:J,imageSequenceInfo:F}},L=f=>{for(const{dataSourceNode:q,refBranches:p}of f){const w=p.filter(g=>g.sourceHandle&&g.sourceHandle!=="first-frame");w.length>0&&(q.data.subsequentFrames=w.map((g,u)=>({id:u===0?"default-subsequent":`subsequent-${Date.now()}-${u}`,label:u===0?"后续帧检测":`后续帧检测${u+1}`,handleId:g.sourceHandle})))}};return{importFromJSON:async f=>{const q=l(f);if(q)return v.ElMessage.error(q),!1;try{T();const p=[],w=[],g=S(f),u=V(f);p.push(g);const $=r(f.ruleSchema.sourceGroups,f);let d=N($),m=ie.START_X;const i=[];for(const k of $){const E=await s(k,g,d,p,w,u);d=E.branchY,E.maxX>m&&(m=E.maxX),E.imageSequenceInfo&&i.push(E.imageSequenceInfo)}return u.position.x=m+ie.H_GAP,p.push(u),L(i),a.loadWorkflow(p,w),v.ElMessage.success("导入成功"),!0}catch(p){return v.ElMessage.error("导入失败: "+(p.message||"未知错误")),!1}},validateImportJSON:l}},Ft=()=>{const a=e.inject("echoTaskData",null);e.inject("taskModeConfig",null);const o=e.inject("selectedDevicesMap",null),t=ae(),{importFromJSON:c,validateImportJSON:_}=Ye(),l=(r,N)=>{const s=r.mode??0,L=r.interval??0,P=r.sw_decoding===!1?"GPU":"CPU";let f,q;return N?s===1?(f=2,q=0):s===0&&L===0?(f=3,q=0):(f=1,q=L):s===1?(f=2,q=0):L===0?(f=0,q=30):(f=0,q=L),{mode:f,interval:q,sw_decoding:P}},C=(r,N)=>{const s=r.frameExtractionType??1,L=r.frameInterval??0,f=(r.frameExtractionSourceType??1)===2?"GPU":"CPU";let q,p;return s===0?(q=3,p=0):s===1&&L===0?(q=N?2:0,p=30):s===1?(q=0,p=L):s===2?(q=1,p=L):s===3?(q=2,p=0):(q=N?3:0,p=30),{mode:q,interval:p,sw_decoding:f}},T=r=>r===1?"device":"platform",D=r=>!r||r.enablePolling!==1?{enablePatrol:!1}:{enablePatrol:!0,patrolGroupSize:Number(r.pollingAmount??1)},G=(r,N,s)=>{if(N){const L=r.find(P=>P.sourceGroupId===N);if(L)return L}return r[s]??null},M=(r,N)=>{if(!r?.branches)return null;for(const s of r.branches){const L=s.nodes?.find(P=>P.toolTitle===N);if(L?.arguments)return{...L.arguments}}return null},y=r=>{if(!Array.isArray(r)||r.length===0)return{timeZone:"",planType:0};const N=r.map(L=>({dayType:Number(L.dayType??0),timePeriod:(L.timePeriod??[]).map(P=>({startTime:P.startTime,endTime:P.endTime}))})),s=N.some(L=>L.dayType===0)?1:0;return{timeZone:JSON.stringify({plan:N}),planType:s}},S=async()=>{const r=a?.value??a;if(!r||typeof r!="object"||Object.keys(r).length===0)return;const N=r.graph??{},s=N.sources??[],L=N.extraConfig??{},P=t.nodes.find(g=>g.type===b.START);if(P){const g=r.name??N.workflowName??"",u=!!L.enableVideo,$=L.schedule??[],{timeZone:d,planType:m}=y($);t.updateNodeData(P.id,{taskName:g,enableAlertVideo:u,schedule:$,timeZone:d,planType:m,...d?{executionTime:d}:{}})}const f=t.nodes.filter(g=>g.type===b.DATA_SOURCE),q=t.nodes.some(g=>g.type===b.SMALL_MODEL);return f.forEach((g,u)=>{const $=g.data?.sourceGroupId??null,d=G(s,$,u);if(!d)return;const m=d.attach??{},i=d.streamConfig?.decoder??null,k=m.deviceType==="1400"?"1400":"camera",E=k==="camera"?i?l(i,q):C(m,q):{},J=k==="camera"?D(m.pollingConfig):{},A=k==="1400"?{detectionMode:T(m.detectionType)}:{},B=g.data?.arguments??{};if(t.updateNodeData(g.id,{arguments:{...B,deviceType:k,...E,...J,...A}}),o){const F=$?s.filter(O=>O.sourceGroupId===$):[],h=(F.length>0?F:[d]).map(O=>({sourceId:O.sourceId??"",sourceName:O.sourceName??"",thirdId:O.attach?.thirdId??"",area:O.areas??[],lines:O.lines??[],direction:O.direction??[]}));o.value[g.id]=h}}),t.nodes.filter(g=>g.type===b.DETECTION_TARGET).forEach(g=>{const u=new Set,$=[g.id];let d=null;for(;$.length&&!d;){const B=$.shift();if(u.has(B))continue;u.add(B);const F=t.edges.filter(W=>W.target===B);for(const W of F){const h=t.nodes.find(O=>O.id===W.source);if(h){if(h.type===b.DATA_SOURCE){d=h.id;break}$.push(h.id)}}}if(!d)return;const m=o?.value?.[d]??[];if(m.length<=1)return;const i=g.data?.targetId;if(!i)return;const k=m.map(B=>{const F=String(B.sourceId??B.id??""),W=s.find(h=>String(h.sourceId)===F);if(!W?.branches)return{deviceId:F,args:null};for(const h of W.branches){const O=h.nodes?.find(H=>H.toolTitle===i);if(O?.arguments)return{deviceId:F,args:{...O.arguments}}}return{deviceId:F,args:null}}),E=k.filter(B=>B.args!==null);if(E.length===0)return;const J=JSON.stringify(E[0].args);if(E.some(B=>JSON.stringify(B.args)!==J)){const B=g.data?.arguments??{};t.updateNodeData(g.id,{arguments:{...B,configMode:"perDevice"}}),k.forEach(({deviceId:F,args:W})=>{W&&t.setTaskSourceArguments(d,F,g.id,W)})}}),t.nodes.filter(g=>g.type===b.FACE_RECOGNITION).forEach(g=>{const u=new Set,$=[g.id];let d=null;for(;$.length&&!d;){const B=$.shift();if(u.has(B))continue;u.add(B);const F=t.edges.filter(W=>W.target===B);for(const W of F){const h=t.nodes.find(O=>O.id===W.source);if(h){if(h.type===b.DATA_SOURCE){d=h.id;break}$.push(h.id)}}}const i=(d?t.nodes.find(B=>B.id===d):null)?.data?.sourceGroupId??null,k=f.findIndex(B=>B.id===d),E=G(s,i,k>=0?k:0);if(!E)return;const J=M(E,"face");if(!J?.repositoryId)return;const A=g.data?.arguments??{};t.updateNodeData(g.id,{arguments:{...A,repositoryId:Array.isArray(J.repositoryId)?J.repositoryId:[J.repositoryId]}})}),!0};return{importFromJSON:async r=>{const N=_(r);return N?(v.ElMessage.error(N),!1):await c(r)?(await S(),!0):!1},applyTaskData:S,validateImportJSON:_}},qt=()=>{if(e.inject("editorMode",oe.ALGORITHM)===oe.TASK)return Ft();const{importFromJSON:o,validateImportJSON:t}=Ye();return{importFromJSON:o,validateImportJSON:t,applyTaskData:async()=>{}}},Gt={class:"node-content"},Ht={class:"node-label"},jt=ne({__name:"StartNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const c=e.resolveComponent("VideoPlay"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["start-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",Gt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",Ht,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-9bc41abb"]]),Pt={class:"node-content"},zt={class:"node-label"},Ut=ne({__name:"EndNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const c=e.resolveComponent("CircleClose"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["end-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Pt,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("span",zt,e.toDisplayString(a.data.label),1)])],2)}}},[["__scopeId","data-v-2a723d0b"]]),Wt={class:"node-content"},Jt={class:"node-info"},Yt={class:"node-label"},Xt={key:1,class:"sequence-handles"},Qt={class:"handle-item"},Kt={class:"handle-label"},Zt={key:0,class:"handle-item add-button-item"},vt=ne({__name:"DataSourceNode",props:{id:{type:String,required:!0},data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,M=>{const y=Math.random()*16|0;return(M==="x"?y:y&3|8).toString(16)}),C=e.computed(()=>!o.data.subsequentFrames&&o.data.enableImageSequence?[{id:"default-subsequent",label:"后续帧检测",handleId:"subsequent-frame"}]:o.data.subsequentFrames||[]);let T=!1;const D=()=>{if(T)return;T=!0;const M=o.data.subsequentFrames||[],y={id:l(),label:`后续帧检测${M.length+1}`,handleId:l()};t.addSubsequentFrame(o.id,y),setTimeout(()=>{T=!1},300)},G=async M=>{const y=o.data.subsequentFrames.find(V=>V.id===M);if(t.edges.some(V=>V.source===o.id&&V.sourceHandle===y.handleId))try{await v.ElMessageBox.confirm(`删除"${y.label}"将同时删除其连接,是否继续?`,"确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"})}catch{return}t.removeSubsequentFrame(o.id,M)};return(M,y)=>{const S=e.resolveComponent("FolderOpened"),V=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Wt,[e.createVNode(V,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(S)]),_:1}),e.createElementVNode("div",Jt,[e.createElementVNode("div",Yt,e.toDisplayString(a.data.label),1)])]),a.data.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(ee.Handle),{key:0,type:"source",position:e.unref(ee.Position).Right},null,8,["position"])),a.data.enableImageSequence?(e.openBlock(),e.createElementBlock("div",Xt,[e.createElementVNode("div",Qt,[y[0]||(y[0]=e.createElementVNode("span",{class:"handle-label"},"首帧检测",-1)),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:"first-frame",class:"handle-right"},null,8,["position"])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.value,N=>(e.openBlock(),e.createElementBlock("div",{key:N.id,class:"handle-item"},[e.createElementVNode("span",Kt,e.toDisplayString(N.label),1),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right,id:N.handleId,class:"handle-right"},null,8,["position","id"]),N.id!=="default-subsequent"&&!_.value?(e.openBlock(),e.createBlock(V,{key:0,class:"delete-icon",onClick:e.withModifiers(s=>G(N.id),["stop"])},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Close))]),_:1},8,["onClick"])):e.createCommentVNode("",!0)]))),128)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",Zt,[e.createVNode(r,{size:"small",type:"primary",icon:e.unref(Q.Plus),circle:"",onClick:e.withModifiers(D,["stop"])},null,8,["icon"])]))])):e.createCommentVNode("",!0)],2)}}},[["__scopeId","data-v-7df8ef65"]]),eo={class:"node-content"},to={class:"node-info"},oo={class:"node-label"},no={key:0,class:"node-model"},ao={key:1,class:"node-placeholder"},lo={key:0,class:"direct-alert-badge"},ro=ne({__name:"SmallModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const c=e.resolveComponent("Cpu"),_=e.resolveComponent("el-icon");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["small-model-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",eo,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",to,[e.createElementVNode("div",oo,e.toDisplayString(a.data.label),1),a.data.modelName?(e.openBlock(),e.createElementBlock("div",no,e.toDisplayString(a.data.modelName),1)):(e.openBlock(),e.createElementBlock("div",ao,"未选择模型"))])]),a.data.supportDirectAlert?(e.openBlock(),e.createElementBlock("div",lo,[e.createVNode(_,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Warning))]),_:1})])):e.createCommentVNode("",!0),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-e278c903"]]),so={class:"node-content"},io={class:"node-info"},co={class:"node-target"},mo={class:"node-params"},po=ne({__name:"DetectionTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=()=>o.data.targetName||o.data.label||"检测目标",c=e.computed(()=>o.data.targetId==="other"?!1:o.data.arguments?.threshold!==void 0&&typeof o.data.arguments.threshold=="number"),_=e.computed(()=>{if(o.data.targetId==="other"&&o.data.arguments?.object){const l=o.data.arguments.object;if(Array.isArray(l))return l.filter(T=>T&&T.trim()!=="").length}return null});return(l,C)=>{const T=e.resolveComponent("View"),D=e.resolveComponent("el-icon"),G=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["detection-target-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",so,[e.createVNode(D,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(T)]),_:1}),e.createElementVNode("div",io,[C[1]||(C[1]=e.createElementVNode("div",{class:"node-label"},"检测目标",-1)),e.createElementVNode("div",co,e.toDisplayString(t()),1),e.createElementVNode("div",mo,[_.value?(e.openBlock(),e.createBlock(G,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value)+"个目标 ",1)]),_:1})):e.createCommentVNode("",!0),c.value?(e.openBlock(),e.createBlock(G,{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(G,{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(G,{key:3,size:"small",type:"warning"},{default:e.withCtx(()=>[...C[0]||(C[0]=[e.createTextVNode(" 结构化 ",-1)])]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-9a7ce2ec"]]),uo={class:"node-content"},fo={class:"node-info"},go={class:"node-label"},ho={key:0,class:"node-model"},yo={key:1,class:"node-placeholder"},_o={key:2,class:"node-stats"},No=ne({__name:"ClassificationModelNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return(o,t)=>{const c=e.resolveComponent("Grid"),_=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(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",uo,[e.createVNode(_,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(c)]),_:1}),e.createElementVNode("div",fo,[e.createElementVNode("div",go,e.toDisplayString(a.data.label),1),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",ho,e.toDisplayString(a.data.arguments.modelName),1)):(e.openBlock(),e.createElementBlock("div",yo,"未选择模型")),a.data.arguments?.modelName?(e.openBlock(),e.createElementBlock("div",_o,[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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-0af49326"]]),Co={class:"node-content"},ko={class:"node-info"},bo={class:"node-label"},xo={class:"node-params"},Eo=ne({__name:"OCRNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){return ae(),(o,t)=>{const c=e.resolveComponent("el-icon"),_=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ocr-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Co,[e.createVNode(c,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Document))]),_:1}),e.createElementVNode("div",ko,[e.createElementVNode("div",bo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",xo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(_,{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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-79c5c0a1"]]),wo={class:"node-content"},To={class:"node-info"},So={class:"node-label"},Vo={class:"node-scope"},Bo={class:"node-params"},Ao=ne({__name:"LicensePlateNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),c=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const l=t.nodes.find(C=>C.id===_);return l?l.data.label:"检测范围"};return(_,l)=>{const C=e.resolveComponent("Document"),T=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["license-plate-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",wo,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(C)]),_:1}),e.createElementVNode("div",To,[e.createElementVNode("div",So,e.toDisplayString(a.data.label),1),e.createElementVNode("div",Vo,e.toDisplayString(c()),1),e.createElementVNode("div",Bo,[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(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-6d767970"]]),Do={class:"node-content"},Lo={class:"node-info"},Mo={class:"node-params"},Oo=ne({__name:"TargetCountNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={"=":"=","!=":"≠",">":">","<":"<",">=":"≥","<=":"≤"},c=e.computed(()=>{const _=o.data.arguments?.alertConditions||[];if(_.length===0)return"";if(_.length===1){const C=_[0];return`数量 ${t[C.operator]||C.operator} ${C.value}`}const l=o.data.arguments?.conditionRelation||"OR";return`${_.length} 个条件(${l})`});return(_,l)=>{const C=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["target-count-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Do,[e.createVNode(C,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.DataAnalysis))]),_:1}),e.createElementVNode("div",Lo,[l[0]||(l[0]=e.createElementVNode("div",{class:"node-label"},"目标计数",-1)),e.createElementVNode("div",Mo,[c.value?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"warning"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-18949ab9"]]),Io={class:"node-content"},Ro={class:"node-info"},$o={class:"node-label"},Fo={class:"node-params"},qo=ne({__name:"TimerTargetNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=e.computed(()=>o.data.description||"目标计时"),c=e.computed(()=>`${o.data.arguments?.duration||30}秒`),_=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,C)=>{const T=e.resolveComponent("el-icon"),D=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["timer-target-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",Io,[e.createVNode(T,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Timer))]),_:1}),e.createElementVNode("div",Ro,[e.createElementVNode("div",$o,e.toDisplayString(t.value),1),e.createElementVNode("div",Fo,[e.createVNode(D,{size:"small",type:"success"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1}),_.value?(e.openBlock(),e.createBlock(D,{key:0,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(_.value),1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-44ea79f7"]]),Go={class:"group-label"},Ho=ne({__name:"GroupNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t={and:"ALL",or:"SOME"},c=e.computed(()=>t[o.data.branchLogic]??"ALL"),_=e.computed(()=>o.data.branchLogic==="or"?"warning":"primary"),l={width:"8px",height:"8px",borderRadius:"2px"},C={borderColor:"var(--aiflow-color-brand-primary)",borderStyle:"dashed"};return(T,D)=>{const G=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["group-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"]),e.createElementVNode("div",Go,[e.createVNode(G,{type:_.value,size:"small",effect:"dark"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(c.value),1)]),_:1},8,["type"]),D[0]||(D[0]=e.createElementVNode("span",null,"并行组",-1))]),e.createVNode(e.unref(nt.NodeResizer),{"min-width":200,"min-height":100,"handle-style":l,"line-style":C})],2)}}},[["__scopeId","data-v-adf6607d"]]),jo={class:"node-content"},Po={class:"node-info"},zo={class:"node-label"},Uo={class:"node-scope"},Wo={class:"node-params"},Jo=ne({__name:"FaceRecognitionNode",props:{data:{type:Object,required:!0},selected:{type:Boolean,default:!1}},setup(a){const o=a,t=ae(),c=()=>{const _=o.data.arguments?.detectionScope;if(!_)return"";const l=t.nodes.find(C=>C.id===_);return l?l.data.label:"检测范围"};return(_,l)=>{const C=e.resolveComponent("el-icon"),T=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["face-recognition-node",{selected:a.selected}])},[e.createVNode(e.unref(ee.Handle),{type:"target",position:e.unref(ee.Position).Left},null,8,["position"]),e.createElementVNode("div",jo,[e.createVNode(C,{class:"node-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.User))]),_:1}),e.createElementVNode("div",Po,[e.createElementVNode("div",zo,e.toDisplayString(a.data.label),1),e.createElementVNode("div",Uo,e.toDisplayString(c()),1),e.createElementVNode("div",Wo,[a.data.arguments?.threshold!==void 0?(e.openBlock(),e.createBlock(T,{key:0,size:"small",type:"primary"},{default:e.withCtx(()=>[e.createTextVNode(" 阈值: "+e.toDisplayString(a.data.arguments.threshold),1)]),_:1})):e.createCommentVNode("",!0),a.data.arguments?.minFaceWidth!==void 0&&a.data.arguments?.minFaceHeight!==void 0?(e.openBlock(),e.createBlock(T,{key:1,size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(" 最小尺寸: "+e.toDisplayString(a.data.arguments.minFaceWidth)+"×"+e.toDisplayString(a.data.arguments.minFaceHeight)+"px ",1)]),_:1})):e.createCommentVNode("",!0)])])]),e.createVNode(e.unref(ee.Handle),{type:"source",position:e.unref(ee.Position).Right},null,8,["position"])],2)}}},[["__scopeId","data-v-cedaa1a2"]]),Yo={class:"quick-add-menu__list"},Xo=["onClick"],Qo={class:"quick-add-menu__icon"},Ko={class:"quick-add-menu__label"},Zo={key:0,class:"quick-add-menu__empty"},fe=8,vo=ne({__name:"NodeQuickAddMenu",props:{visible:{type:Boolean,default:!1},position:{type:Object,default:()=>({x:0,y:0})},sourceNodeType:{type:String,default:""}},emits:["select","close"],setup(a){const o=a,t=e.ref(null),c=e.ref({x:0,y:0});e.watch(()=>o.visible,async T=>{if(!T||(c.value={x:o.position.x,y:o.position.y},await e.nextTick(),!t.value))return;const D=t.value.getBoundingClientRect(),G=window.innerWidth,M=window.innerHeight;let{x:y,y:S}=o.position;y+D.width>G-fe&&(y=G-D.width-fe),S+D.height>M-fe&&(S=M-D.height-fe),y<fe&&(y=fe),S<fe&&(S=fe),c.value={x:y,y:S}});const _=e.computed(()=>({left:c.value.x+"px",top:c.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:"🏁"}],C=e.computed(()=>{switch(o.sourceNodeType){case"start":return l.filter(T=>T.type==="dataSource");case"dataSource":return l.filter(T=>T.type==="smallModel"||T.type==="detectionTarget"||T.type==="classificationModel");case"smallModel":return l.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel"&&T.type!=="targetCount"&&T.type!=="timerTarget");case"detectionTarget":case"classificationModel":return l.filter(T=>T.type!=="dataSource"&&T.type!=="smallModel");case"timerTarget":return l.filter(T=>["ocr","faceRecognition","licensePlate","end"].includes(T.type));case"targetCount":return l.filter(T=>["timerTarget","ocr","faceRecognition","licensePlate","end"].includes(T.type));case"ocr":return l.filter(T=>["licensePlate","faceRecognition","end"].includes(T.type));case"licensePlate":return l.filter(T=>["ocr","faceRecognition","end"].includes(T.type));case"faceRecognition":return l.filter(T=>["ocr","licensePlate","end"].includes(T.type));default:return[]}});return(T,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(_.value)},[D[1]||(D[1]=e.createElementVNode("div",{class:"quick-add-menu__header"},"添加节点",-1)),e.createElementVNode("ul",Yo,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.value,G=>(e.openBlock(),e.createElementBlock("li",{key:G.type,class:"quick-add-menu__item",onClick:M=>T.$emit("select",G.type)},[e.createElementVNode("span",Qo,e.toDisplayString(G.icon),1),e.createElementVNode("span",Ko,e.toDisplayString(G.label),1)],8,Xo))),128)),C.value.length===0?(e.openBlock(),e.createElementBlock("li",Zo," 无可连接节点 ")):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]=G=>T.$emit("close"))})):e.createCommentVNode("",!0)]))}},[["__scopeId","data-v-05a5ee6d"]]),en={class:"workflow-canvas"},Xe=5,tn=ne({__name:"WorkflowCanvas",setup(a){const o=ae(),{screenToFlowCoordinate:t,findNode:c,onConnectStart:_,onConnectEnd:l}=ee.useVueFlow(),C=e.inject("editorConfig",null),T=e.inject("editorMode",oe.ALGORITHM),D=e.computed(()=>T===oe.TASK),G=e.inject("echoAlgodata",null),M=e.inject("echoTaskData",null),{importFromJSON:y,applyTaskData:S}=qt();e.watch(G,async n=>{if(n&&Object.keys(n).length>0){await e.nextTick();const x=n.graph??n;if(await y(x),D.value){const j=x?.ruleSchema?.sourceGroups??[];let Y=null;if(j.some(z=>z.streamConfig)?Y="stream":(j.length>1||j.some(z=>(z.children??[]).length>1))&&(Y="image"),Y){const z=o.nodes.find(X=>X.type===b.START);z&&o.updateNodeData(z.id,{streamType:Y})}await S()}}},{immediate:!0}),e.watch(M,async n=>{D.value&&(!n||typeof n!="object"||Object.keys(n).length===0||o.nodes.length!==0&&await S())},{immediate:!1});const V=(n,x)=>{if(!x?.properties)return n;const j={};return Object.entries(x.properties).forEach(([Y,z])=>{z.default!==void 0&&(j[Y]=z.default)}),n.data.arguments={...j,...n.data.arguments},n},r=e.reactive({visible:!1,screenPos:{x:0,y:0},sourceNodeId:null,sourceNodeType:null,sourceHandleId:null,flowPos:{x:0,y:0}}),N=()=>{r.visible=!1,r.sourceNodeId=null,r.sourceNodeType=null,r.sourceHandleId=null,q=!1};let s=null,L=!1,P=null,f=null,q=!1;const p=()=>{P&&(document.removeEventListener("mousemove",P),P=null),f&&(document.removeEventListener("mouseup",f),f=null)};e.onUnmounted(()=>{p()}),_(({nodeId:n,handleId:x,handleType:j,event:Y})=>{if(j!=="source")return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线");return}const z=o.nodes.find(K=>K.id===n);if(!z||z.type==="end")return;if(z.type===b.DATA_SOURCE&&z.data?.enableImageSequence){if(x&&o.edges.filter(re=>re.source===n&&re.sourceHandle===x).length>=1)return}else if(z.type!==b.START&&z.type!==b.DATA_SOURCE&&o.edges.filter(re=>re.source===n).length>=1)return;const X=Y?.target;let te=0,le=0;if(X){const K=X.getBoundingClientRect();te=K.right+12,le=K.top-8}s={nodeId:n,sourceNodeType:z.type,handleId:x,menuX:te,menuY:le,flowPos:{...z.position}},L=!1;const pe=Y?.clientX??0,I=Y?.clientY??0;p(),P=K=>{(Math.abs(K.clientX-pe)>Xe||Math.abs(K.clientY-I)>Xe)&&(L=!0,p())},f=()=>{if(p(),!L&&s){q=!0;const K=s;r.visible=!0,r.screenPos={x:K.menuX,y:K.menuY},r.sourceNodeId=K.nodeId,r.sourceNodeType=K.sourceNodeType,r.sourceHandleId=K.handleId,r.flowPos=K.flowPos}s=null},document.addEventListener("mousemove",P),document.addEventListener("mouseup",f)});const w=n=>{const x=r.sourceNodeId,j=o.nodes.find(ce=>ce.id===x);if(!j){N();return}if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点"),N();return}const Y=j.position.x+250,z=j.position.y;let X={x:Y,y:z};const te=60,le=80;let pe=0,I=!0;for(;I;){I=!1;const ce=z+pe;for(const ge of o.nodes)if(Math.abs(ge.position.x-Y)<100&&Math.abs(ge.position.y-ce)<te+20){I=!0,pe+=le;break}}if(X.y=z+pe,n==="end"){const ce=o.nodes.find(ge=>ge.type==="end");if(ce){if(o.edges.some(xe=>xe.source===x&&xe.target===ce.id)){v.ElMessage.warning("已经连接到结束节点"),N();return}const _e=u(j,ce);if(!_e.valid){v.ElMessage.warning(_e.message),N();return}o.addConnection({source:x,target:ce.id,sourceHandle:r.sourceHandleId||null,targetHandle:null}),B(),N(),v.ElMessage.success("已连接到结束节点");return}}let K;switch(n){case"end":K=Ee(X);break;case"dataSource":K=we(X);break;case"smallModel":K=De(X);break;case"detectionTarget":K=Le(X);break;case"classificationModel":K=Me(X);break;case"ocr":{const ce=C?.value??C;K=V(Oe(X),ce?.ocr?.[0]?.inputSchema);break}case"licensePlate":{const ce=C?.value??C;K=V(Ie(X),ce?.license_plate?.[0]?.inputSchema);break}case"faceRecognition":{const ce=C?.value??C;K=V(Fe(X),ce?.face?.faceParams?.[0]?.inputSchema);break}case"targetCount":K=Re(X);break;case"timerTarget":K=$e(X);break;default:N();return}const re=u(j,K);if(!re.valid){v.ElMessage.warning(re.message),N();return}o.addNode(K),o.addConnection({source:x,target:K.id,sourceHandle:r.sourceHandleId||null,targetHandle:null}),B(),N(),v.ElMessage.success(`已添加${K.data.label}并连接`)},g=["smallModel","detectionTarget","classificationModel","ocr","licensePlate","faceRecognition","targetCount","timerTarget"],u=(n,x)=>{if(n?.parentNode&&x?.type!=="group")return{valid:!1,message:"组内节点不能直接连接到外部节点,请通过并行组的连接点连线"};if(x?.parentNode&&n?.type!=="group")return{valid:!1,message:"外部节点不能直接连接到组内节点,请通过并行组的连接点连线"};if(n?.type===b.START){if(x?.type!==b.DATA_SOURCE)return{valid:!1,message:"开始节点只能连接数据源节点"};if(o.edges.filter(z=>z.source===n.id).some(z=>o.nodes.find(te=>te.id===z.target)?.data?.enableImageSequence===!0))return{valid:!1,message:"已有数据源节点开启了图片时序,不能再连接其他数据源节点"}}if(x?.type===b.SMALL_MODEL){if(n?.type!==b.DATA_SOURCE)return{valid:!1,message:"小模型节点的上游节点只能是数据源节点"};if(o.edges.filter(X=>X.source===n.id).some(X=>o.nodes.find(le=>le.id===X.target)?.type!==b.SMALL_MODEL))return{valid:!1,message:"小模型节点只能出现在单分支场景中。数据源节点已有其他连接,不能再连接小模型节点"}}if(n?.type===b.DATA_SOURCE){if(x?.type!==b.SMALL_MODEL&&x?.type!==b.DETECTION_TARGET&&x?.type!==b.CLASSIFICATION_MODEL)return{valid:!1,message:"数据源节点的下游节点只能是小模型节点、检测目标节点或分类模型节点"};if(o.edges.filter(X=>X.source===n.id).some(X=>o.nodes.find(le=>le.id===X.target)?.type===b.SMALL_MODEL))return{valid:!1,message:"数据源节点已连接小模型节点(单分支场景),不能再连接其他节点"}}if(n?.type===b.SMALL_MODEL&&(x?.type===b.TARGET_COUNT||x?.type===b.TIMER_TARGET))return{valid:!1,message:"小模型节点不能直接连接目标计数或目标计时节点,请先连接检测目标节点"};if(n?.type===b.TARGET_COUNT&&![b.TIMER_TARGET,b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(x?.type))return{valid:!1,message:"目标计数节点只能连接目标计时、辅助节点或结束节点"};if(n?.type===b.TIMER_TARGET&&![b.OCR,b.FACE_RECOGNITION,b.LICENSE_PLATE,b.END].includes(x?.type))return{valid:!1,message:"目标计时节点只能连接辅助节点或结束节点"};const j=[b.OCR,b.LICENSE_PLATE,b.FACE_RECOGNITION];return j.includes(n?.type)&&!j.filter(z=>z!==n.type).concat(b.END).includes(x?.type)?{valid:!1,message:"辅助节点只能连接除自身外的辅助节点或结束节点"}:x?.type!==b.END&&o.edges.filter(z=>z.target===x?.id).length>=1?{valid:!1,message:"该节点已有入口连接,该节点只允许有一条入口边"}:{valid:!0}},$=e.markRaw({start:jt,end:Ut,dataSource:vt,smallModel:ro,detectionTarget:po,classificationModel:No,ocr:Eo,licensePlate:Ao,targetCount:Oo,timerTarget:qo,group:Ho,faceRecognition:Jo}),d=e.computed({get:()=>o.nodes,set:n=>{o.nodes=n}}),m=e.computed({get:()=>o.edges,set:n=>{o.edges=n}}),i=n=>{n.forEach(x=>{if(x.type==="position"&&x.position)o.updateNodePosition(x.id,x.position);else if(x.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除节点");return}const j=o.nodes.find(z=>z.id===x.id);if(j&&j.type===b.START){v.ElMessage.warning("开始节点不可删除");return}if(j&&j.type===b.END){v.ElMessage.warning("结束节点不可删除");return}if(j&&j.type==="group"){v.ElMessage.warning('并行组不可手动删除,请关闭对应节点的"开启分支"选项');return}const Y=j?.parentNode;o.removeNode(x.id),Y&&o.nodes.filter(X=>X.parentNode===Y).length===0&&o.dissolveParallelGroup(Y)}})},k=n=>{n.forEach(x=>{if(x.type==="remove"){if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(x.id)}})},E=n=>{if(q)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加连接线"),N();return}const x=o.nodes.find(z=>z.id===n.source),j=o.nodes.find(z=>z.id===n.target),Y=u(x,j);if(!Y.valid){v.ElMessage.warning(Y.message),N();return}if(x?.type===b.DATA_SOURCE&&x.data.enableImageSequence&&n.sourceHandle&&o.edges.filter(X=>X.source===n.source&&X.sourceHandle===n.sourceHandle).length>=1){const X=n.sourceHandle==="first-frame"?"首帧检测":"后续帧检测";v.ElMessage.warning(`${X}连接点只能连接一个节点`);return}if(g.includes(x?.type)&&!x.data.enableBranch&&o.edges.filter(X=>X.source===n.source).length>=1){v.ElMessage.warning("该节点只能连接一个节点。");return}o.addConnection(n),B(),N()},J=n=>({and:"ALL",or:"SOME"})[n]||"ALL",A=n=>{const x=o.nodes.find(j=>j.id===n.source);if(!x)return"";if(x.type===b.START){const j=x.data.branchLogic||"and",Y=J(j),z=n.data?.branchOrder;return z!=null?`${Y} - 执行顺序 ${z}`:Y}if(x.type===b.DATA_SOURCE){if(x.data?.enableImageSequence){const X=n.sourceHandle==="first-frame"?"首帧":"后续帧",te=n.data?.branchOrder;return te!=null?`${X} - 执行顺序 ${te}`:X}const j=x.data.branchLogic||"and",Y=J(j),z=n.data?.branchOrder;return z!=null?`${Y} - 执行顺序 ${z}`:Y}return""},B=()=>{o.edges.forEach(n=>{const x=A(n);n.label!==x&&(n.label=x,n.labelStyle=x?{fill:"#fff",fontWeight:600,fontSize:"11px"}:void 0,n.labelBgStyle=x?{fill:"var(--aiflow-color-brand-primary)",rx:4,ry:4}:void 0,n.labelBgPadding=x?[4,6]:void 0)})},F=()=>{o.nodes.forEach(n=>{if(n.type!=="group")return;const x=n.data.sourceNodeId;if(!x)return;const j=o.nodes.find(Y=>Y.id===x);j?.data?.enableBranch&&j.data.branchLogic!==n.data.branchLogic&&o.updateNodeData(n.id,{branchLogic:j.data.branchLogic||"and"})})};e.watch(()=>o.nodes.filter(n=>g.includes(n.type)).map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic})),(n,x)=>{x&&n.forEach(j=>{const Y=x.find(z=>z.id===j.id);if(Y){if(j.enableBranch&&!Y.enableBranch){const z=o.nodes.find(X=>X.id===j.id);if(!z)return;o.createEmptyGroup({x:z.position.x+200,y:z.position.y-30},z.data.branchLogic||"and",j.id)}else if(!j.enableBranch&&Y.enableBranch){const z=o.nodes.find(X=>X.type==="group"&&X.data.sourceNodeId===j.id);z&&o.dissolveParallelGroup(z.id)}if(j.enableBranch&&Y.branchLogic!==j.branchLogic){const z=o.nodes.find(X=>X.type==="group"&&X.data.sourceNodeId===j.id);z&&o.updateNodeData(z.id,{branchLogic:j.branchLogic})}}})}),e.watch(()=>o.nodes.filter(n=>n.type!=="group").map(n=>({id:n.id,enableBranch:n.data.enableBranch,branchLogic:n.data.branchLogic,branchOrder:n.data.branchOrder})),()=>{B(),F()},{deep:!0}),e.watch(()=>o.edges.map(n=>({id:n.id,branchOrder:n.data?.branchOrder})),(n,x)=>{B(),x&&n.forEach(j=>{const Y=x.find(z=>z.id===j.id);if(Y&&Y.branchOrder!==j.branchOrder&&j.branchOrder!==void 0){const z=o.edges.find(X=>X.id===j.id);if(z){const X=o.nodes.find(te=>te.id===z.source);X&&X.type===b.DATA_SOURCE&&o.updateNodePosition(X.id,{x:X.position.x,y:X.position.y-.001})}}})},{deep:!0}),e.watch(()=>[o.invalidNodeIds,o.invalidEdgeIds],([n,x])=>{o.nodes.forEach(j=>{n.has(j.id)?j.class="invalid-node":j.class==="invalid-node"&&(j.class="")}),o.edges.forEach(j=>{x.has(j.id)?j.class="invalid-edge":j.class==="invalid-edge"&&(j.class="")})},{deep:!0});const W=n=>{n.event?.target?.closest(".vue-flow__handle")||o.selectNode(n.node.id)},h=n=>{o.selectEdge(n.edge.id)},O=n=>{if(D.value){v.ElMessage.warning("算法任务模式下不允许删除连接线");return}o.removeEdge(n.edge.id)},H=()=>{o.clearSelection()},U=({node:n})=>{if(n.type==="group"||!g.includes(n.type))return;const x=o.nodes.filter(Y=>Y.type==="group");let j=null;for(const Y of x){const z=c(Y.id);if(!z)continue;const X=z.dimensions?.width||parseInt(Y.style?.width)||300,te=z.dimensions?.height||parseInt(Y.style?.height)||160;let le=n.position.x,pe=n.position.y;if(n.parentNode){const _e=o.nodes.find(xe=>xe.id===n.parentNode);_e&&(le+=_e.position.x,pe+=_e.position.y)}const I=c(n.id),K=I?.dimensions?.width||160,re=I?.dimensions?.height||60,ce=le+K/2,ge=pe+re/2;if(ce>=Y.position.x&&ce<=Y.position.x+X&&ge>=Y.position.y&&ge<=Y.position.y+te){j=Y.id;break}}j?n.parentNode!==j&&o.addNodeToGroup(n.id,j):n.parentNode&&o.removeNodeFromGroup(n.id)},Z=n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect="move")},R=n=>{n.preventDefault();const x=n.dataTransfer?.getData("application/vueflow");if(!x)return;if(D.value){v.ElMessage.warning("算法任务模式下不允许添加节点");return}if(x===b.START&&o.getNodeCountByType(b.START)>=1){v.ElMessage.warning("工作流只能有一个开始节点");return}if(x===b.END&&o.getNodeCountByType(b.END)>=1){v.ElMessage.warning("工作流只能有一个结束节点");return}const j=160,Y=60,z=t({x:n.clientX,y:n.clientY}),X={x:z.x-j/2,y:z.y-Y/2};let te;switch(x){case b.START:te=Ae(X);break;case b.END:te=Ee(X);break;case b.DATA_SOURCE:te=we(X);break;case b.SMALL_MODEL:te=De(X);break;case b.DETECTION_TARGET:te=Le(X);break;case b.CLASSIFICATION_MODEL:te=Me(X);break;case b.OCR:{const le=C?.value??C;te=V(Oe(X),le?.ocr?.[0]?.inputSchema);break}case b.LICENSE_PLATE:{const le=C?.value??C;te=V(Ie(X),le?.license_plate?.[0]?.inputSchema);break}case b.TARGET_COUNT:te=Re(X);break;case b.TIMER_TARGET:te=$e(X);break;case b.FACE_RECOGNITION:{const le=C?.value??C;te=V(Fe(X),le?.face?.faceParams?.[0]?.inputSchema);break}default:return}o.addNode(te),v.ElMessage.success("节点已添加")};return(n,x)=>(e.openBlock(),e.createElementBlock("div",en,[e.createVNode(e.unref(ee.VueFlow),{nodes:d.value,"onUpdate:nodes":x[0]||(x[0]=j=>d.value=j),edges:m.value,"onUpdate:edges":x[1]||(x[1]=j=>m.value=j),"node-types":e.unref($),onNodesChange:i,onEdgesChange:k,onConnect:E,onNodeClick:W,onEdgeClick:h,onEdgeDoubleClick:O,onPaneClick:H,onDrop:R,onDragover:Z,onNodeDragStop:U,"snap-to-grid":!0,"snap-grid":[15,15],"default-zoom":1,"min-zoom":.2,"max-zoom":4},{default:e.withCtx(()=>[e.createVNode(e.unref(tt.Background),{"pattern-color":"#aaa",gap:16,variant:"dots"}),e.createVNode(e.unref(ot.Controls))]),_:1},8,["nodes","edges","node-types"]),e.createVNode(vo,{visible:r.visible,position:r.screenPos,"source-node-type":r.sourceNodeType,onSelect:w,onClose:N},null,8,["visible","position","source-node-type"])]))}},[["__scopeId","data-v-cf0301e9"]]),on={class:"config-header"},nn={key:0,class:"config-section"},an={key:1,class:"config-section"},ln=ne({__name:"EdgeConfig",setup(a){const o=ae(),t=e.inject("editorMode",oe.ALGORITHM),c=e.computed(()=>t===oe.TASK),_=e.computed(()=>{const M=o.selectedEdge;return M&&o.nodes.find(S=>S.id===M.source)?.data?.enableBranch?M:null}),l=e.computed(()=>_.value&&o.nodes.find(y=>y.id===_.value.source)?.type==="start"?"多数据源分支配置":"分支配置"),C=e.computed(()=>{if(!_.value)return!1;const M=o.nodes.find(y=>y.id===_.value.source);return(M?.type==="dataSource"||M?.type==="start")&&M?.data?.enableBranch}),T=e.computed(()=>{if(!_.value)return 1;const M=o.nodes.find(y=>y.id===_.value.source);return M?o.edges.filter(y=>y.source===M.id).length:1}),D=e.computed(()=>{if(!_.value)return!1;const M=o.nodes.find(y=>y.id===_.value.source);return M?M.type==="dataSource"&&M.data?.enableImageSequence===!0&&_.value.sourceHandle!=="first-frame":!1}),G=M=>{_.value&&o.updateEdgeData(_.value.id,M)};return(M,y)=>{const S=e.resolveComponent("el-divider"),V=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-text"),N=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form"),L=e.resolveComponent("el-option"),P=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",on,[e.createElementVNode("h3",null,e.toDisplayString(l.value),1)]),e.createVNode(S),D.value?(e.openBlock(),e.createElementBlock("div",nn,[y[3]||(y[3]=e.createElementVNode("h4",null,"后续检测帧的持续时间",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"后续检测帧的持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(V,{"model-value":_.value?.data?.timeWindowSeconds??null,onChange:y[0]||(y[0]=f=>G({timeWindowSeconds:f})),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(()=>[...y[2]||(y[2]=[e.createTextVNode(" 后续帧检测需要持续的时间(必填) ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0),C.value?(e.openBlock(),e.createElementBlock("div",an,[y[5]||(y[5]=e.createElementVNode("h4",null,"分支顺序",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"执行顺序"},{default:e.withCtx(()=>[e.createVNode(P,{"model-value":_.value?.data?.branchOrder??null,disabled:c.value,onChange:y[1]||(y[1]=f=>G({branchOrder:f})),style:{width:"100%"},placeholder:"请选择执行顺序",clearable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,f=>(e.openBlock(),e.createBlock(L,{key:f,label:`执行顺序 ${f}`,value:f},null,8,["label","value"]))),128))]),_:1},8,["model-value","disabled"]),e.createVNode(r,{size:"small",type:"info",style:{"margin-top":"4px",display:"block"}},{default:e.withCtx(()=>[...y[4]||(y[4]=[e.createTextVNode(" 系统会根据连接顺序自动分配执行顺序,数字越小越先执行。可手动调整顺序 ",-1)])]),_:1})]),_:1})]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-61177f45"]]),rn={class:"config-section"},sn=ne({__name:"GroupNodeConfig",setup(a){return(o,t)=>{const c=e.resolveComponent("el-divider"),_=e.resolveComponent("el-text");return e.openBlock(),e.createElementBlock("div",null,[t[1]||(t[1]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"并行组")],-1)),e.createVNode(c),e.createElementVNode("div",rn,[e.createVNode(_,{type:"info",size:"small"},{default:e.withCtx(()=>[...t[0]||(t[0]=[e.createTextVNode("并行组由系统自动管理,断开连接后自动解散。",-1)])]),_:1})])])}}},[["__scopeId","data-v-60b47589"]]),cn={class:"time-init-container"},dn={key:0,class:"time-header flex-x-start"},mn={class:"tab-type flex-x"},pn={class:"time-content"},un={id:"time-content-table-body"},fn=["onClick"],gn=["onClick"],hn=["data-sort","data-value","data-day","data-type","onMousedown"],yn={key:1},_n=["data-sort","data-value","data-type","onMousedown"],Nn={class:"time-list"},Cn={key:0,class:"time-list-title"},kn={key:1,style:{"margin-right":"10px"}},bn=ne({__name:"TimeInit",props:{operationType:{type:Number,default:1}},setup(a,{expose:o}){const t=a,c=e.ref(0);let _,l,C,T,D;const G=e.ref(new Map),M=e.ref(new Map),y=e.computed(()=>c.value===0?G.value:M.value);e.onMounted(()=>{_=document.querySelector("#time-content-table-body"),l=_.querySelectorAll("td.sel-able[data-type]"),t.operationType!=3&&document.body.addEventListener("mouseup",s)}),e.onBeforeUnmount(()=>{t.operationType!=3&&document.body.removeEventListener("mouseup",s)});const S=i=>{c.value!==i&&(c.value=i,e.nextTick(()=>{l=_.querySelectorAll("td.sel-able[data-type]"),l.forEach(E=>E.classList.remove("selected")),(i===0?G.value:M.value).forEach((E,J)=>{E.origin.forEach(A=>{Array.from(l).forEach(B=>{Number(B.dataset.sort)==A.sort&&Number(B.dataset.value)==A.value&&Number(B.dataset.day)==J&&B.classList.add("selected")})})})}))},V=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=(i,k,E)=>{t.operationType!=3&&E.which==1&&(T=i,C=Number(E.target.dataset.value),E.target.classList.contains("selected")?(E.target.classList.remove("selected"),D=""):(D="selected",E.target.classList.add("selected")),N(),p())},N=()=>{l.forEach(i=>{i.addEventListener("mouseover",L,!1,{once:!0})})},s=()=>{l.forEach(i=>{i.removeEventListener("mouseover",L)})},L=i=>{i.target.classList.remove("selected"),D&&i.target.classList.add(D);let k=Number(i.target.dataset.value),E=Number(i.target.dataset.day),J=E>T?E:T,A=E<T?E:T,B=k>C?k:C,F=k<C?k:C;for(let W=A;W<=J;W++)for(let h=F;h<=B;h++){let O=document.querySelector(`td[data-value="${h}"][data-day="${W}"]`);O.classList.remove("selected"),D&&O.classList.add(D)}p()},P=i=>{if(t.operationType==3)return;let k=[];l.forEach(E=>{Number(E.dataset.day)==i&&k.push(E)}),k.find(E=>!E.classList.contains("selected"))?k.forEach(E=>E.classList.add("selected")):k.forEach(E=>E.classList.remove("selected")),p()},f=i=>{if(t.operationType==3)return;let k=[];l.forEach(E=>{Number(E.dataset.sort)==i&&k.push(E)}),k.find(E=>!E.classList.contains("selected"))?k.forEach(E=>E.classList.add("selected")):k.forEach(E=>E.classList.remove("selected")),p()},q=()=>{l.forEach(k=>{k.classList.remove("selected")}),(c.value===0?G:M).value.clear()},p=()=>{const i=c.value===0?G:M;i.value.clear(),l.forEach(k=>{if(k.classList.contains("selected")){let E=k.dataset.day,J=k.dataset.sort,A=k.dataset.value;i.value.get(E)?i.value.get(E).origin.push({sort:Number(J),value:Number(A)}):i.value.set(E,{origin:[{sort:Number(J),value:Number(A)}],timeList:[]})}})},w=i=>{let J=y.value.get(i).origin.map(A=>A.value).reduce((A,B,F,W)=>(F==0?A.push([B]):B==W[F-1]+1?A[A.length-1].push(B):A.push([B]),A),[]);return J=J.map(A=>{let B=Math.max(...A)+1,F=Math.min(...A)+1,W=F%2==0?30:0,h=B%2==0?0:30,O=g(Math.ceil(F/2)-1),H=g(Math.ceil(B/2)-(h==0?0:1));return{dayType:i,startTime:O+":"+(W==0?"00":W),endTime:H+":"+(h==0?"00":h)}}),y.value.get(i).timeList=J,J.map(A=>A.startTime+"-"+A.endTime).join()};function g(i){return i<10?"0"+i:i}const u=(i,k)=>{G.value.clear(),M.value.clear(),l.forEach(B=>B.classList.remove("selected")),c.value=k;const E=k===0?G:M,J=JSON.parse(i);let A=[];J.plan.forEach(B=>{B.timePeriod.forEach(F=>{A.push({...F,dayType:B.dayType})})}),e.nextTick(()=>{l=_.querySelectorAll("td.sel-able[data-type]"),A.forEach(B=>{E.value.get(B.dayType)?E.value.get(B.dayType).timeList.push(B):E.value.set(B.dayType,{origin:[],timeList:[{...B}]})}),E.value.forEach((B,F)=>{B.timeList.forEach(W=>{let h=Number(W.startTime.split(":")[1]),O=Number(W.endTime.split(":")[1]),H=Number(W.startTime.split(":")[0]),U=Number(W.endTime.split(":")[0]);if(H==U){B.origin.push({sort:H,value:2*H});return}for(let Z=H;Z<=U;Z++)if(Z==H)h==0?(B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1})):B.origin.push({sort:Z,value:2*Z+1});else if(Z>H&&Z<U)B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1});else if(O==0){if(Z==U)return;B.origin.push({sort:Z,value:2*Z}),B.origin.push({sort:Z,value:2*Z+1})}else B.origin.push({sort:Z,value:2*Z})}),B.origin.forEach(W=>{Array.from(l).find(h=>{Number(h.dataset.sort)==W.sort&&Number(h.dataset.value)==W.value&&Number(h.dataset.day)==F&&h.classList.add("selected")})})})})},$=(i,k)=>i.map(A=>A.value).sort((A,B)=>A-B).reduce((A,B,F,W)=>(F==0?A.push([B]):B==W[F-1]+1?A[A.length-1].push(B):A.push([B]),A),[]).map(A=>{let B=Math.max(...A)+1,F=Math.min(...A)+1,W=F%2==0?30:0,h=B%2==0?0:30,O=g(Math.ceil(F/2)-1),H=g(Math.ceil(B/2)-(h==0?0:1));return{dayType:k,startTime:O+":"+(W==0?"00":W),endTime:H+":"+(h==0?"00":h)}});return o({getTimeData:()=>{(c.value===0?M:G).value.clear();let k=[];y.value.forEach((A,B)=>{const F=$(A.origin,B);k=k.concat(F)});let E={plan:[]},J=k.map(A=>A.dayType).filter((A,B,F)=>F.indexOf(A)===B);return J.length?(J.forEach(A=>{E.plan.push({dayType:A,timePeriod:k.filter(B=>B.dayType===A).map(B=>({startTime:B.startTime,endTime:B.endTime}))})}),{validTime:!0,timeZone:JSON.stringify(E),planType:c.value}):{validTime:!1}},revertByTime:u,resetFn:()=>{c.value=0,G.value.clear(),M.value.clear(),e.nextTick(()=>{l.forEach(i=>{i.classList.remove("selected")}),l=_.querySelectorAll("td.sel-able[data-type]")})}}),(i,k)=>{const E=e.resolveComponent("el-icon"),J=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",cn,[a.operationType!=3?(e.openBlock(),e.createElementBlock("div",dn,[e.createElementVNode("div",mn,[e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==0}]),onClick:k[0]||(k[0]=A=>S(0))}," 周计划 ",2),e.createElementVNode("div",{class:e.normalizeClass(["type",{active:c.value==1}]),onClick:k[1]||(k[1]=A=>S(1))}," 日计划 ",2)]),e.createVNode(J,{class:"rm-icon",link:"",type:"danger",onClick:q},{default:e.withCtx(()=>[e.createVNode(E,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Delete))]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createElementVNode("div",pn,[e.createElementVNode("table",{class:"time-content-table",onContextmenu:k[3]||(k[3]=A=>A.preventDefault())},[k[5]||(k[5]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th"),e.createElementVNode("th",{colspan:"24"},"上午"),e.createElementVNode("th",{colspan:"24"},"下午")])],-1)),e.createElementVNode("tbody",un,[e.createElementVNode("tr",null,[k[4]||(k[4]=e.createElementVNode("th",null,null,-1)),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(24,A=>e.createElementVNode("td",{class:"sel-able",colspan:"2",onClick:B=>f(A-1)},e.toDisplayString(A-1),9,fn)),64))]),c.value==0?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:0},e.renderList(V.value.filter(A=>A.value!=0),A=>(e.openBlock(),e.createElementBlock("tr",null,[e.createElementVNode("th",{onClick:B=>P(A.value)},e.toDisplayString(A.name),9,gn),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,B=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((B-1)/2),"data-value":B-1,"data-day":A.value,"data-type":c.value,onMousedown:F=>r(A.value,B,F)},null,40,hn)),64))]))),256)):e.createCommentVNode("",!0),c.value==1?(e.openBlock(),e.createElementBlock("tr",yn,[e.createElementVNode("th",{onClick:k[2]||(k[2]=A=>P(0))},"每日"),(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(48,A=>e.createElementVNode("td",{class:"sel-able","data-sort":parseInt((A-1)/2),"data-value":A-1,"data-day":0,"data-type":c.value,onMousedown:B=>r(0,A,B)},null,40,_n)),64))])):e.createCommentVNode("",!0)])],32)]),e.createElementVNode("div",Nn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(y.value.keys(),A=>(e.openBlock(),e.createElementBlock("div",null,[c.value==0?(e.openBlock(),e.createElementBlock("span",Cn,[k[6]||(k[6]=e.createElementVNode("span",null,"星期",-1)),e.createTextVNode(" "+e.toDisplayString(V.value.find(B=>B.value==A).name),1)])):(e.openBlock(),e.createElementBlock("span",kn,e.toDisplayString(V.value.find(B=>B.value==A).name),1)),e.createTextVNode(" ("+e.toDisplayString(w(A))+") ",1)]))),256))])])}}},[["__scopeId","data-v-fd17fb3f"]]),xn={class:"time-template-dialog"},En={class:"time-editor-panel"},wn=ne({__name:"TimeTemplateDialog",props:{modelValue:{type:Object,default:()=>({timeTemplateId:"",timeTemplateName:"",schedule:[]})}},emits:["update:modelValue"],setup(a,{expose:o,emit:t}){const c=a,_=t,l=e.ref(null),C=e.ref(""),T=e.ref(""),D=e.ref(c.modelValue?.timeTemplateName||""),G=e.ref([]);return e.computed(()=>C.value?G.value.filter(S=>S.name.toLowerCase().includes(C.value.toLowerCase())):G.value),e.watch(D,S=>{_("update:modelValue",{...c.modelValue,timeTemplateName:S})}),o({getFormData:()=>{const S=l.value?.getTimeData();return{timeTemplateId:T.value,timeTemplateName:D.value,...S}},revertByTime:(S,V)=>{l.value?.revertByTime(S,V)}}),(S,V)=>(e.resolveComponent("el-icon"),e.resolveComponent("el-input"),e.resolveComponent("el-button"),e.resolveComponent("el-form-item"),e.resolveComponent("el-form"),e.openBlock(),e.createElementBlock("div",xn,[e.createCommentVNode("",!0),e.createElementVNode("div",En,[e.createCommentVNode("",!0),e.createVNode(bn,{ref_key:"timeInitRef",ref:l},null,512)])]))}},[["__scopeId","data-v-a39aee75"]]),Tn={class:"config-section"},Sn={key:0,class:"config-section"},Vn={key:0,style:{"font-size":"12px",color:"var(--el-color-info)","margin-top":"4px"}},Bn={class:"config-section"},An=ne({__name:"StartNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("echoAlgodata",null),C=e.computed(()=>{const V=l?.value??l,N=(V?.graph??V)?.ruleSchema?.sourceGroups??[];if(N.some(P=>P.streamConfig))return{value:"stream",locked:!0,reason:"算法含小模型节点,固定为视频流"};const s=N.length>1,L=N.some(P=>(P.children??[]).length>1);return s||L?{value:"image",locked:!0,reason:"算法含多数据源或多分支,固定为图片流"}:{value:null,locked:!1,reason:""}});e.watch(C,V=>{V.locked&&t.value&&o.updateNodeData(t.value.id,{streamType:V.value})},{immediate:!0});const T=e.ref(!1),D=e.ref(null),G=()=>{const V=D.value?.getFormData();if(V?.validTime){const N=(JSON.parse(V.timeZone)?.plan??[]).map(s=>({dayType:String(s.dayType),timePeriod:s.timePeriod.map(L=>({startTime:L.startTime,endTime:L.endTime}))}));o.updateNodeData(t.value.id,{executionTime:V.timeZone,schedule:N,timeZone:V.timeZone,planType:V.planType??0})}else o.updateNodeData(t.value.id,{executionTime:"",schedule:[],timeZone:"",planType:0});T.value=!1},M=()=>{const V=t.value?.data;V?.timeZone&&D.value?.revertByTime(V.timeZone,V.planType??0)},y=e.computed(()=>t.value?o.edges.filter(r=>r.source===t.value.id).length>=2:!1),S=V=>{t.value&&o.updateNodeData(t.value.id,{algorithmName:V})};return(V,r)=>{const N=e.resolveComponent("el-divider"),s=e.resolveComponent("el-input"),L=e.resolveComponent("el-form-item"),P=e.resolveComponent("el-form"),f=e.resolveComponent("el-option"),q=e.resolveComponent("el-select"),p=e.resolveComponent("el-switch"),w=e.resolveComponent("el-button"),g=e.resolveComponent("el-dialog"),u=e.resolveComponent("el-icon"),$=e.resolveComponent("el-tooltip"),d=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(N),e.createElementVNode("div",Tn,[r[9]||(r[9]=e.createElementVNode("h4",null,"算法信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"算法名称",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.algorithmName,disabled:_.value,onInput:r[0]||(r[0]=m=>S(m)),placeholder:"请输入算法名称",maxlength:"50","show-word-limit":""},null,8,["model-value","disabled"])]),_:1})]),_:1})]),_.value?(e.openBlock(),e.createElementBlock("div",Sn,[r[10]||(r[10]=e.createElementVNode("h4",null,"任务信息",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"任务名称",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.taskName,onInput:r[1]||(r[1]=m=>e.unref(o).updateNodeData(t.value.id,{taskName:m})),placeholder:"请输入任务名称",maxlength:"50","show-word-limit":""},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务数据流"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":C.value.locked?C.value.value:t.value?.data.streamType||"image",disabled:C.value.locked,onChange:r[2]||(r[2]=m=>e.unref(o).updateNodeData(t.value.id,{streamType:m})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"图片流",value:"image"}),e.createVNode(f,{label:"视频流",value:"stream"})]),_:1},8,["model-value","disabled"]),C.value.locked?(e.openBlock(),e.createElementBlock("div",Vn,e.toDisplayString(C.value.reason),1)):e.createCommentVNode("",!0)]),_:1}),e.createVNode(L,{label:"开启告警短视频"},{default:e.withCtx(()=>[e.createVNode(p,{"model-value":t.value?.data.enableAlertVideo,onChange:r[3]||(r[3]=m=>e.unref(o).updateNodeData(t.value.id,{enableAlertVideo:m}))},null,8,["model-value"])]),_:1}),e.createVNode(L,{label:"任务执行时间",required:""},{default:e.withCtx(()=>[e.createVNode(s,{"model-value":t.value?.data.timeZone?"已设置执行时段":"请选择执行时段",readonly:"",onClick:r[4]||(r[4]=m=>T.value=!0),style:{cursor:"pointer"}},null,8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),e.createVNode(g,{modelValue:T.value,"onUpdate:modelValue":r[6]||(r[6]=m=>T.value=m),title:"执行时段",width:"1200px","append-to-body":"",onOpened:M},{footer:e.withCtx(()=>[e.createVNode(w,{onClick:r[5]||(r[5]=m=>T.value=!1)},{default:e.withCtx(()=>[...r[11]||(r[11]=[e.createTextVNode("取消",-1)])]),_:1}),e.createVNode(w,{type:"primary",onClick:G},{default:e.withCtx(()=>[...r[12]||(r[12]=[e.createTextVNode("确认",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(wn,{ref_key:"timeTemplateRef",ref:D},null,512)]),_:1},8,["modelValue"]),e.createElementVNode("div",Bn,[r[14]||(r[14]=e.createElementVNode("h4",null,"多数据源配置",-1)),e.createVNode(P,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(L,{label:"多数据源关系"},{default:e.withCtx(()=>[e.createVNode(q,{"model-value":t.value?.data.branchLogic||"and",disabled:_.value,onChange:r[7]||(r[7]=m=>e.unref(o).updateNodeData(t.value.id,{branchLogic:m})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(f,{label:"ALL(满足所有数据源)",value:"and"}),e.createVNode(f,{label:"SOME(满足至少一个数据源)",value:"or"})]),_:1},8,["model-value","disabled"])]),_:1}),y.value?(e.openBlock(),e.createBlock(L,{key:0},{label:e.withCtx(()=>[r[13]||(r[13]=e.createElementVNode("span",null,"多数据协同检测等待时间(秒)",-1)),e.createVNode($,{content:"等待接收多数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",placement:"top"},{default:e.withCtx(()=>[e.createVNode(u,{style:{"margin-left":"4px",color:"var(--aiflow-color-text-tertiary)",cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(d,{"model-value":t.value?.data.groupWindowSeconds??5,onChange:r[8]||(r[8]=m=>e.unref(o).updateNodeData(t.value.id,{groupWindowSeconds:m})),min:1,max:3600,step:1,style:{width:"100%"}},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-40d5bdc3"]]),Dn={detectionTarget:"detection",classificationModel:"classification",ocr:"ocr",face:"face",faceRecognition:"face",licensePlate:"licensePlate",dataSource:"stream",smallModel:"small",end:"end"},Ln=["smallModel","detectionTarget"],Se=()=>({schemaLoading:e.ref(!1),getToolType:l=>Dn[l]||null,needsToolSelection:l=>Ln.includes(l),fetchToolSchema:async(l,C="")=>(console.warn("fetchToolSchema is deprecated, use editorConfig instead"),null),fetchSchemaForNodeType:async(l,C="")=>(console.warn("fetchSchemaForNodeType is deprecated, use editorConfig instead"),null)}),Mn={key:0,class:"config-section"},On={key:3,class:"array-input"},In={key:1,class:"config-section"},Rn=ne({__name:"EndNodeConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),{schemaLoading:c,fetchSchemaForNodeType:_}=Se(),l=e.computed(()=>{if(!t.value)return[];const y=t.value.data.input_schema||t.value.data.inputSchema;if(!y||!y.properties)return[];const S=y.required||[];return Object.entries(y.properties).map(([V,r])=>({key:V,type:r.type,label:r.title||r.label||r.description||V,description:r.description||"",default:r.default,required:S.includes(V)||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}))}),C=y=>{if(t.value)return t.value.data.arguments?.[y]},T=(y,S)=>{if(!t.value)return;const r={...t.value.data.arguments||{},[y]:S};o.updateNodeData(t.value.id,{arguments:r})},D=y=>{if(!y.dependsOn||!t.value)return!0;const{field:S,value:V}=y.dependsOn,r=C(S);if(typeof V=="string"&&V.startsWith("!")){const N=V.substring(1);return r!==N}return Array.isArray(V)?V.includes(r):r===V},G=y=>{const S=C(y);return Array.isArray(S)?JSON.stringify(S):""},M=(y,S)=>{try{const V=JSON.parse(S);Array.isArray(V)&&T(y,V)}catch{}};return e.watch(()=>t.value?.id,async y=>{if(!y||!t.value)return;const S=t.value.type,V=t.value.data,r=V.input_schema||V.inputSchema;if(r&&r.properties&&Object.keys(r.properties).length>0)return;const N=await _(S);if(!N)return;const s=t.value?.data;s&&o.updateNodeData(t.value.id,{...s,input_schema:N.inputSchema,extraConfig:N.extraConfig,arguments:{...N.arguments,...s.arguments}})},{immediate:!0}),(y,S)=>{const V=e.resolveComponent("el-divider"),r=e.resolveComponent("el-icon"),N=e.resolveComponent("el-tooltip"),s=e.resolveComponent("el-option"),L=e.resolveComponent("el-select"),P=e.resolveComponent("el-switch"),f=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-input"),p=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[S[2]||(S[2]=e.createElementVNode("div",{class:"config-header"},[e.createElementVNode("h3",null,"节点配置")],-1)),e.createVNode(V),l.value.length>0?(e.openBlock(),e.createElementBlock("div",Mn,[S[0]||(S[0]=e.createElementVNode("h4",null,"告警上报配置",-1)),e.createVNode(w,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,g=>e.withDirectives((e.openBlock(),e.createBlock(p,{key:g.key,required:g.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(g.label),1),g.description?(e.openBlock(),e.createBlock(N,{key:0,content:g.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(r,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[g.options&&g.type==="string"?(e.openBlock(),e.createBlock(L,{key:0,"model-value":C(g.key),onChange:u=>T(g.key,u),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(u,$)=>(e.openBlock(),e.createBlock(s,{key:u,label:g.optionLabels?g.optionLabels[$]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):g.type==="boolean"?(e.openBlock(),e.createBlock(P,{key:1,"model-value":C(g.key),onChange:u=>T(g.key,u)},null,8,["model-value","onChange"])):g.type==="number"||g.type==="integer"?(e.openBlock(),e.createBlock(f,{key:2,"model-value":C(g.key),onChange:u=>T(g.key,u),min:g.min,max:g.max,step:g.step||(g.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step"])):g.type==="array"&&!g.options?(e.openBlock(),e.createElementBlock("div",On,[e.createVNode(q,{"model-value":G(g.key),onChange:u=>M(g.key,u),type:"textarea",rows:3,placeholder:g.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):g.type==="array"&&g.options?(e.openBlock(),e.createBlock(L,{key:4,"model-value":C(g.key),onChange:u=>T(g.key,u),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.options,(u,$)=>(e.openBlock(),e.createBlock(s,{key:u,label:g.optionLabels?g.optionLabels[$]:u,value:u},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(q,{key:5,"model-value":C(g.key),onInput:u=>T(g.key,u),maxlength:g.maxLength,"show-word-limit":!!g.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!g.dependsOn||D(g)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(c)&&l.value.length===0?(e.openBlock(),e.createElementBlock("div",In,[...S[1]||(S[1]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-8a2e6388"]]),$n={class:"config-header"},Fn={class:"config-section"},qn={key:0,style:{"margin-top":"8px",color:"var(--el-text-color-secondary)","font-size":"12px"}},Gn={key:0,class:"config-section"},Hn={key:3,class:"array-input"},jn={key:1,class:"config-section"},Pn={key:2,class:"config-section"},zn=ne({__name:"ClassificationModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("editorConfig",null),C=e.computed(()=>(l?.value??l)?.classification?.models??[]),T=e.computed(()=>(l?.value??l)?.classification?.modelParams??null),D=e.ref([]),G=e.ref(!1),M=e.computed({get:()=>t.value?.data.arguments?.modelId||null,set:p=>{t.value&&p&&s("modelId",p)}}),y=()=>{D.value=C.value},S=async p=>{if(!t.value||!p)return;const w=D.value.find(d=>d.id===p);if(!w)return;const g=t.value?.data;if(!g)return;const u=w.inputSchema||w.input_schema||T.value?.inputSchema||{},$={};u.properties&&Object.entries(u.properties).forEach(([d,m])=>{m.default!==void 0&&($[d]=m.default)}),o.updateNodeData(t.value.id,{...g,input_schema:u,extraConfig:w.extraConfig||null,arguments:{...$,modelId:w.id,modelName:w.name}})},V=()=>{t.value&&o.updateNodeData(t.value.id,{arguments:{},input_schema:{},extraConfig:null})},r=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const w=p.required||[];return Object.entries(p.properties).map(([g,u])=>({key:g,type:u.type,label:u.title||u.label||u.description||g,description:u.description||"",default:u.default,required:w.includes(g)||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,sort:u.sort,hidden:u["x-hidden"]||!1})).filter(g=>!g.hidden).sort((g,u)=>(g.sort??1/0)-(u.sort??1/0))}),N=p=>{if(t.value)return t.value.data.arguments?.[p]},s=(p,w)=>{if(!t.value)return;const u={...t.value.data.arguments||{},[p]:w};o.updateNodeData(t.value.id,{arguments:u})},L=p=>{if(!p.dependsOn||!t.value)return!0;const{field:w,value:g}=p.dependsOn,u=N(w);if(typeof g=="string"&&g.startsWith("!")){const $=g.substring(1);return u!==$}return Array.isArray(g)?g.includes(u):u===g},P=p=>{const w=N(p);return Array.isArray(w)?JSON.stringify(w):""},f=(p,w)=>{try{const g=JSON.parse(w);Array.isArray(g)&&s(p,g)}catch{}},q=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async p=>{if(!p||!t.value)return;D.value.length===0&&y();const w=t.value.data,g=w.input_schema||w.inputSchema,u=w.arguments?.modelId;if(u&&g&&g.properties&&Object.keys(g.properties).length>0||!u)return;const $=D.value.find(k=>k.id===u);if(!$)return;const d=$.inputSchema||$.input_schema||T.value?.inputSchema||{},m={};d.properties&&Object.entries(d.properties).forEach(([k,E])=>{E.default!==void 0&&(m[k]=E.default)});const i=t.value?.data;i&&o.updateNodeData(t.value.id,{...i,input_schema:d,extraConfig:$.extraConfig||null,arguments:{...m,...i.arguments}})},{immediate:!0}),(p,w)=>{const g=e.resolveComponent("el-button"),u=e.resolveComponent("el-divider"),$=e.resolveComponent("el-option"),d=e.resolveComponent("el-select"),m=e.resolveComponent("el-form-item"),i=e.resolveComponent("el-form"),k=e.resolveComponent("el-icon"),E=e.resolveComponent("el-tooltip"),J=e.resolveComponent("el-switch"),A=e.resolveComponent("el-input-number"),B=e.resolveComponent("el-input");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",$n,[w[1]||(w[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",Fn,[w[2]||(w[2]=e.createElementVNode("h4",null,"选择模型",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(m,{label:"模型",required:""},{default:e.withCtx(()=>[e.createVNode(d,{modelValue:M.value,"onUpdate:modelValue":w[0]||(w[0]=F=>M.value=F),filterable:"",clearable:"",placeholder:"请选择模型",style:{width:"100%"},loading:G.value,disabled:_.value,onChange:S,onClear:V},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,F=>(e.openBlock(),e.createBlock($,{key:F.id,label:F.name,value:F.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading","disabled"]),D.value.length===0&&!G.value?(e.openBlock(),e.createElementBlock("div",qn," 暂无可用模型 ")):e.createCommentVNode("",!0)]),_:1})]),_:1})]),M.value&&r.value.length>0?(e.openBlock(),e.createElementBlock("div",Gn,[w[3]||(w[3]=e.createElementVNode("h4",null,"分类模型参数",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,F=>e.withDirectives((e.openBlock(),e.createBlock(m,{key:F.key,required:F.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(F.label),1),F.description?(e.openBlock(),e.createBlock(E,{key:0,content:F.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(k,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[F.options&&F.type==="string"?(e.openBlock(),e.createBlock(d,{key:0,"model-value":N(F.key),disabled:_.value&&F.key!=="threshold",onChange:W=>s(F.key,W),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(W,h)=>(e.openBlock(),e.createBlock($,{key:W,label:F.optionLabels?F.optionLabels[h]:W,value:W},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):F.type==="boolean"?(e.openBlock(),e.createBlock(J,{key:1,"model-value":N(F.key),disabled:_.value&&F.key!=="threshold",onChange:W=>s(F.key,W)},null,8,["model-value","disabled","onChange"])):F.type==="number"||F.type==="integer"?(e.openBlock(),e.createBlock(A,{key:2,"model-value":N(F.key),disabled:_.value&&F.key!=="threshold",onChange:W=>s(F.key,W),min:F.min,max:F.max,step:F.step||(F.type==="integer"?1:.1),style:{width:"100%"}},null,8,["model-value","disabled","onChange","min","max","step"])):F.type==="array"&&!F.options?(e.openBlock(),e.createElementBlock("div",Hn,[e.createVNode(B,{"model-value":P(F.key),disabled:_.value&&F.key!=="threshold",onChange:W=>f(F.key,W),type:"textarea",rows:3,placeholder:F.description||"输入JSON数组"},null,8,["model-value","disabled","onChange","placeholder"])])):F.type==="array"&&F.options?(e.openBlock(),e.createBlock(d,{key:4,"model-value":N(F.key),disabled:_.value&&F.key!=="threshold",onChange:W=>s(F.key,W),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(F.options,(W,h)=>(e.openBlock(),e.createBlock($,{key:W,label:F.optionLabels?F.optionLabels[h]:W,value:W},null,8,["label","value"]))),128))]),_:2},1032,["model-value","disabled","onChange"])):(e.openBlock(),e.createBlock(B,{key:5,"model-value":N(F.key),disabled:_.value&&F.key!=="threshold",onInput:W=>s(F.key,W),maxlength:F.maxLength,"show-word-limit":!!F.maxLength},null,8,["model-value","disabled","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!F.dependsOn||L(F)]])),128))]),_:1})])):e.createCommentVNode("",!0),M.value&&G.value&&r.value.length===0?(e.openBlock(),e.createElementBlock("div",jn,[...w[4]||(w[4]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0),!M.value&&!G.value?(e.openBlock(),e.createElementBlock("div",Pn,[...w[5]||(w[5]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 请先选择模型 ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5103b9a3"]]),Un={class:"config-header"},Wn={class:"config-section"},Jn=ne({__name:"OcrConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("editorConfig",null),C=e.computed(()=>(l?.value??l)?.ocr?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(M,y)=>{if(!t.value)return;const S=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...S,[M]:y}})},G=()=>{t.value&&v.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 y=C.value,S=t.value.data.arguments||{},V={};y?.properties&&Object.entries(y.properties).forEach(([r,N])=>{N.default!==void 0&&(V[r]=N.default)}),o.updateNodeData(t.value.id,{arguments:{...V,...S}})},{immediate:!0}),(M,y)=>{const S=e.resolveComponent("el-button"),V=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),N=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Un,[y[1]||(y[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:G},null,8,["icon"]))]),e.createVNode(V),e.createElementVNode("div",Wn,[y[2]||(y[2]=e.createElementVNode("h4",null,"OCR识别参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":T.value,onChange:y[0]||(y[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-583b9f13"]]),Yn={class:"config-header"},Xn={class:"config-section"},Qn=ne({__name:"LicensePlateConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("editorConfig",null),C=e.computed(()=>(l?.value??l)?.license_plate?.[0]?.inputSchema??null),T=e.computed(()=>t.value?.data.arguments?.threshold??.5),D=(M,y)=>{if(!t.value)return;const S=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...S,[M]:y}})},G=()=>{t.value&&v.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 y=C.value,S=t.value.data.arguments||{},V={};y?.properties&&Object.entries(y.properties).forEach(([r,N])=>{N.default!==void 0&&(V[r]=N.default)}),o.updateNodeData(t.value.id,{arguments:{...V,...S}})},{immediate:!0}),(M,y)=>{const S=e.resolveComponent("el-button"),V=e.resolveComponent("el-divider"),r=e.resolveComponent("el-input-number"),N=e.resolveComponent("el-form-item"),s=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Yn,[y[1]||(y[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:G},null,8,["icon"]))]),e.createVNode(V),e.createElementVNode("div",Xn,[y[2]||(y[2]=e.createElementVNode("h4",null,"车牌识别参数",-1)),e.createVNode(s,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(N,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(r,{"model-value":T.value,onChange:y[0]||(y[0]=L=>D("threshold",L)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-8c4d3477"]]),Kn={class:"config-header"},Zn={class:"config-section"},vn={key:0,class:"config-section"},Qe=ne({__name:"FaceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("editorConfig",null),C=e.computed(()=>(l?.value??l)?.face?.faceRepos??[]),T=e.ref(null),D=e.computed(()=>({repositoryId:S.value})),G={repositoryId:[{required:!0,message:"请选择人脸库",trigger:"change"}]},M=e.computed(()=>t.value?.data.arguments?.threshold??.5),y=N=>t.value?.data.arguments?.[N],S=e.computed(()=>{const N=y("repositoryId");return N?Array.isArray(N)?N:[N]:[]}),V=(N,s)=>{if(!t.value)return;const L=t.value.data.arguments||{};o.updateNodeData(t.value.id,{arguments:{...L,[N]:s}})},r=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,N=>{if(!N||!t.value)return;const L=(l?.value??l)?.face?.faceParams?.[0]?.inputSchema??null,P=t.value.data.arguments||{},f={};L?.properties&&Object.entries(L.properties).forEach(([q,p])=>{p.default!==void 0&&(f[q]=p.default)}),o.updateNodeData(t.value.id,{arguments:{...f,...P}})},{immediate:!0}),(N,s)=>{const L=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-form-item"),p=e.resolveComponent("el-form"),w=e.resolveComponent("el-option"),g=e.resolveComponent("el-select");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Kn,[s[2]||(s[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",Zn,[s[3]||(s[3]=e.createElementVNode("h4",null,"人脸识别参数",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"检测阈值"},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":M.value,onChange:s[0]||(s[0]=u=>V("threshold",u)),min:0,max:1,step:.01,precision:2,style:{width:"100%"}},null,8,["model-value"])]),_:1})]),_:1})]),e.unref(c)==="task"?(e.openBlock(),e.createElementBlock("div",vn,[s[4]||(s[4]=e.createElementVNode("h4",null,"人脸库选择",-1)),e.createVNode(p,{model:D.value,rules:G,ref_key:"faceFormRef",ref:T,"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,{label:"人脸库",prop:"repositoryId",required:""},{default:e.withCtx(()=>[e.createVNode(g,{"model-value":S.value,onChange:s[1]||(s[1]=u=>V("repositoryId",u)),placeholder:"请选择人脸库(可多选)",style:{width:"100%"},multiple:"",filterable:"",clearable:"","collapse-tags":"","collapse-tags-tooltip":""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(C.value,u=>(e.openBlock(),e.createBlock(w,{key:u.id,label:u.name,value:u.id},null,8,["label","value"]))),128))]),_:1},8,["model-value"])]),_:1})]),_:1},8,["model"])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-5094495d"]]),ea={class:"config-header"},ta={key:0,class:"config-section"},oa={key:3,class:"array-input"},na={key:1,class:"config-section"},aa=ne({__name:"StreamConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),{schemaLoading:l,fetchSchemaForNodeType:C}=Se(),T=e.computed(()=>{if(!t.value)return[];const r=t.value.data.input_schema||t.value.data.inputSchema;if(!r||!r.properties)return[];const N=r.required||[];return Object.entries(r.properties).map(([s,L])=>({key:s,type:L.type,label:L.title||L.label||L.description||s,description:L.description||"",default:L.default,required:N.includes(s)||L.required||!1,min:L.minimum!==void 0?L.minimum:L.min,max:L.maximum!==void 0?L.maximum:L.max,step:L.step,maxLength:L.maxLength,options:L.enum,optionLabels:L.enumLabels||L.enum,dependsOn:L.dependsOn,sort:L.sort})).sort((s,L)=>(s.sort??1/0)-(L.sort??1/0))}),D=r=>{if(t.value)return t.value.data.arguments?.[r]},G=(r,N)=>{if(!t.value)return;const L={...t.value.data.arguments||{},[r]:N};o.updateNodeData(t.value.id,{arguments:L})},M=r=>{if(!r.dependsOn||!t.value)return!0;const{field:N,value:s}=r.dependsOn,L=D(N);if(typeof s=="string"&&s.startsWith("!")){const P=s.substring(1);return L!==P}return Array.isArray(s)?s.includes(L):L===s},y=r=>{const N=D(r);return Array.isArray(N)?JSON.stringify(N):""},S=(r,N)=>{try{const s=JSON.parse(N);Array.isArray(s)&&G(r,s)}catch{}},V=()=>{t.value&&v.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 N=t.value.type,s=t.value.data,L=s.input_schema||s.inputSchema;if(L&&L.properties&&Object.keys(L.properties).length>0)return;const P=await C(N);if(!P)return;const f=t.value?.data;f&&o.updateNodeData(t.value.id,{...f,input_schema:P.inputSchema,extraConfig:P.extraConfig,arguments:{...P.arguments,...f.arguments}})},{immediate:!0}),(r,N)=>{const s=e.resolveComponent("el-button"),L=e.resolveComponent("el-divider"),P=e.resolveComponent("el-icon"),f=e.resolveComponent("el-tooltip"),q=e.resolveComponent("el-option"),p=e.resolveComponent("el-select"),w=e.resolveComponent("el-switch"),g=e.resolveComponent("el-input-number"),u=e.resolveComponent("el-input"),$=e.resolveComponent("el-form-item"),d=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",ea,[N[0]||(N[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(s,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:V},null,8,["icon"]))]),e.createVNode(L),T.value.length>0?(e.openBlock(),e.createElementBlock("div",ta,[N[1]||(N[1]=e.createElementVNode("h4",null,"流处理参数",-1)),e.createVNode(d,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(T.value,m=>e.withDirectives((e.openBlock(),e.createBlock($,{key:m.key,required:m.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(m.label),1),m.description?(e.openBlock(),e.createBlock(f,{key:0,content:m.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(P,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.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":D(m.key),onChange:i=>G(m.key,i),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.options,(i,k)=>(e.openBlock(),e.createBlock(q,{key:i,label:m.optionLabels?m.optionLabels[k]:i,value:i},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):m.type==="boolean"?(e.openBlock(),e.createBlock(w,{key:1,"model-value":D(m.key),onChange:i=>G(m.key,i)},null,8,["model-value","onChange"])):m.type==="number"||m.type==="integer"?(e.openBlock(),e.createBlock(g,{key:2,"model-value":D(m.key),onChange:i=>G(m.key,i),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"])):m.type==="array"&&!m.options?(e.openBlock(),e.createElementBlock("div",oa,[e.createVNode(u,{"model-value":y(m.key),onChange:i=>S(m.key,i),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:4,"model-value":D(m.key),onChange:i=>G(m.key,i),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.options,(i,k)=>(e.openBlock(),e.createBlock(q,{key:i,label:m.optionLabels?m.optionLabels[k]:i,value:i},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(u,{key:5,"model-value":D(m.key),onInput:i=>G(m.key,i),maxlength:m.maxLength,"show-word-limit":!!m.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!m.dependsOn||M(m)]])),128))]),_:1})])):e.createCommentVNode("",!0),e.unref(l)&&T.value.length===0?(e.openBlock(),e.createElementBlock("div",na,[...N[2]||(N[2]=[e.createElementVNode("div",{style:{"text-align":"center",padding:"20px",color:"var(--aiflow-color-text-secondary)"}}," 加载参数配置中... ",-1)])])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-e9fc5ade"]]),la={class:"config-header"},ra={class:"config-section"},sa={key:0,class:"config-section"},ia={key:1,class:"config-section"},ca={key:0,class:"el-form-item__error"},da={key:2,class:"config-section"},ma={key:3,class:"config-section"},pa={key:4,class:"config-section"},ua=ne({__name:"DataSourceConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.inject("taskModeConfig",null),l=e.inject("selectedDevicesMap",null),C=e.inject("echoAlgodata",null),T=e.computed(()=>c==="task"),D=e.computed(()=>P("deviceType")??"camera"),G=e.computed(()=>{const m=o.nodes.find(k=>k.type===b.START);return m?.data?.streamType?m.data.streamType:(_?.value??_)?.streamType??"image"}),M=e.computed(()=>{const m=t.value?.id;return l?.value?.[m]?.length??0}),y=()=>{const m=_?.value??_,i=t.value?.id,k=t.value?.data?.label??"",E=l?.value?.[i]??[],J=o.nodes.filter(h=>h.type===b.DATA_SOURCE).findIndex(h=>h.id===i),A=C?.value??C,B=A?.graph??A,F=t.value?.data?.sourceGroupId??B?.ruleSchema?.sourceGroups?.[J]?.sourceGroupId??i,W=h=>{l&&(l.value[i]=h)};m?.datasource?.onDeviceClick?.(i,k,F,E,D.value,W)},{fetchSchemaForNodeType:S}=Se(),V=e.computed(()=>o.nodes.some(m=>m.type===b.SMALL_MODEL)),r=e.computed(()=>o.getDataSourceCount()>=2),N=e.computed(()=>!o.supportPatrol()),s=e.computed(()=>o.getDataSourceCount()>=2?"存在多个数据源节点时不支持轮巡分析":o.hasCooperativeDetection()?"开启协同检测时不支持轮巡分析":""),L=e.computed(()=>{if(!t.value)return[];const m=t.value.data.input_schema||t.value.data.inputSchema;if(!m||!m.properties)return[];const i=m.required||[];return Object.entries(m.properties).map(([k,E])=>({key:k,type:E.type,label:E.title||E.label||E.description||k,description:E.description||"",default:E.default,required:i.includes(k)||E.required||!1,min:E.minimum!==void 0?E.minimum:E.min,max:E.maximum!==void 0?E.maximum:E.max,step:E.step,maxLength:E.maxLength,options:E.enum,optionLabels:E.enumLabels||E.enum,dependsOn:E.dependsOn}))}),P=m=>{if(t.value)return t.value.data.arguments?.[m]},f=e.computed(()=>!!P("enableImageSequence")),q=e.computed(()=>!!P("needCooperativeDetection")),p=(m,i)=>{if(!t.value)return;const E={...t.value.data.arguments||{},[m]:i};o.updateNodeData(t.value.id,{arguments:E})},w=async m=>{if(!t.value)return;if(o.edges.some(k=>k.source===t.value.id))try{await v.ElMessageBox.confirm("切换模式将清除该节点的所有输出连接,是否继续?","确认切换",{confirmButtonText:"继续",cancelButtonText:"取消",type:"warning"}),o.edges.filter(E=>E.source===t.value.id).forEach(E=>{o.removeEdge(E.id)}),m&&p("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:m}),p("enableImageSequence",m),m&&o.initializeSubsequentFrames(t.value.id)}catch{return}else m&&p("needCooperativeDetection",!1),o.updateNodeData(t.value.id,{enableImageSequence:m}),p("enableImageSequence",m),m&&o.initializeSubsequentFrames(t.value.id)},g=m=>{t.value&&(m&&(o.updateNodeData(t.value.id,{enableImageSequence:!1}),p("enableImageSequence",!1),p("enablePatrol",!1)),p("needCooperativeDetection",m))};e.watch(G,m=>{m==="stream"&&t.value&&P("deviceType")==="1400"&&p("deviceType","camera")},{immediate:!0});const u=e.computed(()=>T.value&&D.value==="camera"&&G.value!=="stream"&&o.supportPatrol());e.watch(u,m=>{!m&&t.value&&P("enablePatrol")&&p("enablePatrol",!1)}),e.watch(M,m=>{m>0&&P("enablePatrol")&&(P("patrolGroupSize")??1)>m&&p("patrolGroupSize",m)});const $=m=>{if(!m.dependsOn||!t.value)return!0;const{field:i,value:k}=m.dependsOn,E=P(i);if(typeof k=="string"&&k.startsWith("!")){const J=k.substring(1);return E!==J}return Array.isArray(k)?k.includes(E):E===k},d=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.id,async m=>{if(!m||!t.value)return;const i=t.value.type,k=t.value.data;if(i==="dataSource"&&T.value){const B=k.arguments||{},F={},W=o.nodes.some(h=>h.type===b.SMALL_MODEL);B.mode===void 0&&(F.mode=W?3:0),B.interval===void 0&&(F.interval=30),G.value==="stream"&&B.sw_decoding===void 0&&(F.sw_decoding="CPU"),Object.keys(F).length>0&&o.updateNodeData(m,{arguments:{...B,...F}})}const E=k.input_schema||k.inputSchema;if(i==="dataSource"&&E&&E.properties&&!E.properties.windowSeconds){E.properties.windowSeconds={type:"integer",title:"协同检测等待时间(秒)",description:"等待接收数据源下所有摄像机返回图片的最大时长。若超时仍未收齐全部图片,将自动终止本次协同分析",default:5,min:1,max:60,dependsOn:{field:"needCooperativeDetection",value:!0}},k.arguments.windowSeconds||o.updateNodeData(t.value.id,{...k,input_schema:E,arguments:{...k.arguments,windowSeconds:5}});return}if(E&&E.properties&&Object.keys(E.properties).length>0)return;const J=await S(i);if(!J)return;const A=t.value?.data;A&&o.updateNodeData(t.value.id,{...A,input_schema:J.inputSchema,extraConfig:J.extraConfig,arguments:{...J.arguments,...A.arguments}})},{immediate:!0}),(m,i)=>{const k=e.resolveComponent("el-button"),E=e.resolveComponent("el-divider"),J=e.resolveComponent("el-icon"),A=e.resolveComponent("el-tooltip"),B=e.resolveComponent("el-option"),F=e.resolveComponent("el-select"),W=e.resolveComponent("el-switch"),h=e.resolveComponent("el-input-number"),O=e.resolveComponent("el-input"),H=e.resolveComponent("el-form-item"),U=e.resolveComponent("el-form"),Z=e.resolveComponent("el-radio"),R=e.resolveComponent("el-radio-group");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",la,[i[11]||(i[11]=e.createElementVNode("h3",null,"节点配置",-1)),T.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(k,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:d},null,8,["icon"]))]),e.createVNode(E),e.createElementVNode("div",ra,[i[12]||(i[12]=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(L.value,n=>e.withDirectives((e.openBlock(),e.createBlock(H,{key:n.key,required:n.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(n.label),1),n.description?(e.openBlock(),e.createBlock(A,{key:0,content:n.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(J,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[n.options&&n.type==="string"?(e.openBlock(),e.createBlock(F,{key:0,"model-value":P(n.key),onChange:x=>p(n.key,x),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.options,(x,j)=>(e.openBlock(),e.createBlock(B,{key:x,label:n.optionLabels?n.optionLabels[j]:x,value:x},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):n.type==="boolean"?(e.openBlock(),e.createBlock(A,{key:1,content:T.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")?"算法任务模式下不允许修改此配置":n.key==="needCooperativeDetection"&&f.value?"已开启图片时序,无法同时开启协同检测":n.key==="enableImageSequence"&&q.value?"已开启协同检测,无法同时开启图片时序":n.key==="enableImageSequence"&&r.value?"多数据源场景下不允许开启图片时序":"",disabled:!(T.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence"))&&!(n.key==="needCooperativeDetection"&&f.value)&&!(n.key==="enableImageSequence"&&q.value)&&!(n.key==="enableImageSequence"&&r.value),placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":P(n.key),disabled:T.value&&(n.key==="needCooperativeDetection"||n.key==="enableImageSequence")||n.key==="needCooperativeDetection"&&f.value||n.key==="enableImageSequence"&&q.value||n.key==="enableImageSequence"&&r.value,onChange:x=>n.key==="enableImageSequence"?w(x):n.key==="needCooperativeDetection"?g(x):p(n.key,x)},null,8,["model-value","disabled","onChange"])]),_:2},1032,["content","disabled"])):n.type==="number"||n.type==="integer"?(e.openBlock(),e.createBlock(h,{key:2,"model-value":P(n.key),onChange:x=>p(n.key,x),min:n.min,max:n.max,step:n.step||(n.type==="integer"?1:.1),precision:n.type==="integer"?0:void 0,style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):(e.openBlock(),e.createBlock(O,{key:3,"model-value":P(n.key),onInput:x=>p(n.key,x),maxlength:n.maxLength,"show-word-limit":!!n.maxLength},null,8,["model-value","onInput","maxlength","show-word-limit"]))]),_:2},1032,["required"])),[[e.vShow,!n.dependsOn||$(n)]])),128))]),_:1})]),t.value?.data?.enableImageSequence?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",sa,[i[13]||(i[13]=e.createElementVNode("h4",null,"分支配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(H,{label:"分支关系"},{default:e.withCtx(()=>[e.createVNode(F,{"model-value":t.value?.data.branchLogic||"and",disabled:T.value,onChange:i[0]||(i[0]=n=>e.unref(o).updateNodeData(t.value.id,{branchLogic:n})),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"ALL(满足所有分支)",value:"and"}),e.createVNode(B,{label:"SOME(满足至少一个分支)",value:"or"}),e.createVNode(B,{label:"ONE(有且只满足一个分支)",value:"more"})]),_:1},8,["model-value","disabled"])]),_:1})]),_:1})])),T.value?(e.openBlock(),e.createElementBlock("div",ia,[i[16]||(i[16]=e.createElementVNode("h4",null,"设备配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(H,{label:"设备类型",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":P("deviceType")??"camera",onChange:i[1]||(i[1]=n=>p("deviceType",n))},{default:e.withCtx(()=>[e.createVNode(Z,{value:"camera"},{default:e.withCtx(()=>[...i[14]||(i[14]=[e.createTextVNode("摄像机",-1)])]),_:1}),e.createVNode(Z,{value:"1400",disabled:G.value==="stream"},{default:e.withCtx(()=>[...i[15]||(i[15]=[e.createTextVNode("1400设备",-1)])]),_:1},8,["disabled"])]),_:1},8,["model-value"])]),_:1}),e.createVNode(H,{label:"设备选择",required:""},{default:e.withCtx(()=>[e.createVNode(O,{"model-value":`已选 ${M.value} 个设备`,readonly:"",style:{cursor:"pointer"},class:e.normalizeClass({"is-error":M.value===0}),onClick:y},null,8,["model-value","class"]),M.value===0?(e.openBlock(),e.createElementBlock("div",ca,"请选择至少一个设备")):e.createCommentVNode("",!0)]),_:1})]),_:1})])):e.createCommentVNode("",!0),T.value&&D.value==="1400"?(e.openBlock(),e.createElementBlock("div",da,[i[19]||(i[19]=e.createElementVNode("h4",null,"目标检测方式",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(H,{label:"检测方式",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":P("detectionMode")??"platform",onChange:i[2]||(i[2]=n=>p("detectionMode",n))},{default:e.withCtx(()=>[e.createVNode(Z,{value:"platform"},{default:e.withCtx(()=>[...i[17]||(i[17]=[e.createTextVNode("平台检测",-1)])]),_:1}),e.createVNode(Z,{value:"device"},{default:e.withCtx(()=>[...i[18]||(i[18]=[e.createTextVNode("前端设备检测",-1)])]),_:1})]),_:1},8,["model-value"])]),_:1})]),_:1})])):e.createCommentVNode("",!0),T.value&&D.value==="camera"&&G.value!=="stream"&&e.unref(o).supportPatrol()?(e.openBlock(),e.createElementBlock("div",ma,[i[21]||(i[21]=e.createElementVNode("h4",null,"轮巡分析",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(H,{label:"启用轮巡分析"},{default:e.withCtx(()=>[e.createVNode(A,{disabled:!N.value,content:s.value,placement:"top"},{default:e.withCtx(()=>[e.createVNode(W,{"model-value":N.value?!1:P("enablePatrol"),disabled:N.value,onChange:i[3]||(i[3]=n=>p("enablePatrol",n))},null,8,["model-value","disabled"])]),_:1},8,["disabled","content"])]),_:1}),P("enablePatrol")?(e.openBlock(),e.createBlock(H,{key:0},{label:e.withCtx(()=>[i[20]||(i[20]=e.createElementVNode("span",null,"每组设备数量",-1)),e.createVNode(A,{content:"提示:每组设备数量需要根据抽帧间隔设置,建议每组设备数量不超过:10*抽帧间隔的秒数",placement:"top"},{default:e.withCtx(()=>[e.createVNode(J,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})]),default:e.withCtx(()=>[e.createVNode(h,{"model-value":P("patrolGroupSize")??1,onChange:i[4]||(i[4]=n=>p("patrolGroupSize",n)),min:1,max:M.value>0?M.value:void 0,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0),T.value&&D.value==="camera"?(e.openBlock(),e.createElementBlock("div",pa,[i[22]||(i[22]=e.createElementVNode("h4",null,"抽帧配置",-1)),e.createVNode(U,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(H,{label:"抽帧策略"},{default:e.withCtx(()=>[G.value==="image"?(e.openBlock(),e.createBlock(F,{key:0,"model-value":0,disabled:"",style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"按时间间隔抽帧",value:0})]),_:1})):V.value?(e.openBlock(),e.createBlock(F,{key:1,"model-value":P("mode")??3,onChange:i[5]||(i[5]=n=>{p("mode",n),n===1&&p("interval",V.value?5:25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"每一帧都检测",value:3}),e.createVNode(B,{label:"跳帧检测",value:1}),e.createVNode(B,{label:"关键帧",value:2})]),_:1},8,["model-value"])):(e.openBlock(),e.createBlock(F,{key:2,"model-value":P("mode")??0,onChange:i[6]||(i[6]=n=>{p("mode",n),n===0&&p("interval",30),n===1&&p("interval",25)}),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"按时间间隔抽帧",value:0}),e.createVNode(B,{label:"跳帧检测",value:1}),e.createVNode(B,{label:"关键I帧检测",value:2})]),_:1},8,["model-value"]))]),_:1}),G.value==="image"||G.value==="stream"&&(P("mode")??0)===0?(e.openBlock(),e.createBlock(H,{key:0,label:"抽帧间隔时间(秒)"},{default:e.withCtx(()=>[e.createVNode(h,{"model-value":P("interval")??30,onChange:i[7]||(i[7]=n=>p("interval",n)),min:1,max:G.value==="image"?600:60,step:1,style:{width:"100%"}},null,8,["model-value","max"])]),_:1})):e.createCommentVNode("",!0),G.value==="stream"&&(P("mode")??0)===1?(e.openBlock(),e.createBlock(H,{key:1,label:"跳帧数量(帧)"},{default:e.withCtx(()=>[V.value?(e.openBlock(),e.createBlock(h,{key:0,"model-value":P("interval")??5,onChange:i[8]||(i[8]=n=>p("interval",n)),min:1,max:30,step:1,precision:0,style:{width:"100%"}},null,8,["model-value"])):(e.openBlock(),e.createBlock(F,{key:1,"model-value":P("interval")??25,onChange:i[9]||(i[9]=n=>p("interval",n)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:25,value:25}),e.createVNode(B,{label:50,value:50}),e.createVNode(B,{label:75,value:75}),e.createVNode(B,{label:125,value:125}),e.createVNode(B,{label:250,value:250}),e.createVNode(B,{label:375,value:375}),e.createVNode(B,{label:750,value:750})]),_:1},8,["model-value"]))]),_:1})):e.createCommentVNode("",!0),G.value==="stream"?(e.openBlock(),e.createBlock(H,{key:2,label:"抽帧硬件资源"},{default:e.withCtx(()=>[e.createVNode(F,{"model-value":P("sw_decoding")??"CPU",onChange:i[10]||(i[10]=n=>p("sw_decoding",n)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(B,{label:"GPU",value:"GPU"}),e.createVNode(B,{label:"CPU",value:"CPU"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-a941b904"]]),fa={safety:"安全检测",security:"安防监控",traffic:"交通监控",behavior:"行为分析"},Ke=(a=null)=>{const o=e.ref(a||[]),t=e.ref(!1),c=e.ref(null),_=e.ref(""),l=async(V=!1)=>{if(a){o.value=a;return}},C=async()=>{o.value=[],await l(!0)},T=V=>o.value.find(r=>r.id===V||r.title===V),D=V=>{const r=T(V);if(!r)return{};const N=r.inputSchema||r.input_schema;if(!N||!N.properties)return{};const s={};return Object.entries(N.properties).forEach(([L,P])=>{P.default!==void 0&&(s[L]=P.default)}),s},G=V=>{const r=T(V);if(!r)return[];const N=r.inputSchema||r.input_schema;if(!N||!N.properties)return[];const s=N.required||[];return Object.entries(N.properties).map(([L,P])=>({key:L,type:P.type,label:P.title||P.description||L,description:P.description||"",default:P.default,required:s.includes(L)||P.required||!1,min:P.minimum,max:P.maximum,step:P.step,options:P.enum,optionLabels:P.enumLabels||P.enum,dependsOn:P.dependsOn}))},M=e.computed(()=>{if(!_.value)return o.value;const V=_.value.toLowerCase();return o.value.filter(r=>r.name?.toLowerCase().includes(V)||r.type?.toLowerCase().includes(V)||r.title?.toLowerCase().includes(V)||r.description&&r.description.toLowerCase().includes(V)||y(r.type).toLowerCase().includes(V))}),y=V=>fa[V]||V;return{models:o,loading:t,error:c,searchKeyword:_,filteredModels:M,loadSmallModels:l,reloadSmallModels:C,getModelConfig:T,getTypeLabel:y,getDefaultArguments:D,getSchemaFields:G,validateArguments:(V,r)=>{const N=T(V);if(!N)return{valid:!1,errors:["模型不存在"]};const s=[],L=N.inputSchema||N.input_schema;return!L||!L.properties?{valid:!0,errors:[]}:(Object.entries(L.properties).forEach(([P,f])=>{const q=r[P];if(f.required&&(q==null||q==="")){s.push(`${f.title||P} 为必填项`);return}if(q!=null&&(f.type==="number"||f.type==="integer")){if(typeof q!="number"){s.push(`${f.title||P} 必须是数字`);return}f.minimum!==void 0&&q<f.minimum&&s.push(`${f.title||P} 不能小于 ${f.minimum}`),f.maximum!==void 0&&q>f.maximum&&s.push(`${f.title||P} 不能大于 ${f.maximum}`)}}),{valid:s.length===0,errors:s})}}},ga={class:"small-model-selector"},ha={key:0,class:"loading-state"},ya={key:1,class:"error-state"},_a={key:2,class:"model-list"},Na=["onClick"],Ca={class:"model-header"},ka={class:"model-name"},ba={class:"model-description"},xa={class:"model-meta"},Ea={key:3,class:"empty-state"},wa=ne({__name:"SmallModelSelector",props:{modelValue:{type:String,default:null},externalModels:{type:Array,default:null}},emits:["update:modelValue","select"],setup(a,{emit:o}){const t=a,c=o,{loading:_,error:l,searchKeyword:C,filteredModels:T,loadSmallModels:D,reloadSmallModels:G,getTypeLabel:M}=Ke(t.externalModels),y=r=>{c("update:modelValue",r.id),c("select",r)},S=()=>{G()},V=r=>({safety:"warning",security:"danger",traffic:"info"})[r]||"info";return e.onMounted(()=>{t.externalModels||D()}),(r,N)=>{const s=e.resolveComponent("el-input"),L=e.resolveComponent("el-icon"),P=e.resolveComponent("el-button"),f=e.resolveComponent("el-tag");return e.openBlock(),e.createElementBlock("div",ga,[e.createVNode(s,{modelValue:e.unref(C),"onUpdate:modelValue":N[0]||(N[0]=q=>e.isRef(C)?C.value=q:null),placeholder:"搜索小模型(名称、类型、描述)",clearable:"","prefix-icon":e.unref(Q.Search),size:"default",class:"search-input"},null,8,["modelValue","prefix-icon"]),e.unref(_)?(e.openBlock(),e.createElementBlock("div",ha,[e.createVNode(L,{class:"is-loading"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Loading))]),_:1}),N[2]||(N[2]=e.createElementVNode("span",null,"加载中...",-1))])):e.unref(l)?(e.openBlock(),e.createElementBlock("div",ya,[e.createVNode(L,{class:"error-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.CircleClose))]),_:1}),e.createElementVNode("p",null,e.toDisplayString(e.unref(l)),1),e.createVNode(P,{type:"primary",onClick:S},{default:e.withCtx(()=>[...N[3]||(N[3]=[e.createTextVNode("重试",-1)])]),_:1})])):e.unref(T).length>0?(e.openBlock(),e.createElementBlock("div",_a,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(T),q=>(e.openBlock(),e.createElementBlock("div",{key:q.id,class:e.normalizeClass(["model-item",{selected:a.modelValue===q.id}]),onClick:p=>y(q)},[e.createElementVNode("div",Ca,[e.createElementVNode("div",ka,[e.createVNode(L,{class:"model-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Cpu))]),_:1}),e.createTextVNode(" "+e.toDisplayString(q.name),1)]),e.createVNode(f,{type:V(q.type),size:"small"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(e.unref(M)(q.type)),1)]),_:2},1032,["type"])]),e.createElementVNode("div",ba,e.toDisplayString(q.description),1),e.createElementVNode("div",xa,[q.supportDirectAlert?(e.openBlock(),e.createBlock(f,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...N[4]||(N[4]=[e.createTextVNode(" 支持直通预警 ",-1)])]),_:1})):e.createCommentVNode("",!0)])],10,Na))),128))])):(e.openBlock(),e.createElementBlock("div",Ea,[e.createVNode(L,{class:"empty-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Search))]),_:1}),N[6]||(N[6]=e.createElementVNode("p",null,"未找到匹配的小模型",-1)),e.createVNode(P,{text:"",onClick:N[1]||(N[1]=q=>C.value="")},{default:e.withCtx(()=>[...N[5]||(N[5]=[e.createTextVNode("清空搜索",-1)])]),_:1})]))])}}},[["__scopeId","data-v-6e0d51c6"]]),Ta={class:"position-tooltip"},Ve=ne({__name:"PositionTooltip",setup(a){return(o,t)=>(e.openBlock(),e.createElementBlock("div",Ta,[...t[0]||(t[0]=[e.createStaticVNode('<div class="tooltip-title" data-v-6ac23ee8>提示说明</div><div class="tooltip-desc" data-v-6ac23ee8> 目标点为点位代表目标位置的点,系统默认使用目标框的中心点表示目标的位置。只有当目标的重心点满足检测框完整落在检测区域时,才表示目标进入检测框或者离开检测区域。 </div><div class="tooltip-examples" data-v-6ac23ee8><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例1:以目标框的中心点代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="60" cy="90" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0.5 Y轴: 0.5</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例2:以目标框的最左上角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="5" cy="5" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 0 Y轴: 0</div></div><div class="tooltip-example" data-v-6ac23ee8><div class="example-title" data-v-6ac23ee8>示例3:以目标框的最右下角代表目标位置</div><div class="example-figure" data-v-6ac23ee8><svg viewBox="0 0 120 180" width="120" height="180" xmlns="http://www.w3.org/2000/svg" data-v-6ac23ee8><rect x="5" y="5" width="110" height="170" rx="6" fill="#fff" stroke="#ddd" stroke-width="1" data-v-6ac23ee8></rect><ellipse cx="60" cy="32" rx="18" ry="20" fill="#2d3a4a" data-v-6ac23ee8></ellipse><ellipse cx="60" cy="36" rx="14" ry="16" fill="#f5c5a3" data-v-6ac23ee8></ellipse><path d="M54 42 Q60 47 66 42" stroke="#c8956a" stroke-width="1.5" fill="none" stroke-linecap="round" data-v-6ac23ee8></path><rect x="42" y="58" width="36" height="52" rx="4" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="26" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><rect x="78" y="60" width="16" height="38" rx="6" fill="#4a90d9" data-v-6ac23ee8></rect><ellipse cx="34" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><ellipse cx="86" cy="100" rx="8" ry="10" fill="#f5c5a3" data-v-6ac23ee8></ellipse><rect x="44" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><rect x="62" y="108" width="14" height="42" rx="5" fill="#2d3a4a" data-v-6ac23ee8></rect><circle cx="115" cy="175" r="5" fill="#e74c3c" data-v-6ac23ee8></circle></svg></div><div class="example-coords" data-v-6ac23ee8>X轴: 1 Y轴: 1</div></div></div>',3)])]))}},[["__scopeId","data-v-6ac23ee8"]]),Sa={class:"config-header"},Va={class:"config-section"},Ba={key:0,class:"model-selector-wrapper"},Aa={key:1,class:"selected-model-info"},Da={class:"model-info-header"},La={class:"model-info-name"},Ma={class:"model-info-description"},Oa={key:0,class:"config-section"},Ia={key:3,class:"array-input"},Ra="检测到事件后,连续两次告警上报的时间间隔",$a=ne({__name:"SmallModelConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=e.inject("editorConfig",null),C=e.computed(()=>(l?.value??l)?.smallModels??null),{models:T}=Ke(C.value),D=new Set(["threshold","interval","bottomScale","leftScale","rightScale","topScale","targetHeight","targetWidth","x_ratio","y_ratio","targetNumber","overloadNumber","targetDuration"]),G={CrowdInAndOut:"上报在告警间隔时间内的进入和离开的人员数量",MotorInAndOut:"上报在告警间隔时间内的进入和离开的车辆数量"},M=e.computed(()=>{if(!t.value)return[];const p=t.value.data.input_schema||t.value.data.inputSchema;if(!p||!p.properties)return[];const w=p.required||[],g=t.value.data.title||"";return Object.entries(p.properties).filter(([u])=>D.has(u)).map(([u,$])=>{const d={key:u,type:$.type,label:$.title||$.label||$.description||u,description:$.description||"",default:$.default,required:w.includes(u)||$.required||!1,min:$.minimum!==void 0?$.minimum:$.min,max:$.maximum!==void 0?$.maximum:$.max,step:$.step,maxLength:$.maxLength,options:$.enum,optionLabels:$.enumLabels||$.enum,dependsOn:$.dependsOn,sort:$.sort};return u==="interval"&&(d.label="告警间隔(秒)",d.description=G[g]||Ra,d.isInterval=!0,d.default=d.default!=null?d.default/1e3:10,d.min=d.min!=null?d.min/1e3:1,d.max=d.max!=null?d.max/1e3:void 0,d.step=1,d.precision=0),u==="threshold"&&(d.label="小模型阈值",d.step=.01,d.precision=2),u==="targetWidth"&&(d.label="最小目标宽度",d.default=60,d.min=20,d.max=1920,d.step=1,d.precision=0),u==="targetHeight"&&(d.label="最小目标高度",d.default=60,d.min=20,d.max=1080,d.step=1,d.precision=0),u==="topScale"&&(d.label="调整目标框高度比例 (上)",d.max=10,d.step=.1,d.precision=1),u==="bottomScale"&&(d.label="调整目标框高度比例 (下)",d.max=10,d.step=.1,d.precision=1),u==="leftScale"&&(d.label="调整目标框宽度比例 (左)",d.max=10,d.step=.1,d.precision=1),u==="rightScale"&&(d.label="调整目标框宽度比例 (右)",d.max=10,d.step=.1,d.precision=1),u==="x_ratio"&&(d.label="X轴位置信息",d.step=.01,d.precision=2),u==="y_ratio"&&(d.label="Y轴位置信息",d.step=.01,d.precision=2),u==="targetDuration"&&(d.label="目标持续时间(秒)",d.default=d.default!=null?d.default/1e3:1,d.min=d.min!=null?d.min/1e3:1,d.max=d.max!=null?d.max/1e3:void 0,d.step=.01,d.precision=2),u==="overloadNumber"&&(d.precision=0),u==="targetNumber"&&(d.precision=0),d}).filter(u=>!["areas","darwin","direction","lines"].includes(u.key)).filter(u=>!(u.key==="targetDuration"&&g==="NonMotorCounter")).sort((u,$)=>(u.sort??1/0)-($.sort??1/0))}),y=["interval","targetDuration"],S=p=>{if(!t.value)return;const w=t.value.data.arguments?.[p];return y.includes(p)&&w!=null?w/1e3:w},V=(p,w)=>{if(!t.value)return;let g=w;y.includes(p)&&w!=null&&(g=w*1e3);const $={...t.value.data.arguments||{},[p]:g};o.updateNodeData(t.value.id,{arguments:$})},r=p=>{if(!p.dependsOn||!t.value)return!0;const{field:w,value:g}=p.dependsOn,u=S(w);if(typeof g=="string"&&g.startsWith("!")){const $=g.substring(1);return u!==$}return Array.isArray(g)?g.includes(u):u===g},N=p=>{const w=S(p);return Array.isArray(w)?JSON.stringify(w):""},s=(p,w)=>{try{const g=JSON.parse(w);Array.isArray(g)&&V(p,g)}catch{}},L=async p=>{if(!t.value)return;const w=p.inputSchema||p.input_schema||{},g={};w.properties&&Object.entries(w.properties).forEach(([u,$])=>{$.default!==void 0&&(g[u]=$.default)}),o.updateNodeData(t.value.id,{...t.value.data,modelId:p.id||p.title,title:p.title,modelName:p.name,modelType:p.type,input_schema:w,extraConfig:p.extraConfig,supportDirectAlert:p.supportDirectAlert||!1,arguments:g})},P=()=>{t.value&&v.ElMessageBox.confirm("更换模型将清空当前配置,是否继续?","确认更换",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{o.updateNodeData(t.value.id,{modelId:null,modelName:"",supportDirectAlert:!1,input_schema:null,arguments:{}})}).catch(()=>{})},f=()=>t.value?.data.modelId?T.value.find(w=>w.id===t.value.data.modelId)?.description||"暂无描述":"",q=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(p,w)=>{const g=e.resolveComponent("el-button"),u=e.resolveComponent("el-divider"),$=e.resolveComponent("el-icon"),d=e.resolveComponent("el-tag"),m=e.resolveComponent("el-tooltip"),i=e.resolveComponent("el-option"),k=e.resolveComponent("el-select"),E=e.resolveComponent("el-switch"),J=e.resolveComponent("el-input-number"),A=e.resolveComponent("el-input"),B=e.resolveComponent("el-text"),F=e.resolveComponent("el-form-item"),W=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Sa,[w[0]||(w[0]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:q},null,8,["icon"]))]),e.createVNode(u),e.createElementVNode("div",Va,[w[3]||(w[3]=e.createElementVNode("h4",null,"选择小模型",-1)),!t.value?.data.modelId&&!_.value?(e.openBlock(),e.createElementBlock("div",Ba,[e.createVNode(wa,{"model-value":t.value?.data.modelId,"external-models":C.value,onSelect:L},null,8,["model-value","external-models"])])):t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Aa,[e.createElementVNode("div",Da,[e.createElementVNode("div",La,[e.createVNode($,{class:"model-info-icon"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Cpu))]),_:1}),e.createElementVNode("span",null,e.toDisplayString(t.value?.data.modelName),1)]),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(g,{key:0,type:"text",text:"",size:"small",onClick:P},{default:e.withCtx(()=>[...w[1]||(w[1]=[e.createTextVNode(" 更换模型 ",-1)])]),_:1}))]),e.createElementVNode("div",Ma,e.toDisplayString(f()),1),t.value?.data.supportDirectAlert?(e.openBlock(),e.createBlock(d,{key:0,size:"small",type:"success",effect:"plain"},{default:e.withCtx(()=>[...w[2]||(w[2]=[e.createTextVNode(" 支持直通预警模式 ",-1)])]),_:1})):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)]),t.value?.data.modelId?(e.openBlock(),e.createElementBlock("div",Oa,[w[4]||(w[4]=e.createElementVNode("h4",null,"模型参数",-1)),e.createVNode(W,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(M.value,h=>e.withDirectives((e.openBlock(),e.createBlock(F,{key:h.key,required:h.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(h.label),1),h.key==="x_ratio"||h.key==="y_ratio"?(e.openBlock(),e.createBlock(m,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode($,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})):h.description?(e.openBlock(),e.createBlock(m,{key:1,content:h.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode($,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[h.options&&h.type==="string"?(e.openBlock(),e.createBlock(k,{key:0,"model-value":S(h.key),onChange:O=>V(h.key,O),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(O,H)=>(e.openBlock(),e.createBlock(i,{key:O,label:h.optionLabels?h.optionLabels[H]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):h.type==="boolean"?(e.openBlock(),e.createBlock(E,{key:1,"model-value":S(h.key),onChange:O=>V(h.key,O)},null,8,["model-value","onChange"])):h.type==="number"||h.type==="integer"||h.type==="float"?(e.openBlock(),e.createBlock(J,{key:2,"model-value":S(h.key),onChange:O=>V(h.key,O),min:h.min,max:h.max,step:h.step||(h.type==="integer"||h.type==="number"?1:.01),precision:h.precision??(h.type==="integer"?0:2),style:{width:"100%"}},null,8,["model-value","onChange","min","max","step","precision"])):h.type==="array"&&!h.options?(e.openBlock(),e.createElementBlock("div",Ia,[e.createVNode(A,{"model-value":N(h.key),onChange:O=>s(h.key,O),type:"textarea",rows:3,placeholder:"输入坐标,例如: [[100,100], [200,100], [200,200], [100,200]]"},null,8,["model-value","onChange"]),e.createVNode(B,{size:"small",type:"info"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(h.description||"输入多边形顶点坐标,格式: [[x1,y1], [x2,y2], ...]"),1)]),_:2},1024)])):h.type==="array"&&h.options?(e.openBlock(),e.createBlock(k,{key:4,"model-value":S(h.key),onChange:O=>V(h.key,O),multiple:"",placeholder:"请选择",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.options,(O,H)=>(e.openBlock(),e.createBlock(i,{key:O,label:h.optionLabels?h.optionLabels[H]:O,value:O},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(A,{key:5,"model-value":S(h.key),onInput:O=>V(h.key,O)},null,8,["model-value","onInput"]))]),_:2},1032,["required"])),[[e.vShow,!h.dependsOn||r(h)]])),128))]),_:1})])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-ecf7f01b"]]),Fa=(a=null)=>{const o=ae(),t=e.ref(a?a.map(y=>Te.backendToFrontend(y)):[]),c=e.ref(!1),_=e.ref(null),l=async(y=!1)=>{if(a){t.value=a.map(S=>Te.backendToFrontend(S));return}},C=y=>t.value.find(S=>S.title===y)||null,T=y=>{const S=C(y);return S?{targetId:S.title,targetName:S.label,threshold:S.data.threshold||.5,targetWidth:S.data.targetWidth||20,targetHeight:S.data.targetHeight||20,postmodel:S.data.postmodel||"ClipVit",areas:S.data.areas||[],expandRect:S.data.expandRect!==void 0?S.data.expandRect:!1,topScale:S.data.topScale||1.6,bottomScale:S.data.bottomScale||1.6,leftScale:S.data.leftScale||1.6,rightScale:S.data.rightScale||1.6,enableStructure:S.data.enableStructure}:{}},D=(y=null)=>o.nodes.filter(S=>S.type==="detectionTarget"&&S.id!==y).map(S=>({value:S.id,label:S.data.targetName||S.data.label})),G=(y=null)=>{const S=[{value:"original",label:"原图"}],V=D(y);return[...S,...V]},M=e.computed(()=>t.value.map(y=>({value:y.title,label:y.label,...y})));return{detectionTargets:t,loading:c,error:_,loadDetectionTargets:l,getTargetById:C,getDefaultConfig:T,getDetectionTargetNodes:D,getDetectionScopeOptions:G,getTargetOptions:M}},qa={class:"paired-array-input"},Be=ne({__name:"PairedArrayInput",props:{primaryField:{type:Object,required:!0},pairedField:{type:Object,required:!0},primaryValue:{type:Array,default:()=>[]},pairedValue:{type:Array,default:()=>[]}},emits:["update"],setup(a,{emit:o}){const t=(M,y)=>{let S;return(...V)=>{clearTimeout(S),S=setTimeout(()=>M(...V),y)}},c=a,_=o,l=e.ref([]),C=()=>{const M=c.primaryValue||[],y=c.pairedValue||[],S=Math.max(M.length,y.length,1);l.value=Array.from({length:S},(V,r)=>({primary:M[r]||"",paired:y[r]!==void 0?y[r]:c.pairedField.default?.[0]||.5}))};e.watch(()=>[c.primaryValue,c.pairedValue],()=>{C()},{immediate:!0,deep:!0});const T=t((M,y)=>{_("update",M,y)},300);e.watch(l,M=>{const y=M.map(V=>V.primary),S=M.map(V=>V.paired);T(y,S)},{deep:!0});const D=()=>{l.value.length>=10||l.value.push({primary:"",paired:c.pairedField.default?.[0]||.5})},G=M=>{l.value.length>1&&l.value.splice(M,1)};return(M,y)=>{const S=e.resolveComponent("el-input"),V=e.resolveComponent("el-input-number"),r=e.resolveComponent("el-button");return e.openBlock(),e.createElementBlock("div",qa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.value,(N,s)=>(e.openBlock(),e.createElementBlock("div",{key:s,class:"input-row"},[e.createVNode(S,{modelValue:l.value[s].primary,"onUpdate:modelValue":L=>l.value[s].primary=L,placeholder:a.primaryField.description||"输入内容",class:e.normalizeClass([{"is-error":!l.value[s].primary||l.value[s].primary.trim()===""},"primary-input"])},null,8,["modelValue","onUpdate:modelValue","placeholder","class"]),e.createVNode(V,{modelValue:l.value[s].paired,"onUpdate:modelValue":L=>l.value[s].paired=L,min:a.pairedField.min||0,max:a.pairedField.max||1,step:a.pairedField.step||.1,class:"paired-input"},null,8,["modelValue","onUpdate:modelValue","min","max","step"]),e.createVNode(r,{type:"danger",icon:e.unref(Q.Delete),circle:"",size:"small",disabled:l.value.length===1,onClick:L=>G(s)},null,8,["icon","disabled","onClick"])]))),128)),e.createVNode(r,{type:"primary",icon:e.unref(Q.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"]]),Ga={class:"config-header"},Ha={class:"config-section"},ja={class:"flex items-center justify-between"},Pa={key:0,class:"config-section"},za={key:1,class:"config-section"},Ua={key:2,class:"config-section"},Wa={class:"device-list"},Ja=["onClick"],Ya={class:"device-name"},Xa={key:0,class:"device-list-empty"},Qa={key:4,class:"array-input"},Ka={key:4,class:"array-input"},Za=ne({__name:"DetectionTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c==="task");e.inject("taskModeConfig",null);const l=e.inject("echoAlgodata",null),C=e.inject("echoTaskData",null),T=e.inject("selectedDevicesMap",null),D=e.computed(()=>{if(!t.value)return null;const h=new Set,O=[t.value.id];for(;O.length;){const H=O.shift();if(h.has(H))continue;h.add(H);const U=o.edges.filter(Z=>Z.target===H);for(const Z of U){const R=o.nodes.find(n=>n.id===Z.source);if(R){if(R.type==="dataSource")return R.id;O.push(R.id)}}}return null}),G=e.computed(()=>{const h=D.value;return h?T?.value?.[h]??[]:[]}),M=e.computed(()=>_.value&&G.value.length>0),y=e.ref(""),S=e.ref(""),V=e.computed(()=>{const h=S.value.trim().toLowerCase();return h?G.value.filter(O=>(O.sourceName??O.name??String(O.sourceId??O.id??O)).toLowerCase().includes(h)):G.value}),r=e.computed(()=>{const h={},O=D.value,H=t.value?.id;if(!O||!H)return h;const U={...t.value?.data?.arguments??{}};delete U.configMode;for(const Z of G.value){const R=String(Z.sourceId??Z.id??Z),n=o.getTaskSourceArguments(O,R,H);if(n===null){h[R]=!1;continue}const x=new Set([...Object.keys(n),...Object.keys(U)]);let j=!1;for(const Y of x)if(JSON.stringify(n[Y])!==JSON.stringify(U[Y])){j=!0;break}h[R]=j}return h});e.watch([G,()=>t.value?.data?.arguments?.configMode],([h])=>{h.length>0?y.value=String(h[0]?.sourceId??h[0]?.id??h[0]):y.value=""},{immediate:!0});const N=(h,O=null)=>{if(O){const n=((C?.value??C)?.graph?.sources??[]).find(x=>String(x.sourceId)===String(O));if(n?.branches)for(const x of n.branches){const j=x.nodes?.find(Y=>Y.toolTitle===h);if(j?.arguments)return{...j.arguments}}return null}const H=l?.value??l,U=H?.graph??H;if(!U?.branches)return null;for(const Z of U.branches){const R=Z.nodes?.find(n=>n.toolTitle===h);if(R?.arguments)return{...R.arguments}}return null},s=h=>{const O=D.value,H=t.value?.id;if(!O||!H||!h||o.getTaskSourceArguments(O,h,H)!==null)return;const U=t.value?.data?.targetId,Z=U?N(U,h):null,R=t.value?.data?.arguments??{},n={...Z??R};delete n.configMode,o.setTaskSourceArguments(O,h,H,n)};e.watch(y,h=>{h&&t.value?.data?.arguments?.configMode==="perDevice"&&s(h)}),e.watch(()=>t.value?.data?.arguments?.configMode,h=>{h==="perDevice"&&y.value&&s(y.value)});const L=e.inject("editorConfig",null),P=e.computed(()=>(L?.value??L)?.detection??null),{detectionTargets:f,loading:q}=Fa(P.value),p=e.computed(()=>{if(!t.value)return[];const h=t.value.data.input_schema||t.value.data.inputSchema;if(!h||!h.properties)return[];const O=h.required||[];return Object.entries(h.properties).map(([H,U])=>({key:H,type:U.type,label:U.title||U.label||U.description||H,description:U.description||"",default:U.default,required:O.includes(H)||U.required||!1,min:U.minimum!==void 0?U.minimum:U.min,max:U.maximum!==void 0?U.maximum:U.max,step:U.step,maxLength:U.maxLength,options:U.enum,optionLabels:U.enumLabels||U.enum,dependsOn:U.dependsOn,"x-component":U["x-component"],"x-paired-with":U["x-paired-with"],sort:U.sort})).sort((H,U)=>(H.sort??1/0)-(U.sort??1/0))}),w=h=>h.type==="array"&&h["x-component"]==="paired-array"&&h["x-paired-with"],g=h=>{const O=h["x-paired-with"];return p.value.find(H=>H.key===O)},u={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}},$=new Set(Object.keys(u)),d=e.computed(()=>{const h=t.value?.data.targetId,O=new Set;return p.value.forEach(H=>{H["x-paired-with"]&&O.add(H["x-paired-with"])}),p.value.filter(H=>h==="traffic_accident"?H.key==="threshold":$.has(H.key)&&!O.has(H.key)&&!w(H)).map(H=>{const U=u[H.key]||{};return{...H,label:U.label||H.label,description:U.description||H.description,min:U.min??H.min,max:U.max??H.max,step:U.step??H.step,precision:U.precision,default:U.default??H.default}})}),m=e.computed(()=>p.value.filter(h=>w(h))),i=h=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&y.value){const H=D.value,U=o.getTaskSourceArguments(H,y.value,t.value.id);if(U!==null)return U[h]}return t.value.data.arguments?.[h]},k=(h,O)=>{if(!t.value)return;const H=t.value.data.arguments?.configMode;if(h!=="configMode"&&H==="perDevice"&&y.value){const R=D.value;o.updateTaskSourceArgument(R,y.value,t.value.id,h,O);return}const Z={...t.value.data.arguments||{},[h]:O};o.updateNodeData(t.value.id,{arguments:Z})},E=h=>{if(!h.dependsOn||!t.value)return!0;const{field:O,value:H}=h.dependsOn,U=i(O);if(typeof H=="string"&&H.startsWith("!")){const Z=H.substring(1);return U!==Z}return Array.isArray(H)?H.includes(U):U===H},J=h=>{const O=i(h);return Array.isArray(O)?JSON.stringify(O):""},A=(h,O)=>{try{const H=JSON.parse(O);Array.isArray(H)&&k(h,H)}catch{}},B=(h,O,H,U)=>{if(!t.value)return;if(t.value.data.arguments?.configMode==="perDevice"&&y.value){const x=D.value;o.updateTaskSourceArgument(x,y.value,t.value.id,h,O),o.updateTaskSourceArgument(x,y.value,t.value.id,H,U);return}const n={...t.value.data.arguments||{},[h]:O,[H]:U};o.updateNodeData(t.value.id,{arguments:n})},F=async h=>{if(!t.value||!h)return;const O=f.value.find(n=>n.title===h);if(!O)return;let H=O.inputSchema||O.input_schema||{};if(h==="other"){const n={properties:{object:{type:"array",title:"检测目标",description:"输入检测目标名称",items:{type:"string"},default:[""],minItems:1,"x-component":"paired-array","x-paired-with":"threshold"},threshold:{type:"array",title:"检测阈值",description:"每个目标的检测阈值",items:{type:"number",minimum:0,maximum:1},default:[.5],minItems:1}}};H={...H,properties:{...H.properties,...n.properties}}}const U={};H.properties&&Object.entries(H.properties).forEach(([n,x])=>{x.default!==void 0&&(U[n]=x.default)});const Z=t.value.data,R={...U,target_class:O.title};o.updateNodeData(t.value.id,{...Z,targetId:O.title,targetName:O.label,label:O.label,input_schema:H,inputSchema:H,extraConfig:O.extraConfig,arguments:R})},W=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return e.watch(()=>t.value?.data.targetId,h=>{if(!h||!t.value)return;const O=f.value.find(Z=>Z.title===h);if(!O)return;const H=t.value.data;if(H.input_schema&&Object.keys(H.input_schema).length>0)return;const U={...O.defaultArguments,...H.arguments,target_class:O.title};o.updateNodeData(t.value.id,{...H,input_schema:O.inputSchema,arguments:U})}),(h,O)=>{const H=e.resolveComponent("el-button"),U=e.resolveComponent("el-divider"),Z=e.resolveComponent("el-option"),R=e.resolveComponent("el-select"),n=e.resolveComponent("el-form-item"),x=e.resolveComponent("el-form"),j=e.resolveComponent("el-radio"),Y=e.resolveComponent("el-radio-group"),z=e.resolveComponent("el-icon"),X=e.resolveComponent("el-tooltip"),te=e.resolveComponent("el-input"),le=e.resolveComponent("el-switch"),pe=e.resolveComponent("el-input-number");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",Ga,[O[2]||(O[2]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(H,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:W},null,8,["icon"]))]),e.createVNode(U),e.createElementVNode("div",Ha,[O[3]||(O[3]=e.createElementVNode("h4",null,"检测目标选择",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(n,{label:"选择检测目标",required:""},{default:e.withCtx(()=>[e.createVNode(R,{"model-value":t.value?.data.targetId,disabled:_.value,onChange:F,placeholder:"请选择检测目标",style:{width:"100%"},loading:e.unref(q),filterable:""},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(f),I=>(e.openBlock(),e.createBlock(Z,{key:I.title,label:I.label,value:I.title},{default:e.withCtx(()=>[e.createElementVNode("div",ja,[e.createElementVNode("span",null,e.toDisplayString(I.label),1)])]),_:2},1032,["label","value"]))),128))]),_:1},8,["model-value","disabled","loading"])]),_:1})]),_:1})]),M.value?(e.openBlock(),e.createElementBlock("div",Pa,[O[6]||(O[6]=e.createElementVNode("h4",null,"配置方式",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(n,{label:"配置方式"},{default:e.withCtx(()=>[e.createVNode(Y,{"model-value":t.value?.data?.arguments?.configMode??"unified",onChange:O[0]||(O[0]=I=>k("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),m.value.length>0?(e.openBlock(),e.createElementBlock("div",za,[O[7]||(O[7]=e.createElementVNode("h4",null,"检测目标",-1)),e.createVNode(x,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,I=>(e.openBlock(),e.createBlock(n,{key:I.key,required:I.required},{label:e.withCtx(()=>[e.createElementVNode("span",null,e.toDisplayString(I.label),1),I.description?(e.openBlock(),e.createBlock(X,{key:0,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[e.createVNode(Be,{"primary-field":I,"paired-field":g(I),"primary-value":i(I.key),"paired-value":i(I["x-paired-with"]),onUpdate:(K,re)=>B(I.key,K,I["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])]),_:2},1032,["required"]))),128))]),_:1})])):e.createCommentVNode("",!0),t.value?.data.targetId&&t.value?.data.targetId!=="full"?(e.openBlock(),e.createElementBlock("div",Ua,[O[9]||(O[9]=e.createElementVNode("h4",null,"检测目标参数",-1)),t.value?.data?.arguments?.configMode==="perDevice"&&G.value.length>0?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(te,{modelValue:S.value,"onUpdate:modelValue":O[1]||(O[1]=I=>S.value=I),placeholder:"搜索设备...",clearable:"",size:"small",class:"device-search"},{prefix:e.withCtx(()=>[e.createVNode(z,null,{default:e.withCtx(()=>[e.createVNode(e.unref(Q.Search))]),_:1})]),_:1},8,["modelValue"]),e.createElementVNode("div",Wa,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(V.value,I=>(e.openBlock(),e.createElementBlock("div",{key:String(I.sourceId??I.id??I),class:e.normalizeClass(["device-list-item",{"is-active":y.value===String(I.sourceId??I.id??I),"has-custom":r.value[String(I.sourceId??I.id??I)]}]),onClick:K=>y.value=String(I.sourceId??I.id??I)},[e.createElementVNode("span",Ya,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(X,{key:0,content:"已单独配置参数",placement:"right"},{default:e.withCtx(()=>[...O[8]||(O[8]=[e.createElementVNode("span",{class:"custom-dot"},"✔",-1)])]),_:1})):e.createCommentVNode("",!0)],10,Ja))),128)),V.value.length===0?(e.openBlock(),e.createElementBlock("div",Xa," 无匹配设备 ")):e.createCommentVNode("",!0)]),y.value?(e.openBlock(),e.createBlock(x,{key:0,"label-position":"top",size:"default",style:{"margin-top":"12px"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,I=>e.withDirectives((e.openBlock(),e.createBlock(n,{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(X,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(X,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":i(I.key),onChange:K=>k(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,re)=>(e.openBlock(),e.createBlock(Z,{key:K,label:I.optionLabels?I.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(le,{key:1,"model-value":i(I.key),onChange:K=>k(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":i(I.key),onChange:K=>k(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"])):w(I)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":I,"paired-field":g(I),"primary-value":i(I.key),"paired-value":i(I["x-paired-with"]),onUpdate:(K,re)=>B(I.key,K,I["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Qa,[e.createVNode(te,{"model-value":J(I.key),onChange:K=>A(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(R,{key:5,"model-value":i(I.key),onChange:K=>k(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,re)=>(e.openBlock(),e.createBlock(Z,{key:K,label:I.optionLabels?I.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":i(I.key),onInput:K=>k(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||E(I)]])),128))]),_:1})):e.createCommentVNode("",!0)],64)):(e.openBlock(),e.createBlock(x,{key:1,"label-position":"top",size:"default"},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,I=>e.withDirectives((e.openBlock(),e.createBlock(n,{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(X,{key:0,placement:"right","show-arrow":!0,"popper-class":"position-info-tooltip","hide-after":0},{content:e.withCtx(()=>[e.createVNode(Ve)]),default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})):I.description?(e.openBlock(),e.createBlock(X,{key:1,content:I.description,placement:"top"},{default:e.withCtx(()=>[e.createVNode(z,{class:"field-help"},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1},8,["content"])):e.createCommentVNode("",!0)]),default:e.withCtx(()=>[I.options&&I.type==="string"?(e.openBlock(),e.createBlock(R,{key:0,"model-value":i(I.key),onChange:K=>k(I.key,K),style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,re)=>(e.openBlock(),e.createBlock(Z,{key:K,label:I.optionLabels?I.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):I.type==="boolean"?(e.openBlock(),e.createBlock(le,{key:1,"model-value":i(I.key),onChange:K=>k(I.key,K)},null,8,["model-value","onChange"])):I.type==="number"||I.type==="integer"?(e.openBlock(),e.createBlock(pe,{key:2,"model-value":i(I.key),onChange:K=>k(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"])):w(I)?(e.openBlock(),e.createBlock(Be,{key:3,"primary-field":I,"paired-field":g(I),"primary-value":i(I.key),"paired-value":i(I["x-paired-with"]),onUpdate:(K,re)=>B(I.key,K,I["x-paired-with"],re)},null,8,["primary-field","paired-field","primary-value","paired-value","onUpdate"])):I.type==="array"&&!I.options?(e.openBlock(),e.createElementBlock("div",Ka,[e.createVNode(te,{"model-value":J(I.key),onChange:K=>A(I.key,K),type:"textarea",rows:3,placeholder:I.description||"输入JSON数组"},null,8,["model-value","onChange","placeholder"])])):I.type==="array"&&I.options?(e.openBlock(),e.createBlock(R,{key:5,"model-value":i(I.key),onChange:K=>k(I.key,K),multiple:"",style:{width:"100%"}},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(I.options,(K,re)=>(e.openBlock(),e.createBlock(Z,{key:K,label:I.optionLabels?I.optionLabels[re]:K,value:K},null,8,["label","value"]))),128))]),_:2},1032,["model-value","onChange"])):(e.openBlock(),e.createBlock(te,{key:6,"model-value":i(I.key),onInput:K=>k(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||E(I)]])),128))]),_:1}))])):e.createCommentVNode("",!0)])}}},[["__scopeId","data-v-d53c8063"]]),va={class:"config-header"},el={class:"config-section"},tl={key:0,style:{"margin-bottom":"8px"}},ol=ne({__name:"TargetCountConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=M=>{if(!t.value)return;const y={...t.value.data.arguments,conditionRelation:M};o.updateNodeData(t.value.id,{arguments:y})},C=()=>{if(!t.value)return;const y=[...t.value.data.arguments?.alertConditions||[],{operator:">",value:0}],S={...t.value.data.arguments,alertConditions:y};o.updateNodeData(t.value.id,{arguments:S})},T=(M,y,S)=>{if(!t.value)return;const V=[...t.value.data.arguments?.alertConditions||[]];V[M]={...V[M],[y]:S};const r={...t.value.data.arguments,alertConditions:V};o.updateNodeData(t.value.id,{arguments:r})},D=M=>{if(!t.value)return;const y=[...t.value.data.arguments?.alertConditions||[]];y.splice(M,1);const S={...t.value.data.arguments,alertConditions:y};o.updateNodeData(t.value.id,{arguments:S})},G=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(M,y)=>{const S=e.resolveComponent("el-button"),V=e.resolveComponent("el-divider"),r=e.resolveComponent("el-text"),N=e.resolveComponent("el-option"),s=e.resolveComponent("el-select"),L=e.resolveComponent("el-input-number"),P=e.resolveComponent("el-radio"),f=e.resolveComponent("el-radio-group"),q=e.resolveComponent("el-form-item"),p=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",va,[y[1]||(y[1]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(S,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:G},null,8,["icon"]))]),e.createVNode(V),e.createElementVNode("div",el,[y[9]||(y[9]=e.createElementVNode("h4",null,"目标计数配置",-1)),e.createVNode(p,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(q,null,{label:e.withCtx(()=>[y[3]||(y[3]=e.createElementVNode("span",null,"计数条件",-1)),e.createVNode(r,{size:"small",type:"info",style:{"margin-left":"8px"}},{default:e.withCtx(()=>[...y[2]||(y[2]=[e.createTextVNode("(必填)",-1)])]),_:1})]),default:e.withCtx(()=>[e.createVNode(r,{size:"small",type:"info",style:{display:"block","margin-bottom":"8px"}},{default:e.withCtx(()=>[...y[4]||(y[4]=[e.createTextVNode(" 当目标数量满足下列条件时才上报 ",-1)])]),_:1}),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.value?.data.arguments?.alertConditions||[],(w,g)=>(e.openBlock(),e.createElementBlock("div",{key:g,style:{display:"flex","align-items":"center",gap:"8px","margin-bottom":"8px",width:"100%","box-sizing":"border-box"}},[e.createVNode(s,{"model-value":w.operator,onChange:u=>T(g,"operator",u),style:{width:"120px","flex-shrink":"0"}},{default:e.withCtx(()=>[e.createVNode(N,{label:"等于 =",value:"="}),e.createVNode(N,{label:"大于 >",value:">"}),e.createVNode(N,{label:"小于 <",value:"<"}),e.createVNode(N,{label:"大于等于 ≥",value:">="}),e.createVNode(N,{label:"小于等于 ≤",value:"<="})]),_:1},8,["model-value","onChange"]),e.createVNode(L,{"model-value":w.value,onChange:u=>T(g,"value",u),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(S,{key:0,type:"danger",icon:e.unref(Q.Delete),circle:"",size:"small",onClick:u=>D(g)},null,8,["icon","onClick"])):e.createCommentVNode("",!0)]))),128)),(t.value?.data.arguments?.alertConditions||[]).length>=2?(e.openBlock(),e.createElementBlock("div",tl,[e.createVNode(r,{size:"small",style:{"margin-right":"8px"}},{default:e.withCtx(()=>[...y[5]||(y[5]=[e.createTextVNode("条件关系:",-1)])]),_:1}),e.createVNode(f,{"model-value":t.value?.data.arguments?.conditionRelation||"OR",onChange:y[0]||(y[0]=w=>l(w))},{default:e.withCtx(()=>[e.createVNode(P,{value:"OR"},{default:e.withCtx(()=>[...y[6]||(y[6]=[e.createTextVNode("OR(满足任一)",-1)])]),_:1}),e.createVNode(P,{value:"AND"},{default:e.withCtx(()=>[...y[7]||(y[7]=[e.createTextVNode("AND(同时满足)",-1)])]),_:1})]),_:1},8,["model-value"])])):e.createCommentVNode("",!0),e.createVNode(S,{type:"text",link:"",icon:e.unref(Q.Plus),onClick:C},{default:e.withCtx(()=>[...y[8]||(y[8]=[e.createTextVNode(" 添加条件 ",-1)])]),_:1},8,["icon"])]),_:1})]),_:1})])])}}},[["__scopeId","data-v-3dcd1bfb"]]),nl={class:"config-header"},al={class:"config-section"},ll={style:{display:"flex","align-items":"center",gap:"8px"}},rl={style:{display:"flex","align-items":"center",gap:"8px"}},sl={style:{display:"flex","align-items":"center",gap:"8px"}},il=ne({__name:"TimerTargetConfig",setup(a){const o=ae(),t=e.computed(()=>o.selectedNode),c=e.inject("editorMode",oe.ALGORITHM),_=e.computed(()=>c===oe.TASK),l=N=>{if(!t.value)return;const s={...t.value.data.arguments,duration:N};o.updateNodeData(t.value.id,{arguments:s})},C=N=>{if(!t.value)return;const s={...t.value.data.arguments,similarity_enabled:N};o.updateNodeData(t.value.id,{arguments:s})},T=N=>{if(!t.value)return;const s={...t.value.data.arguments,similarity_threshold:N};o.updateNodeData(t.value.id,{arguments:s})},D=N=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_enabled:N};o.updateNodeData(t.value.id,{arguments:s})},G=N=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_operator:N};o.updateNodeData(t.value.id,{arguments:s})},M=N=>{if(!t.value)return;const s={...t.value.data.arguments,hit_rate_threshold:N};o.updateNodeData(t.value.id,{arguments:s})},y=N=>{if(!t.value)return;const s=t.value.data.arguments?.overlap_detection||{},L={...t.value.data.arguments,overlap_detection:{operator:s.operator??"gt",threshold:s.threshold??90,...s,enabled:N}};o.updateNodeData(t.value.id,{arguments:L})},S=N=>{if(!t.value)return;const s={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,operator:N}};o.updateNodeData(t.value.id,{arguments:s})},V=N=>{if(!t.value)return;const s={...t.value.data.arguments,overlap_detection:{...t.value.data.arguments?.overlap_detection,threshold:N}};o.updateNodeData(t.value.id,{arguments:s})},r=()=>{t.value&&v.ElMessageBox.confirm("确定要删除这个节点吗?","确认删除",{confirmButtonText:"删除",cancelButtonText:"取消",type:"warning"}).then(()=>{o.removeNode(t.value.id)}).catch(()=>{})};return(N,s)=>{const L=e.resolveComponent("el-button"),P=e.resolveComponent("el-divider"),f=e.resolveComponent("el-input-number"),q=e.resolveComponent("el-text"),p=e.resolveComponent("el-form-item"),w=e.resolveComponent("el-switch"),g=e.resolveComponent("el-icon"),u=e.resolveComponent("el-tooltip"),$=e.resolveComponent("el-slider"),d=e.resolveComponent("el-option"),m=e.resolveComponent("el-select"),i=e.resolveComponent("el-form");return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",nl,[s[9]||(s[9]=e.createElementVNode("h3",null,"节点配置",-1)),_.value?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(L,{key:0,type:"danger",size:"small",icon:e.unref(Q.Delete),circle:"",onClick:r},null,8,["icon"]))]),e.createVNode(P),e.createElementVNode("div",al,[s[13]||(s[13]=e.createElementVNode("h4",null,"目标计时配置",-1)),e.createVNode(i,{"label-position":"top",size:"default"},{default:e.withCtx(()=>[e.createVNode(p,{label:"持续时间(秒)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.duration??30,onChange:s[0]||(s[0]=k=>l(k)),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(()=>[...s[10]||(s[10]=[e.createTextVNode(" 目标需要持续出现的时间阈值(1-3600秒) ",-1)])]),_:1})]),_:1}),e.createVNode(p,{label:"目标追踪"},{default:e.withCtx(()=>[e.createElementVNode("div",ll,[e.createVNode(w,{"model-value":t.value?.data.arguments?.similarity_enabled??!1,onChange:s[1]||(s[1]=k=>C(k))},null,8,["model-value"]),e.createVNode(u,{content:"当连续多张图片中目标的相似度大于阈值时,表示多张图片中的目标为同一个目标",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.similarity_enabled?(e.openBlock(),e.createBlock(p,{key:0,label:"目标相似度阈值(%)",required:""},{default:e.withCtx(()=>[e.createVNode($,{"model-value":t.value?.data.arguments?.similarity_threshold??90,onInput:s[2]||(s[2]=k=>T(k)),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(()=>[...s[11]||(s[11]=[e.createTextVNode(" 判定为同一目标的相似度阈值 ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(p,{label:"目标命中次数"},{default:e.withCtx(()=>[e.createElementVNode("div",rl,[e.createVNode(w,{"model-value":t.value?.data.arguments?.hit_rate_enabled??!1,onChange:s[3]||(s[3]=k=>D(k))},null,8,["model-value"]),e.createVNode(u,{content:"当连续多张图片中多次出现了目标时,表示目标行为在持续",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(p,{key:1,label:"命中次数判断条件",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.hit_rate_operator??"gte",onChange:s[4]||(s[4]=k=>G(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(d,{label:"大于 >",value:"gt"}),e.createVNode(d,{label:"大于等于 >=",value:"gte"}),e.createVNode(d,{label:"等于 =",value:"eq"}),e.createVNode(d,{label:"小于等于 <=",value:"lte"}),e.createVNode(d,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.hit_rate_enabled?(e.openBlock(),e.createBlock(p,{key:2,label:"目标命中次数",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.hit_rate_threshold??2,onChange:s[5]||(s[5]=k=>M(k)),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(()=>[...s[12]||(s[12]=[e.createTextVNode(" 连续图片中目标出现的最低次数(2-1000) ",-1)])]),_:1})]),_:1})):e.createCommentVNode("",!0),e.createVNode(p,{label:"目标框重合检测"},{default:e.withCtx(()=>[e.createElementVNode("div",sl,[e.createVNode(w,{"model-value":t.value?.data.arguments?.overlap_detection?.enabled||!1,onChange:s[6]||(s[6]=k=>y(k))},null,8,["model-value"]),e.createVNode(u,{content:"通过检测相邻画面中目标框的重合比例来判断目标是否发生了移动",placement:"top"},{default:e.withCtx(()=>[e.createVNode(g,{style:{cursor:"help"}},{default:e.withCtx(()=>[e.createVNode(e.unref(Q.QuestionFilled))]),_:1})]),_:1})])]),_:1}),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(p,{key:3,label:"重合运算条件",required:""},{default:e.withCtx(()=>[e.createVNode(m,{"model-value":t.value?.data.arguments?.overlap_detection?.operator??"gt",onChange:s[7]||(s[7]=k=>S(k)),style:{width:"100%"}},{default:e.withCtx(()=>[e.createVNode(d,{label:"大于 >",value:"gt"}),e.createVNode(d,{label:"等于 =",value:"eq"}),e.createVNode(d,{label:"小于 <",value:"lt"})]),_:1},8,["model-value"])]),_:1})):e.createCommentVNode("",!0),t.value?.data.arguments?.overlap_detection?.enabled?(e.openBlock(),e.createBlock(p,{key:4,label:"重合比例(%)",required:""},{default:e.withCtx(()=>[e.createVNode(f,{"model-value":t.value?.data.arguments?.overlap_detection?.threshold??90,onChange:s[8]||(s[8]=k=>V(k)),min:0,max:100,precision:2,style:{width:"100%"},"controls-position":"right"},null,8,["model-value"])]),_:1})):e.createCommentVNode("",!0)]),_:1})])])}}},[["__scopeId","data-v-2969d123"]]),cl={class:"node-config-panel"},dl={class:"config-content"},ml=ne({__name:"NodeConfigPanel",setup(a){const o=ae(),t={edge:ln,group:sn,start:An,end:Rn,classificationModel:zn,ocr:Jn,licensePlate:Qn,face:Qe,stream:aa,dataSource:ua,smallModel:$a,detectionTarget:Za,targetCount:ol,timerTarget:il,faceRecognition:Qe},c=e.computed(()=>{const _=o.selectedEdge;if(_)return o.nodes.find(T=>T.id===_.source)?.data?.enableBranch&&t.edge||null;const l=o.selectedNode;return l&&t[l.type]||null});return(_,l)=>(e.openBlock(),e.createElementBlock("div",cl,[e.createElementVNode("div",dl,[c.value?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value),{key:0})):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-5b5a9ed3"]]),pl={class:"workflow-editor",id:"workflow-editor"},ul={class:"editor-content"},fl={__name:"WorkflowEditor",props:{mode:{type:String,default:oe.ALGORITHM,validator:a=>Object.values(oe).includes(a)},pageMode:{type:String,default:Ne.CREATE,validator:a=>Object.values(Ne).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,c=String(e.getCurrentInstance()?.uid??Math.random().toString(36).slice(2));e.provide("workflowInstanceId",c),e.provide("editorMode",t.mode),e.provide("pageMode",e.computed(()=>t.pageMode)),e.provide("taskModeConfig",e.computed(()=>t.taskModeConfig));const _=e.ref({});e.provide("selectedDevicesMap",_);const l=e.computed(()=>t.mode==="task"?t.taskModeConfig:t.algorithmModeConfig);e.provide("editorConfig",l),e.provide("echoAlgodata",e.computed(()=>t.echoAlgodata)),e.provide("echoTaskData",e.computed(()=>t.echoTaskData));const C=ae(c),{copyToClipboard:T,downloadJSON:D,exportToJSON:G}=Ue(t.mode,C,l),{runValidation:M}=We(t.mode,C,e.computed(()=>t.taskModeConfig),_);e.onUnmounted(()=>{it(c)});const y=e.computed(()=>{if(C.selectedNodeId)return!0;const V=C.selectedEdge;return V?!!C.nodes.find(N=>N.id===V.source)?.data?.enableBranch:!1});return o({reset:()=>{C.resetWorkflow()},runTest:M,copyJSON:T,exportJSON:G}),(V,r)=>(e.openBlock(),e.createElementBlock("div",pl,[e.createVNode(wt),e.createElementVNode("div",ul,[e.createVNode(Dt),e.createVNode(tn),e.createVNode(e.Transition,{name:"slide-right"},{default:e.withCtx(()=>[y.value?(e.openBlock(),e.createBlock(ml,{key:0})):e.createCommentVNode("",!0)]),_:1})])]))}},Ze=ne(fl,[["__scopeId","data-v-dfbe718a"]]),gl={Box:Q.Box,CircleCheck:Q.CircleCheck,CircleClose:Q.CircleClose,Close:Q.Close,CopyDocument:Q.CopyDocument,Cpu:Q.Cpu,DArrowLeft:Q.DArrowLeft,DataAnalysis:Q.DataAnalysis,Delete:Q.Delete,Document:Q.Document,Download:Q.Download,FolderOpened:Q.FolderOpened,Grid:Q.Grid,Loading:Q.Loading,Plus:Q.Plus,QuestionFilled:Q.QuestionFilled,RefreshLeft:Q.RefreshLeft,Search:Q.Search,Timer:Q.Timer,Upload:Q.Upload,User:Q.User,View:Q.View,VideoPlay:Q.VideoPlay,Warning:Q.Warning},ve=a=>{Object.entries(gl).forEach(([o,t])=>{a.component(o,t)}),a.component("WorkflowEditor",Ze)},hl={install:ve};se.EditorMode=oe,se.NodeType=b,se.PageMode=Ne,se.WorkflowEditor=Ze,se.default=hl,se.install=ve,Object.defineProperties(se,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|