| 1 |
- import{q as e,a9 as a,aR as t,aS as o,e as l,z as n,A as s,t as r,ad as i,d,av as u,aq as c,g as v,a as f,aT as p,ak as g,aU as m,ai as h,aj as w,aV as y,aW as _,P as b,ag as k}from"./element-plus.ea_38_Np.js";import{u as x,a as $,b as C,c as D,d as E,e as T}from"./@vue-flow.C14KmPsA.js";import{d as j}from"./dagre.C9k86_Gz.js";import z from"./DynamicNode._CPMgUtp.js";import V from"./NodeConfigPanel.DdKCWi8Q.js";import W from"./EdgeConfigPanel.guAV_bG9.js";import{a4 as N,W as L,_ as S}from"./index.Dwded2Oo.js";import{M as U,aD as B,bE as O,aL as I,s as P,bJ as q,I as M,v as G,bk as H,u as R,F as A,aX as J,H as F,bb as X,au as Y,t as K,aU as Q,aS as Z,q as ee,ao as ae}from"./@vue.DbmRtknU.js";const te="/task/workflow/definition",oe={getWorkflowList:e=>N({url:`${te}/list`,method:"get",params:e}),getWorkflowDetail:e=>N({url:`${te}/detail/${e}`,method:"get"}),createWorkflow:e=>N({url:`${te}/create`,method:"post",data:e}),updateWorkflow:(e,a)=>N({url:`${te}/update/${e}`,method:"put",data:a}),deleteWorkflow:e=>N({url:`${te}/delete`,method:"delete",data:e}),publishWorkflow:(e,a)=>N({url:`${te}/publish/${e}`,method:"post",data:a}),executeWorkflow:e=>N({url:`${te}/execute`,method:"post",data:e})},le={class:"panel-section"},ne={class:"panel-section"},se={style:{"margin-left":"4px","font-size":"10px",opacity:"0.7"}},re={class:"canvas-main"},ie={class:"drawer-footer"},de=S(U({name:"WorkflowCreateDrawer",inheritAttrs:!1,__name:"WorkflowDesignDrawer",props:{visible:{type:Boolean,default:!1},workflow:{type:Object,default:void 0}},emits:["update:visible","refresh"],setup(N,{emit:S}){const U=N,te=S,de=Q(),ue=Q(),ce=Z({code:"",name:"",description:""}),ve={code:[{required:!0,message:"请输入流程编码",trigger:"blur"}],name:[{required:!0,message:"请输入流程名称",trigger:"blur"}]},fe=ee({get:()=>U.visible,set:e=>te("update:visible",e)}),pe=ee(()=>U.workflow?"编辑工作流":"创建工作流"),{onInit:ge,onConnect:me,addEdges:he,getNodes:we,getEdges:ye,setEdges:_e,setNodes:be,screenToFlowCoordinate:ke,onNodesInitialized:xe,updateNode:$e,addNodes:Ce}=x(),De={type:"smoothstep",animated:!0,markerEnd:"arrowclosed"},Ee=Q("smoothstep"),Te=Q(!0),je=e=>{Ee.value=e,De.type=e,_e(ye.value.map(a=>({...a,type:e})))},ze=Q("LR"),Ve=()=>{const a=we.value,t=ye.value;if(0===a.length)return void e.warning("画布中没有节点,无法布局");const o=new j.graphlib.Graph;o.setDefaultEdgeLabel(()=>({}));o.setGraph({rankdir:ze.value,nodesep:80,ranksep:120,marginx:50,marginy:50}),a.forEach(e=>{o.setNode(e.id,{width:180,height:60})}),t.forEach(e=>{o.setEdge(e.source,e.target)}),j.layout(o);const l=a.map(e=>{const a=o.node(e.id);return{...e,position:{x:a.x-90,y:a.y-30}}});be(l),_e(t.map(e=>({...e,type:Ee.value,animated:Te.value}))),e.success("画布布局完成")},We=()=>{const a=we.value,t=ye.value;if(0===a.length)return void e.warning("画布中没有节点,无法格式化");const o=new j.graphlib.Graph;o.setDefaultEdgeLabel(()=>({}));o.setGraph({rankdir:ze.value,nodesep:100,ranksep:150,marginx:80,marginy:80}),a.forEach(e=>{o.setNode(e.id,{width:180,height:60})}),t.forEach(e=>{o.setEdge(e.source,e.target)}),j.layout(o);const l=a.map(e=>{const a=o.node(e.id);return{...e,position:{x:a.x-90,y:a.y-30}}});be(l),_e(t.map(e=>({...e,type:Ee.value,animated:Te.value}))),e.success("画布格式化完成")},Ne=Q([]),Le=Q([]),Se=Q(""),Ue=Q([]),Be=ee(()=>{if(!Se.value)return Ue.value;const e=Se.value.toLowerCase();return Ue.value.filter(a=>a.name.toLowerCase().includes(e))}),Oe=e=>({trigger:"触发器",action:"动作",condition:"条件",control:"控制"}[e]||e),Ie=Q({}),Pe=Q(""),qe=Q(),Me=Q(),Ge=Q(!1),He=()=>we.value,Re=()=>ye.value.map(e=>({id:e.id,source:e.source,target:e.target,label:"string"==typeof e.label?e.label:void 0,type:e.type,animated:e.animated,style:e.style,data:e.data}));B(()=>{(async()=>{Ge.value=!0;try{const e=await L.getWorkflowNodeTypeOptions();if(e.data&&e.data.data){Ue.value=e.data.data.map(e=>({id:e.id,type:e.code,name:e.name,category:e.category||"action",args:e.args||"",kwargs:e.kwargs||"{}"}));const a={};e.data.data.forEach(e=>{a[e.code]=ae(z)}),Ie.value=a}}catch{e.error("加载节点类型失败")}finally{Ge.value=!1}})()}),ge(a=>{a.fitView(),ue.value?oe.getWorkflowDetail(ue.value).then(e=>{e.data&&e.data.data&&(Ne.value=e.data.data.nodes||[],Le.value=e.data.data.edges||[],na(Ne.value,Le.value))}).catch(()=>{e.error("流程加载失败")}):na(Ne.value,Le.value)}),me(e=>{he({...e,type:Ee.value,animated:Te.value}),na(Ne.value,Le.value)});const Ae=e=>{e.event.stopPropagation(),qe.value=e.edge,Pe.value="edge"},Je=e=>{e.target instanceof HTMLElement&&(e.target.classList.contains("vue-flow__node")||e.target.closest(".vue-flow__node"))||(Pe.value="",Me.value=void 0,qe.value=void 0)},Fe=e=>{e.event.stopPropagation(),Me.value=e.node,Pe.value="node"};function Xe(e){!function(e,a,t,o,l){var n;const s=null==(n=e.dataTransfer)?void 0:n.getData("application/vueflow");if(!s)return;const r=JSON.parse(s),i=a({x:e.clientX,y:e.clientY}),d={id:`node-${Date.now()}`,type:r.type,position:i,data:{label:r.name,type:r.type,category:r.category,args:r.args,kwargs:r.kwargs}};l([d])}(e,ke,0,0,Ce)}function Ye(){Pe.value="",Me.value=void 0,qe.value=void 0}function Ke(e){if(!Me.value)return;const a=Me.value.id;a&&function(e,a,t,o){const l=t(),n=l.findIndex(a=>a.id===e);if(-1===n)return!1;const s=[...l];return s[n]={...s[n],data:{...s[n].data,...a}},o(s),!0}(a,e,He,be)&&na(Ne.value,Le.value)}function Qe(){if(!Me.value)return;const a=Me.value.id;a&&b.confirm("确定要删除该节点吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{!function(e,a,t,o,l){const n=a(),s=o(),r=n.filter(a=>a.id!==e),i=s.filter(a=>a.source!==e&&a.target!==e);t(r),l(i)}(a,He,be,Re,_e),e.success("节点删除成功"),Ye(),na(Ne.value,Le.value)})}function Ze(e){if(!qe.value)return;const a=qe.value.id;a&&function(e,a,t,o){const l=t(),n=l.findIndex(a=>a.id===e);if(-1===n)return!1;const s=[...l];return s[n]={...s[n],...a,data:{...s[n].data,...a}},o(s),!0}(a,e,Re,_e)&&na(Ne.value,Le.value)}function ea(){if(!qe.value)return;const a=qe.value.id;a&&b.confirm("确定要删除该连线吗?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>{!function(e,a,t){const o=a().filter(a=>a.id!==e);t(o)}(a,Re,_e),e.success("连线删除成功"),Ye(),na(Ne.value,Le.value)})}O(()=>U.workflow,e=>{e?(Object.assign(ce,{code:e.code,name:e.name,description:e.description}),ue.value=e.id,Ne.value=e.nodes||[],Le.value=e.edges||[]):(Object.assign(ce,{code:"",name:"",description:""}),ue.value=void 0,Ne.value=[],Le.value=[])},{immediate:!0});const aa=async()=>{if(de.value)try{await de.value.validate(),await function(){const e=[],a=[],t=He(),o=Re();0===t.length&&e.push("流程中没有节点");const l=new Set(t.map(e=>e.id));o.forEach(a=>{l.has(a.source)||e.push(`连线 ${a.label||a.id} 的源节点不存在`),l.has(a.target)||e.push(`连线 ${a.label||a.id} 的目标节点不存在`)});const n=t.filter(e=>!o.some(a=>a.source===e.id||a.target===e.id));if(n.length>0&&a.push(`有 ${n.length} 个孤立节点: ${n.map(e=>e.data.label).join(", ")}`),e.length>0)throw b.alert(`<div style="max-height: 300px; overflow-y: auto;">\n <strong>错误 (${e.length}):</strong>\n <ul>${e.map(e=>`<li style="color: #f56c6c;">${e}</li>`).join("")}</ul>\n ${a.length>0?`<strong>警告 (${a.length}):</strong>\n <ul>${a.map(e=>`<li style="color: #e6a23c;">${e}</li>`).join("")}</ul>`:""}\n </div>`,"流程验证结果",{confirmButtonText:"确定",dangerouslyUseHTMLString:!0}),new Error("验证失败");a.length>0&&b.alert(`<div style="max-height: 300px; overflow-y: auto;">\n <strong>流程验证通过,但有警告 (${a.length}):</strong>\n <ul>${a.map(e=>`<li style="color: #e6a23c;">${e}</li>`).join("")}</ul>\n </div>`,"流程验证结果",{confirmButtonText:"确定",dangerouslyUseHTMLString:!0})}(),await function(){const e={nodes:Ne.value,edges:Le.value},a={...ce,nodes:e.nodes,edges:e.edges};return ue.value?oe.updateWorkflow(ue.value,a):oe.createWorkflow(a).then(e=>{e.data&&e.data.data&&(ue.value=e.data.data.id)})}(),te("refresh"),ta()}catch(e){}},ta=()=>{te("update:visible",!1)},oa=Q([]),la=Q(-1);function na(e,a){oa.value=oa.value.slice(0,la.value+1),oa.value.push({nodes:e,edges:a}),la.value=oa.value.length-1}function sa(){}function ra(e){e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect="move")}return(e,b)=>{const x=r,j=s,z=n,N=i,L=d,S=v,U=c,B=l,O=o,Q=f,Z=w,ee=h,ae=g,te=t,oe=a,ue=k;return I(),P(ue,{modelValue:fe.value,"onUpdate:modelValue":b[9]||(b[9]=e=>fe.value=e),title:pe.value,"close-on-click-modal":!0,size:"80%",class:"workflow-drawer",onClose:ta},{footer:q(()=>[G("div",ie,[M(Q,{onClick:ta},{default:q(()=>[...b[17]||(b[17]=[F("取消",-1)])]),_:1}),M(Q,{type:"primary",onClick:aa},{default:q(()=>[...b[18]||(b[18]=[F("保存",-1)])]),_:1})])]),default:q(()=>[M(oe,{class:"workflow-create-content"},{default:q(()=>[M(te,{direction:"horizontal",style:{height:"100%"}},{default:q(()=>[M(O,{size:"250px",min:200,max:400},{default:q(()=>[M(B,{style:{height:"100%"}},{default:q(()=>[G("div",le,[b[10]||(b[10]=G("div",{class:"section-title"},"基础信息",-1)),M(z,{ref_key:"formRef",ref:de,model:ce,"label-width":"50px",rules:ve,size:"small"},{default:q(()=>[M(j,{label:"编码",prop:"code"},{default:q(()=>[M(x,{modelValue:ce.code,"onUpdate:modelValue":b[0]||(b[0]=e=>ce.code=e),placeholder:"请输入流程编码"},null,8,["modelValue"])]),_:1}),M(j,{label:"名称",prop:"name"},{default:q(()=>[M(x,{modelValue:ce.name,"onUpdate:modelValue":b[1]||(b[1]=e=>ce.name=e),placeholder:"请输入流程名称"},null,8,["modelValue"])]),_:1}),M(j,{label:"描述",prop:"description"},{default:q(()=>[M(x,{modelValue:ce.description,"onUpdate:modelValue":b[2]||(b[2]=e=>ce.description=e),type:"textarea",rows:2,placeholder:"请输入流程描述"},null,8,["modelValue"])]),_:1})]),_:1},8,["model"])]),M(N,{style:{margin:"4px 0"}}),G("div",ne,[b[11]||(b[11]=G("div",{class:"section-title"},"节点",-1)),M(x,{modelValue:Se.value,"onUpdate:modelValue":b[3]||(b[3]=e=>Se.value=e),placeholder:"搜索节点名称",clearable:"",size:"small",class:"search-box"},{prefix:q(()=>[M(L,null,{default:q(()=>[M(H(u))]),_:1})]),_:1},8,["modelValue"]),M(U,{direction:"vertical",size:8,fill:"",style:{width:"100%","margin-top":"8px"}},{default:q(()=>[(I(!0),R(A,null,J(Be.value,e=>{return I(),P(S,{key:e.id,type:(a=e.category,{trigger:"warning",action:"primary",condition:"success",control:"info"}[a]||"info"),effect:"plain",draggable:"true",style:{"justify-content":"center",cursor:"move","user-select":"none"},onDragstart:a=>{return o=e,void((t=a).dataTransfer&&(t.dataTransfer.setData("application/vueflow",JSON.stringify(o)),t.dataTransfer.effectAllowed="move"));var t,o},onDragend:sa},{default:q(()=>[F(X(e.name)+" ",1),G("span",se," ["+X(Oe(e.category))+"] ",1)]),_:2},1032,["type","onDragstart"]);var a}),128))]),_:1})])]),_:1})]),_:1}),M(O,null,{default:q(()=>[G("div",re,[G("div",{class:"canvas-container",onClick:Je},[M(H($),{nodes:Ne.value,"onUpdate:nodes":b[7]||(b[7]=e=>Ne.value=e),edges:Le.value,"onUpdate:edges":b[8]||(b[8]=e=>Le.value=e),class:"basic-flow","default-viewport":{zoom:1.5},"min-zoom":.2,"max-zoom":4,"node-types":Ie.value,"default-edge-options":De,onNodeClick:Fe,onEdgeClick:Ae,onDrop:Xe,onDragover:ra},{default:q(()=>[M(H(C)),M(H(D),{"pattern-color":"#aaa",gap:16}),M(H(E),{position:"top-right",class:"workflow-toolbar"},{default:q(()=>[M(Q,{class:"vue-flow__controls-button",title:"格式化画布",icon:H(p),onClick:We},null,8,["icon"]),M(ae,{trigger:"click",onCommand:je},{dropdown:q(()=>[M(ee,null,{default:q(()=>[M(Z,{command:"bezier",class:Y({active:"bezier"===Ee.value})},{default:q(()=>[...b[12]||(b[12]=[F(" 平滑曲线 ",-1)])]),_:1},8,["class"]),M(Z,{command:"smoothstep",class:Y({active:"smoothstep"===Ee.value})},{default:q(()=>[...b[13]||(b[13]=[F(" 阶梯折线 ",-1)])]),_:1},8,["class"]),M(Z,{command:"straight",class:Y({active:"straight"===Ee.value})},{default:q(()=>[...b[14]||(b[14]=[F(" 直线 ",-1)])]),_:1},8,["class"])]),_:1})]),default:q(()=>[M(Q,{class:"vue-flow__controls-button",title:"连线样式",icon:H(m)},null,8,["icon"])]),_:1}),M(Q,{class:"vue-flow__controls-button",title:Te.value?"关闭动画":"开启动画",icon:H(y),onClick:b[4]||(b[4]=e=>{return a=!Te.value,Te.value=a,De.animated=a,void _e(ye.value.map(e=>({...e,animated:a})));var a})},null,8,["title","icon"]),M(ae,{trigger:"click"},{dropdown:q(()=>[M(ee,null,{default:q(()=>[M(Z,{onClick:b[5]||(b[5]=e=>{ze.value="LR",Ve()})},{default:q(()=>[...b[15]||(b[15]=[F(" 横向布局 ",-1)])]),_:1}),M(Z,{onClick:b[6]||(b[6]=e=>{ze.value="TB",Ve()})},{default:q(()=>[...b[16]||(b[16]=[F(" 纵向布局 ",-1)])]),_:1})]),_:1})]),default:q(()=>[M(Q,{class:"vue-flow__controls-button",title:"布局方向"},{default:q(()=>[M(L,null,{default:q(()=>[M(H(_))]),_:1})]),_:1})]),_:1})]),_:1}),M(H(T),{pannable:"",zoomable:""})]),_:1},8,["nodes","edges","node-types"])])])]),_:1}),Pe.value?(I(),P(O,{key:0,size:"320px",min:280,max:400},{default:q(()=>["node"===Pe.value?(I(),P(V,{key:0,node:Me.value,onClose:Ye,onSave:Ke,onDelete:Qe},null,8,["node"])):K("",!0),"edge"===Pe.value?(I(),P(W,{key:1,edge:qe.value,onClose:Ye,onSave:Ze,onDelete:ea},null,8,["edge"])):K("",!0)]),_:1})):K("",!0)]),_:1})]),_:1})]),_:1},8,["modelValue","title"])}}}),[["__scopeId","data-v-dd324e8d"]]),ue=Object.freeze(Object.defineProperty({__proto__:null,default:de},Symbol.toStringTag,{value:"Module"}));export{de as W,oe as a,ue as b};
|