@robot-admin/naive-ui-components 0.17.3 → 0.17.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/C_Form.cjs +1 -1
  3. package/dist/C_Form.js +1 -1
  4. package/dist/C_FormModal2.cjs +1 -1
  5. package/dist/C_FormModal2.js +1 -1
  6. package/dist/C_FormSearch.css +52 -52
  7. package/dist/C_FormSearch2.cjs +1 -1
  8. package/dist/C_FormSearch2.js +1 -1
  9. package/dist/C_Table.base.css +155 -145
  10. package/dist/C_Table.css +155 -145
  11. package/dist/C_Table.d.cts +1 -1
  12. package/dist/C_Table.d.ts +1 -1
  13. package/dist/C_Time.css +4 -4
  14. package/dist/C_Time2.cjs +1 -1
  15. package/dist/C_Time2.js +1 -1
  16. package/dist/C_Tree.css +23 -23
  17. package/dist/C_Tree2.cjs +1 -1
  18. package/dist/C_Tree2.js +1 -1
  19. package/dist/C_WorkFlow.css +39 -39
  20. package/dist/C_WorkFlow2.cjs +1 -1
  21. package/dist/C_WorkFlow2.js +1 -1
  22. package/dist/constants.d.cts +1 -1
  23. package/dist/constants.d.ts +1 -1
  24. package/dist/constants3.d.cts +1 -1
  25. package/dist/constants3.d.ts +1 -1
  26. package/dist/constants4.d.cts +6 -6
  27. package/dist/constants4.d.ts +6 -6
  28. package/dist/constants5.d.cts +2 -2
  29. package/dist/constants5.d.ts +2 -2
  30. package/dist/data.d.cts +8 -8
  31. package/dist/data.d.ts +8 -8
  32. package/dist/formValidation.cjs +1 -0
  33. package/dist/formValidation.js +1 -0
  34. package/dist/helpers.cjs +1 -1
  35. package/dist/helpers.js +1 -1
  36. package/dist/index.cjs +1 -1
  37. package/dist/index.d.cts +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.vue.d.cts +2 -2
  41. package/dist/index.vue.d.ts +2 -2
  42. package/dist/index10.vue.d.cts +5 -5
  43. package/dist/index10.vue.d.ts +2 -2
  44. package/dist/index11.vue.d.cts +2 -2
  45. package/dist/index11.vue.d.ts +3 -3
  46. package/dist/index12.vue.d.cts +3 -3
  47. package/dist/index12.vue.d.ts +2 -2
  48. package/dist/index13.vue.d.cts +2 -2
  49. package/dist/index13.vue.d.ts +3 -3
  50. package/dist/index14.vue.d.cts +3 -3
  51. package/dist/index14.vue.d.ts +8 -8
  52. package/dist/index15.vue.d.cts +8 -8
  53. package/dist/index15.vue.d.ts +1 -1
  54. package/dist/index16.vue.d.cts +1 -1
  55. package/dist/index17.vue.d.ts +1 -1
  56. package/dist/index18.vue.d.cts +1 -1
  57. package/dist/index18.vue.d.ts +5 -5
  58. package/dist/index19.vue.d.cts +5 -5
  59. package/dist/index19.vue.d.ts +5 -4
  60. package/dist/index2.vue.d.cts +2 -2
  61. package/dist/index2.vue.d.ts +2 -2
  62. package/dist/index20.vue.d.cts +2 -2
  63. package/dist/index20.vue.d.ts +2 -2
  64. package/dist/index21.vue.d.cts +2 -2
  65. package/dist/index21.vue.d.ts +2 -2
  66. package/dist/index22.vue.d.cts +2 -2
  67. package/dist/index22.vue.d.ts +2 -2
  68. package/dist/index25.vue.d.cts +4 -4
  69. package/dist/index25.vue.d.ts +4 -4
  70. package/dist/index26.vue.d.cts +1 -1
  71. package/dist/index26.vue.d.ts +1 -1
  72. package/dist/index27.vue.d.cts +4 -4
  73. package/dist/index27.vue.d.ts +4 -4
  74. package/dist/index28.vue.d.cts +2 -2
  75. package/dist/index28.vue.d.ts +2 -2
  76. package/dist/index3.vue.d.cts +4 -4
  77. package/dist/index3.vue.d.ts +4 -4
  78. package/dist/index4.vue.d.cts +5 -4
  79. package/dist/index8.vue.d.ts +3 -3
  80. package/dist/index9.vue.d.cts +3 -3
  81. package/dist/index9.vue.d.ts +5 -5
  82. package/dist/mapUtils.d.cts +2 -2
  83. package/dist/mapUtils.d.ts +2 -2
  84. package/dist/style.css +274 -264
  85. package/dist/useCalendarEvents.d.cts +1 -1
  86. package/dist/useCalendarEvents.d.ts +1 -1
  87. package/dist/useCollapsePanel.d.cts +4 -4
  88. package/dist/useCollapsePanel.d.ts +4 -4
  89. package/dist/useCropperCore.d.cts +6 -6
  90. package/dist/useCropperCore.d.ts +6 -6
  91. package/dist/useDraggableLayout.d.cts +6 -6
  92. package/dist/useDraggableLayout.d.ts +6 -6
  93. package/dist/useDynamicFormState.d.cts +4 -3
  94. package/dist/useDynamicFormState.d.ts +4 -3
  95. package/dist/useEdgeInteraction.d.cts +2 -2
  96. package/dist/useEdgeInteraction.d.ts +2 -2
  97. package/dist/useInfiniteScroll.d.cts +2 -2
  98. package/dist/useInfiniteScroll.d.ts +2 -2
  99. package/dist/useQRCode.d.cts +3 -3
  100. package/dist/useQRCode.d.ts +3 -3
  101. package/dist/useSearchState.d.cts +2 -2
  102. package/dist/useSearchState.d.ts +2 -2
  103. package/dist/useSignatureHistory.d.cts +4 -4
  104. package/dist/useSignatureHistory.d.ts +4 -4
  105. package/dist/useSplitResize.d.cts +11 -11
  106. package/dist/useSplitResize.d.ts +11 -11
  107. package/dist/useTableQuery.cjs +3 -3
  108. package/dist/useTableQuery.d.cts +535 -509
  109. package/dist/useTableQuery.d.ts +535 -509
  110. package/dist/useTableQuery.js +3 -3
  111. package/dist/useTimeSelection.d.cts +11 -6
  112. package/dist/useTimeSelection.d.ts +11 -6
  113. package/dist/useWorkflowValidation.d.cts +5 -5
  114. package/dist/useWorkflowValidation.d.ts +5 -5
  115. package/dist/verification.d.cts +4 -4
  116. package/dist/verification.d.ts +4 -4
  117. package/docs/guides/usage.en.md +16 -0
  118. package/docs/guides/usage.md +38 -0
  119. package/package.json +2 -1
@@ -1 +1 @@
1
- require(`./chunk.cjs`);const e=require(`./feedback.cjs`),t=require(`./C_Icon2.cjs`),n=require(`./export-helper.cjs`),r=require(`./data.cjs`);let i=require(`vue`),a=require(`naive-ui`),o=require(`@vue-flow/core`);const s=[{type:`approval`,label:`审批人`,icon:`mdi:account-check`,iconClass:`approval-icon`},{type:`copy`,label:`抄送人`,icon:`mdi:email-outline`,iconClass:`copy-icon`},{type:`condition`,label:`条件分支`,icon:`mdi:source-branch`,iconClass:`condition-icon`}],c=[{value:`any`,label:`或签`,desc:`任意一人同意即可通过`},{value:`all`,label:`会签`,desc:`所有人都同意才能通过`},{value:`sequence`,label:`顺序审批`,desc:`按选择顺序依次审批`}],l=[{label:`申请金额`,value:`amount`},{label:`申请人部门`,value:`department`},{label:`申请类型`,value:`type`},{label:`紧急程度`,value:`priority`}],u=[{label:`等于`,value:`equals`},{label:`大于`,value:`greater_than`},{label:`小于`,value:`less_than`},{label:`包含`,value:`contains`},{label:`不等于`,value:`not_equals`}],d={start:`发起人`,approval:`审批人`,copy:`抄送人`,condition:`条件分支`},f={approval:`审批人设置`,copy:`抄送人设置`,condition:`条件分支设置`},p={approvers:`审批人`,conditions:`条件配置`,connection:`节点连接`,nodeId:`节点标识`,edgeId:`连线标识`,start:`开始节点`,cycle:`循环策略`,copyUsers:`抄送人`},m={required:`必填`,invalid:`结构错误`,incomplete:`不完整`,warning:`警告`,error:`错误`},h={id:`start-1`,type:`start`,position:{x:150,y:100},data:{title:`发起人`,status:`active`,initiators:[]}},g=e=>{let t=Array.from(e.trim()).slice(0,2).join(``).toUpperCase()||`?`,n=`<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80"><rect width="80" height="80" rx="40" fill="hsl(${Array.from(e).reduce((e,t)=>(e*31+(t.codePointAt(0)??0))%360,210)} 55% 46%)"/><text x="40" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" fill="white">${t.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&apos;`})[e])}</text></svg>`;return`data:image/svg+xml;charset=UTF-8,${encodeURIComponent(n)}`};let _=0;const v=e=>typeof crypto<`u`&&`randomUUID`in crypto?`${e}-${crypto.randomUUID()}`:`${e}-${Date.now()}-${++_}`,y=()=>v(`condition`),b=(e,t)=>`edge-${e}-${t}`,x=()=>({id:y(),name:``,field:``,operator:`equals`,value:``}),S={key:0,class:`max-h-60vh overflow-y-auto`},C={class:`config-section`},w={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},T={class:`border rounded-lg p-3 mb-4 max-h-50 overflow-y-auto`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},E={key:0,class:`rounded-lg p-4 mb-4 border`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},D={class:`mb-2 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},O={class:`flex flex-wrap gap-3`},k={class:`flex items-center gap-2`},A={class:`font-medium text-sm`},j={class:`text-xs px-1.5 py-0.5 rounded`,style:{color:`var(--n-text-color-3)`,background:`var(--n-color-embedded)`}},M={key:0,class:`mt-4`},ee={class:`flex flex-col gap-1`},te={class:`text-sm`},ne={class:`text-xs`,style:{color:`var(--n-text-color-3)`}},N={class:`max-h-60vh overflow-y-auto`},P={class:`config-section`},F={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},I={class:`space-y-3`},L={class:`flex items-center gap-3 flex-nowrap min-h-10 p-2`},R=(0,i.defineComponent)({__name:`NodeConfigModal`,props:{show:{type:Boolean,default:!1},currentNode:{default:null},users:{default:()=>[]},departments:{default:()=>[]}},emits:[`update:show`,`save`,`cancel`],setup(n,{emit:o}){let s=n,d=o,p=e.t(),m=(0,i.ref)(``),h=(0,i.ref)([]),_=(0,i.ref)([]),v=(0,i.ref)(`any`),y=(0,i.ref)(!1),b=(0,i.ref)([]),R=(0,i.computed)({get:()=>s.show,set:e=>d(`update:show`,e)}),re=(0,i.computed)(()=>s.currentNode?.type===`start`?`发起人设置`:f[s.currentNode?.type]||`节点设置`),z=(0,i.computed)(()=>{let e=[],t=new Map;return s.departments?.forEach(e=>{t.has(e.id)||t.set(e.id,{key:`dept-${e.id}`,label:`${e.name} ${e.manager?`(负责人: ${e.manager})`:``}`,children:[],isLeaf:!1,disabled:!0})}),(s.users?.filter(e=>!m.value||e.name.includes(m.value)||e.department.includes(m.value))||[]).forEach(e=>{let n=s.departments?.find(t=>t.name===e.department);n&&t.has(n.id)&&t.get(n.id).children.push({key:e.id,label:`${e.name}${e.role?`(${e.role})`:``}`,isLeaf:!0,user:e})}),t.forEach(t=>{t.children.length>0&&e.push(t)}),e}),B=(0,i.computed)(()=>s.users?.filter(e=>h.value.includes(e.id))||[]),V=(0,i.computed)(()=>s.users?.filter(e=>_.value.includes(e.id))||[]),H=(0,i.computed)(()=>s.users?.filter(e=>h.value.includes(e.id))||[]),U=e=>{h.value=e.filter(e=>!e.startsWith(`dept-`))},W=e=>{_.value=e.filter(e=>!e.startsWith(`dept-`))},G=e=>{h.value=h.value.filter(t=>t!==e)},K=e=>{_.value=_.value.filter(t=>t!==e)},q=e=>{h.value=h.value.filter(t=>t!==e)},J=()=>b.value.push(x()),Y=e=>b.value.splice(e,1),X=e=>{let{initiators:t}=e.data;h.value=t?t.map(e=>e.id):[]},ie=e=>{h.value=(e.data.approvers||[]).map(e=>e.id),v.value=e.data.approvalMode||`any`},ae=e=>{_.value=(e.data.copyUsers||[]).map(e=>e.id)},oe=e=>{b.value=r.t(e.data.conditions||[])},se=async()=>{if(h.value.length===0)return p.error(`请选择发起人`),!1;let e=H.value;return d(`save`,{initiators:e}),p.success(`已设置 ${e.length} 个发起人`),!0},ce=async()=>{if(h.value.length===0)return p.error(`请至少选择一个审批人`),!1;let e=B.value;return d(`save`,{approvers:e,approvalMode:v.value}),p.success(`已设置 ${e.length} 个审批人`),!0},le=async()=>{let e=V.value;return d(`save`,{copyUsers:e}),p.success(`已设置 ${e.length} 个抄送人`),!0},Z=async()=>b.value.length===0?(p.error(`请至少添加一个条件分支`),!1):b.value.some(e=>!e.name?.trim()||!e.field||!e.operator||!e.value?.trim())?(p.error(`请完善所有条件配置`),!1):(d(`save`,{conditions:r.t(b.value)}),p.success(`已设置 ${b.value.length} 个条件分支`),!0),ue=async()=>{if(!s.currentNode)return!1;y.value=!0;try{let e={start:se,approval:ce,copy:le,condition:Z}[s.currentNode.type];return e?await e():!1}catch(e){return p.error(`保存配置失败`,e),!1}finally{y.value=!1}},de=()=>{d(`cancel`)};(0,i.watch)(()=>s.currentNode,e=>{if(e){m.value=``;let t={start:X,approval:ie,copy:ae,condition:oe}[e.type];t&&t(e)}},{immediate:!0});let fe=(0,i.computed)(()=>[`start`,`approval`,`copy`].includes(s.currentNode?.type||``)),Q=(0,i.computed)(()=>{let e=s.currentNode?.type;return e===`start`?{icon:`mdi:account-star`,title:`选择发起人`,checkedKeys:h.value,onSelect:U,selectedUsers:H.value,selectedLabel:`已选择发起人`,tagType:`primary`,onRemove:q}:e===`approval`?{icon:`mdi:account-check`,title:`选择审批人`,checkedKeys:h.value,onSelect:U,selectedUsers:B.value,selectedLabel:`已选择审批人`,tagType:`info`,onRemove:G}:e===`copy`?{icon:`mdi:email-outline`,title:`选择抄送人`,checkedKeys:_.value,onSelect:W,selectedUsers:V.value,selectedLabel:`已选择抄送人`,tagType:`success`,onRemove:K}:{icon:``,title:``,checkedKeys:[],onSelect:()=>{},selectedUsers:[],selectedLabel:``,tagType:`default`,onRemove:()=>{}}});return(e,n)=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NModal),{show:R.value,"onUpdate:show":n[2]||=e=>R.value=e,style:{width:`900px`},"mask-closable":!1,preset:`dialog`,title:re.value,"positive-text":`确定`,"negative-text":`取消`,loading:y.value,onPositiveClick:ue,onNegativeClick:de},{default:(0,i.withCtx)(()=>[(0,i.createCommentVNode)(` 公共选择面板 `),fe.value?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,S,[(0,i.createElementVNode)(`div`,C,[(0,i.createElementVNode)(`h4`,w,[Q.value.icon?((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(t.t),{key:0,name:Q.value.icon,size:16},null,8,[`name`])):(0,i.createCommentVNode)(`v-if`,!0),(0,i.createTextVNode)(` `+(0,i.toDisplayString)(Q.value.title),1)]),(0,i.createVNode)((0,i.unref)(a.NInput),{value:m.value,"onUpdate:value":n[0]||=e=>m.value=e,placeholder:`搜索用户姓名或部门`,clearable:``,class:`mb-4`},{prefix:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:magnify`,size:16})]),_:1},8,[`value`]),(0,i.createElementVNode)(`div`,T,[(0,i.createVNode)((0,i.unref)(a.NTree),{data:z.value,"checked-keys":Q.value.checkedKeys,selectable:!1,checkable:``,cascade:``,"virtual-scroll":!0,style:{"max-height":`300px`},"onUpdate:checkedKeys":Q.value.onSelect},null,8,[`data`,`checked-keys`,`onUpdate:checkedKeys`])]),Q.value.selectedUsers.length>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,E,[(0,i.createElementVNode)(`h5`,D,(0,i.toDisplayString)(Q.value.selectedLabel)+` (`+(0,i.toDisplayString)(Q.value.selectedUsers.length)+`) `,1),(0,i.createElementVNode)(`div`,O,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(Q.value.selectedUsers,e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NTag),{key:e.id,closable:``,type:Q.value.tagType,onClose:t=>Q.value.onRemove(e.id)},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,k,[(0,i.createVNode)((0,i.unref)(a.NAvatar),{src:e.avatar,"fallback-src":(0,i.unref)(g)(e.name),size:`small`},null,8,[`src`,`fallback-src`]),(0,i.createElementVNode)(`span`,A,(0,i.toDisplayString)(e.name),1),(0,i.createElementVNode)(`span`,j,(0,i.toDisplayString)(e.department),1)])]),_:2},1032,[`type`,`onClose`]))),128))])])):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createCommentVNode)(` 审批节点时附带审批模式 `),s.currentNode?.type===`approval`?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,M,[n[3]||=(0,i.createElementVNode)(`h5`,{class:`mb-3 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},` 审批模式 `,-1),(0,i.createVNode)((0,i.unref)(a.NRadioGroup),{value:v.value,"onUpdate:value":n[1]||=e=>v.value=e},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NSpace),{vertical:``},{default:(0,i.withCtx)(()=>[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(c),e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NRadio),{key:e.value,value:e.value},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,ee,[(0,i.createElementVNode)(`strong`,te,(0,i.toDisplayString)(e.label),1),(0,i.createElementVNode)(`span`,ne,(0,i.toDisplayString)(e.desc),1)])]),_:2},1032,[`value`]))),128))]),_:1})]),_:1},8,[`value`])])):(0,i.createCommentVNode)(`v-if`,!0)])):s.currentNode?.type===`condition`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:1},[(0,i.createCommentVNode)(` 条件节点配置 `),(0,i.createElementVNode)(`div`,N,[(0,i.createElementVNode)(`div`,P,[(0,i.createElementVNode)(`h4`,F,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:source-branch`,size:16}),n[4]||=(0,i.createTextVNode)(` 条件分支设置 `,-1)]),(0,i.createElementVNode)(`div`,I,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(b.value,(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`condition-item`},[(0,i.createVNode)((0,i.unref)(a.NCard),{size:`small`,class:`border border-gray-200 hover:border-gray-300 transition-colors`},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,L,[(0,i.createVNode)((0,i.unref)(a.NInput),{value:e.name,"onUpdate:value":t=>e.name=t,placeholder:`分支名称`,style:{width:`150px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),(0,i.createVNode)((0,i.unref)(a.NSelect),{value:e.field,"onUpdate:value":t=>e.field=t,placeholder:`选择字段`,options:(0,i.unref)(l),style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),(0,i.createVNode)((0,i.unref)(a.NSelect),{value:e.operator,"onUpdate:value":t=>e.operator=t,placeholder:`操作符`,options:(0,i.unref)(u),style:{width:`100px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),(0,i.createVNode)((0,i.unref)(a.NInput),{value:e.value,"onUpdate:value":t=>e.value=t,placeholder:`值`,style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),(0,i.createVNode)((0,i.unref)(a.NButton),{quaternary:``,type:`error`,onClick:e=>Y(n),class:`flex-shrink-0 ml-auto`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:delete`,size:16})]),_:1},8,[`onClick`])])]),_:2},1024)]))),128)),(0,i.createVNode)((0,i.unref)(a.NButton),{dashed:``,block:``,onClick:J,class:`w-full`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})]),default:(0,i.withCtx)(()=>[n[5]||=(0,i.createTextVNode)(` 添加条件 `,-1)]),_:1})])])])],2112)):(0,i.createCommentVNode)(`v-if`,!0)]),_:1},8,[`show`,`title`,`loading`]))}});var re=n.t(R,[[`__scopeId`,`data-v-df36c1fc`]]);const z={class:`start-node`},B={class:`node-content`},V={class:`node-info`},H={class:`node-text`},U={key:0,class:`initiator-name`},W={key:1,class:`placeholder-text`},G=(0,i.defineComponent)({__name:`StartNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.computed)(()=>{let{initiators:e}=n.data;return!e||!Array.isArray(e)||e.length===0?``:e.map(e=>e?.name||`未知用户`).join(`、`)}),o=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,z,[(0,i.createCommentVNode)(` 主要内容区域 `),(0,i.createElementVNode)(`div`,B,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`🚀`,-1),(0,i.createElementVNode)(`div`,V,[(0,i.createElementVNode)(`div`,H,(0,i.toDisplayString)(e.data.title),1),a.value?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,U,(0,i.toDisplayString)(a.value),1)):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,W,`点击设置发起人`))])]),(0,i.createCommentVNode)(` 添加节点按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:o,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var K=n.t(G,[[`__scopeId`,`data-v-6fb2df95`]]);const q={class:`approval-node`},J={class:`node-card`},Y={class:`node-header`},X={class:`node-icon`},ie={class:`node-title`},ae={key:0,class:`node-badge`},oe={key:1,class:`approval-mode-badge`},se={class:`node-content`},ce={key:0,class:`approvers-list`},le={class:`approver-info`},Z={class:`approver-avatar`},ue={class:`approver-details`},de={class:`approver-name`},fe={class:`approver-dept`},Q={class:`approver-role`},pe={key:0,class:`more-count`},me={key:1,class:`placeholder`},he=(0,i.defineComponent)({__name:`ApprovalNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),o=(0,i.inject)(`deleteNode`),s=(0,i.computed)(()=>n.data.approvers??[]),c=(0,i.computed)(()=>s.value.length),l=(0,i.computed)(()=>s.value.slice(0,3)),u=(0,i.computed)(()=>Math.max(0,c.value-3)),d=e=>({any:`或签`,all:`会签`,sequence:`顺序`})[e]||``,f=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},p=e=>{e.stopPropagation(),o&&o(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,q,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:p,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,J,[(0,i.createElementVNode)(`div`,Y,[(0,i.createElementVNode)(`div`,X,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account`,size:12,color:`white`})]),(0,i.createElementVNode)(`span`,ie,(0,i.toDisplayString)(e.data.title),1),c.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,ae,(0,i.toDisplayString)(c.value),1)):(0,i.createCommentVNode)(`v-if`,!0),e.data.approvalMode?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,oe,(0,i.toDisplayString)(d(e.data.approvalMode)),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,se,[c.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,ce,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(l.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`approver-tag`},[(0,i.createElementVNode)(`div`,le,[(0,i.createElementVNode)(`div`,Z,[(0,i.createVNode)((0,i.unref)(a.NAvatar),{src:e.avatar,"fallback-src":(0,i.unref)(g)(e.name),size:`small`},null,8,[`src`,`fallback-src`])]),(0,i.createElementVNode)(`div`,ue,[(0,i.createElementVNode)(`span`,de,(0,i.toDisplayString)(e.name),1),(0,i.createElementVNode)(`span`,fe,(0,i.toDisplayString)(e.department),1),(0,i.createElementVNode)(`span`,Q,(0,i.toDisplayString)(e.role),1)])])]))),128)),u.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,pe,`+`+(0,i.toDisplayString)(u.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,me,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account-plus`,size:24,color:`#9ca3af`}),r[0]||=(0,i.createElementVNode)(`span`,null,`请设置审批人`,-1)]))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:f,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var ge=n.t(he,[[`__scopeId`,`data-v-e6968a42`]]);const _e={class:`copy-node`},ve={class:`node-card`},ye={class:`node-header`},be={class:`node-title`},xe={key:0,class:`node-badge`},Se={class:`node-content`},Ce={key:0,class:`copy-users-list`},we={key:0,class:`more-count`},Te={key:1,class:`placeholder`},Ee=(0,i.defineComponent)({__name:`CopyNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.inject)(`deleteNode`),o=(0,i.computed)(()=>n.data.copyUsers??[]),s=(0,i.computed)(()=>o.value.length),c=(0,i.computed)(()=>o.value.slice(0,3)),l=(0,i.computed)(()=>Math.max(0,s.value-3)),u=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},d=e=>{e.stopPropagation(),a&&a(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,_e,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:d,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,ve,[(0,i.createElementVNode)(`div`,ye,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`📋`,-1),(0,i.createElementVNode)(`span`,be,(0,i.toDisplayString)(e.data.title),1),s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,xe,(0,i.toDisplayString)(s.value),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,Se,[s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ce,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(c.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`copy-user-tag`},(0,i.toDisplayString)(e.name),1))),128)),l.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,we,`+`+(0,i.toDisplayString)(l.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Te,`请设置抄送人`))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:u,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var De=n.t(Ee,[[`__scopeId`,`data-v-010e7ec8`]]);const Oe={class:`condition-node`},ke={class:`node-card`},Ae={class:`node-header`},je={class:`node-title`},Me={key:0,class:`node-badge`},Ne={class:`node-content`},Pe={key:0,class:`conditions-list`},Fe={key:0,class:`more-count`},Ie={key:1,class:`placeholder`},Le=(0,i.defineComponent)({__name:`ConditionNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.inject)(`deleteNode`),o=(0,i.computed)(()=>n.data.conditions??[]),s=(0,i.computed)(()=>o.value.length),c=(0,i.computed)(()=>o.value.slice(0,2)),l=(0,i.computed)(()=>Math.max(0,s.value-2)),u=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},d=e=>{e.stopPropagation(),a&&a(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Oe,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:d,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,ke,[(0,i.createElementVNode)(`div`,Ae,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`🔀`,-1),(0,i.createElementVNode)(`span`,je,(0,i.toDisplayString)(e.data.title),1),s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Me,(0,i.toDisplayString)(s.value),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,Ne,[s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Pe,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(c.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`condition-tag`},[r[1]||=(0,i.createElementVNode)(`span`,{class:`condition-icon`},`→`,-1),(0,i.createElementVNode)(`span`,null,(0,i.toDisplayString)(e.name||`条件`+(c.value.indexOf(e)+1)),1)]))),128)),l.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Fe,`+`+(0,i.toDisplayString)(l.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ie,`请设置分支条件`))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:u,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var Re=n.t(Le,[[`__scopeId`,`data-v-5ede8782`]]);const ze={start:(0,i.markRaw)(K),approval:(0,i.markRaw)(ge),copy:(0,i.markRaw)(De),condition:(0,i.markRaw)(Re)};function Be(t,n,a){let o=e.t(),s=(0,i.ref)(r.t(t.modelValue?.nodes??[h])),c=(0,i.ref)(r.t(t.modelValue?.edges??[])),l=(0,i.ref)(t.modelValue?r.t(t.modelValue.config):{version:`1.0`,createdAt:new Date().toISOString()}),u=(0,i.ref)(!1),f=(0,i.ref)({x:0,y:0}),p=(0,i.ref)(!1),m=(0,i.ref)(null),g=(0,i.ref)(null),_=new Set,y=!1,x=(e,t)=>{let n=setTimeout(()=>{_.delete(n),y||e()},t);_.add(n)},S=(0,i.computed)(()=>ze),C=(0,i.computed)(()=>{let e={totalNodes:s.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0};return s.value.forEach(t=>{t.type===`approval`?e.approvalNodes++:t.type===`copy`?e.copyNodes++:t.type===`condition`&&e.conditionNodes++}),e}),w=()=>({nodes:r.t(s.value),edges:r.t(c.value),...l.value!==void 0&&{config:r.t(l.value)}}),T=()=>{let e=w();n(`update:modelValue`,e),n(`change`,e)},E=(e=60,t=400)=>{(0,i.nextTick)(()=>{y||x(()=>{a.value?.fitView?.({padding:e,duration:t})},100)})},D=(e,n)=>{t.readonly||(f.value={x:typeof e.x==`number`?e.x:0,y:typeof e.y==`number`?e.y:0},g.value=n||null,u.value=!0)},O=()=>{u.value=!1},k=e=>{if(t.readonly)return;let n=s.value.findIndex(t=>t.id===e);if(n===-1)return;if(s.value[n].type===`start`){o.warning(`不能删除开始节点`);return}let r=c.value.filter(t=>t.target===e),i=c.value.filter(t=>t.source===e);s.value.splice(n,1),c.value=c.value.filter(t=>t.source!==e&&t.target!==e),r.forEach(e=>{i.forEach(t=>{c.value.push({id:b(e.source,t.target),source:e.source,target:t.target,animated:!0,type:`default`})})}),s.value.forEach((e,t)=>{t>=n&&(e.position.y-=180)}),T(),o.success(`节点已删除`),E()};(0,i.provide)(`showAddMenu`,D),(0,i.provide)(`deleteNode`,k);let A=()=>{let e=s.value.length-1,t=s.value[e];if(g.value){let n=s.value.findIndex(e=>e.id===g.value);n!==-1&&(e=n,t=s.value[e])}return{targetNodeIndex:e,targetNode:t}},j=(e,t)=>({id:v(e),type:e,position:{x:t?.position.x??150,y:(t?.position.y??130)+180},data:{title:d[e],status:`pending`,...e===`approval`&&{approvers:[],approvalMode:`any`},...e===`copy`&&{copyUsers:[]},...e===`condition`&&{conditions:[]}}}),M=(e,t)=>{let n=c.value.filter(t=>t.source===e.id);c.value=c.value.filter(t=>t.source!==e.id),c.value.push({id:b(e.id,t.id),source:e.id,target:t.id,animated:!0,type:`default`}),n.forEach(e=>{c.value.push({id:b(t.id,e.target),source:t.id,target:e.target,animated:!0,type:`default`})})};return(0,i.watch)(()=>t.modelValue,e=>{e&&(r.a(e.nodes??[],s.value)&&r.a(e.edges??[],c.value)&&r.a(e.config,l.value)||(s.value=r.t(e.nodes??[]),c.value=r.t(e.edges??[]),l.value=r.t(e.config)))},{deep:!0}),(0,i.onMounted)(()=>{y=!1,(0,i.nextTick)(()=>{y||x(()=>{a.value?.fitView?.({padding:80,includeHiddenNodes:!1,minZoom:.8,maxZoom:1.2,duration:600})},300)})}),(0,i.onBeforeUnmount)(()=>{y=!0,_.forEach(e=>clearTimeout(e)),_.clear()}),{nodes:s,edges:c,showAddMenu:u,menuPosition:f,showNodeConfig:p,currentNode:m,nodeTypes:S,workflowStats:C,addNode:e=>{if(!t.readonly)try{let{targetNodeIndex:t,targetNode:n}=A(),r=j(e,n);s.value.splice(t+1,0,r);for(let e=t+2;e<s.value.length;e++)s.value[e].position.y+=180;n&&M(n,r),u.value=!1,g.value=null,T(),E()}catch(e){o.error(`添加节点失败,请重试`,e)}},onNodeClick:e=>{let i=s.value.find(t=>t.id===e.node.id);i&&(t.readonly||(m.value=i,p.value=!0),n(`node-click`,r.t(i)))},closeAddMenu:O,handleConfigSave:e=>{if(t.readonly||!m.value)return;let n=s.value.findIndex(e=>e.id===m.value.id);if(n!==-1){let t={...s.value[n],data:{...s.value[n].data,...r.t(e)}};s.value.splice(n,1,t),m.value=t}T(),p.value=!1,o.success(`节点配置已保存`)},resetNodes:()=>{t.readonly||(s.value=r.t([h]),c.value=[],T(),E(80,600),o.success(`画布已清空`))},getCurrentWorkflowData:w,fitView:()=>{let e=a.value;if(!e?.fitView){o.warning(`画布未准备就绪,请稍后重试`);return}(0,i.nextTick)(()=>{y||a.value!==e||e.fitView({padding:50,includeHiddenNodes:!1,minZoom:.5,maxZoom:1.5,duration:800})}),o.success(`已适应窗口大小`)},deleteNode:k}}function $(e,t,n){return{nodeId:e?.id??``,nodeName:e?.data.title??`流程结构`,field:t,message:n,type:`invalid`,severity:`high`}}function Ve(e){let t=new Set,n=new Set;for(let r of e.keys()){if(t.has(r))continue;let i=[{id:r,offset:0}];for(t.add(r),n.add(r);i.length;){let r=i[i.length-1],a=e.get(r.id);if(r.offset>=a.length){n.delete(r.id),i.pop();continue}let o=a[r.offset++];if(n.has(o))return o;t.has(o)||(t.add(o),n.add(o),i.push({id:o,offset:0}))}}}function He(e,t){let n=new Map;return e.forEach(e=>{e.id?.trim()?n.has(e.id)?t.push($(e,`nodeId`,`节点 id「${e.id}」重复,请使用唯一标识`)):n.set(e.id,e):t.push($(e,`nodeId`,`节点 id 不能为空`))}),n}function Ue(e,t,n){let r=new Map([...e.keys()].map(e=>[e,[]])),i=new Set;return t.forEach(t=>{let a=e.get(t.source),o=e.get(t.target);if((!t.id?.trim()||i.has(t.id))&&n.push($(a??o,`edgeId`,`连线 id 不能为空或重复`)),i.add(t.id),!a||!o){let e=[!a&&t.source,!o&&t.target].filter(e=>e!==!1).map(e=>e||`空标识`);n.push($(a??o,`connection`,`连线「${t.id}」指向不存在的节点:${e.join(`、`)}`));return}r.get(a.id).push(o.id)}),r}function We(e,t,n,r){let i=new Set([e.id]),a=[e.id];for(let e=0;e<a.length;e++)n.get(a[e])?.forEach(e=>{i.has(e)||(i.add(e),a.push(e))});t.forEach(e=>{i.has(e.id)||r.push($(e,`connection`,`此节点无法从开始节点到达,请检查连线方向与流程连接`))})}function Ge(e,t,n={}){let r=[],i=He(e,r),a=e.filter(e=>e.type===`start`);a.length!==1&&r.push($(a[0],`start`,`流程必须包含且仅包含一个开始节点,当前为 ${a.length} 个`));let o=Ue(i,t,r);if(a.length===1&&i.has(a[0].id)&&We(a[0],i,o,r),n.allowCycles===!1){let e=Ve(o);e!==void 0&&r.push($(i.get(e),`cycle`,`当前审批流程不允许循环,请移除回指连线或由业务启用循环策略`))}return r}function Ke(t,n,r,a){let o=e.t(),s=(0,i.ref)([]),c=(0,i.ref)(!1),l,u=()=>{let e=typeof a?.allowCycles==`function`?a.allowCycles():a?.allowCycles,r=Ge(t.value,n.value,{allowCycles:e});return t.value.forEach(e=>{if(e.type===`approval`&&(e.data.approvers||[]).length===0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`approvers`,message:`审批节点必须设置至少一个审批人,否则流程无法正常运行`,type:`required`}),e.type===`condition`){let t=e.data.conditions||[];if(t.length===0)r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`条件分支节点必须配置至少一个分支条件,否则无法进行条件判断`,type:`required`});else{let n=t.filter(e=>!e.name||!e.field||!e.operator||!e.value);n.length>0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`有 ${n.length} 个条件分支配置不完整,请完善所有必填字段`,type:`incomplete`})}}}),r};return(0,i.onBeforeUnmount)(()=>{l&&clearTimeout(l)}),{validationErrors:s,showValidationErrors:c,validateWorkflow:u,validateCurrentWorkflow:()=>{let e=u();s.value=e,e.length===0?(o.success(`流程结构和节点配置验证通过;执行规则由业务后端校验`),c.value=!1):(o.error(`发现 ${e.length} 个问题,请查看详细错误`),c.value=!0,a?.onValidateError?.(e))},jumpToErrorNode:e=>{let n=t.value.find(t=>t.id===e);!n||!r.value||(r.value.setCenter(n.position.x,n.position.y,{zoom:1.2,duration:800}),l&&clearTimeout(l),l=setTimeout(()=>{l=void 0,t.value.includes(n)&&(a?.onShowNodeConfig?.(n),c.value=!1)},900),o.info(`已定位到节点:${n.data.title}`))},getFieldDisplayName:e=>p[e]||e,getErrorTypeText:e=>m[e]||e,resetValidation:()=>{l&&clearTimeout(l),l=void 0,s.value=[],c.value=!1}}}const qe={start:{label:`发起人`,icon:`mdi:play-circle`,colorClass:`start`},approval:{label:`审批节点`,icon:`mdi:account-check`,colorClass:`approval`},copy:{label:`抄送节点`,icon:`mdi:email-outline`,colorClass:`copy`},condition:{label:`条件分支`,icon:`mdi:source-branch`,colorClass:`condition`}},Je={any:`或签(任一审批人通过即可)`,all:`会签(所有审批人必须通过)`,sequence:`顺序审批(按顺序依次审批)`},Ye={equals:`等于`,not_equals:`不等于`,greater_than:`大于`,less_than:`小于`,contains:`包含`};function Xe(e,t){let n=(0,i.ref)(!1),r=(0,i.ref)([]),a=(0,i.ref)({totalNodes:0,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:0}),o={start:e=>{let t=e.initiators||[];return t.length>0?[{type:`users`,label:`发起人`,users:t}]:[{type:`text`,label:`发起人`,value:`所有人`}]},approval:e=>{let t=e.approvalMode||`any`,n=e.approvers||[],r=[{type:`mode`,label:`审批方式`,value:Je[t]||t,modeKey:t}];return n.length>0?r.push({type:`users`,label:`审批人`,users:n}):r.push({type:`warning`,label:`审批人`,value:`未设置`}),r},copy:e=>{let t=e.copyUsers||[];return t.length>0?[{type:`users`,label:`抄送人`,users:t}]:[{type:`text`,label:`抄送人`,value:`未设置`}]},condition:e=>{let t=e.conditions||[];return t.length===0?[{type:`warning`,label:`条件分支`,value:`未配置`}]:t.map((e,t)=>{let n=Ye[e.operator]||e.operator;return{type:`text`,label:`分支 ${t+1}`,value:`${e.name||`未命名`} — ${e.field||`?`} ${n} ${e.value||`?`}`}})}},s=e=>{let t=o[e.type||`start`];return t?t(e.data):[]},c=()=>{let n=new Map;e.value.forEach(e=>n.set(e.id,e));let r=new Map,i=new Map;e.value.forEach(e=>{r.set(e.id,[]),i.set(e.id,0)}),t.value.forEach(e=>{r.get(e.source)?.push(e.target),i.set(e.target,(i.get(e.target)||0)+1)});let a=[];i.forEach((e,t)=>{e===0&&a.push(t)});let o=[],s=new Set;for(;a.length>0;){let e=a.shift();if(s.has(e))continue;s.add(e);let t=n.get(e);t&&o.push(t);let c=r.get(e)||[];for(let e of c){let t=(i.get(e)||1)-1;i.set(e,t),t<=0&&!s.has(e)&&a.push(e)}}return e.value.forEach(e=>{s.has(e.id)||o.push(e)}),o},l=()=>c().map((e,t)=>{let n=qe[e.type||`start`]||qe.start;return{order:t+1,node:e,nodeTypeLabel:n.label,icon:n.icon,colorClass:n.colorClass,details:s(e)}}),u=()=>{let n={totalNodes:e.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:t.value.length};return e.value.forEach(e=>{e.type===`approval`?n.approvalNodes++:e.type===`copy`?n.copyNodes++:e.type===`condition`&&n.conditionNodes++}),n};return{showPreview:n,previewSteps:r,previewStats:a,openPreview:()=>{r.value=l(),a.value=u(),n.value=!0},closePreview:()=>{n.value=!1}}}const Ze={class:`approval-workflow-container`},Qe={class:`floating-toolbar`},$e={class:`add-menu-content`},et=[`onClick`],tt={class:`menu-text`},nt={key:0,class:`validation-success`},rt={class:`success-icon`},it={key:1,class:`validation-errors`},at={class:`error-summary`},ot={class:`error-icon`},st={class:`error-list`},ct={class:`error-header`},lt={class:`error-number`},ut={class:`error-info`},dt={class:`error-node`},ft={class:`error-field`},pt={class:`error-message`},mt={class:`error-actions`},ht={class:`validation-footer`},gt={class:`preview-stats`},_t={class:`stat-item`},vt={class:`stat-value`},yt={class:`stat-item approval`},bt={class:`stat-value`},xt={class:`stat-item copy`},St={class:`stat-value`},Ct={class:`stat-item condition`},wt={class:`stat-value`},Tt={class:`stat-item edge`},Et={class:`stat-value`},Dt={class:`preview-timeline`},Ot={class:`step-connector`},kt={class:`step-dot`},At={key:0,class:`step-line`},jt={class:`step-content`},Mt={class:`step-header`},Nt={class:`step-order`},Pt={class:`step-type-badge`},Ft={class:`step-title`},It={key:0,class:`step-details`},Lt={class:`detail-label`},Rt={class:`warning-text`},zt={key:0,class:`preview-empty`},Bt={class:`preview-footer`},Vt=(0,i.defineComponent)({name:`C_WorkFlow`,__name:`index`,props:{users:{default:()=>[]},roles:{default:()=>[]},departments:{default:()=>[]},modelValue:{},readonly:{type:Boolean,default:!1},allowCycles:{type:Boolean,default:!0},theme:{default:`light`}},emits:[`update:modelValue`,`change`,`node-click`,`edge-click`,`save`,`validate-error`],setup(n,{expose:r,emit:c}){let l=n,u=c,d=e.t(),f=(0,i.ref)(),{nodes:p,edges:m,showAddMenu:h,menuPosition:g,showNodeConfig:_,currentNode:v,nodeTypes:y,workflowStats:b,addNode:x,onNodeClick:S,closeAddMenu:C,handleConfigSave:w,resetNodes:T,getCurrentWorkflowData:E,fitView:D,deleteNode:O}=Be(l,u,f),{validationErrors:k,showValidationErrors:A,validateWorkflow:j,validateCurrentWorkflow:M,jumpToErrorNode:ee,getFieldDisplayName:te,getErrorTypeText:ne,resetValidation:N}=Ke(p,m,f,{allowCycles:()=>l.allowCycles,onShowNodeConfig:e=>{l.readonly||(v.value=e,_.value=!0)},onValidateError:e=>u(`validate-error`,e)}),{showPreview:P,previewSteps:F,previewStats:I,openPreview:L,closePreview:R}=Xe(p,m),z=()=>{if(l.readonly)return;let e=j();if(k.value=e,e.length>0){d.error(`工作流验证失败: ${e[0].message}`),A.value=!0,u(`validate-error`,e);return}u(`save`,E()),d.success(`工作流保存成功`)},B=()=>{L()},V=()=>{R(),z()},H=()=>{l.readonly||(T(),N())};return r({validateWorkflow:j,getCurrentWorkflowData:E,saveWorkflow:z,previewWorkflow:B,deleteNode:O,stats:b}),(e,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ze,[(0,i.createCommentVNode)(` 浮动工具栏 `),(0,i.createElementVNode)(`div`,Qe,[(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`primary`,disabled:n.readonly,onClick:z},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:content-save`,size:16})]),default:(0,i.withCtx)(()=>[r[7]||=(0,i.createTextVNode)(` 保存 `,-1)]),_:1},8,[`disabled`]),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:B},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:eye`,size:16})]),default:(0,i.withCtx)(()=>[r[8]||=(0,i.createTextVNode)(` 预览 `,-1)]),_:1}),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:(0,i.unref)(M),title:`检查工作流配置是否正确`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:check-circle`,size:16})]),default:(0,i.withCtx)(()=>[r[9]||=(0,i.createTextVNode)(` 验证流程 `,-1)]),_:1},8,[`onClick`]),r[10]||=(0,i.createElementVNode)(`div`,{class:`toolbar-divider`},null,-1),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:(0,i.unref)(D),title:`适应窗口`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:fit-to-screen`,size:16})]),_:1},8,[`onClick`]),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`error`,disabled:n.readonly,onClick:H,title:`清空画布`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:delete-sweep`,size:16})]),_:1},8,[`disabled`])]),(0,i.createCommentVNode)(` Vue Flow 画布 `),(0,i.createVNode)((0,i.unref)(o.VueFlow),{ref_key:`vueFlowRef`,ref:f,nodes:(0,i.unref)(p),"onUpdate:nodes":r[0]||=e=>(0,i.isRef)(p)?p.value=e:null,edges:(0,i.unref)(m),"onUpdate:edges":r[1]||=e=>(0,i.isRef)(m)?m.value=e:null,"node-types":(0,i.unref)(y),class:`workflow-canvas`,"default-viewport":{zoom:1,x:0,y:0},"min-zoom":.5,"max-zoom":2,"fit-view-on-init":!0,"nodes-draggable":!n.readonly,"nodes-connectable":!n.readonly,"edges-updatable":!n.readonly,"delete-key-code":n.readonly?null:void 0,"elements-selectable":!0,onNodeClick:(0,i.unref)(S),onPaneClick:(0,i.unref)(C)},null,8,[`nodes`,`edges`,`node-types`,`nodes-draggable`,`nodes-connectable`,`edges-updatable`,`delete-key-code`,`onNodeClick`,`onPaneClick`]),(0,i.createCommentVNode)(` 节点添加菜单 `),((0,i.openBlock)(),(0,i.createBlock)(i.Teleport,{to:`body`},[(0,i.withDirectives)((0,i.createElementVNode)(`div`,{class:`add-node-menu`,style:(0,i.normalizeStyle)({left:(0,i.unref)(g).x+`px`,top:(0,i.unref)(g).y+`px`})},[(0,i.createElementVNode)(`div`,$e,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(s),e=>((0,i.openBlock)(),(0,i.createElementBlock)(`button`,{key:e.type,type:`button`,class:`add-menu-item`,onClick:t=>(0,i.unref)(x)(e.type)},[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`menu-icon`,e.iconClass])},[(0,i.createVNode)((0,i.unref)(t.t),{name:e.icon,size:16},null,8,[`name`])],2),(0,i.createElementVNode)(`span`,tt,(0,i.toDisplayString)(e.label),1)],8,et))),128))])],4),[[i.vShow,(0,i.unref)(h)]])])),(0,i.createCommentVNode)(` 节点配置弹窗 - 拆分到独立组件 `),(0,i.createVNode)(re,{show:(0,i.unref)(_),"onUpdate:show":r[2]||=e=>(0,i.isRef)(_)?_.value=e:null,"current-node":(0,i.unref)(v),users:n.users,departments:n.departments,onSave:(0,i.unref)(w),onCancel:r[3]||=e=>_.value=!1},null,8,[`show`,`current-node`,`users`,`departments`,`onSave`]),(0,i.createCommentVNode)(` 验证错误日志抽屉 `),(0,i.createVNode)((0,i.unref)(a.NDrawer),{show:(0,i.unref)(A),"onUpdate:show":r[5]||=e=>(0,i.isRef)(A)?A.value=e:null,width:450,placement:`right`},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NDrawerContent),{title:`流程验证结果`,closable:``},{footer:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,ht,[(0,i.createVNode)((0,i.unref)(a.NButton),{onClick:r[4]||=e=>A.value=!1},{default:(0,i.withCtx)(()=>[...r[16]||=[(0,i.createTextVNode)(`关闭`,-1)]]),_:1}),(0,i.createVNode)((0,i.unref)(a.NButton),{type:`primary`,onClick:(0,i.unref)(M)},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:refresh`,size:16})]),default:(0,i.withCtx)(()=>[r[17]||=(0,i.createTextVNode)(` 重新验证 `,-1)]),_:1},8,[`onClick`])])]),default:(0,i.withCtx)(()=>[(0,i.unref)(k).length===0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,nt,[(0,i.createElementVNode)(`div`,rt,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:check-circle`,size:32,color:`#52c41a`})]),r[11]||=(0,i.createElementVNode)(`h3`,null,`验证通过`,-1),r[12]||=(0,i.createElementVNode)(`p`,null,`流程结构和节点配置验证通过;审批执行、权限与业务规则由后端校验。`,-1)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,it,[(0,i.createElementVNode)(`div`,at,[(0,i.createElementVNode)(`div`,ot,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:alert-circle`,size:24,color:`#ff4d4f`})]),(0,i.createElementVNode)(`h3`,null,`发现 `+(0,i.toDisplayString)((0,i.unref)(k).length)+` 个问题`,1),r[13]||=(0,i.createElementVNode)(`p`,null,`请修复以下问题后重新验证:`,-1)]),(0,i.createElementVNode)(`div`,st,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(k),(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:`${e.nodeId}-${e.field}-${n}`,class:`error-item`},[(0,i.createElementVNode)(`div`,ct,[(0,i.createElementVNode)(`span`,lt,(0,i.toDisplayString)(n+1),1),(0,i.createElementVNode)(`div`,ut,[(0,i.createElementVNode)(`strong`,dt,(0,i.toDisplayString)(e.nodeName),1),(0,i.createElementVNode)(`span`,ft,(0,i.toDisplayString)((0,i.unref)(te)(e.field)),1)]),(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`error-type`,e.type])},(0,i.toDisplayString)((0,i.unref)(ne)(e.type)),3)]),(0,i.createElementVNode)(`div`,pt,(0,i.toDisplayString)(e.message),1),(0,i.createElementVNode)(`div`,mt,[(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`primary`,disabled:!e.nodeId,onClick:t=>(0,i.unref)(ee)(e.nodeId)},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:target`,size:16})]),default:(0,i.withCtx)(()=>[r[14]||=(0,i.createTextVNode)(` 定位节点 `,-1)]),_:1},8,[`disabled`,`onClick`])])]))),128))]),r[15]||=(0,i.createElementVNode)(`div`,{class:`validation-tips`},[(0,i.createElementVNode)(`h4`,null,`💡 常见问题解决方案:`),(0,i.createElementVNode)(`ul`,null,[(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`审批人未设置:`),(0,i.createTextVNode)(`点击审批节点,在弹窗中选择审批人员 `)]),(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`条件分支未配置:`),(0,i.createTextVNode)(`点击条件节点,添加至少一个条件分支 `)]),(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`节点连接断开:`),(0,i.createTextVNode)(` 检查节点之间的连线是否正确 `)])])],-1)]))]),_:1})]),_:1},8,[`show`]),(0,i.createCommentVNode)(` 流程预览抽屉 `),(0,i.createVNode)((0,i.unref)(a.NDrawer),{show:(0,i.unref)(P),"onUpdate:show":r[6]||=e=>(0,i.isRef)(P)?P.value=e:null,width:520,placement:`right`},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NDrawerContent),{title:`流程预览`,closable:``},{footer:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,Bt,[(0,i.createVNode)((0,i.unref)(a.NButton),{onClick:(0,i.unref)(R)},{default:(0,i.withCtx)(()=>[...r[24]||=[(0,i.createTextVNode)(`关闭`,-1)]]),_:1},8,[`onClick`]),(0,i.createVNode)((0,i.unref)(a.NButton),{type:`primary`,onClick:V},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:content-save`,size:16})]),default:(0,i.withCtx)(()=>[r[25]||=(0,i.createTextVNode)(` 确认并保存 `,-1)]),_:1})])]),default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,gt,[(0,i.createElementVNode)(`div`,_t,[(0,i.createElementVNode)(`span`,vt,(0,i.toDisplayString)((0,i.unref)(I).totalNodes),1),r[18]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`总节点`,-1)]),(0,i.createElementVNode)(`div`,yt,[(0,i.createElementVNode)(`span`,bt,(0,i.toDisplayString)((0,i.unref)(I).approvalNodes),1),r[19]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`审批`,-1)]),(0,i.createElementVNode)(`div`,xt,[(0,i.createElementVNode)(`span`,St,(0,i.toDisplayString)((0,i.unref)(I).copyNodes),1),r[20]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`抄送`,-1)]),(0,i.createElementVNode)(`div`,Ct,[(0,i.createElementVNode)(`span`,wt,(0,i.toDisplayString)((0,i.unref)(I).conditionNodes),1),r[21]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`条件`,-1)]),(0,i.createElementVNode)(`div`,Tt,[(0,i.createElementVNode)(`span`,Et,(0,i.toDisplayString)((0,i.unref)(I).totalEdges),1),r[22]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`连线`,-1)])]),(0,i.createElementVNode)(`div`,Dt,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(F),(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.node.id,class:(0,i.normalizeClass)([`preview-step`,e.colorClass])},[(0,i.createCommentVNode)(` 时间线连接线 `),(0,i.createElementVNode)(`div`,Ot,[(0,i.createElementVNode)(`div`,kt,[(0,i.createVNode)((0,i.unref)(t.t),{name:e.icon,size:16},null,8,[`name`])]),n<(0,i.unref)(F).length-1?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,At)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createCommentVNode)(` 步骤内容 `),(0,i.createElementVNode)(`div`,jt,[(0,i.createElementVNode)(`div`,Mt,[(0,i.createElementVNode)(`span`,Nt,`步骤 `+(0,i.toDisplayString)(e.order),1),(0,i.createElementVNode)(`span`,Pt,(0,i.toDisplayString)(e.nodeTypeLabel),1)]),(0,i.createElementVNode)(`div`,Ft,(0,i.toDisplayString)(e.node.data.title),1),e.details.length>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,It,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(e.details,(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:n,class:(0,i.normalizeClass)([`step-detail-item`,{"is-warning":e.type===`warning`}])},[(0,i.createElementVNode)(`span`,Lt,(0,i.toDisplayString)(e.label)+`:`,1),(0,i.createCommentVNode)(` 审批方式 badge `),e.type===`mode`?((0,i.openBlock)(),(0,i.createElementBlock)(`span`,{key:0,class:(0,i.normalizeClass)([`mode-badge`,e.modeKey])},(0,i.toDisplayString)(e.value),3)):e.type===`users`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:1},[(0,i.createCommentVNode)(` 人员 tags `),((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(e.users,e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NTag),{key:e.name,size:`small`,bordered:!1,round:``,class:`user-tag`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account`,size:12})]),default:(0,i.withCtx)(()=>[(0,i.createTextVNode)(` `+(0,i.toDisplayString)(e.name),1)]),_:2},1024))),128))],64)):e.type===`warning`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:2},[(0,i.createCommentVNode)(` 警告文案 `),(0,i.createElementVNode)(`span`,Rt,` ⚠️ `+(0,i.toDisplayString)(e.value),1)],2112)):((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:3},[(0,i.createCommentVNode)(` 普通文本 `),(0,i.createElementVNode)(`span`,null,(0,i.toDisplayString)(e.value),1)],2112))],2))),128))])):(0,i.createCommentVNode)(`v-if`,!0)])],2))),128))]),(0,i.unref)(F).length===0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,zt,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:file-document-outline`,size:48,color:`#d1d5db`}),r[23]||=(0,i.createElementVNode)(`p`,null,`暂无流程节点`,-1)])):(0,i.createCommentVNode)(`v-if`,!0)]),_:1})]),_:1},8,[`show`])]))}});var Ht=n.t(Vt,[[`__scopeId`,`data-v-f5022473`]]);Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Be}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Xe}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Ke}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Ht}});
1
+ require(`./chunk.cjs`);const e=require(`./feedback.cjs`),t=require(`./C_Icon2.cjs`),n=require(`./export-helper.cjs`),r=require(`./data.cjs`);let i=require(`vue`),a=require(`naive-ui`),o=require(`@vue-flow/core`);const s=[{type:`approval`,label:`审批人`,icon:`mdi:account-check`,iconClass:`approval-icon`},{type:`copy`,label:`抄送人`,icon:`mdi:email-outline`,iconClass:`copy-icon`},{type:`condition`,label:`条件分支`,icon:`mdi:source-branch`,iconClass:`condition-icon`}],c=[{value:`any`,label:`或签`,desc:`任意一人同意即可通过`},{value:`all`,label:`会签`,desc:`所有人都同意才能通过`},{value:`sequence`,label:`顺序审批`,desc:`按选择顺序依次审批`}],l=[{label:`申请金额`,value:`amount`},{label:`申请人部门`,value:`department`},{label:`申请类型`,value:`type`},{label:`紧急程度`,value:`priority`}],u=[{label:`等于`,value:`equals`},{label:`大于`,value:`greater_than`},{label:`小于`,value:`less_than`},{label:`包含`,value:`contains`},{label:`不等于`,value:`not_equals`}],d={start:`发起人`,approval:`审批人`,copy:`抄送人`,condition:`条件分支`},f={approval:`审批人设置`,copy:`抄送人设置`,condition:`条件分支设置`},p={approvers:`审批人`,conditions:`条件配置`,connection:`节点连接`,nodeId:`节点标识`,edgeId:`连线标识`,start:`开始节点`,cycle:`循环策略`,copyUsers:`抄送人`},m={required:`必填`,invalid:`结构错误`,incomplete:`不完整`,warning:`警告`,error:`错误`},h={id:`start-1`,type:`start`,position:{x:150,y:100},data:{title:`发起人`,status:`active`,initiators:[]}},g=e=>{let t=Array.from(e.trim()).slice(0,2).join(``).toUpperCase()||`?`,n=`<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80"><rect width="80" height="80" rx="40" fill="hsl(${Array.from(e).reduce((e,t)=>(e*31+(t.codePointAt(0)??0))%360,210)} 55% 46%)"/><text x="40" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" fill="white">${t.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&apos;`})[e])}</text></svg>`;return`data:image/svg+xml;charset=UTF-8,${encodeURIComponent(n)}`};let _=0;const v=e=>typeof crypto<`u`&&`randomUUID`in crypto?`${e}-${crypto.randomUUID()}`:`${e}-${Date.now()}-${++_}`,y=()=>v(`condition`),b=(e,t)=>`edge-${e}-${t}`,x=()=>({id:y(),name:``,field:``,operator:`equals`,value:``}),S=new Set([`equals`,`not_equals`,`greater_than`,`less_than`,`contains`]);function C(e){if(!e||typeof e!=`object`)return!1;let t=e;return[t.id,t.name,t.field,t.value].every(e=>typeof e==`string`&&e.trim().length>0)&&S.has(t.operator)}const w={key:0,class:`max-h-60vh overflow-y-auto`},T={class:`config-section`},E={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},D={class:`border rounded-lg p-3 mb-4 max-h-50 overflow-y-auto`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},O={key:0,class:`rounded-lg p-4 mb-4 border`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},k={class:`mb-2 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},A={class:`flex flex-wrap gap-3`},j={class:`flex items-center gap-2`},M={class:`font-medium text-sm`},ee={class:`text-xs px-1.5 py-0.5 rounded`,style:{color:`var(--n-text-color-3)`,background:`var(--n-color-embedded)`}},te={key:0,class:`mt-4`},N={class:`flex flex-col gap-1`},P={class:`text-sm`},F={class:`text-xs`,style:{color:`var(--n-text-color-3)`}},I={class:`max-h-60vh overflow-y-auto`},L={class:`config-section`},ne={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},R={class:`space-y-3`},z={class:`flex items-center gap-3 flex-nowrap min-h-10 p-2`},B=(0,i.defineComponent)({__name:`NodeConfigModal`,props:{show:{type:Boolean,default:!1},currentNode:{default:null},users:{default:()=>[]},departments:{default:()=>[]}},emits:[`update:show`,`save`,`cancel`],setup(n,{emit:o}){let s=n,d=o,p=e.t(),m=(0,i.ref)(``),h=(0,i.ref)([]),_=(0,i.ref)([]),v=(0,i.ref)(`any`),y=(0,i.ref)(!1),b=(0,i.ref)([]),S=(0,i.computed)({get:()=>s.show,set:e=>d(`update:show`,e)}),B=(0,i.computed)(()=>s.currentNode?.type===`start`?`发起人设置`:f[s.currentNode?.type]||`节点设置`),V=(0,i.computed)(()=>{let e=[],t=new Map;return s.departments?.forEach(e=>{t.has(e.id)||t.set(e.id,{key:`dept-${e.id}`,label:`${e.name} ${e.manager?`(负责人: ${e.manager})`:``}`,children:[],isLeaf:!1,disabled:!0})}),(s.users?.filter(e=>!m.value||e.name.includes(m.value)||e.department.includes(m.value))||[]).forEach(e=>{let n=s.departments?.find(t=>t.name===e.department);n&&t.has(n.id)&&t.get(n.id).children.push({key:e.id,label:`${e.name}${e.role?`(${e.role})`:``}`,isLeaf:!0,user:e})}),t.forEach(t=>{t.children.length>0&&e.push(t)}),e}),H=(0,i.computed)(()=>s.users?.filter(e=>h.value.includes(e.id))||[]),U=(0,i.computed)(()=>s.users?.filter(e=>_.value.includes(e.id))||[]),W=(0,i.computed)(()=>s.users?.filter(e=>h.value.includes(e.id))||[]),G=e=>{h.value=e.filter(e=>!e.startsWith(`dept-`))},K=e=>{_.value=e.filter(e=>!e.startsWith(`dept-`))},q=e=>{h.value=h.value.filter(t=>t!==e)},J=e=>{_.value=_.value.filter(t=>t!==e)},Y=e=>{h.value=h.value.filter(t=>t!==e)},X=()=>b.value.push(x()),Z=e=>b.value.splice(e,1),re=e=>{let{initiators:t}=e.data;h.value=t?t.map(e=>e.id):[]},ie=e=>{h.value=(e.data.approvers||[]).map(e=>e.id),v.value=e.data.approvalMode||`any`},ae=e=>{_.value=(e.data.copyUsers||[]).map(e=>e.id)},oe=e=>{b.value=r.t(e.data.conditions||[])},se=async()=>{if(h.value.length===0)return p.error(`请选择发起人`),!1;let e=W.value;return d(`save`,{initiators:e}),p.success(`已设置 ${e.length} 个发起人`),!0},ce=async()=>{if(h.value.length===0)return p.error(`请至少选择一个审批人`),!1;let e=H.value;return d(`save`,{approvers:e,approvalMode:v.value}),p.success(`已设置 ${e.length} 个审批人`),!0},le=async()=>{let e=U.value;return d(`save`,{copyUsers:e}),p.success(`已设置 ${e.length} 个抄送人`),!0},ue=async()=>b.value.length===0?(p.error(`请至少添加一个条件分支`),!1):b.value.some(e=>!C(e))?(p.error(`请完善所有条件配置`),!1):(d(`save`,{conditions:r.t(b.value)}),p.success(`已设置 ${b.value.length} 个条件分支`),!0),de=async()=>{if(!s.currentNode)return!1;y.value=!0;try{let e={start:se,approval:ce,copy:le,condition:ue}[s.currentNode.type];return e?await e():!1}catch(e){return p.error(`保存配置失败`,e),!1}finally{y.value=!1}},fe=()=>{d(`cancel`)};(0,i.watch)(()=>s.currentNode,e=>{if(e){m.value=``;let t={start:re,approval:ie,copy:ae,condition:oe}[e.type];t&&t(e)}},{immediate:!0});let pe=(0,i.computed)(()=>[`start`,`approval`,`copy`].includes(s.currentNode?.type||``)),Q=(0,i.computed)(()=>{let e=s.currentNode?.type;return e===`start`?{icon:`mdi:account-star`,title:`选择发起人`,checkedKeys:h.value,onSelect:G,selectedUsers:W.value,selectedLabel:`已选择发起人`,tagType:`primary`,onRemove:Y}:e===`approval`?{icon:`mdi:account-check`,title:`选择审批人`,checkedKeys:h.value,onSelect:G,selectedUsers:H.value,selectedLabel:`已选择审批人`,tagType:`info`,onRemove:q}:e===`copy`?{icon:`mdi:email-outline`,title:`选择抄送人`,checkedKeys:_.value,onSelect:K,selectedUsers:U.value,selectedLabel:`已选择抄送人`,tagType:`success`,onRemove:J}:{icon:``,title:``,checkedKeys:[],onSelect:()=>{},selectedUsers:[],selectedLabel:``,tagType:`default`,onRemove:()=>{}}});return(e,n)=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NModal),{show:S.value,"onUpdate:show":n[2]||=e=>S.value=e,style:{width:`900px`},"mask-closable":!1,preset:`dialog`,title:B.value,"positive-text":`确定`,"negative-text":`取消`,loading:y.value,onPositiveClick:de,onNegativeClick:fe},{default:(0,i.withCtx)(()=>[(0,i.createCommentVNode)(` 公共选择面板 `),pe.value?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,w,[(0,i.createElementVNode)(`div`,T,[(0,i.createElementVNode)(`h4`,E,[Q.value.icon?((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(t.t),{key:0,name:Q.value.icon,size:16},null,8,[`name`])):(0,i.createCommentVNode)(`v-if`,!0),(0,i.createTextVNode)(` `+(0,i.toDisplayString)(Q.value.title),1)]),(0,i.createVNode)((0,i.unref)(a.NInput),{value:m.value,"onUpdate:value":n[0]||=e=>m.value=e,placeholder:`搜索用户姓名或部门`,clearable:``,class:`mb-4`},{prefix:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:magnify`,size:16})]),_:1},8,[`value`]),(0,i.createElementVNode)(`div`,D,[(0,i.createVNode)((0,i.unref)(a.NTree),{data:V.value,"checked-keys":Q.value.checkedKeys,selectable:!1,checkable:``,cascade:``,"virtual-scroll":!0,style:{"max-height":`300px`},"onUpdate:checkedKeys":Q.value.onSelect},null,8,[`data`,`checked-keys`,`onUpdate:checkedKeys`])]),Q.value.selectedUsers.length>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,O,[(0,i.createElementVNode)(`h5`,k,(0,i.toDisplayString)(Q.value.selectedLabel)+` (`+(0,i.toDisplayString)(Q.value.selectedUsers.length)+`) `,1),(0,i.createElementVNode)(`div`,A,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(Q.value.selectedUsers,e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NTag),{key:e.id,closable:``,type:Q.value.tagType,onClose:t=>Q.value.onRemove(e.id)},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,j,[(0,i.createVNode)((0,i.unref)(a.NAvatar),{src:e.avatar,"fallback-src":(0,i.unref)(g)(e.name),size:`small`},null,8,[`src`,`fallback-src`]),(0,i.createElementVNode)(`span`,M,(0,i.toDisplayString)(e.name),1),(0,i.createElementVNode)(`span`,ee,(0,i.toDisplayString)(e.department),1)])]),_:2},1032,[`type`,`onClose`]))),128))])])):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createCommentVNode)(` 审批节点时附带审批模式 `),s.currentNode?.type===`approval`?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,te,[n[3]||=(0,i.createElementVNode)(`h5`,{class:`mb-3 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},` 审批模式 `,-1),(0,i.createVNode)((0,i.unref)(a.NRadioGroup),{value:v.value,"onUpdate:value":n[1]||=e=>v.value=e},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NSpace),{vertical:``},{default:(0,i.withCtx)(()=>[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(c),e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NRadio),{key:e.value,value:e.value},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,N,[(0,i.createElementVNode)(`strong`,P,(0,i.toDisplayString)(e.label),1),(0,i.createElementVNode)(`span`,F,(0,i.toDisplayString)(e.desc),1)])]),_:2},1032,[`value`]))),128))]),_:1})]),_:1},8,[`value`])])):(0,i.createCommentVNode)(`v-if`,!0)])):s.currentNode?.type===`condition`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:1},[(0,i.createCommentVNode)(` 条件节点配置 `),(0,i.createElementVNode)(`div`,I,[(0,i.createElementVNode)(`div`,L,[(0,i.createElementVNode)(`h4`,ne,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:source-branch`,size:16}),n[4]||=(0,i.createTextVNode)(` 条件分支设置 `,-1)]),(0,i.createElementVNode)(`div`,R,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(b.value,(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`condition-item`},[(0,i.createVNode)((0,i.unref)(a.NCard),{size:`small`,class:`border border-gray-200 hover:border-gray-300 transition-colors`},{default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,z,[(0,i.createVNode)((0,i.unref)(a.NInput),{value:e.name,"onUpdate:value":t=>e.name=t,placeholder:`分支名称`,style:{width:`150px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),(0,i.createVNode)((0,i.unref)(a.NSelect),{value:e.field,"onUpdate:value":t=>e.field=t,placeholder:`选择字段`,options:(0,i.unref)(l),style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),(0,i.createVNode)((0,i.unref)(a.NSelect),{value:e.operator,"onUpdate:value":t=>e.operator=t,placeholder:`操作符`,options:(0,i.unref)(u),style:{width:`100px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),(0,i.createVNode)((0,i.unref)(a.NInput),{value:e.value,"onUpdate:value":t=>e.value=t,placeholder:`值`,style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),(0,i.createVNode)((0,i.unref)(a.NButton),{quaternary:``,type:`error`,onClick:e=>Z(n),class:`flex-shrink-0 ml-auto`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:delete`,size:16})]),_:1},8,[`onClick`])])]),_:2},1024)]))),128)),(0,i.createVNode)((0,i.unref)(a.NButton),{dashed:``,block:``,onClick:X,class:`w-full`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})]),default:(0,i.withCtx)(()=>[n[5]||=(0,i.createTextVNode)(` 添加条件 `,-1)]),_:1})])])])],2112)):(0,i.createCommentVNode)(`v-if`,!0)]),_:1},8,[`show`,`title`,`loading`]))}});var V=n.t(B,[[`__scopeId`,`data-v-468a6dee`]]);const H={class:`start-node`},U={class:`node-content`},W={class:`node-info`},G={class:`node-text`},K={key:0,class:`initiator-name`},q={key:1,class:`placeholder-text`},J=(0,i.defineComponent)({__name:`StartNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.computed)(()=>{let{initiators:e}=n.data;return!e||!Array.isArray(e)||e.length===0?``:e.map(e=>e?.name||`未知用户`).join(`、`)}),o=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,H,[(0,i.createCommentVNode)(` 主要内容区域 `),(0,i.createElementVNode)(`div`,U,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`🚀`,-1),(0,i.createElementVNode)(`div`,W,[(0,i.createElementVNode)(`div`,G,(0,i.toDisplayString)(e.data.title),1),a.value?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,K,(0,i.toDisplayString)(a.value),1)):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,q,`点击设置发起人`))])]),(0,i.createCommentVNode)(` 添加节点按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:o,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var Y=n.t(J,[[`__scopeId`,`data-v-6fb2df95`]]);const X={class:`approval-node`},Z={class:`node-card`},re={class:`node-header`},ie={class:`node-icon`},ae={class:`node-title`},oe={key:0,class:`node-badge`},se={key:1,class:`approval-mode-badge`},ce={class:`node-content`},le={key:0,class:`approvers-list`},ue={class:`approver-info`},de={class:`approver-avatar`},fe={class:`approver-details`},pe={class:`approver-name`},Q={class:`approver-dept`},me={class:`approver-role`},he={key:0,class:`more-count`},ge={key:1,class:`placeholder`},_e=(0,i.defineComponent)({__name:`ApprovalNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),o=(0,i.inject)(`deleteNode`),s=(0,i.computed)(()=>n.data.approvers??[]),c=(0,i.computed)(()=>s.value.length),l=(0,i.computed)(()=>s.value.slice(0,3)),u=(0,i.computed)(()=>Math.max(0,c.value-3)),d=e=>({any:`或签`,all:`会签`,sequence:`顺序`})[e]||``,f=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},p=e=>{e.stopPropagation(),o&&o(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,X,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:p,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,Z,[(0,i.createElementVNode)(`div`,re,[(0,i.createElementVNode)(`div`,ie,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account`,size:12,color:`white`})]),(0,i.createElementVNode)(`span`,ae,(0,i.toDisplayString)(e.data.title),1),c.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,oe,(0,i.toDisplayString)(c.value),1)):(0,i.createCommentVNode)(`v-if`,!0),e.data.approvalMode?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,se,(0,i.toDisplayString)(d(e.data.approvalMode)),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,ce,[c.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,le,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(l.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`approver-tag`},[(0,i.createElementVNode)(`div`,ue,[(0,i.createElementVNode)(`div`,de,[(0,i.createVNode)((0,i.unref)(a.NAvatar),{src:e.avatar,"fallback-src":(0,i.unref)(g)(e.name),size:`small`},null,8,[`src`,`fallback-src`])]),(0,i.createElementVNode)(`div`,fe,[(0,i.createElementVNode)(`span`,pe,(0,i.toDisplayString)(e.name),1),(0,i.createElementVNode)(`span`,Q,(0,i.toDisplayString)(e.department),1),(0,i.createElementVNode)(`span`,me,(0,i.toDisplayString)(e.role),1)])])]))),128)),u.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,he,`+`+(0,i.toDisplayString)(u.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,ge,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account-plus`,size:24,color:`#9ca3af`}),r[0]||=(0,i.createElementVNode)(`span`,null,`请设置审批人`,-1)]))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:f,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var ve=n.t(_e,[[`__scopeId`,`data-v-e6968a42`]]);const ye={class:`copy-node`},be={class:`node-card`},xe={class:`node-header`},Se={class:`node-title`},Ce={key:0,class:`node-badge`},we={class:`node-content`},Te={key:0,class:`copy-users-list`},Ee={key:0,class:`more-count`},De={key:1,class:`placeholder`},Oe=(0,i.defineComponent)({__name:`CopyNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.inject)(`deleteNode`),o=(0,i.computed)(()=>n.data.copyUsers??[]),s=(0,i.computed)(()=>o.value.length),c=(0,i.computed)(()=>o.value.slice(0,3)),l=(0,i.computed)(()=>Math.max(0,s.value-3)),u=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},d=e=>{e.stopPropagation(),a&&a(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,ye,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:d,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,be,[(0,i.createElementVNode)(`div`,xe,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`📋`,-1),(0,i.createElementVNode)(`span`,Se,(0,i.toDisplayString)(e.data.title),1),s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ce,(0,i.toDisplayString)(s.value),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,we,[s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Te,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(c.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`copy-user-tag`},(0,i.toDisplayString)(e.name),1))),128)),l.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ee,`+`+(0,i.toDisplayString)(l.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,De,`请设置抄送人`))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:u,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var ke=n.t(Oe,[[`__scopeId`,`data-v-010e7ec8`]]);const Ae={class:`condition-node`},je={class:`node-card`},Me={class:`node-header`},Ne={class:`node-title`},Pe={key:0,class:`node-badge`},Fe={class:`node-content`},Ie={key:0,class:`conditions-list`},Le={key:0,class:`more-count`},Re={key:1,class:`placeholder`},ze=(0,i.defineComponent)({__name:`ConditionNode`,props:{id:{},data:{}},setup(e){let n=e,r=(0,i.inject)(`showAddMenu`),a=(0,i.inject)(`deleteNode`),o=(0,i.computed)(()=>n.data.conditions??[]),s=(0,i.computed)(()=>o.value.length),c=(0,i.computed)(()=>o.value.slice(0,2)),l=(0,i.computed)(()=>Math.max(0,s.value-2)),u=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},d=e=>{e.stopPropagation(),a&&a(n.id)};return(n,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ae,[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`status-indicator`,e.data.status])},null,2),(0,i.createCommentVNode)(` 删除按钮 `),(0,i.createElementVNode)(`button`,{type:`button`,class:`delete-btn`,onClick:d,title:`删除节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:close`,size:12})]),(0,i.createElementVNode)(`div`,je,[(0,i.createElementVNode)(`div`,Me,[r[0]||=(0,i.createElementVNode)(`div`,{class:`node-icon`},`🔀`,-1),(0,i.createElementVNode)(`span`,Ne,(0,i.toDisplayString)(e.data.title),1),s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Pe,(0,i.toDisplayString)(s.value),1)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createElementVNode)(`div`,Fe,[s.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Ie,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(c.value,e=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.id,class:`condition-tag`},[r[1]||=(0,i.createElementVNode)(`span`,{class:`condition-icon`},`→`,-1),(0,i.createElementVNode)(`span`,null,(0,i.toDisplayString)(e.name||`条件`+(c.value.indexOf(e)+1)),1)]))),128)),l.value>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Le,`+`+(0,i.toDisplayString)(l.value),1)):(0,i.createCommentVNode)(`v-if`,!0)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Re,`请设置分支条件`))])]),(0,i.createElementVNode)(`button`,{type:`button`,class:`add-node-btn`,onClick:u,title:`添加下一个节点`},[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:plus`,size:16})])]))}});var Be=n.t(ze,[[`__scopeId`,`data-v-5ede8782`]]);const Ve={start:(0,i.markRaw)(Y),approval:(0,i.markRaw)(ve),copy:(0,i.markRaw)(ke),condition:(0,i.markRaw)(Be)};function He(t,n,a){let o=e.t(),s=(0,i.ref)(r.t(t.modelValue?.nodes??[h])),c=(0,i.ref)(r.t(t.modelValue?.edges??[])),l=(0,i.ref)(t.modelValue?r.t(t.modelValue.config):{version:`1.0`,createdAt:new Date().toISOString()}),u=(0,i.ref)(!1),f=(0,i.ref)({x:0,y:0}),p=(0,i.ref)(!1),m=(0,i.ref)(null),g=(0,i.ref)(null),_=new Set,y=!1,x=(e,t)=>{let n=setTimeout(()=>{_.delete(n),y||e()},t);_.add(n)},S=(0,i.computed)(()=>Ve),C=(0,i.computed)(()=>{let e={totalNodes:s.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0};return s.value.forEach(t=>{t.type===`approval`?e.approvalNodes++:t.type===`copy`?e.copyNodes++:t.type===`condition`&&e.conditionNodes++}),e}),w=()=>({nodes:r.t(s.value),edges:r.t(c.value),...l.value!==void 0&&{config:r.t(l.value)}}),T=()=>{let e=w();n(`update:modelValue`,e),n(`change`,e)},E=(e=60,t=400)=>{(0,i.nextTick)(()=>{y||x(()=>{a.value?.fitView?.({padding:e,duration:t})},100)})},D=(e,n)=>{t.readonly||(f.value={x:typeof e.x==`number`?e.x:0,y:typeof e.y==`number`?e.y:0},g.value=n||null,u.value=!0)},O=()=>{u.value=!1},k=e=>{if(t.readonly)return;let n=s.value.findIndex(t=>t.id===e);if(n===-1)return;if(s.value[n].type===`start`){o.warning(`不能删除开始节点`);return}let r=c.value.filter(t=>t.target===e),i=c.value.filter(t=>t.source===e);s.value.splice(n,1),c.value=c.value.filter(t=>t.source!==e&&t.target!==e),r.forEach(e=>{i.forEach(t=>{c.value.push({id:b(e.source,t.target),source:e.source,target:t.target,animated:!0,type:`default`})})}),s.value.forEach((e,t)=>{t>=n&&(e.position.y-=180)}),T(),o.success(`节点已删除`),E()};(0,i.provide)(`showAddMenu`,D),(0,i.provide)(`deleteNode`,k);let A=()=>{let e=s.value.length-1,t=s.value[e];if(g.value){let n=s.value.findIndex(e=>e.id===g.value);n!==-1&&(e=n,t=s.value[e])}return{targetNodeIndex:e,targetNode:t}},j=(e,t)=>({id:v(e),type:e,position:{x:t?.position.x??150,y:(t?.position.y??130)+180},data:{title:d[e],status:`pending`,...e===`approval`&&{approvers:[],approvalMode:`any`},...e===`copy`&&{copyUsers:[]},...e===`condition`&&{conditions:[]}}}),M=(e,t)=>{let n=c.value.filter(t=>t.source===e.id);c.value=c.value.filter(t=>t.source!==e.id),c.value.push({id:b(e.id,t.id),source:e.id,target:t.id,animated:!0,type:`default`}),n.forEach(e=>{c.value.push({id:b(t.id,e.target),source:t.id,target:e.target,animated:!0,type:`default`})})};return(0,i.watch)(()=>t.modelValue,e=>{e&&(r.a(e.nodes??[],s.value)&&r.a(e.edges??[],c.value)&&r.a(e.config,l.value)||(s.value=r.t(e.nodes??[]),c.value=r.t(e.edges??[]),l.value=r.t(e.config)))},{deep:!0}),(0,i.onMounted)(()=>{y=!1,(0,i.nextTick)(()=>{y||x(()=>{a.value?.fitView?.({padding:80,includeHiddenNodes:!1,minZoom:.8,maxZoom:1.2,duration:600})},300)})}),(0,i.onBeforeUnmount)(()=>{y=!0,_.forEach(e=>clearTimeout(e)),_.clear()}),{nodes:s,edges:c,showAddMenu:u,menuPosition:f,showNodeConfig:p,currentNode:m,nodeTypes:S,workflowStats:C,addNode:e=>{if(!t.readonly)try{let{targetNodeIndex:t,targetNode:n}=A(),r=j(e,n);s.value.splice(t+1,0,r);for(let e=t+2;e<s.value.length;e++)s.value[e].position.y+=180;n&&M(n,r),u.value=!1,g.value=null,T(),E()}catch(e){o.error(`添加节点失败,请重试`,e)}},onNodeClick:e=>{let i=s.value.find(t=>t.id===e.node.id);i&&(t.readonly||(m.value=i,p.value=!0),n(`node-click`,r.t(i)))},closeAddMenu:O,handleConfigSave:e=>{if(t.readonly||!m.value)return;let n=s.value.findIndex(e=>e.id===m.value.id);if(n!==-1){let t={...s.value[n],data:{...s.value[n].data,...r.t(e)}};s.value.splice(n,1,t),m.value=t}T(),p.value=!1,o.success(`节点配置已保存`)},resetNodes:()=>{t.readonly||(s.value=r.t([h]),c.value=[],T(),E(80,600),o.success(`画布已清空`))},getCurrentWorkflowData:w,fitView:()=>{let e=a.value;if(!e?.fitView){o.warning(`画布未准备就绪,请稍后重试`);return}(0,i.nextTick)(()=>{y||a.value!==e||e.fitView({padding:50,includeHiddenNodes:!1,minZoom:.5,maxZoom:1.5,duration:800})}),o.success(`已适应窗口大小`)},deleteNode:k}}function $(e,t,n){return{nodeId:e?.id??``,nodeName:e?.data.title??`流程结构`,field:t,message:n,type:`invalid`,severity:`high`}}function Ue(e){let t=new Set,n=new Set;for(let r of e.keys()){if(t.has(r))continue;let i=[{id:r,offset:0}];for(t.add(r),n.add(r);i.length;){let r=i[i.length-1],a=e.get(r.id);if(r.offset>=a.length){n.delete(r.id),i.pop();continue}let o=a[r.offset++];if(n.has(o))return o;t.has(o)||(t.add(o),n.add(o),i.push({id:o,offset:0}))}}}function We(e,t){let n=new Map;return e.forEach(e=>{e.id?.trim()?n.has(e.id)?t.push($(e,`nodeId`,`节点 id「${e.id}」重复,请使用唯一标识`)):n.set(e.id,e):t.push($(e,`nodeId`,`节点 id 不能为空`))}),n}function Ge(e,t,n){let r=new Map([...e.keys()].map(e=>[e,[]])),i=new Set;return t.forEach(t=>{let a=e.get(t.source),o=e.get(t.target);if((!t.id?.trim()||i.has(t.id))&&n.push($(a??o,`edgeId`,`连线 id 不能为空或重复`)),i.add(t.id),!a||!o){let e=[!a&&t.source,!o&&t.target].filter(e=>e!==!1).map(e=>e||`空标识`);n.push($(a??o,`connection`,`连线「${t.id}」指向不存在的节点:${e.join(`、`)}`));return}r.get(a.id).push(o.id)}),r}function Ke(e,t,n,r){let i=new Set([e.id]),a=[e.id];for(let e=0;e<a.length;e++)n.get(a[e])?.forEach(e=>{i.has(e)||(i.add(e),a.push(e))});t.forEach(e=>{i.has(e.id)||r.push($(e,`connection`,`此节点无法从开始节点到达,请检查连线方向与流程连接`))})}function qe(e,t,n={}){let r=[],i=We(e,r),a=e.filter(e=>e.type===`start`);a.length!==1&&r.push($(a[0],`start`,`流程必须包含且仅包含一个开始节点,当前为 ${a.length} 个`));let o=Ge(i,t,r);if(a.length===1&&i.has(a[0].id)&&Ke(a[0],i,o,r),n.allowCycles===!1){let e=Ue(o);e!==void 0&&r.push($(i.get(e),`cycle`,`当前审批流程不允许循环,请移除回指连线或由业务启用循环策略`))}return r}function Je(t,n,r,a){let o=e.t(),s=(0,i.ref)([]),c=(0,i.ref)(!1),l,u=()=>{let e=typeof a?.allowCycles==`function`?a.allowCycles():a?.allowCycles,r=qe(t.value,n.value,{allowCycles:e});return t.value.forEach(e=>{if(e.type===`approval`&&(`approvers`in e.data&&Array.isArray(e.data.approvers)?e.data.approvers:[]).length===0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`approvers`,message:`审批节点必须设置至少一个审批人,否则流程无法正常运行`,type:`required`}),e.type===`condition`){let t=`conditions`in e.data&&Array.isArray(e.data.conditions)?e.data.conditions:[];if(t.length===0)r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`条件分支节点必须配置至少一个分支条件,否则无法进行条件判断`,type:`required`});else{let n=t.filter(e=>!C(e));n.length>0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`有 ${n.length} 个条件分支配置不完整,请完善所有必填字段`,type:`incomplete`})}}}),r};return(0,i.onBeforeUnmount)(()=>{l&&clearTimeout(l)}),{validationErrors:s,showValidationErrors:c,validateWorkflow:u,validateCurrentWorkflow:()=>{let e=u();s.value=e,e.length===0?(o.success(`流程结构和节点配置验证通过;执行规则由业务后端校验`),c.value=!1):(o.error(`发现 ${e.length} 个问题,请查看详细错误`),c.value=!0,a?.onValidateError?.(e))},jumpToErrorNode:e=>{let n=t.value.find(t=>t.id===e);!n||!r.value||(r.value.setCenter(n.position.x,n.position.y,{zoom:1.2,duration:800}),l&&clearTimeout(l),l=setTimeout(()=>{l=void 0,t.value.includes(n)&&(a?.onShowNodeConfig?.(n),c.value=!1)},900),o.info(`已定位到节点:${n.data.title}`))},getFieldDisplayName:e=>p[e]||e,getErrorTypeText:e=>m[e]||e,resetValidation:()=>{l&&clearTimeout(l),l=void 0,s.value=[],c.value=!1}}}const Ye={start:{label:`发起人`,icon:`mdi:play-circle`,colorClass:`start`},approval:{label:`审批节点`,icon:`mdi:account-check`,colorClass:`approval`},copy:{label:`抄送节点`,icon:`mdi:email-outline`,colorClass:`copy`},condition:{label:`条件分支`,icon:`mdi:source-branch`,colorClass:`condition`}},Xe={any:`或签(任一审批人通过即可)`,all:`会签(所有审批人必须通过)`,sequence:`顺序审批(按顺序依次审批)`},Ze={equals:`等于`,not_equals:`不等于`,greater_than:`大于`,less_than:`小于`,contains:`包含`};function Qe(e,t){let n=(0,i.ref)(!1),r=(0,i.ref)([]),a=(0,i.ref)({totalNodes:0,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:0}),o={start:e=>{let t=e.initiators||[];return t.length>0?[{type:`users`,label:`发起人`,users:t}]:[{type:`text`,label:`发起人`,value:`所有人`}]},approval:e=>{let t=e.approvalMode||`any`,n=e.approvers||[],r=[{type:`mode`,label:`审批方式`,value:Xe[t]||t,modeKey:t}];return n.length>0?r.push({type:`users`,label:`审批人`,users:n}):r.push({type:`warning`,label:`审批人`,value:`未设置`}),r},copy:e=>{let t=e.copyUsers||[];return t.length>0?[{type:`users`,label:`抄送人`,users:t}]:[{type:`text`,label:`抄送人`,value:`未设置`}]},condition:e=>{let t=e.conditions||[];return t.length===0?[{type:`warning`,label:`条件分支`,value:`未配置`}]:t.map((e,t)=>{let n=Ze[e.operator]||e.operator;return{type:`text`,label:`分支 ${t+1}`,value:`${e.name||`未命名`} — ${e.field||`?`} ${n} ${e.value||`?`}`}})}},s=e=>{let t=o[e.type||`start`];return t?t(e.data):[]},c=()=>{let n=new Map;e.value.forEach(e=>n.set(e.id,e));let r=new Map,i=new Map;e.value.forEach(e=>{r.set(e.id,[]),i.set(e.id,0)}),t.value.forEach(e=>{r.get(e.source)?.push(e.target),i.set(e.target,(i.get(e.target)||0)+1)});let a=[];i.forEach((e,t)=>{e===0&&a.push(t)});let o=[],s=new Set;for(;a.length>0;){let e=a.shift();if(s.has(e))continue;s.add(e);let t=n.get(e);t&&o.push(t);let c=r.get(e)||[];for(let e of c){let t=(i.get(e)||1)-1;i.set(e,t),t<=0&&!s.has(e)&&a.push(e)}}return e.value.forEach(e=>{s.has(e.id)||o.push(e)}),o},l=()=>c().map((e,t)=>{let n=Ye[e.type||`start`]||Ye.start;return{order:t+1,node:e,nodeTypeLabel:n.label,icon:n.icon,colorClass:n.colorClass,details:s(e)}}),u=()=>{let n={totalNodes:e.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:t.value.length};return e.value.forEach(e=>{e.type===`approval`?n.approvalNodes++:e.type===`copy`?n.copyNodes++:e.type===`condition`&&n.conditionNodes++}),n};return{showPreview:n,previewSteps:r,previewStats:a,openPreview:()=>{r.value=l(),a.value=u(),n.value=!0},closePreview:()=>{n.value=!1}}}const $e={class:`approval-workflow-container`},et={class:`floating-toolbar`},tt={class:`add-menu-content`},nt=[`onClick`],rt={class:`menu-text`},it={key:0,class:`validation-success`},at={class:`success-icon`},ot={key:1,class:`validation-errors`},st={class:`error-summary`},ct={class:`error-icon`},lt={class:`error-list`},ut={class:`error-header`},dt={class:`error-number`},ft={class:`error-info`},pt={class:`error-node`},mt={class:`error-field`},ht={class:`error-message`},gt={class:`error-actions`},_t={class:`validation-footer`},vt={class:`preview-stats`},yt={class:`stat-item`},bt={class:`stat-value`},xt={class:`stat-item approval`},St={class:`stat-value`},Ct={class:`stat-item copy`},wt={class:`stat-value`},Tt={class:`stat-item condition`},Et={class:`stat-value`},Dt={class:`stat-item edge`},Ot={class:`stat-value`},kt={class:`preview-timeline`},At={class:`step-connector`},jt={class:`step-dot`},Mt={key:0,class:`step-line`},Nt={class:`step-content`},Pt={class:`step-header`},Ft={class:`step-order`},It={class:`step-type-badge`},Lt={class:`step-title`},Rt={key:0,class:`step-details`},zt={class:`detail-label`},Bt={class:`warning-text`},Vt={key:0,class:`preview-empty`},Ht={class:`preview-footer`},Ut=(0,i.defineComponent)({name:`C_WorkFlow`,__name:`index`,props:{users:{default:()=>[]},roles:{default:()=>[]},departments:{default:()=>[]},modelValue:{},readonly:{type:Boolean,default:!1},allowCycles:{type:Boolean,default:!0},theme:{default:`light`}},emits:[`update:modelValue`,`change`,`node-click`,`edge-click`,`save`,`validate-error`],setup(n,{expose:r,emit:c}){let l=n,u=c,d=e.t(),f=(0,i.ref)(),{nodes:p,edges:m,showAddMenu:h,menuPosition:g,showNodeConfig:_,currentNode:v,nodeTypes:y,workflowStats:b,addNode:x,onNodeClick:S,closeAddMenu:C,handleConfigSave:w,resetNodes:T,getCurrentWorkflowData:E,fitView:D,deleteNode:O}=He(l,u,f),{validationErrors:k,showValidationErrors:A,validateWorkflow:j,validateCurrentWorkflow:M,jumpToErrorNode:ee,getFieldDisplayName:te,getErrorTypeText:N,resetValidation:P}=Je(p,m,f,{allowCycles:()=>l.allowCycles,onShowNodeConfig:e=>{l.readonly||(v.value=e,_.value=!0)},onValidateError:e=>u(`validate-error`,e)}),{showPreview:F,previewSteps:I,previewStats:L,openPreview:ne,closePreview:R}=Qe(p,m),z=()=>{if(l.readonly)return;let e=j();if(k.value=e,e.length>0){d.error(`工作流验证失败: ${e[0].message}`),A.value=!0,u(`validate-error`,e);return}u(`save`,E()),d.success(`工作流保存成功`)},B=()=>{ne()},H=()=>{R(),z()},U=()=>{l.readonly||(T(),P())};return r({validateWorkflow:j,getCurrentWorkflowData:E,saveWorkflow:z,previewWorkflow:B,deleteNode:O,stats:b}),(e,r)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,$e,[(0,i.createCommentVNode)(` 浮动工具栏 `),(0,i.createElementVNode)(`div`,et,[(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`primary`,disabled:n.readonly,onClick:z},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:content-save`,size:16})]),default:(0,i.withCtx)(()=>[r[7]||=(0,i.createTextVNode)(` 保存 `,-1)]),_:1},8,[`disabled`]),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:B},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:eye`,size:16})]),default:(0,i.withCtx)(()=>[r[8]||=(0,i.createTextVNode)(` 预览 `,-1)]),_:1}),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:(0,i.unref)(M),title:`检查工作流配置是否正确`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:check-circle`,size:16})]),default:(0,i.withCtx)(()=>[r[9]||=(0,i.createTextVNode)(` 验证流程 `,-1)]),_:1},8,[`onClick`]),r[10]||=(0,i.createElementVNode)(`div`,{class:`toolbar-divider`},null,-1),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,onClick:(0,i.unref)(D),title:`适应窗口`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:fit-to-screen`,size:16})]),_:1},8,[`onClick`]),(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`error`,disabled:n.readonly,onClick:U,title:`清空画布`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:delete-sweep`,size:16})]),_:1},8,[`disabled`])]),(0,i.createCommentVNode)(` Vue Flow 画布 `),(0,i.createVNode)((0,i.unref)(o.VueFlow),{ref_key:`vueFlowRef`,ref:f,nodes:(0,i.unref)(p),"onUpdate:nodes":r[0]||=e=>(0,i.isRef)(p)?p.value=e:null,edges:(0,i.unref)(m),"onUpdate:edges":r[1]||=e=>(0,i.isRef)(m)?m.value=e:null,"node-types":(0,i.unref)(y),class:`workflow-canvas`,"default-viewport":{zoom:1,x:0,y:0},"min-zoom":.5,"max-zoom":2,"fit-view-on-init":!0,"nodes-draggable":!n.readonly,"nodes-connectable":!n.readonly,"edges-updatable":!n.readonly,"delete-key-code":n.readonly?null:void 0,"elements-selectable":!0,onNodeClick:(0,i.unref)(S),onPaneClick:(0,i.unref)(C)},null,8,[`nodes`,`edges`,`node-types`,`nodes-draggable`,`nodes-connectable`,`edges-updatable`,`delete-key-code`,`onNodeClick`,`onPaneClick`]),(0,i.createCommentVNode)(` 节点添加菜单 `),((0,i.openBlock)(),(0,i.createBlock)(i.Teleport,{to:`body`},[(0,i.withDirectives)((0,i.createElementVNode)(`div`,{class:`add-node-menu`,style:(0,i.normalizeStyle)({left:(0,i.unref)(g).x+`px`,top:(0,i.unref)(g).y+`px`})},[(0,i.createElementVNode)(`div`,tt,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(s),e=>((0,i.openBlock)(),(0,i.createElementBlock)(`button`,{key:e.type,type:`button`,class:`add-menu-item`,onClick:t=>(0,i.unref)(x)(e.type)},[(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`menu-icon`,e.iconClass])},[(0,i.createVNode)((0,i.unref)(t.t),{name:e.icon,size:16},null,8,[`name`])],2),(0,i.createElementVNode)(`span`,rt,(0,i.toDisplayString)(e.label),1)],8,nt))),128))])],4),[[i.vShow,(0,i.unref)(h)]])])),(0,i.createCommentVNode)(` 节点配置弹窗 - 拆分到独立组件 `),(0,i.createVNode)(V,{show:(0,i.unref)(_),"onUpdate:show":r[2]||=e=>(0,i.isRef)(_)?_.value=e:null,"current-node":(0,i.unref)(v),users:n.users,departments:n.departments,onSave:(0,i.unref)(w),onCancel:r[3]||=e=>_.value=!1},null,8,[`show`,`current-node`,`users`,`departments`,`onSave`]),(0,i.createCommentVNode)(` 验证错误日志抽屉 `),(0,i.createVNode)((0,i.unref)(a.NDrawer),{show:(0,i.unref)(A),"onUpdate:show":r[5]||=e=>(0,i.isRef)(A)?A.value=e:null,width:450,placement:`right`},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NDrawerContent),{title:`流程验证结果`,closable:``},{footer:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,_t,[(0,i.createVNode)((0,i.unref)(a.NButton),{onClick:r[4]||=e=>A.value=!1},{default:(0,i.withCtx)(()=>[...r[16]||=[(0,i.createTextVNode)(`关闭`,-1)]]),_:1}),(0,i.createVNode)((0,i.unref)(a.NButton),{type:`primary`,onClick:(0,i.unref)(M)},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:refresh`,size:16})]),default:(0,i.withCtx)(()=>[r[17]||=(0,i.createTextVNode)(` 重新验证 `,-1)]),_:1},8,[`onClick`])])]),default:(0,i.withCtx)(()=>[(0,i.unref)(k).length===0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,it,[(0,i.createElementVNode)(`div`,at,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:check-circle`,size:32,color:`#52c41a`})]),r[11]||=(0,i.createElementVNode)(`h3`,null,`验证通过`,-1),r[12]||=(0,i.createElementVNode)(`p`,null,`流程结构和节点配置验证通过;审批执行、权限与业务规则由后端校验。`,-1)])):((0,i.openBlock)(),(0,i.createElementBlock)(`div`,ot,[(0,i.createElementVNode)(`div`,st,[(0,i.createElementVNode)(`div`,ct,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:alert-circle`,size:24,color:`#ff4d4f`})]),(0,i.createElementVNode)(`h3`,null,`发现 `+(0,i.toDisplayString)((0,i.unref)(k).length)+` 个问题`,1),r[13]||=(0,i.createElementVNode)(`p`,null,`请修复以下问题后重新验证:`,-1)]),(0,i.createElementVNode)(`div`,lt,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(k),(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:`${e.nodeId}-${e.field}-${n}`,class:`error-item`},[(0,i.createElementVNode)(`div`,ut,[(0,i.createElementVNode)(`span`,dt,(0,i.toDisplayString)(n+1),1),(0,i.createElementVNode)(`div`,ft,[(0,i.createElementVNode)(`strong`,pt,(0,i.toDisplayString)(e.nodeName),1),(0,i.createElementVNode)(`span`,mt,(0,i.toDisplayString)((0,i.unref)(te)(e.field)),1)]),(0,i.createElementVNode)(`div`,{class:(0,i.normalizeClass)([`error-type`,e.type])},(0,i.toDisplayString)((0,i.unref)(N)(e.type)),3)]),(0,i.createElementVNode)(`div`,ht,(0,i.toDisplayString)(e.message),1),(0,i.createElementVNode)(`div`,gt,[(0,i.createVNode)((0,i.unref)(a.NButton),{size:`small`,type:`primary`,disabled:!e.nodeId,onClick:t=>(0,i.unref)(ee)(e.nodeId)},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:target`,size:16})]),default:(0,i.withCtx)(()=>[r[14]||=(0,i.createTextVNode)(` 定位节点 `,-1)]),_:1},8,[`disabled`,`onClick`])])]))),128))]),r[15]||=(0,i.createElementVNode)(`div`,{class:`validation-tips`},[(0,i.createElementVNode)(`h4`,null,`💡 常见问题解决方案:`),(0,i.createElementVNode)(`ul`,null,[(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`审批人未设置:`),(0,i.createTextVNode)(`点击审批节点,在弹窗中选择审批人员 `)]),(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`条件分支未配置:`),(0,i.createTextVNode)(`点击条件节点,添加至少一个条件分支 `)]),(0,i.createElementVNode)(`li`,null,[(0,i.createElementVNode)(`strong`,null,`节点连接断开:`),(0,i.createTextVNode)(` 检查节点之间的连线是否正确 `)])])],-1)]))]),_:1})]),_:1},8,[`show`]),(0,i.createCommentVNode)(` 流程预览抽屉 `),(0,i.createVNode)((0,i.unref)(a.NDrawer),{show:(0,i.unref)(F),"onUpdate:show":r[6]||=e=>(0,i.isRef)(F)?F.value=e:null,width:520,placement:`right`},{default:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(a.NDrawerContent),{title:`流程预览`,closable:``},{footer:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,Ht,[(0,i.createVNode)((0,i.unref)(a.NButton),{onClick:(0,i.unref)(R)},{default:(0,i.withCtx)(()=>[...r[24]||=[(0,i.createTextVNode)(`关闭`,-1)]]),_:1},8,[`onClick`]),(0,i.createVNode)((0,i.unref)(a.NButton),{type:`primary`,onClick:H},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:content-save`,size:16})]),default:(0,i.withCtx)(()=>[r[25]||=(0,i.createTextVNode)(` 确认并保存 `,-1)]),_:1})])]),default:(0,i.withCtx)(()=>[(0,i.createElementVNode)(`div`,vt,[(0,i.createElementVNode)(`div`,yt,[(0,i.createElementVNode)(`span`,bt,(0,i.toDisplayString)((0,i.unref)(L).totalNodes),1),r[18]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`总节点`,-1)]),(0,i.createElementVNode)(`div`,xt,[(0,i.createElementVNode)(`span`,St,(0,i.toDisplayString)((0,i.unref)(L).approvalNodes),1),r[19]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`审批`,-1)]),(0,i.createElementVNode)(`div`,Ct,[(0,i.createElementVNode)(`span`,wt,(0,i.toDisplayString)((0,i.unref)(L).copyNodes),1),r[20]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`抄送`,-1)]),(0,i.createElementVNode)(`div`,Tt,[(0,i.createElementVNode)(`span`,Et,(0,i.toDisplayString)((0,i.unref)(L).conditionNodes),1),r[21]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`条件`,-1)]),(0,i.createElementVNode)(`div`,Dt,[(0,i.createElementVNode)(`span`,Ot,(0,i.toDisplayString)((0,i.unref)(L).totalEdges),1),r[22]||=(0,i.createElementVNode)(`span`,{class:`stat-label`},`连线`,-1)])]),(0,i.createElementVNode)(`div`,kt,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)((0,i.unref)(I),(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:e.node.id,class:(0,i.normalizeClass)([`preview-step`,e.colorClass])},[(0,i.createCommentVNode)(` 时间线连接线 `),(0,i.createElementVNode)(`div`,At,[(0,i.createElementVNode)(`div`,jt,[(0,i.createVNode)((0,i.unref)(t.t),{name:e.icon,size:16},null,8,[`name`])]),n<(0,i.unref)(I).length-1?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Mt)):(0,i.createCommentVNode)(`v-if`,!0)]),(0,i.createCommentVNode)(` 步骤内容 `),(0,i.createElementVNode)(`div`,Nt,[(0,i.createElementVNode)(`div`,Pt,[(0,i.createElementVNode)(`span`,Ft,`步骤 `+(0,i.toDisplayString)(e.order),1),(0,i.createElementVNode)(`span`,It,(0,i.toDisplayString)(e.nodeTypeLabel),1)]),(0,i.createElementVNode)(`div`,Lt,(0,i.toDisplayString)(e.node.data.title),1),e.details.length>0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Rt,[((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(e.details,(e,n)=>((0,i.openBlock)(),(0,i.createElementBlock)(`div`,{key:n,class:(0,i.normalizeClass)([`step-detail-item`,{"is-warning":e.type===`warning`}])},[(0,i.createElementVNode)(`span`,zt,(0,i.toDisplayString)(e.label)+`:`,1),(0,i.createCommentVNode)(` 审批方式 badge `),e.type===`mode`?((0,i.openBlock)(),(0,i.createElementBlock)(`span`,{key:0,class:(0,i.normalizeClass)([`mode-badge`,e.modeKey])},(0,i.toDisplayString)(e.value),3)):e.type===`users`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:1},[(0,i.createCommentVNode)(` 人员 tags `),((0,i.openBlock)(!0),(0,i.createElementBlock)(i.Fragment,null,(0,i.renderList)(e.users,e=>((0,i.openBlock)(),(0,i.createBlock)((0,i.unref)(a.NTag),{key:e.name,size:`small`,bordered:!1,round:``,class:`user-tag`},{icon:(0,i.withCtx)(()=>[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:account`,size:12})]),default:(0,i.withCtx)(()=>[(0,i.createTextVNode)(` `+(0,i.toDisplayString)(e.name),1)]),_:2},1024))),128))],64)):e.type===`warning`?((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:2},[(0,i.createCommentVNode)(` 警告文案 `),(0,i.createElementVNode)(`span`,Bt,` ⚠️ `+(0,i.toDisplayString)(e.value),1)],2112)):((0,i.openBlock)(),(0,i.createElementBlock)(i.Fragment,{key:3},[(0,i.createCommentVNode)(` 普通文本 `),(0,i.createElementVNode)(`span`,null,(0,i.toDisplayString)(e.value),1)],2112))],2))),128))])):(0,i.createCommentVNode)(`v-if`,!0)])],2))),128))]),(0,i.unref)(I).length===0?((0,i.openBlock)(),(0,i.createElementBlock)(`div`,Vt,[(0,i.createVNode)((0,i.unref)(t.t),{name:`mdi:file-document-outline`,size:48,color:`#d1d5db`}),r[23]||=(0,i.createElementVNode)(`p`,null,`暂无流程节点`,-1)])):(0,i.createCommentVNode)(`v-if`,!0)]),_:1})]),_:1},8,[`show`])]))}});var Wt=n.t(Ut,[[`__scopeId`,`data-v-f5022473`]]);Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return He}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return Qe}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Je}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Wt}});
@@ -1 +1 @@
1
- import{t as e}from"./feedback.js";import{t}from"./C_Icon2.js";import{t as n}from"./export-helper.js";import{a as r,t as i}from"./data.js";import{Fragment as a,Teleport as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,createTextVNode as f,createVNode as p,defineComponent as m,inject as h,isRef as g,markRaw as _,nextTick as v,normalizeClass as y,normalizeStyle as b,onBeforeUnmount as x,onMounted as S,openBlock as C,provide as w,ref as T,renderList as E,toDisplayString as D,unref as O,vShow as ee,watch as k,withCtx as A,withDirectives as j}from"vue";import{NAvatar as M,NButton as N,NCard as P,NDrawer as F,NDrawerContent as I,NInput as L,NModal as te,NRadio as ne,NRadioGroup as re,NSelect as R,NSpace as ie,NTag as ae,NTree as z}from"naive-ui";import{VueFlow as B}from"@vue-flow/core";const oe=[{type:`approval`,label:`审批人`,icon:`mdi:account-check`,iconClass:`approval-icon`},{type:`copy`,label:`抄送人`,icon:`mdi:email-outline`,iconClass:`copy-icon`},{type:`condition`,label:`条件分支`,icon:`mdi:source-branch`,iconClass:`condition-icon`}],se=[{value:`any`,label:`或签`,desc:`任意一人同意即可通过`},{value:`all`,label:`会签`,desc:`所有人都同意才能通过`},{value:`sequence`,label:`顺序审批`,desc:`按选择顺序依次审批`}],ce=[{label:`申请金额`,value:`amount`},{label:`申请人部门`,value:`department`},{label:`申请类型`,value:`type`},{label:`紧急程度`,value:`priority`}],V=[{label:`等于`,value:`equals`},{label:`大于`,value:`greater_than`},{label:`小于`,value:`less_than`},{label:`包含`,value:`contains`},{label:`不等于`,value:`not_equals`}],H={start:`发起人`,approval:`审批人`,copy:`抄送人`,condition:`条件分支`},U={approval:`审批人设置`,copy:`抄送人设置`,condition:`条件分支设置`},W={approvers:`审批人`,conditions:`条件配置`,connection:`节点连接`,nodeId:`节点标识`,edgeId:`连线标识`,start:`开始节点`,cycle:`循环策略`,copyUsers:`抄送人`},G={required:`必填`,invalid:`结构错误`,incomplete:`不完整`,warning:`警告`,error:`错误`},K={id:`start-1`,type:`start`,position:{x:150,y:100},data:{title:`发起人`,status:`active`,initiators:[]}},q=e=>{let t=Array.from(e.trim()).slice(0,2).join(``).toUpperCase()||`?`,n=`<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80"><rect width="80" height="80" rx="40" fill="hsl(${Array.from(e).reduce((e,t)=>(e*31+(t.codePointAt(0)??0))%360,210)} 55% 46%)"/><text x="40" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" fill="white">${t.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&apos;`})[e])}</text></svg>`;return`data:image/svg+xml;charset=UTF-8,${encodeURIComponent(n)}`};let le=0;const J=e=>typeof crypto<`u`&&`randomUUID`in crypto?`${e}-${crypto.randomUUID()}`:`${e}-${Date.now()}-${++le}`,Y=()=>J(`condition`),X=(e,t)=>`edge-${e}-${t}`,ue=()=>({id:Y(),name:``,field:``,operator:`equals`,value:``}),de={key:0,class:`max-h-60vh overflow-y-auto`},Z={class:`config-section`},fe={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},pe={class:`border rounded-lg p-3 mb-4 max-h-50 overflow-y-auto`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},me={key:0,class:`rounded-lg p-4 mb-4 border`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},he={class:`mb-2 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},ge={class:`flex flex-wrap gap-3`},_e={class:`flex items-center gap-2`},ve={class:`font-medium text-sm`},ye={class:`text-xs px-1.5 py-0.5 rounded`,style:{color:`var(--n-text-color-3)`,background:`var(--n-color-embedded)`}},be={key:0,class:`mt-4`},xe={class:`flex flex-col gap-1`},Se={class:`text-sm`},Ce={class:`text-xs`,style:{color:`var(--n-text-color-3)`}},we={class:`max-h-60vh overflow-y-auto`},Te={class:`config-section`},Ee={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},De={class:`space-y-3`},Oe={class:`flex items-center gap-3 flex-nowrap min-h-10 p-2`};var ke=n(m({__name:`NodeConfigModal`,props:{show:{type:Boolean,default:!1},currentNode:{default:null},users:{default:()=>[]},departments:{default:()=>[]}},emits:[`update:show`,`save`,`cancel`],setup(n,{emit:r}){let o=n,m=r,h=e(),g=T(``),_=T([]),v=T([]),y=T(`any`),b=T(!1),x=T([]),S=s({get:()=>o.show,set:e=>m(`update:show`,e)}),w=s(()=>o.currentNode?.type===`start`?`发起人设置`:U[o.currentNode?.type]||`节点设置`),ee=s(()=>{let e=[],t=new Map;return o.departments?.forEach(e=>{t.has(e.id)||t.set(e.id,{key:`dept-${e.id}`,label:`${e.name} ${e.manager?`(负责人: ${e.manager})`:``}`,children:[],isLeaf:!1,disabled:!0})}),(o.users?.filter(e=>!g.value||e.name.includes(g.value)||e.department.includes(g.value))||[]).forEach(e=>{let n=o.departments?.find(t=>t.name===e.department);n&&t.has(n.id)&&t.get(n.id).children.push({key:e.id,label:`${e.name}${e.role?`(${e.role})`:``}`,isLeaf:!0,user:e})}),t.forEach(t=>{t.children.length>0&&e.push(t)}),e}),j=s(()=>o.users?.filter(e=>_.value.includes(e.id))||[]),F=s(()=>o.users?.filter(e=>v.value.includes(e.id))||[]),I=s(()=>o.users?.filter(e=>_.value.includes(e.id))||[]),B=e=>{_.value=e.filter(e=>!e.startsWith(`dept-`))},oe=e=>{v.value=e.filter(e=>!e.startsWith(`dept-`))},H=e=>{_.value=_.value.filter(t=>t!==e)},W=e=>{v.value=v.value.filter(t=>t!==e)},G=e=>{_.value=_.value.filter(t=>t!==e)},K=()=>x.value.push(ue()),le=e=>x.value.splice(e,1),J=e=>{let{initiators:t}=e.data;_.value=t?t.map(e=>e.id):[]},Y=e=>{_.value=(e.data.approvers||[]).map(e=>e.id),y.value=e.data.approvalMode||`any`},X=e=>{v.value=(e.data.copyUsers||[]).map(e=>e.id)},ke=e=>{x.value=i(e.data.conditions||[])},Ae=async()=>{if(_.value.length===0)return h.error(`请选择发起人`),!1;let e=I.value;return m(`save`,{initiators:e}),h.success(`已设置 ${e.length} 个发起人`),!0},je=async()=>{if(_.value.length===0)return h.error(`请至少选择一个审批人`),!1;let e=j.value;return m(`save`,{approvers:e,approvalMode:y.value}),h.success(`已设置 ${e.length} 个审批人`),!0},Me=async()=>{let e=F.value;return m(`save`,{copyUsers:e}),h.success(`已设置 ${e.length} 个抄送人`),!0},Ne=async()=>x.value.length===0?(h.error(`请至少添加一个条件分支`),!1):x.value.some(e=>!e.name?.trim()||!e.field||!e.operator||!e.value?.trim())?(h.error(`请完善所有条件配置`),!1):(m(`save`,{conditions:i(x.value)}),h.success(`已设置 ${x.value.length} 个条件分支`),!0),Pe=async()=>{if(!o.currentNode)return!1;b.value=!0;try{let e={start:Ae,approval:je,copy:Me,condition:Ne}[o.currentNode.type];return e?await e():!1}catch(e){return h.error(`保存配置失败`,e),!1}finally{b.value=!1}},Fe=()=>{m(`cancel`)};k(()=>o.currentNode,e=>{if(e){g.value=``;let t={start:J,approval:Y,copy:X,condition:ke}[e.type];t&&t(e)}},{immediate:!0});let Ie=s(()=>[`start`,`approval`,`copy`].includes(o.currentNode?.type||``)),Q=s(()=>{let e=o.currentNode?.type;return e===`start`?{icon:`mdi:account-star`,title:`选择发起人`,checkedKeys:_.value,onSelect:B,selectedUsers:I.value,selectedLabel:`已选择发起人`,tagType:`primary`,onRemove:G}:e===`approval`?{icon:`mdi:account-check`,title:`选择审批人`,checkedKeys:_.value,onSelect:B,selectedUsers:j.value,selectedLabel:`已选择审批人`,tagType:`info`,onRemove:H}:e===`copy`?{icon:`mdi:email-outline`,title:`选择抄送人`,checkedKeys:v.value,onSelect:oe,selectedUsers:F.value,selectedLabel:`已选择抄送人`,tagType:`success`,onRemove:W}:{icon:``,title:``,checkedKeys:[],onSelect:()=>{},selectedUsers:[],selectedLabel:``,tagType:`default`,onRemove:()=>{}}});return(e,n)=>(C(),c(O(te),{show:S.value,"onUpdate:show":n[2]||=e=>S.value=e,style:{width:`900px`},"mask-closable":!1,preset:`dialog`,title:w.value,"positive-text":`确定`,"negative-text":`取消`,loading:b.value,onPositiveClick:Pe,onNegativeClick:Fe},{default:A(()=>[l(` 公共选择面板 `),Ie.value?(C(),u(`div`,de,[d(`div`,Z,[d(`h4`,fe,[Q.value.icon?(C(),c(O(t),{key:0,name:Q.value.icon,size:16},null,8,[`name`])):l(`v-if`,!0),f(` `+D(Q.value.title),1)]),p(O(L),{value:g.value,"onUpdate:value":n[0]||=e=>g.value=e,placeholder:`搜索用户姓名或部门`,clearable:``,class:`mb-4`},{prefix:A(()=>[p(O(t),{name:`mdi:magnify`,size:16})]),_:1},8,[`value`]),d(`div`,pe,[p(O(z),{data:ee.value,"checked-keys":Q.value.checkedKeys,selectable:!1,checkable:``,cascade:``,"virtual-scroll":!0,style:{"max-height":`300px`},"onUpdate:checkedKeys":Q.value.onSelect},null,8,[`data`,`checked-keys`,`onUpdate:checkedKeys`])]),Q.value.selectedUsers.length>0?(C(),u(`div`,me,[d(`h5`,he,D(Q.value.selectedLabel)+` (`+D(Q.value.selectedUsers.length)+`) `,1),d(`div`,ge,[(C(!0),u(a,null,E(Q.value.selectedUsers,e=>(C(),c(O(ae),{key:e.id,closable:``,type:Q.value.tagType,onClose:t=>Q.value.onRemove(e.id)},{default:A(()=>[d(`div`,_e,[p(O(M),{src:e.avatar,"fallback-src":O(q)(e.name),size:`small`},null,8,[`src`,`fallback-src`]),d(`span`,ve,D(e.name),1),d(`span`,ye,D(e.department),1)])]),_:2},1032,[`type`,`onClose`]))),128))])])):l(`v-if`,!0)]),l(` 审批节点时附带审批模式 `),o.currentNode?.type===`approval`?(C(),u(`div`,be,[n[3]||=d(`h5`,{class:`mb-3 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},` 审批模式 `,-1),p(O(re),{value:y.value,"onUpdate:value":n[1]||=e=>y.value=e},{default:A(()=>[p(O(ie),{vertical:``},{default:A(()=>[(C(!0),u(a,null,E(O(se),e=>(C(),c(O(ne),{key:e.value,value:e.value},{default:A(()=>[d(`div`,xe,[d(`strong`,Se,D(e.label),1),d(`span`,Ce,D(e.desc),1)])]),_:2},1032,[`value`]))),128))]),_:1})]),_:1},8,[`value`])])):l(`v-if`,!0)])):o.currentNode?.type===`condition`?(C(),u(a,{key:1},[l(` 条件节点配置 `),d(`div`,we,[d(`div`,Te,[d(`h4`,Ee,[p(O(t),{name:`mdi:source-branch`,size:16}),n[4]||=f(` 条件分支设置 `,-1)]),d(`div`,De,[(C(!0),u(a,null,E(x.value,(e,n)=>(C(),u(`div`,{key:e.id,class:`condition-item`},[p(O(P),{size:`small`,class:`border border-gray-200 hover:border-gray-300 transition-colors`},{default:A(()=>[d(`div`,Oe,[p(O(L),{value:e.name,"onUpdate:value":t=>e.name=t,placeholder:`分支名称`,style:{width:`150px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),p(O(R),{value:e.field,"onUpdate:value":t=>e.field=t,placeholder:`选择字段`,options:O(ce),style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),p(O(R),{value:e.operator,"onUpdate:value":t=>e.operator=t,placeholder:`操作符`,options:O(V),style:{width:`100px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),p(O(L),{value:e.value,"onUpdate:value":t=>e.value=t,placeholder:`值`,style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),p(O(N),{quaternary:``,type:`error`,onClick:e=>le(n),class:`flex-shrink-0 ml-auto`},{icon:A(()=>[p(O(t),{name:`mdi:delete`,size:16})]),_:1},8,[`onClick`])])]),_:2},1024)]))),128)),p(O(N),{dashed:``,block:``,onClick:K,class:`w-full`},{icon:A(()=>[p(O(t),{name:`mdi:plus`,size:16})]),default:A(()=>[n[5]||=f(` 添加条件 `,-1)]),_:1})])])])],2112)):l(`v-if`,!0)]),_:1},8,[`show`,`title`,`loading`]))}}),[[`__scopeId`,`data-v-df36c1fc`]]);const Ae={class:`start-node`},je={class:`node-content`},Me={class:`node-info`},Ne={class:`node-text`},Pe={key:0,class:`initiator-name`},Fe={key:1,class:`placeholder-text`};var Ie=n(m({__name:`StartNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=s(()=>{let{initiators:e}=n.data;return!e||!Array.isArray(e)||e.length===0?``:e.map(e=>e?.name||`未知用户`).join(`、`)}),a=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)};return(n,r)=>(C(),u(`div`,Ae,[l(` 主要内容区域 `),d(`div`,je,[r[0]||=d(`div`,{class:`node-icon`},`🚀`,-1),d(`div`,Me,[d(`div`,Ne,D(e.data.title),1),i.value?(C(),u(`div`,Pe,D(i.value),1)):(C(),u(`div`,Fe,`点击设置发起人`))])]),l(` 添加节点按钮 `),d(`button`,{type:`button`,class:`add-node-btn`,onClick:a,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-6fb2df95`]]);const Q={class:`approval-node`},Le={class:`node-card`},Re={class:`node-header`},ze={class:`node-icon`},Be={class:`node-title`},Ve={key:0,class:`node-badge`},He={key:1,class:`approval-mode-badge`},Ue={class:`node-content`},We={key:0,class:`approvers-list`},Ge={class:`approver-info`},Ke={class:`approver-avatar`},qe={class:`approver-details`},Je={class:`approver-name`},Ye={class:`approver-dept`},Xe={class:`approver-role`},Ze={key:0,class:`more-count`},Qe={key:1,class:`placeholder`};var $e=n(m({__name:`ApprovalNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.approvers??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,3)),m=s(()=>Math.max(0,c.value-3)),g=e=>({any:`或签`,all:`会签`,sequence:`顺序`})[e]||``,_=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},v=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,Q,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:v,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,Le,[d(`div`,Re,[d(`div`,ze,[p(O(t),{name:`mdi:account`,size:12,color:`white`})]),d(`span`,Be,D(e.data.title),1),c.value>0?(C(),u(`div`,Ve,D(c.value),1)):l(`v-if`,!0),e.data.approvalMode?(C(),u(`div`,He,D(g(e.data.approvalMode)),1)):l(`v-if`,!0)]),d(`div`,Ue,[c.value>0?(C(),u(`div`,We,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`approver-tag`},[d(`div`,Ge,[d(`div`,Ke,[p(O(M),{src:e.avatar,"fallback-src":O(q)(e.name),size:`small`},null,8,[`src`,`fallback-src`])]),d(`div`,qe,[d(`span`,Je,D(e.name),1),d(`span`,Ye,D(e.department),1),d(`span`,Xe,D(e.role),1)])])]))),128)),m.value>0?(C(),u(`div`,Ze,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,Qe,[p(O(t),{name:`mdi:account-plus`,size:24,color:`#9ca3af`}),r[0]||=d(`span`,null,`请设置审批人`,-1)]))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:_,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-e6968a42`]]);const et={class:`copy-node`},tt={class:`node-card`},nt={class:`node-header`},rt={class:`node-title`},it={key:0,class:`node-badge`},at={class:`node-content`},ot={key:0,class:`copy-users-list`},st={key:0,class:`more-count`},ct={key:1,class:`placeholder`};var lt=n(m({__name:`CopyNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.copyUsers??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,3)),m=s(()=>Math.max(0,c.value-3)),g=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},_=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,et,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:_,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,tt,[d(`div`,nt,[r[0]||=d(`div`,{class:`node-icon`},`📋`,-1),d(`span`,rt,D(e.data.title),1),c.value>0?(C(),u(`div`,it,D(c.value),1)):l(`v-if`,!0)]),d(`div`,at,[c.value>0?(C(),u(`div`,ot,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`copy-user-tag`},D(e.name),1))),128)),m.value>0?(C(),u(`div`,st,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,ct,`请设置抄送人`))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:g,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-010e7ec8`]]);const ut={class:`condition-node`},dt={class:`node-card`},ft={class:`node-header`},pt={class:`node-title`},mt={key:0,class:`node-badge`},ht={class:`node-content`},gt={key:0,class:`conditions-list`},_t={key:0,class:`more-count`},vt={key:1,class:`placeholder`};var yt=n(m({__name:`ConditionNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.conditions??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,2)),m=s(()=>Math.max(0,c.value-2)),g=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},_=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,ut,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:_,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,dt,[d(`div`,ft,[r[0]||=d(`div`,{class:`node-icon`},`🔀`,-1),d(`span`,pt,D(e.data.title),1),c.value>0?(C(),u(`div`,mt,D(c.value),1)):l(`v-if`,!0)]),d(`div`,ht,[c.value>0?(C(),u(`div`,gt,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`condition-tag`},[r[1]||=d(`span`,{class:`condition-icon`},`→`,-1),d(`span`,null,D(e.name||`条件`+(f.value.indexOf(e)+1)),1)]))),128)),m.value>0?(C(),u(`div`,_t,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,vt,`请设置分支条件`))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:g,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-5ede8782`]]);const bt={start:_(Ie),approval:_($e),copy:_(lt),condition:_(yt)};function xt(t,n,a){let o=e(),c=T(i(t.modelValue?.nodes??[K])),l=T(i(t.modelValue?.edges??[])),u=T(t.modelValue?i(t.modelValue.config):{version:`1.0`,createdAt:new Date().toISOString()}),d=T(!1),f=T({x:0,y:0}),p=T(!1),m=T(null),h=T(null),g=new Set,_=!1,y=(e,t)=>{let n=setTimeout(()=>{g.delete(n),_||e()},t);g.add(n)},b=s(()=>bt),C=s(()=>{let e={totalNodes:c.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0};return c.value.forEach(t=>{t.type===`approval`?e.approvalNodes++:t.type===`copy`?e.copyNodes++:t.type===`condition`&&e.conditionNodes++}),e}),E=()=>({nodes:i(c.value),edges:i(l.value),...u.value!==void 0&&{config:i(u.value)}}),D=()=>{let e=E();n(`update:modelValue`,e),n(`change`,e)},O=(e=60,t=400)=>{v(()=>{_||y(()=>{a.value?.fitView?.({padding:e,duration:t})},100)})},ee=(e,n)=>{t.readonly||(f.value={x:typeof e.x==`number`?e.x:0,y:typeof e.y==`number`?e.y:0},h.value=n||null,d.value=!0)},A=()=>{d.value=!1},j=e=>{if(t.readonly)return;let n=c.value.findIndex(t=>t.id===e);if(n===-1)return;if(c.value[n].type===`start`){o.warning(`不能删除开始节点`);return}let r=l.value.filter(t=>t.target===e),i=l.value.filter(t=>t.source===e);c.value.splice(n,1),l.value=l.value.filter(t=>t.source!==e&&t.target!==e),r.forEach(e=>{i.forEach(t=>{l.value.push({id:X(e.source,t.target),source:e.source,target:t.target,animated:!0,type:`default`})})}),c.value.forEach((e,t)=>{t>=n&&(e.position.y-=180)}),D(),o.success(`节点已删除`),O()};w(`showAddMenu`,ee),w(`deleteNode`,j);let M=()=>{let e=c.value.length-1,t=c.value[e];if(h.value){let n=c.value.findIndex(e=>e.id===h.value);n!==-1&&(e=n,t=c.value[e])}return{targetNodeIndex:e,targetNode:t}},N=(e,t)=>({id:J(e),type:e,position:{x:t?.position.x??150,y:(t?.position.y??130)+180},data:{title:H[e],status:`pending`,...e===`approval`&&{approvers:[],approvalMode:`any`},...e===`copy`&&{copyUsers:[]},...e===`condition`&&{conditions:[]}}}),P=(e,t)=>{let n=l.value.filter(t=>t.source===e.id);l.value=l.value.filter(t=>t.source!==e.id),l.value.push({id:X(e.id,t.id),source:e.id,target:t.id,animated:!0,type:`default`}),n.forEach(e=>{l.value.push({id:X(t.id,e.target),source:t.id,target:e.target,animated:!0,type:`default`})})};return k(()=>t.modelValue,e=>{e&&(r(e.nodes??[],c.value)&&r(e.edges??[],l.value)&&r(e.config,u.value)||(c.value=i(e.nodes??[]),l.value=i(e.edges??[]),u.value=i(e.config)))},{deep:!0}),S(()=>{_=!1,v(()=>{_||y(()=>{a.value?.fitView?.({padding:80,includeHiddenNodes:!1,minZoom:.8,maxZoom:1.2,duration:600})},300)})}),x(()=>{_=!0,g.forEach(e=>clearTimeout(e)),g.clear()}),{nodes:c,edges:l,showAddMenu:d,menuPosition:f,showNodeConfig:p,currentNode:m,nodeTypes:b,workflowStats:C,addNode:e=>{if(!t.readonly)try{let{targetNodeIndex:t,targetNode:n}=M(),r=N(e,n);c.value.splice(t+1,0,r);for(let e=t+2;e<c.value.length;e++)c.value[e].position.y+=180;n&&P(n,r),d.value=!1,h.value=null,D(),O()}catch(e){o.error(`添加节点失败,请重试`,e)}},onNodeClick:e=>{let r=c.value.find(t=>t.id===e.node.id);r&&(t.readonly||(m.value=r,p.value=!0),n(`node-click`,i(r)))},closeAddMenu:A,handleConfigSave:e=>{if(t.readonly||!m.value)return;let n=c.value.findIndex(e=>e.id===m.value.id);if(n!==-1){let t={...c.value[n],data:{...c.value[n].data,...i(e)}};c.value.splice(n,1,t),m.value=t}D(),p.value=!1,o.success(`节点配置已保存`)},resetNodes:()=>{t.readonly||(c.value=i([K]),l.value=[],D(),O(80,600),o.success(`画布已清空`))},getCurrentWorkflowData:E,fitView:()=>{let e=a.value;if(!e?.fitView){o.warning(`画布未准备就绪,请稍后重试`);return}v(()=>{_||a.value!==e||e.fitView({padding:50,includeHiddenNodes:!1,minZoom:.5,maxZoom:1.5,duration:800})}),o.success(`已适应窗口大小`)},deleteNode:j}}function $(e,t,n){return{nodeId:e?.id??``,nodeName:e?.data.title??`流程结构`,field:t,message:n,type:`invalid`,severity:`high`}}function St(e){let t=new Set,n=new Set;for(let r of e.keys()){if(t.has(r))continue;let i=[{id:r,offset:0}];for(t.add(r),n.add(r);i.length;){let r=i[i.length-1],a=e.get(r.id);if(r.offset>=a.length){n.delete(r.id),i.pop();continue}let o=a[r.offset++];if(n.has(o))return o;t.has(o)||(t.add(o),n.add(o),i.push({id:o,offset:0}))}}}function Ct(e,t){let n=new Map;return e.forEach(e=>{e.id?.trim()?n.has(e.id)?t.push($(e,`nodeId`,`节点 id「${e.id}」重复,请使用唯一标识`)):n.set(e.id,e):t.push($(e,`nodeId`,`节点 id 不能为空`))}),n}function wt(e,t,n){let r=new Map([...e.keys()].map(e=>[e,[]])),i=new Set;return t.forEach(t=>{let a=e.get(t.source),o=e.get(t.target);if((!t.id?.trim()||i.has(t.id))&&n.push($(a??o,`edgeId`,`连线 id 不能为空或重复`)),i.add(t.id),!a||!o){let e=[!a&&t.source,!o&&t.target].filter(e=>e!==!1).map(e=>e||`空标识`);n.push($(a??o,`connection`,`连线「${t.id}」指向不存在的节点:${e.join(`、`)}`));return}r.get(a.id).push(o.id)}),r}function Tt(e,t,n,r){let i=new Set([e.id]),a=[e.id];for(let e=0;e<a.length;e++)n.get(a[e])?.forEach(e=>{i.has(e)||(i.add(e),a.push(e))});t.forEach(e=>{i.has(e.id)||r.push($(e,`connection`,`此节点无法从开始节点到达,请检查连线方向与流程连接`))})}function Et(e,t,n={}){let r=[],i=Ct(e,r),a=e.filter(e=>e.type===`start`);a.length!==1&&r.push($(a[0],`start`,`流程必须包含且仅包含一个开始节点,当前为 ${a.length} 个`));let o=wt(i,t,r);if(a.length===1&&i.has(a[0].id)&&Tt(a[0],i,o,r),n.allowCycles===!1){let e=St(o);e!==void 0&&r.push($(i.get(e),`cycle`,`当前审批流程不允许循环,请移除回指连线或由业务启用循环策略`))}return r}function Dt(t,n,r,i){let a=e(),o=T([]),s=T(!1),c,l=()=>{let e=typeof i?.allowCycles==`function`?i.allowCycles():i?.allowCycles,r=Et(t.value,n.value,{allowCycles:e});return t.value.forEach(e=>{if(e.type===`approval`&&(e.data.approvers||[]).length===0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`approvers`,message:`审批节点必须设置至少一个审批人,否则流程无法正常运行`,type:`required`}),e.type===`condition`){let t=e.data.conditions||[];if(t.length===0)r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`条件分支节点必须配置至少一个分支条件,否则无法进行条件判断`,type:`required`});else{let n=t.filter(e=>!e.name||!e.field||!e.operator||!e.value);n.length>0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`有 ${n.length} 个条件分支配置不完整,请完善所有必填字段`,type:`incomplete`})}}}),r};return x(()=>{c&&clearTimeout(c)}),{validationErrors:o,showValidationErrors:s,validateWorkflow:l,validateCurrentWorkflow:()=>{let e=l();o.value=e,e.length===0?(a.success(`流程结构和节点配置验证通过;执行规则由业务后端校验`),s.value=!1):(a.error(`发现 ${e.length} 个问题,请查看详细错误`),s.value=!0,i?.onValidateError?.(e))},jumpToErrorNode:e=>{let n=t.value.find(t=>t.id===e);!n||!r.value||(r.value.setCenter(n.position.x,n.position.y,{zoom:1.2,duration:800}),c&&clearTimeout(c),c=setTimeout(()=>{c=void 0,t.value.includes(n)&&(i?.onShowNodeConfig?.(n),s.value=!1)},900),a.info(`已定位到节点:${n.data.title}`))},getFieldDisplayName:e=>W[e]||e,getErrorTypeText:e=>G[e]||e,resetValidation:()=>{c&&clearTimeout(c),c=void 0,o.value=[],s.value=!1}}}const Ot={start:{label:`发起人`,icon:`mdi:play-circle`,colorClass:`start`},approval:{label:`审批节点`,icon:`mdi:account-check`,colorClass:`approval`},copy:{label:`抄送节点`,icon:`mdi:email-outline`,colorClass:`copy`},condition:{label:`条件分支`,icon:`mdi:source-branch`,colorClass:`condition`}},kt={any:`或签(任一审批人通过即可)`,all:`会签(所有审批人必须通过)`,sequence:`顺序审批(按顺序依次审批)`},At={equals:`等于`,not_equals:`不等于`,greater_than:`大于`,less_than:`小于`,contains:`包含`};function jt(e,t){let n=T(!1),r=T([]),i=T({totalNodes:0,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:0}),a={start:e=>{let t=e.initiators||[];return t.length>0?[{type:`users`,label:`发起人`,users:t}]:[{type:`text`,label:`发起人`,value:`所有人`}]},approval:e=>{let t=e.approvalMode||`any`,n=e.approvers||[],r=[{type:`mode`,label:`审批方式`,value:kt[t]||t,modeKey:t}];return n.length>0?r.push({type:`users`,label:`审批人`,users:n}):r.push({type:`warning`,label:`审批人`,value:`未设置`}),r},copy:e=>{let t=e.copyUsers||[];return t.length>0?[{type:`users`,label:`抄送人`,users:t}]:[{type:`text`,label:`抄送人`,value:`未设置`}]},condition:e=>{let t=e.conditions||[];return t.length===0?[{type:`warning`,label:`条件分支`,value:`未配置`}]:t.map((e,t)=>{let n=At[e.operator]||e.operator;return{type:`text`,label:`分支 ${t+1}`,value:`${e.name||`未命名`} — ${e.field||`?`} ${n} ${e.value||`?`}`}})}},o=e=>{let t=a[e.type||`start`];return t?t(e.data):[]},s=()=>{let n=new Map;e.value.forEach(e=>n.set(e.id,e));let r=new Map,i=new Map;e.value.forEach(e=>{r.set(e.id,[]),i.set(e.id,0)}),t.value.forEach(e=>{r.get(e.source)?.push(e.target),i.set(e.target,(i.get(e.target)||0)+1)});let a=[];i.forEach((e,t)=>{e===0&&a.push(t)});let o=[],s=new Set;for(;a.length>0;){let e=a.shift();if(s.has(e))continue;s.add(e);let t=n.get(e);t&&o.push(t);let c=r.get(e)||[];for(let e of c){let t=(i.get(e)||1)-1;i.set(e,t),t<=0&&!s.has(e)&&a.push(e)}}return e.value.forEach(e=>{s.has(e.id)||o.push(e)}),o},c=()=>s().map((e,t)=>{let n=Ot[e.type||`start`]||Ot.start;return{order:t+1,node:e,nodeTypeLabel:n.label,icon:n.icon,colorClass:n.colorClass,details:o(e)}}),l=()=>{let n={totalNodes:e.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:t.value.length};return e.value.forEach(e=>{e.type===`approval`?n.approvalNodes++:e.type===`copy`?n.copyNodes++:e.type===`condition`&&n.conditionNodes++}),n};return{showPreview:n,previewSteps:r,previewStats:i,openPreview:()=>{r.value=c(),i.value=l(),n.value=!0},closePreview:()=>{n.value=!1}}}const Mt={class:`approval-workflow-container`},Nt={class:`floating-toolbar`},Pt={class:`add-menu-content`},Ft=[`onClick`],It={class:`menu-text`},Lt={key:0,class:`validation-success`},Rt={class:`success-icon`},zt={key:1,class:`validation-errors`},Bt={class:`error-summary`},Vt={class:`error-icon`},Ht={class:`error-list`},Ut={class:`error-header`},Wt={class:`error-number`},Gt={class:`error-info`},Kt={class:`error-node`},qt={class:`error-field`},Jt={class:`error-message`},Yt={class:`error-actions`},Xt={class:`validation-footer`},Zt={class:`preview-stats`},Qt={class:`stat-item`},$t={class:`stat-value`},en={class:`stat-item approval`},tn={class:`stat-value`},nn={class:`stat-item copy`},rn={class:`stat-value`},an={class:`stat-item condition`},on={class:`stat-value`},sn={class:`stat-item edge`},cn={class:`stat-value`},ln={class:`preview-timeline`},un={class:`step-connector`},dn={class:`step-dot`},fn={key:0,class:`step-line`},pn={class:`step-content`},mn={class:`step-header`},hn={class:`step-order`},gn={class:`step-type-badge`},_n={class:`step-title`},vn={key:0,class:`step-details`},yn={class:`detail-label`},bn={class:`warning-text`},xn={key:0,class:`preview-empty`},Sn={class:`preview-footer`};var Cn=n(m({name:`C_WorkFlow`,__name:`index`,props:{users:{default:()=>[]},roles:{default:()=>[]},departments:{default:()=>[]},modelValue:{},readonly:{type:Boolean,default:!1},allowCycles:{type:Boolean,default:!0},theme:{default:`light`}},emits:[`update:modelValue`,`change`,`node-click`,`edge-click`,`save`,`validate-error`],setup(n,{expose:r,emit:i}){let s=n,m=i,h=e(),_=T(),{nodes:v,edges:x,showAddMenu:S,menuPosition:w,showNodeConfig:k,currentNode:M,nodeTypes:P,workflowStats:L,addNode:te,onNodeClick:ne,closeAddMenu:re,handleConfigSave:R,resetNodes:ie,getCurrentWorkflowData:z,fitView:se,deleteNode:ce}=xt(s,m,_),{validationErrors:V,showValidationErrors:H,validateWorkflow:U,validateCurrentWorkflow:W,jumpToErrorNode:G,getFieldDisplayName:K,getErrorTypeText:q,resetValidation:le}=Dt(v,x,_,{allowCycles:()=>s.allowCycles,onShowNodeConfig:e=>{s.readonly||(M.value=e,k.value=!0)},onValidateError:e=>m(`validate-error`,e)}),{showPreview:J,previewSteps:Y,previewStats:X,openPreview:ue,closePreview:de}=jt(v,x),Z=()=>{if(s.readonly)return;let e=U();if(V.value=e,e.length>0){h.error(`工作流验证失败: ${e[0].message}`),H.value=!0,m(`validate-error`,e);return}m(`save`,z()),h.success(`工作流保存成功`)},fe=()=>{ue()},pe=()=>{de(),Z()},me=()=>{s.readonly||(ie(),le())};return r({validateWorkflow:U,getCurrentWorkflowData:z,saveWorkflow:Z,previewWorkflow:fe,deleteNode:ce,stats:L}),(e,r)=>(C(),u(`div`,Mt,[l(` 浮动工具栏 `),d(`div`,Nt,[p(O(N),{size:`small`,type:`primary`,disabled:n.readonly,onClick:Z},{icon:A(()=>[p(O(t),{name:`mdi:content-save`,size:16})]),default:A(()=>[r[7]||=f(` 保存 `,-1)]),_:1},8,[`disabled`]),p(O(N),{size:`small`,onClick:fe},{icon:A(()=>[p(O(t),{name:`mdi:eye`,size:16})]),default:A(()=>[r[8]||=f(` 预览 `,-1)]),_:1}),p(O(N),{size:`small`,onClick:O(W),title:`检查工作流配置是否正确`},{icon:A(()=>[p(O(t),{name:`mdi:check-circle`,size:16})]),default:A(()=>[r[9]||=f(` 验证流程 `,-1)]),_:1},8,[`onClick`]),r[10]||=d(`div`,{class:`toolbar-divider`},null,-1),p(O(N),{size:`small`,onClick:O(se),title:`适应窗口`},{icon:A(()=>[p(O(t),{name:`mdi:fit-to-screen`,size:16})]),_:1},8,[`onClick`]),p(O(N),{size:`small`,type:`error`,disabled:n.readonly,onClick:me,title:`清空画布`},{icon:A(()=>[p(O(t),{name:`mdi:delete-sweep`,size:16})]),_:1},8,[`disabled`])]),l(` Vue Flow 画布 `),p(O(B),{ref_key:`vueFlowRef`,ref:_,nodes:O(v),"onUpdate:nodes":r[0]||=e=>g(v)?v.value=e:null,edges:O(x),"onUpdate:edges":r[1]||=e=>g(x)?x.value=e:null,"node-types":O(P),class:`workflow-canvas`,"default-viewport":{zoom:1,x:0,y:0},"min-zoom":.5,"max-zoom":2,"fit-view-on-init":!0,"nodes-draggable":!n.readonly,"nodes-connectable":!n.readonly,"edges-updatable":!n.readonly,"delete-key-code":n.readonly?null:void 0,"elements-selectable":!0,onNodeClick:O(ne),onPaneClick:O(re)},null,8,[`nodes`,`edges`,`node-types`,`nodes-draggable`,`nodes-connectable`,`edges-updatable`,`delete-key-code`,`onNodeClick`,`onPaneClick`]),l(` 节点添加菜单 `),(C(),c(o,{to:`body`},[j(d(`div`,{class:`add-node-menu`,style:b({left:O(w).x+`px`,top:O(w).y+`px`})},[d(`div`,Pt,[(C(!0),u(a,null,E(O(oe),e=>(C(),u(`button`,{key:e.type,type:`button`,class:`add-menu-item`,onClick:t=>O(te)(e.type)},[d(`div`,{class:y([`menu-icon`,e.iconClass])},[p(O(t),{name:e.icon,size:16},null,8,[`name`])],2),d(`span`,It,D(e.label),1)],8,Ft))),128))])],4),[[ee,O(S)]])])),l(` 节点配置弹窗 - 拆分到独立组件 `),p(ke,{show:O(k),"onUpdate:show":r[2]||=e=>g(k)?k.value=e:null,"current-node":O(M),users:n.users,departments:n.departments,onSave:O(R),onCancel:r[3]||=e=>k.value=!1},null,8,[`show`,`current-node`,`users`,`departments`,`onSave`]),l(` 验证错误日志抽屉 `),p(O(F),{show:O(H),"onUpdate:show":r[5]||=e=>g(H)?H.value=e:null,width:450,placement:`right`},{default:A(()=>[p(O(I),{title:`流程验证结果`,closable:``},{footer:A(()=>[d(`div`,Xt,[p(O(N),{onClick:r[4]||=e=>H.value=!1},{default:A(()=>[...r[16]||=[f(`关闭`,-1)]]),_:1}),p(O(N),{type:`primary`,onClick:O(W)},{icon:A(()=>[p(O(t),{name:`mdi:refresh`,size:16})]),default:A(()=>[r[17]||=f(` 重新验证 `,-1)]),_:1},8,[`onClick`])])]),default:A(()=>[O(V).length===0?(C(),u(`div`,Lt,[d(`div`,Rt,[p(O(t),{name:`mdi:check-circle`,size:32,color:`#52c41a`})]),r[11]||=d(`h3`,null,`验证通过`,-1),r[12]||=d(`p`,null,`流程结构和节点配置验证通过;审批执行、权限与业务规则由后端校验。`,-1)])):(C(),u(`div`,zt,[d(`div`,Bt,[d(`div`,Vt,[p(O(t),{name:`mdi:alert-circle`,size:24,color:`#ff4d4f`})]),d(`h3`,null,`发现 `+D(O(V).length)+` 个问题`,1),r[13]||=d(`p`,null,`请修复以下问题后重新验证:`,-1)]),d(`div`,Ht,[(C(!0),u(a,null,E(O(V),(e,n)=>(C(),u(`div`,{key:`${e.nodeId}-${e.field}-${n}`,class:`error-item`},[d(`div`,Ut,[d(`span`,Wt,D(n+1),1),d(`div`,Gt,[d(`strong`,Kt,D(e.nodeName),1),d(`span`,qt,D(O(K)(e.field)),1)]),d(`div`,{class:y([`error-type`,e.type])},D(O(q)(e.type)),3)]),d(`div`,Jt,D(e.message),1),d(`div`,Yt,[p(O(N),{size:`small`,type:`primary`,disabled:!e.nodeId,onClick:t=>O(G)(e.nodeId)},{icon:A(()=>[p(O(t),{name:`mdi:target`,size:16})]),default:A(()=>[r[14]||=f(` 定位节点 `,-1)]),_:1},8,[`disabled`,`onClick`])])]))),128))]),r[15]||=d(`div`,{class:`validation-tips`},[d(`h4`,null,`💡 常见问题解决方案:`),d(`ul`,null,[d(`li`,null,[d(`strong`,null,`审批人未设置:`),f(`点击审批节点,在弹窗中选择审批人员 `)]),d(`li`,null,[d(`strong`,null,`条件分支未配置:`),f(`点击条件节点,添加至少一个条件分支 `)]),d(`li`,null,[d(`strong`,null,`节点连接断开:`),f(` 检查节点之间的连线是否正确 `)])])],-1)]))]),_:1})]),_:1},8,[`show`]),l(` 流程预览抽屉 `),p(O(F),{show:O(J),"onUpdate:show":r[6]||=e=>g(J)?J.value=e:null,width:520,placement:`right`},{default:A(()=>[p(O(I),{title:`流程预览`,closable:``},{footer:A(()=>[d(`div`,Sn,[p(O(N),{onClick:O(de)},{default:A(()=>[...r[24]||=[f(`关闭`,-1)]]),_:1},8,[`onClick`]),p(O(N),{type:`primary`,onClick:pe},{icon:A(()=>[p(O(t),{name:`mdi:content-save`,size:16})]),default:A(()=>[r[25]||=f(` 确认并保存 `,-1)]),_:1})])]),default:A(()=>[d(`div`,Zt,[d(`div`,Qt,[d(`span`,$t,D(O(X).totalNodes),1),r[18]||=d(`span`,{class:`stat-label`},`总节点`,-1)]),d(`div`,en,[d(`span`,tn,D(O(X).approvalNodes),1),r[19]||=d(`span`,{class:`stat-label`},`审批`,-1)]),d(`div`,nn,[d(`span`,rn,D(O(X).copyNodes),1),r[20]||=d(`span`,{class:`stat-label`},`抄送`,-1)]),d(`div`,an,[d(`span`,on,D(O(X).conditionNodes),1),r[21]||=d(`span`,{class:`stat-label`},`条件`,-1)]),d(`div`,sn,[d(`span`,cn,D(O(X).totalEdges),1),r[22]||=d(`span`,{class:`stat-label`},`连线`,-1)])]),d(`div`,ln,[(C(!0),u(a,null,E(O(Y),(e,n)=>(C(),u(`div`,{key:e.node.id,class:y([`preview-step`,e.colorClass])},[l(` 时间线连接线 `),d(`div`,un,[d(`div`,dn,[p(O(t),{name:e.icon,size:16},null,8,[`name`])]),n<O(Y).length-1?(C(),u(`div`,fn)):l(`v-if`,!0)]),l(` 步骤内容 `),d(`div`,pn,[d(`div`,mn,[d(`span`,hn,`步骤 `+D(e.order),1),d(`span`,gn,D(e.nodeTypeLabel),1)]),d(`div`,_n,D(e.node.data.title),1),e.details.length>0?(C(),u(`div`,vn,[(C(!0),u(a,null,E(e.details,(e,n)=>(C(),u(`div`,{key:n,class:y([`step-detail-item`,{"is-warning":e.type===`warning`}])},[d(`span`,yn,D(e.label)+`:`,1),l(` 审批方式 badge `),e.type===`mode`?(C(),u(`span`,{key:0,class:y([`mode-badge`,e.modeKey])},D(e.value),3)):e.type===`users`?(C(),u(a,{key:1},[l(` 人员 tags `),(C(!0),u(a,null,E(e.users,e=>(C(),c(O(ae),{key:e.name,size:`small`,bordered:!1,round:``,class:`user-tag`},{icon:A(()=>[p(O(t),{name:`mdi:account`,size:12})]),default:A(()=>[f(` `+D(e.name),1)]),_:2},1024))),128))],64)):e.type===`warning`?(C(),u(a,{key:2},[l(` 警告文案 `),d(`span`,bn,` ⚠️ `+D(e.value),1)],2112)):(C(),u(a,{key:3},[l(` 普通文本 `),d(`span`,null,D(e.value),1)],2112))],2))),128))])):l(`v-if`,!0)])],2))),128))]),O(Y).length===0?(C(),u(`div`,xn,[p(O(t),{name:`mdi:file-document-outline`,size:48,color:`#d1d5db`}),r[23]||=d(`p`,null,`暂无流程节点`,-1)])):l(`v-if`,!0)]),_:1})]),_:1},8,[`show`])]))}}),[[`__scopeId`,`data-v-f5022473`]]);export{xt as i,jt as n,Dt as r,Cn as t};
1
+ import{t as e}from"./feedback.js";import{t}from"./C_Icon2.js";import{t as n}from"./export-helper.js";import{a as r,t as i}from"./data.js";import{Fragment as a,Teleport as o,computed as s,createBlock as c,createCommentVNode as l,createElementBlock as u,createElementVNode as d,createTextVNode as f,createVNode as p,defineComponent as m,inject as h,isRef as g,markRaw as _,nextTick as v,normalizeClass as y,normalizeStyle as b,onBeforeUnmount as x,onMounted as S,openBlock as C,provide as w,ref as T,renderList as E,toDisplayString as D,unref as O,vShow as ee,watch as k,withCtx as A,withDirectives as j}from"vue";import{NAvatar as M,NButton as N,NCard as P,NDrawer as F,NDrawerContent as I,NInput as L,NModal as te,NRadio as ne,NRadioGroup as re,NSelect as R,NSpace as ie,NTag as ae,NTree as z}from"naive-ui";import{VueFlow as B}from"@vue-flow/core";const oe=[{type:`approval`,label:`审批人`,icon:`mdi:account-check`,iconClass:`approval-icon`},{type:`copy`,label:`抄送人`,icon:`mdi:email-outline`,iconClass:`copy-icon`},{type:`condition`,label:`条件分支`,icon:`mdi:source-branch`,iconClass:`condition-icon`}],se=[{value:`any`,label:`或签`,desc:`任意一人同意即可通过`},{value:`all`,label:`会签`,desc:`所有人都同意才能通过`},{value:`sequence`,label:`顺序审批`,desc:`按选择顺序依次审批`}],ce=[{label:`申请金额`,value:`amount`},{label:`申请人部门`,value:`department`},{label:`申请类型`,value:`type`},{label:`紧急程度`,value:`priority`}],V=[{label:`等于`,value:`equals`},{label:`大于`,value:`greater_than`},{label:`小于`,value:`less_than`},{label:`包含`,value:`contains`},{label:`不等于`,value:`not_equals`}],H={start:`发起人`,approval:`审批人`,copy:`抄送人`,condition:`条件分支`},U={approval:`审批人设置`,copy:`抄送人设置`,condition:`条件分支设置`},W={approvers:`审批人`,conditions:`条件配置`,connection:`节点连接`,nodeId:`节点标识`,edgeId:`连线标识`,start:`开始节点`,cycle:`循环策略`,copyUsers:`抄送人`},G={required:`必填`,invalid:`结构错误`,incomplete:`不完整`,warning:`警告`,error:`错误`},K={id:`start-1`,type:`start`,position:{x:150,y:100},data:{title:`发起人`,status:`active`,initiators:[]}},le=e=>{let t=Array.from(e.trim()).slice(0,2).join(``).toUpperCase()||`?`,n=`<svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" viewBox="0 0 80 80"><rect width="80" height="80" rx="40" fill="hsl(${Array.from(e).reduce((e,t)=>(e*31+(t.codePointAt(0)??0))%360,210)} 55% 46%)"/><text x="40" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" fill="white">${t.replace(/[&<>"']/g,e=>({"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&apos;`})[e])}</text></svg>`;return`data:image/svg+xml;charset=UTF-8,${encodeURIComponent(n)}`};let ue=0;const q=e=>typeof crypto<`u`&&`randomUUID`in crypto?`${e}-${crypto.randomUUID()}`:`${e}-${Date.now()}-${++ue}`,J=()=>q(`condition`),Y=(e,t)=>`edge-${e}-${t}`,de=()=>({id:J(),name:``,field:``,operator:`equals`,value:``}),X=new Set([`equals`,`not_equals`,`greater_than`,`less_than`,`contains`]);function Z(e){if(!e||typeof e!=`object`)return!1;let t=e;return[t.id,t.name,t.field,t.value].every(e=>typeof e==`string`&&e.trim().length>0)&&X.has(t.operator)}const fe={key:0,class:`max-h-60vh overflow-y-auto`},pe={class:`config-section`},me={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},he={class:`border rounded-lg p-3 mb-4 max-h-50 overflow-y-auto`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},ge={key:0,class:`rounded-lg p-4 mb-4 border`,style:{borderColor:`var(--n-border-color)`,background:`var(--n-color-embedded)`}},_e={class:`mb-2 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},ve={class:`flex flex-wrap gap-3`},ye={class:`flex items-center gap-2`},be={class:`font-medium text-sm`},xe={class:`text-xs px-1.5 py-0.5 rounded`,style:{color:`var(--n-text-color-3)`,background:`var(--n-color-embedded)`}},Se={key:0,class:`mt-4`},Ce={class:`flex flex-col gap-1`},we={class:`text-sm`},Te={class:`text-xs`,style:{color:`var(--n-text-color-3)`}},Ee={class:`max-h-60vh overflow-y-auto`},De={class:`config-section`},Oe={class:`flex items-center gap-2 mb-4 text-base font-semibold`,style:{color:`var(--n-text-color-1)`}},ke={class:`space-y-3`},Ae={class:`flex items-center gap-3 flex-nowrap min-h-10 p-2`};var je=n(m({__name:`NodeConfigModal`,props:{show:{type:Boolean,default:!1},currentNode:{default:null},users:{default:()=>[]},departments:{default:()=>[]}},emits:[`update:show`,`save`,`cancel`],setup(n,{emit:r}){let o=n,m=r,h=e(),g=T(``),_=T([]),v=T([]),y=T(`any`),b=T(!1),x=T([]),S=s({get:()=>o.show,set:e=>m(`update:show`,e)}),w=s(()=>o.currentNode?.type===`start`?`发起人设置`:U[o.currentNode?.type]||`节点设置`),ee=s(()=>{let e=[],t=new Map;return o.departments?.forEach(e=>{t.has(e.id)||t.set(e.id,{key:`dept-${e.id}`,label:`${e.name} ${e.manager?`(负责人: ${e.manager})`:``}`,children:[],isLeaf:!1,disabled:!0})}),(o.users?.filter(e=>!g.value||e.name.includes(g.value)||e.department.includes(g.value))||[]).forEach(e=>{let n=o.departments?.find(t=>t.name===e.department);n&&t.has(n.id)&&t.get(n.id).children.push({key:e.id,label:`${e.name}${e.role?`(${e.role})`:``}`,isLeaf:!0,user:e})}),t.forEach(t=>{t.children.length>0&&e.push(t)}),e}),j=s(()=>o.users?.filter(e=>_.value.includes(e.id))||[]),F=s(()=>o.users?.filter(e=>v.value.includes(e.id))||[]),I=s(()=>o.users?.filter(e=>_.value.includes(e.id))||[]),B=e=>{_.value=e.filter(e=>!e.startsWith(`dept-`))},oe=e=>{v.value=e.filter(e=>!e.startsWith(`dept-`))},H=e=>{_.value=_.value.filter(t=>t!==e)},W=e=>{v.value=v.value.filter(t=>t!==e)},G=e=>{_.value=_.value.filter(t=>t!==e)},K=()=>x.value.push(de()),ue=e=>x.value.splice(e,1),q=e=>{let{initiators:t}=e.data;_.value=t?t.map(e=>e.id):[]},J=e=>{_.value=(e.data.approvers||[]).map(e=>e.id),y.value=e.data.approvalMode||`any`},Y=e=>{v.value=(e.data.copyUsers||[]).map(e=>e.id)},X=e=>{x.value=i(e.data.conditions||[])},je=async()=>{if(_.value.length===0)return h.error(`请选择发起人`),!1;let e=I.value;return m(`save`,{initiators:e}),h.success(`已设置 ${e.length} 个发起人`),!0},Me=async()=>{if(_.value.length===0)return h.error(`请至少选择一个审批人`),!1;let e=j.value;return m(`save`,{approvers:e,approvalMode:y.value}),h.success(`已设置 ${e.length} 个审批人`),!0},Ne=async()=>{let e=F.value;return m(`save`,{copyUsers:e}),h.success(`已设置 ${e.length} 个抄送人`),!0},Pe=async()=>x.value.length===0?(h.error(`请至少添加一个条件分支`),!1):x.value.some(e=>!Z(e))?(h.error(`请完善所有条件配置`),!1):(m(`save`,{conditions:i(x.value)}),h.success(`已设置 ${x.value.length} 个条件分支`),!0),Fe=async()=>{if(!o.currentNode)return!1;b.value=!0;try{let e={start:je,approval:Me,copy:Ne,condition:Pe}[o.currentNode.type];return e?await e():!1}catch(e){return h.error(`保存配置失败`,e),!1}finally{b.value=!1}},Ie=()=>{m(`cancel`)};k(()=>o.currentNode,e=>{if(e){g.value=``;let t={start:q,approval:J,copy:Y,condition:X}[e.type];t&&t(e)}},{immediate:!0});let Le=s(()=>[`start`,`approval`,`copy`].includes(o.currentNode?.type||``)),Q=s(()=>{let e=o.currentNode?.type;return e===`start`?{icon:`mdi:account-star`,title:`选择发起人`,checkedKeys:_.value,onSelect:B,selectedUsers:I.value,selectedLabel:`已选择发起人`,tagType:`primary`,onRemove:G}:e===`approval`?{icon:`mdi:account-check`,title:`选择审批人`,checkedKeys:_.value,onSelect:B,selectedUsers:j.value,selectedLabel:`已选择审批人`,tagType:`info`,onRemove:H}:e===`copy`?{icon:`mdi:email-outline`,title:`选择抄送人`,checkedKeys:v.value,onSelect:oe,selectedUsers:F.value,selectedLabel:`已选择抄送人`,tagType:`success`,onRemove:W}:{icon:``,title:``,checkedKeys:[],onSelect:()=>{},selectedUsers:[],selectedLabel:``,tagType:`default`,onRemove:()=>{}}});return(e,n)=>(C(),c(O(te),{show:S.value,"onUpdate:show":n[2]||=e=>S.value=e,style:{width:`900px`},"mask-closable":!1,preset:`dialog`,title:w.value,"positive-text":`确定`,"negative-text":`取消`,loading:b.value,onPositiveClick:Fe,onNegativeClick:Ie},{default:A(()=>[l(` 公共选择面板 `),Le.value?(C(),u(`div`,fe,[d(`div`,pe,[d(`h4`,me,[Q.value.icon?(C(),c(O(t),{key:0,name:Q.value.icon,size:16},null,8,[`name`])):l(`v-if`,!0),f(` `+D(Q.value.title),1)]),p(O(L),{value:g.value,"onUpdate:value":n[0]||=e=>g.value=e,placeholder:`搜索用户姓名或部门`,clearable:``,class:`mb-4`},{prefix:A(()=>[p(O(t),{name:`mdi:magnify`,size:16})]),_:1},8,[`value`]),d(`div`,he,[p(O(z),{data:ee.value,"checked-keys":Q.value.checkedKeys,selectable:!1,checkable:``,cascade:``,"virtual-scroll":!0,style:{"max-height":`300px`},"onUpdate:checkedKeys":Q.value.onSelect},null,8,[`data`,`checked-keys`,`onUpdate:checkedKeys`])]),Q.value.selectedUsers.length>0?(C(),u(`div`,ge,[d(`h5`,_e,D(Q.value.selectedLabel)+` (`+D(Q.value.selectedUsers.length)+`) `,1),d(`div`,ve,[(C(!0),u(a,null,E(Q.value.selectedUsers,e=>(C(),c(O(ae),{key:e.id,closable:``,type:Q.value.tagType,onClose:t=>Q.value.onRemove(e.id)},{default:A(()=>[d(`div`,ye,[p(O(M),{src:e.avatar,"fallback-src":O(le)(e.name),size:`small`},null,8,[`src`,`fallback-src`]),d(`span`,be,D(e.name),1),d(`span`,xe,D(e.department),1)])]),_:2},1032,[`type`,`onClose`]))),128))])])):l(`v-if`,!0)]),l(` 审批节点时附带审批模式 `),o.currentNode?.type===`approval`?(C(),u(`div`,Se,[n[3]||=d(`h5`,{class:`mb-3 text-sm font-medium`,style:{color:`var(--n-text-color-1)`}},` 审批模式 `,-1),p(O(re),{value:y.value,"onUpdate:value":n[1]||=e=>y.value=e},{default:A(()=>[p(O(ie),{vertical:``},{default:A(()=>[(C(!0),u(a,null,E(O(se),e=>(C(),c(O(ne),{key:e.value,value:e.value},{default:A(()=>[d(`div`,Ce,[d(`strong`,we,D(e.label),1),d(`span`,Te,D(e.desc),1)])]),_:2},1032,[`value`]))),128))]),_:1})]),_:1},8,[`value`])])):l(`v-if`,!0)])):o.currentNode?.type===`condition`?(C(),u(a,{key:1},[l(` 条件节点配置 `),d(`div`,Ee,[d(`div`,De,[d(`h4`,Oe,[p(O(t),{name:`mdi:source-branch`,size:16}),n[4]||=f(` 条件分支设置 `,-1)]),d(`div`,ke,[(C(!0),u(a,null,E(x.value,(e,n)=>(C(),u(`div`,{key:e.id,class:`condition-item`},[p(O(P),{size:`small`,class:`border border-gray-200 hover:border-gray-300 transition-colors`},{default:A(()=>[d(`div`,Ae,[p(O(L),{value:e.name,"onUpdate:value":t=>e.name=t,placeholder:`分支名称`,style:{width:`150px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),p(O(R),{value:e.field,"onUpdate:value":t=>e.field=t,placeholder:`选择字段`,options:O(ce),style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),p(O(R),{value:e.operator,"onUpdate:value":t=>e.operator=t,placeholder:`操作符`,options:O(V),style:{width:`100px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`,`options`]),p(O(L),{value:e.value,"onUpdate:value":t=>e.value=t,placeholder:`值`,style:{width:`120px`},class:`flex-shrink-0`},null,8,[`value`,`onUpdate:value`]),p(O(N),{quaternary:``,type:`error`,onClick:e=>ue(n),class:`flex-shrink-0 ml-auto`},{icon:A(()=>[p(O(t),{name:`mdi:delete`,size:16})]),_:1},8,[`onClick`])])]),_:2},1024)]))),128)),p(O(N),{dashed:``,block:``,onClick:K,class:`w-full`},{icon:A(()=>[p(O(t),{name:`mdi:plus`,size:16})]),default:A(()=>[n[5]||=f(` 添加条件 `,-1)]),_:1})])])])],2112)):l(`v-if`,!0)]),_:1},8,[`show`,`title`,`loading`]))}}),[[`__scopeId`,`data-v-468a6dee`]]);const Me={class:`start-node`},Ne={class:`node-content`},Pe={class:`node-info`},Fe={class:`node-text`},Ie={key:0,class:`initiator-name`},Le={key:1,class:`placeholder-text`};var Q=n(m({__name:`StartNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=s(()=>{let{initiators:e}=n.data;return!e||!Array.isArray(e)||e.length===0?``:e.map(e=>e?.name||`未知用户`).join(`、`)}),a=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)};return(n,r)=>(C(),u(`div`,Me,[l(` 主要内容区域 `),d(`div`,Ne,[r[0]||=d(`div`,{class:`node-icon`},`🚀`,-1),d(`div`,Pe,[d(`div`,Fe,D(e.data.title),1),i.value?(C(),u(`div`,Ie,D(i.value),1)):(C(),u(`div`,Le,`点击设置发起人`))])]),l(` 添加节点按钮 `),d(`button`,{type:`button`,class:`add-node-btn`,onClick:a,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-6fb2df95`]]);const Re={class:`approval-node`},ze={class:`node-card`},Be={class:`node-header`},Ve={class:`node-icon`},He={class:`node-title`},Ue={key:0,class:`node-badge`},We={key:1,class:`approval-mode-badge`},Ge={class:`node-content`},Ke={key:0,class:`approvers-list`},qe={class:`approver-info`},Je={class:`approver-avatar`},Ye={class:`approver-details`},Xe={class:`approver-name`},Ze={class:`approver-dept`},Qe={class:`approver-role`},$e={key:0,class:`more-count`},et={key:1,class:`placeholder`};var tt=n(m({__name:`ApprovalNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.approvers??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,3)),m=s(()=>Math.max(0,c.value-3)),g=e=>({any:`或签`,all:`会签`,sequence:`顺序`})[e]||``,_=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},v=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,Re,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:v,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,ze,[d(`div`,Be,[d(`div`,Ve,[p(O(t),{name:`mdi:account`,size:12,color:`white`})]),d(`span`,He,D(e.data.title),1),c.value>0?(C(),u(`div`,Ue,D(c.value),1)):l(`v-if`,!0),e.data.approvalMode?(C(),u(`div`,We,D(g(e.data.approvalMode)),1)):l(`v-if`,!0)]),d(`div`,Ge,[c.value>0?(C(),u(`div`,Ke,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`approver-tag`},[d(`div`,qe,[d(`div`,Je,[p(O(M),{src:e.avatar,"fallback-src":O(le)(e.name),size:`small`},null,8,[`src`,`fallback-src`])]),d(`div`,Ye,[d(`span`,Xe,D(e.name),1),d(`span`,Ze,D(e.department),1),d(`span`,Qe,D(e.role),1)])])]))),128)),m.value>0?(C(),u(`div`,$e,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,et,[p(O(t),{name:`mdi:account-plus`,size:24,color:`#9ca3af`}),r[0]||=d(`span`,null,`请设置审批人`,-1)]))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:_,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-e6968a42`]]);const nt={class:`copy-node`},rt={class:`node-card`},it={class:`node-header`},at={class:`node-title`},ot={key:0,class:`node-badge`},st={class:`node-content`},ct={key:0,class:`copy-users-list`},lt={key:0,class:`more-count`},ut={key:1,class:`placeholder`};var dt=n(m({__name:`CopyNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.copyUsers??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,3)),m=s(()=>Math.max(0,c.value-3)),g=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},_=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,nt,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:_,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,rt,[d(`div`,it,[r[0]||=d(`div`,{class:`node-icon`},`📋`,-1),d(`span`,at,D(e.data.title),1),c.value>0?(C(),u(`div`,ot,D(c.value),1)):l(`v-if`,!0)]),d(`div`,st,[c.value>0?(C(),u(`div`,ct,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`copy-user-tag`},D(e.name),1))),128)),m.value>0?(C(),u(`div`,lt,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,ut,`请设置抄送人`))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:g,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-010e7ec8`]]);const ft={class:`condition-node`},pt={class:`node-card`},mt={class:`node-header`},ht={class:`node-title`},gt={key:0,class:`node-badge`},_t={class:`node-content`},vt={key:0,class:`conditions-list`},yt={key:0,class:`more-count`},bt={key:1,class:`placeholder`};var xt=n(m({__name:`ConditionNode`,props:{id:{},data:{}},setup(e){let n=e,r=h(`showAddMenu`),i=h(`deleteNode`),o=s(()=>n.data.conditions??[]),c=s(()=>o.value.length),f=s(()=>o.value.slice(0,2)),m=s(()=>Math.max(0,c.value-2)),g=e=>{e.stopPropagation();let t=e.currentTarget.getBoundingClientRect();r&&r({x:t.left+t.width/2,y:t.bottom+10},n.id)},_=e=>{e.stopPropagation(),i&&i(n.id)};return(n,r)=>(C(),u(`div`,ft,[d(`div`,{class:y([`status-indicator`,e.data.status])},null,2),l(` 删除按钮 `),d(`button`,{type:`button`,class:`delete-btn`,onClick:_,title:`删除节点`},[p(O(t),{name:`mdi:close`,size:12})]),d(`div`,pt,[d(`div`,mt,[r[0]||=d(`div`,{class:`node-icon`},`🔀`,-1),d(`span`,ht,D(e.data.title),1),c.value>0?(C(),u(`div`,gt,D(c.value),1)):l(`v-if`,!0)]),d(`div`,_t,[c.value>0?(C(),u(`div`,vt,[(C(!0),u(a,null,E(f.value,e=>(C(),u(`div`,{key:e.id,class:`condition-tag`},[r[1]||=d(`span`,{class:`condition-icon`},`→`,-1),d(`span`,null,D(e.name||`条件`+(f.value.indexOf(e)+1)),1)]))),128)),m.value>0?(C(),u(`div`,yt,`+`+D(m.value),1)):l(`v-if`,!0)])):(C(),u(`div`,bt,`请设置分支条件`))])]),d(`button`,{type:`button`,class:`add-node-btn`,onClick:g,title:`添加下一个节点`},[p(O(t),{name:`mdi:plus`,size:16})])]))}}),[[`__scopeId`,`data-v-5ede8782`]]);const St={start:_(Q),approval:_(tt),copy:_(dt),condition:_(xt)};function Ct(t,n,a){let o=e(),c=T(i(t.modelValue?.nodes??[K])),l=T(i(t.modelValue?.edges??[])),u=T(t.modelValue?i(t.modelValue.config):{version:`1.0`,createdAt:new Date().toISOString()}),d=T(!1),f=T({x:0,y:0}),p=T(!1),m=T(null),h=T(null),g=new Set,_=!1,y=(e,t)=>{let n=setTimeout(()=>{g.delete(n),_||e()},t);g.add(n)},b=s(()=>St),C=s(()=>{let e={totalNodes:c.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0};return c.value.forEach(t=>{t.type===`approval`?e.approvalNodes++:t.type===`copy`?e.copyNodes++:t.type===`condition`&&e.conditionNodes++}),e}),E=()=>({nodes:i(c.value),edges:i(l.value),...u.value!==void 0&&{config:i(u.value)}}),D=()=>{let e=E();n(`update:modelValue`,e),n(`change`,e)},O=(e=60,t=400)=>{v(()=>{_||y(()=>{a.value?.fitView?.({padding:e,duration:t})},100)})},ee=(e,n)=>{t.readonly||(f.value={x:typeof e.x==`number`?e.x:0,y:typeof e.y==`number`?e.y:0},h.value=n||null,d.value=!0)},A=()=>{d.value=!1},j=e=>{if(t.readonly)return;let n=c.value.findIndex(t=>t.id===e);if(n===-1)return;if(c.value[n].type===`start`){o.warning(`不能删除开始节点`);return}let r=l.value.filter(t=>t.target===e),i=l.value.filter(t=>t.source===e);c.value.splice(n,1),l.value=l.value.filter(t=>t.source!==e&&t.target!==e),r.forEach(e=>{i.forEach(t=>{l.value.push({id:Y(e.source,t.target),source:e.source,target:t.target,animated:!0,type:`default`})})}),c.value.forEach((e,t)=>{t>=n&&(e.position.y-=180)}),D(),o.success(`节点已删除`),O()};w(`showAddMenu`,ee),w(`deleteNode`,j);let M=()=>{let e=c.value.length-1,t=c.value[e];if(h.value){let n=c.value.findIndex(e=>e.id===h.value);n!==-1&&(e=n,t=c.value[e])}return{targetNodeIndex:e,targetNode:t}},N=(e,t)=>({id:q(e),type:e,position:{x:t?.position.x??150,y:(t?.position.y??130)+180},data:{title:H[e],status:`pending`,...e===`approval`&&{approvers:[],approvalMode:`any`},...e===`copy`&&{copyUsers:[]},...e===`condition`&&{conditions:[]}}}),P=(e,t)=>{let n=l.value.filter(t=>t.source===e.id);l.value=l.value.filter(t=>t.source!==e.id),l.value.push({id:Y(e.id,t.id),source:e.id,target:t.id,animated:!0,type:`default`}),n.forEach(e=>{l.value.push({id:Y(t.id,e.target),source:t.id,target:e.target,animated:!0,type:`default`})})};return k(()=>t.modelValue,e=>{e&&(r(e.nodes??[],c.value)&&r(e.edges??[],l.value)&&r(e.config,u.value)||(c.value=i(e.nodes??[]),l.value=i(e.edges??[]),u.value=i(e.config)))},{deep:!0}),S(()=>{_=!1,v(()=>{_||y(()=>{a.value?.fitView?.({padding:80,includeHiddenNodes:!1,minZoom:.8,maxZoom:1.2,duration:600})},300)})}),x(()=>{_=!0,g.forEach(e=>clearTimeout(e)),g.clear()}),{nodes:c,edges:l,showAddMenu:d,menuPosition:f,showNodeConfig:p,currentNode:m,nodeTypes:b,workflowStats:C,addNode:e=>{if(!t.readonly)try{let{targetNodeIndex:t,targetNode:n}=M(),r=N(e,n);c.value.splice(t+1,0,r);for(let e=t+2;e<c.value.length;e++)c.value[e].position.y+=180;n&&P(n,r),d.value=!1,h.value=null,D(),O()}catch(e){o.error(`添加节点失败,请重试`,e)}},onNodeClick:e=>{let r=c.value.find(t=>t.id===e.node.id);r&&(t.readonly||(m.value=r,p.value=!0),n(`node-click`,i(r)))},closeAddMenu:A,handleConfigSave:e=>{if(t.readonly||!m.value)return;let n=c.value.findIndex(e=>e.id===m.value.id);if(n!==-1){let t={...c.value[n],data:{...c.value[n].data,...i(e)}};c.value.splice(n,1,t),m.value=t}D(),p.value=!1,o.success(`节点配置已保存`)},resetNodes:()=>{t.readonly||(c.value=i([K]),l.value=[],D(),O(80,600),o.success(`画布已清空`))},getCurrentWorkflowData:E,fitView:()=>{let e=a.value;if(!e?.fitView){o.warning(`画布未准备就绪,请稍后重试`);return}v(()=>{_||a.value!==e||e.fitView({padding:50,includeHiddenNodes:!1,minZoom:.5,maxZoom:1.5,duration:800})}),o.success(`已适应窗口大小`)},deleteNode:j}}function $(e,t,n){return{nodeId:e?.id??``,nodeName:e?.data.title??`流程结构`,field:t,message:n,type:`invalid`,severity:`high`}}function wt(e){let t=new Set,n=new Set;for(let r of e.keys()){if(t.has(r))continue;let i=[{id:r,offset:0}];for(t.add(r),n.add(r);i.length;){let r=i[i.length-1],a=e.get(r.id);if(r.offset>=a.length){n.delete(r.id),i.pop();continue}let o=a[r.offset++];if(n.has(o))return o;t.has(o)||(t.add(o),n.add(o),i.push({id:o,offset:0}))}}}function Tt(e,t){let n=new Map;return e.forEach(e=>{e.id?.trim()?n.has(e.id)?t.push($(e,`nodeId`,`节点 id「${e.id}」重复,请使用唯一标识`)):n.set(e.id,e):t.push($(e,`nodeId`,`节点 id 不能为空`))}),n}function Et(e,t,n){let r=new Map([...e.keys()].map(e=>[e,[]])),i=new Set;return t.forEach(t=>{let a=e.get(t.source),o=e.get(t.target);if((!t.id?.trim()||i.has(t.id))&&n.push($(a??o,`edgeId`,`连线 id 不能为空或重复`)),i.add(t.id),!a||!o){let e=[!a&&t.source,!o&&t.target].filter(e=>e!==!1).map(e=>e||`空标识`);n.push($(a??o,`connection`,`连线「${t.id}」指向不存在的节点:${e.join(`、`)}`));return}r.get(a.id).push(o.id)}),r}function Dt(e,t,n,r){let i=new Set([e.id]),a=[e.id];for(let e=0;e<a.length;e++)n.get(a[e])?.forEach(e=>{i.has(e)||(i.add(e),a.push(e))});t.forEach(e=>{i.has(e.id)||r.push($(e,`connection`,`此节点无法从开始节点到达,请检查连线方向与流程连接`))})}function Ot(e,t,n={}){let r=[],i=Tt(e,r),a=e.filter(e=>e.type===`start`);a.length!==1&&r.push($(a[0],`start`,`流程必须包含且仅包含一个开始节点,当前为 ${a.length} 个`));let o=Et(i,t,r);if(a.length===1&&i.has(a[0].id)&&Dt(a[0],i,o,r),n.allowCycles===!1){let e=wt(o);e!==void 0&&r.push($(i.get(e),`cycle`,`当前审批流程不允许循环,请移除回指连线或由业务启用循环策略`))}return r}function kt(t,n,r,i){let a=e(),o=T([]),s=T(!1),c,l=()=>{let e=typeof i?.allowCycles==`function`?i.allowCycles():i?.allowCycles,r=Ot(t.value,n.value,{allowCycles:e});return t.value.forEach(e=>{if(e.type===`approval`&&(`approvers`in e.data&&Array.isArray(e.data.approvers)?e.data.approvers:[]).length===0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`approvers`,message:`审批节点必须设置至少一个审批人,否则流程无法正常运行`,type:`required`}),e.type===`condition`){let t=`conditions`in e.data&&Array.isArray(e.data.conditions)?e.data.conditions:[];if(t.length===0)r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`条件分支节点必须配置至少一个分支条件,否则无法进行条件判断`,type:`required`});else{let n=t.filter(e=>!Z(e));n.length>0&&r.push({nodeId:e.id,nodeName:e.data.title,field:`conditions`,message:`有 ${n.length} 个条件分支配置不完整,请完善所有必填字段`,type:`incomplete`})}}}),r};return x(()=>{c&&clearTimeout(c)}),{validationErrors:o,showValidationErrors:s,validateWorkflow:l,validateCurrentWorkflow:()=>{let e=l();o.value=e,e.length===0?(a.success(`流程结构和节点配置验证通过;执行规则由业务后端校验`),s.value=!1):(a.error(`发现 ${e.length} 个问题,请查看详细错误`),s.value=!0,i?.onValidateError?.(e))},jumpToErrorNode:e=>{let n=t.value.find(t=>t.id===e);!n||!r.value||(r.value.setCenter(n.position.x,n.position.y,{zoom:1.2,duration:800}),c&&clearTimeout(c),c=setTimeout(()=>{c=void 0,t.value.includes(n)&&(i?.onShowNodeConfig?.(n),s.value=!1)},900),a.info(`已定位到节点:${n.data.title}`))},getFieldDisplayName:e=>W[e]||e,getErrorTypeText:e=>G[e]||e,resetValidation:()=>{c&&clearTimeout(c),c=void 0,o.value=[],s.value=!1}}}const At={start:{label:`发起人`,icon:`mdi:play-circle`,colorClass:`start`},approval:{label:`审批节点`,icon:`mdi:account-check`,colorClass:`approval`},copy:{label:`抄送节点`,icon:`mdi:email-outline`,colorClass:`copy`},condition:{label:`条件分支`,icon:`mdi:source-branch`,colorClass:`condition`}},jt={any:`或签(任一审批人通过即可)`,all:`会签(所有审批人必须通过)`,sequence:`顺序审批(按顺序依次审批)`},Mt={equals:`等于`,not_equals:`不等于`,greater_than:`大于`,less_than:`小于`,contains:`包含`};function Nt(e,t){let n=T(!1),r=T([]),i=T({totalNodes:0,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:0}),a={start:e=>{let t=e.initiators||[];return t.length>0?[{type:`users`,label:`发起人`,users:t}]:[{type:`text`,label:`发起人`,value:`所有人`}]},approval:e=>{let t=e.approvalMode||`any`,n=e.approvers||[],r=[{type:`mode`,label:`审批方式`,value:jt[t]||t,modeKey:t}];return n.length>0?r.push({type:`users`,label:`审批人`,users:n}):r.push({type:`warning`,label:`审批人`,value:`未设置`}),r},copy:e=>{let t=e.copyUsers||[];return t.length>0?[{type:`users`,label:`抄送人`,users:t}]:[{type:`text`,label:`抄送人`,value:`未设置`}]},condition:e=>{let t=e.conditions||[];return t.length===0?[{type:`warning`,label:`条件分支`,value:`未配置`}]:t.map((e,t)=>{let n=Mt[e.operator]||e.operator;return{type:`text`,label:`分支 ${t+1}`,value:`${e.name||`未命名`} — ${e.field||`?`} ${n} ${e.value||`?`}`}})}},o=e=>{let t=a[e.type||`start`];return t?t(e.data):[]},s=()=>{let n=new Map;e.value.forEach(e=>n.set(e.id,e));let r=new Map,i=new Map;e.value.forEach(e=>{r.set(e.id,[]),i.set(e.id,0)}),t.value.forEach(e=>{r.get(e.source)?.push(e.target),i.set(e.target,(i.get(e.target)||0)+1)});let a=[];i.forEach((e,t)=>{e===0&&a.push(t)});let o=[],s=new Set;for(;a.length>0;){let e=a.shift();if(s.has(e))continue;s.add(e);let t=n.get(e);t&&o.push(t);let c=r.get(e)||[];for(let e of c){let t=(i.get(e)||1)-1;i.set(e,t),t<=0&&!s.has(e)&&a.push(e)}}return e.value.forEach(e=>{s.has(e.id)||o.push(e)}),o},c=()=>s().map((e,t)=>{let n=At[e.type||`start`]||At.start;return{order:t+1,node:e,nodeTypeLabel:n.label,icon:n.icon,colorClass:n.colorClass,details:o(e)}}),l=()=>{let n={totalNodes:e.value.length,approvalNodes:0,copyNodes:0,conditionNodes:0,totalEdges:t.value.length};return e.value.forEach(e=>{e.type===`approval`?n.approvalNodes++:e.type===`copy`?n.copyNodes++:e.type===`condition`&&n.conditionNodes++}),n};return{showPreview:n,previewSteps:r,previewStats:i,openPreview:()=>{r.value=c(),i.value=l(),n.value=!0},closePreview:()=>{n.value=!1}}}const Pt={class:`approval-workflow-container`},Ft={class:`floating-toolbar`},It={class:`add-menu-content`},Lt=[`onClick`],Rt={class:`menu-text`},zt={key:0,class:`validation-success`},Bt={class:`success-icon`},Vt={key:1,class:`validation-errors`},Ht={class:`error-summary`},Ut={class:`error-icon`},Wt={class:`error-list`},Gt={class:`error-header`},Kt={class:`error-number`},qt={class:`error-info`},Jt={class:`error-node`},Yt={class:`error-field`},Xt={class:`error-message`},Zt={class:`error-actions`},Qt={class:`validation-footer`},$t={class:`preview-stats`},en={class:`stat-item`},tn={class:`stat-value`},nn={class:`stat-item approval`},rn={class:`stat-value`},an={class:`stat-item copy`},on={class:`stat-value`},sn={class:`stat-item condition`},cn={class:`stat-value`},ln={class:`stat-item edge`},un={class:`stat-value`},dn={class:`preview-timeline`},fn={class:`step-connector`},pn={class:`step-dot`},mn={key:0,class:`step-line`},hn={class:`step-content`},gn={class:`step-header`},_n={class:`step-order`},vn={class:`step-type-badge`},yn={class:`step-title`},bn={key:0,class:`step-details`},xn={class:`detail-label`},Sn={class:`warning-text`},Cn={key:0,class:`preview-empty`},wn={class:`preview-footer`};var Tn=n(m({name:`C_WorkFlow`,__name:`index`,props:{users:{default:()=>[]},roles:{default:()=>[]},departments:{default:()=>[]},modelValue:{},readonly:{type:Boolean,default:!1},allowCycles:{type:Boolean,default:!0},theme:{default:`light`}},emits:[`update:modelValue`,`change`,`node-click`,`edge-click`,`save`,`validate-error`],setup(n,{expose:r,emit:i}){let s=n,m=i,h=e(),_=T(),{nodes:v,edges:x,showAddMenu:S,menuPosition:w,showNodeConfig:k,currentNode:M,nodeTypes:P,workflowStats:L,addNode:te,onNodeClick:ne,closeAddMenu:re,handleConfigSave:R,resetNodes:ie,getCurrentWorkflowData:z,fitView:se,deleteNode:ce}=Ct(s,m,_),{validationErrors:V,showValidationErrors:H,validateWorkflow:U,validateCurrentWorkflow:W,jumpToErrorNode:G,getFieldDisplayName:K,getErrorTypeText:le,resetValidation:ue}=kt(v,x,_,{allowCycles:()=>s.allowCycles,onShowNodeConfig:e=>{s.readonly||(M.value=e,k.value=!0)},onValidateError:e=>m(`validate-error`,e)}),{showPreview:q,previewSteps:J,previewStats:Y,openPreview:de,closePreview:X}=Nt(v,x),Z=()=>{if(s.readonly)return;let e=U();if(V.value=e,e.length>0){h.error(`工作流验证失败: ${e[0].message}`),H.value=!0,m(`validate-error`,e);return}m(`save`,z()),h.success(`工作流保存成功`)},fe=()=>{de()},pe=()=>{X(),Z()},me=()=>{s.readonly||(ie(),ue())};return r({validateWorkflow:U,getCurrentWorkflowData:z,saveWorkflow:Z,previewWorkflow:fe,deleteNode:ce,stats:L}),(e,r)=>(C(),u(`div`,Pt,[l(` 浮动工具栏 `),d(`div`,Ft,[p(O(N),{size:`small`,type:`primary`,disabled:n.readonly,onClick:Z},{icon:A(()=>[p(O(t),{name:`mdi:content-save`,size:16})]),default:A(()=>[r[7]||=f(` 保存 `,-1)]),_:1},8,[`disabled`]),p(O(N),{size:`small`,onClick:fe},{icon:A(()=>[p(O(t),{name:`mdi:eye`,size:16})]),default:A(()=>[r[8]||=f(` 预览 `,-1)]),_:1}),p(O(N),{size:`small`,onClick:O(W),title:`检查工作流配置是否正确`},{icon:A(()=>[p(O(t),{name:`mdi:check-circle`,size:16})]),default:A(()=>[r[9]||=f(` 验证流程 `,-1)]),_:1},8,[`onClick`]),r[10]||=d(`div`,{class:`toolbar-divider`},null,-1),p(O(N),{size:`small`,onClick:O(se),title:`适应窗口`},{icon:A(()=>[p(O(t),{name:`mdi:fit-to-screen`,size:16})]),_:1},8,[`onClick`]),p(O(N),{size:`small`,type:`error`,disabled:n.readonly,onClick:me,title:`清空画布`},{icon:A(()=>[p(O(t),{name:`mdi:delete-sweep`,size:16})]),_:1},8,[`disabled`])]),l(` Vue Flow 画布 `),p(O(B),{ref_key:`vueFlowRef`,ref:_,nodes:O(v),"onUpdate:nodes":r[0]||=e=>g(v)?v.value=e:null,edges:O(x),"onUpdate:edges":r[1]||=e=>g(x)?x.value=e:null,"node-types":O(P),class:`workflow-canvas`,"default-viewport":{zoom:1,x:0,y:0},"min-zoom":.5,"max-zoom":2,"fit-view-on-init":!0,"nodes-draggable":!n.readonly,"nodes-connectable":!n.readonly,"edges-updatable":!n.readonly,"delete-key-code":n.readonly?null:void 0,"elements-selectable":!0,onNodeClick:O(ne),onPaneClick:O(re)},null,8,[`nodes`,`edges`,`node-types`,`nodes-draggable`,`nodes-connectable`,`edges-updatable`,`delete-key-code`,`onNodeClick`,`onPaneClick`]),l(` 节点添加菜单 `),(C(),c(o,{to:`body`},[j(d(`div`,{class:`add-node-menu`,style:b({left:O(w).x+`px`,top:O(w).y+`px`})},[d(`div`,It,[(C(!0),u(a,null,E(O(oe),e=>(C(),u(`button`,{key:e.type,type:`button`,class:`add-menu-item`,onClick:t=>O(te)(e.type)},[d(`div`,{class:y([`menu-icon`,e.iconClass])},[p(O(t),{name:e.icon,size:16},null,8,[`name`])],2),d(`span`,Rt,D(e.label),1)],8,Lt))),128))])],4),[[ee,O(S)]])])),l(` 节点配置弹窗 - 拆分到独立组件 `),p(je,{show:O(k),"onUpdate:show":r[2]||=e=>g(k)?k.value=e:null,"current-node":O(M),users:n.users,departments:n.departments,onSave:O(R),onCancel:r[3]||=e=>k.value=!1},null,8,[`show`,`current-node`,`users`,`departments`,`onSave`]),l(` 验证错误日志抽屉 `),p(O(F),{show:O(H),"onUpdate:show":r[5]||=e=>g(H)?H.value=e:null,width:450,placement:`right`},{default:A(()=>[p(O(I),{title:`流程验证结果`,closable:``},{footer:A(()=>[d(`div`,Qt,[p(O(N),{onClick:r[4]||=e=>H.value=!1},{default:A(()=>[...r[16]||=[f(`关闭`,-1)]]),_:1}),p(O(N),{type:`primary`,onClick:O(W)},{icon:A(()=>[p(O(t),{name:`mdi:refresh`,size:16})]),default:A(()=>[r[17]||=f(` 重新验证 `,-1)]),_:1},8,[`onClick`])])]),default:A(()=>[O(V).length===0?(C(),u(`div`,zt,[d(`div`,Bt,[p(O(t),{name:`mdi:check-circle`,size:32,color:`#52c41a`})]),r[11]||=d(`h3`,null,`验证通过`,-1),r[12]||=d(`p`,null,`流程结构和节点配置验证通过;审批执行、权限与业务规则由后端校验。`,-1)])):(C(),u(`div`,Vt,[d(`div`,Ht,[d(`div`,Ut,[p(O(t),{name:`mdi:alert-circle`,size:24,color:`#ff4d4f`})]),d(`h3`,null,`发现 `+D(O(V).length)+` 个问题`,1),r[13]||=d(`p`,null,`请修复以下问题后重新验证:`,-1)]),d(`div`,Wt,[(C(!0),u(a,null,E(O(V),(e,n)=>(C(),u(`div`,{key:`${e.nodeId}-${e.field}-${n}`,class:`error-item`},[d(`div`,Gt,[d(`span`,Kt,D(n+1),1),d(`div`,qt,[d(`strong`,Jt,D(e.nodeName),1),d(`span`,Yt,D(O(K)(e.field)),1)]),d(`div`,{class:y([`error-type`,e.type])},D(O(le)(e.type)),3)]),d(`div`,Xt,D(e.message),1),d(`div`,Zt,[p(O(N),{size:`small`,type:`primary`,disabled:!e.nodeId,onClick:t=>O(G)(e.nodeId)},{icon:A(()=>[p(O(t),{name:`mdi:target`,size:16})]),default:A(()=>[r[14]||=f(` 定位节点 `,-1)]),_:1},8,[`disabled`,`onClick`])])]))),128))]),r[15]||=d(`div`,{class:`validation-tips`},[d(`h4`,null,`💡 常见问题解决方案:`),d(`ul`,null,[d(`li`,null,[d(`strong`,null,`审批人未设置:`),f(`点击审批节点,在弹窗中选择审批人员 `)]),d(`li`,null,[d(`strong`,null,`条件分支未配置:`),f(`点击条件节点,添加至少一个条件分支 `)]),d(`li`,null,[d(`strong`,null,`节点连接断开:`),f(` 检查节点之间的连线是否正确 `)])])],-1)]))]),_:1})]),_:1},8,[`show`]),l(` 流程预览抽屉 `),p(O(F),{show:O(q),"onUpdate:show":r[6]||=e=>g(q)?q.value=e:null,width:520,placement:`right`},{default:A(()=>[p(O(I),{title:`流程预览`,closable:``},{footer:A(()=>[d(`div`,wn,[p(O(N),{onClick:O(X)},{default:A(()=>[...r[24]||=[f(`关闭`,-1)]]),_:1},8,[`onClick`]),p(O(N),{type:`primary`,onClick:pe},{icon:A(()=>[p(O(t),{name:`mdi:content-save`,size:16})]),default:A(()=>[r[25]||=f(` 确认并保存 `,-1)]),_:1})])]),default:A(()=>[d(`div`,$t,[d(`div`,en,[d(`span`,tn,D(O(Y).totalNodes),1),r[18]||=d(`span`,{class:`stat-label`},`总节点`,-1)]),d(`div`,nn,[d(`span`,rn,D(O(Y).approvalNodes),1),r[19]||=d(`span`,{class:`stat-label`},`审批`,-1)]),d(`div`,an,[d(`span`,on,D(O(Y).copyNodes),1),r[20]||=d(`span`,{class:`stat-label`},`抄送`,-1)]),d(`div`,sn,[d(`span`,cn,D(O(Y).conditionNodes),1),r[21]||=d(`span`,{class:`stat-label`},`条件`,-1)]),d(`div`,ln,[d(`span`,un,D(O(Y).totalEdges),1),r[22]||=d(`span`,{class:`stat-label`},`连线`,-1)])]),d(`div`,dn,[(C(!0),u(a,null,E(O(J),(e,n)=>(C(),u(`div`,{key:e.node.id,class:y([`preview-step`,e.colorClass])},[l(` 时间线连接线 `),d(`div`,fn,[d(`div`,pn,[p(O(t),{name:e.icon,size:16},null,8,[`name`])]),n<O(J).length-1?(C(),u(`div`,mn)):l(`v-if`,!0)]),l(` 步骤内容 `),d(`div`,hn,[d(`div`,gn,[d(`span`,_n,`步骤 `+D(e.order),1),d(`span`,vn,D(e.nodeTypeLabel),1)]),d(`div`,yn,D(e.node.data.title),1),e.details.length>0?(C(),u(`div`,bn,[(C(!0),u(a,null,E(e.details,(e,n)=>(C(),u(`div`,{key:n,class:y([`step-detail-item`,{"is-warning":e.type===`warning`}])},[d(`span`,xn,D(e.label)+`:`,1),l(` 审批方式 badge `),e.type===`mode`?(C(),u(`span`,{key:0,class:y([`mode-badge`,e.modeKey])},D(e.value),3)):e.type===`users`?(C(),u(a,{key:1},[l(` 人员 tags `),(C(!0),u(a,null,E(e.users,e=>(C(),c(O(ae),{key:e.name,size:`small`,bordered:!1,round:``,class:`user-tag`},{icon:A(()=>[p(O(t),{name:`mdi:account`,size:12})]),default:A(()=>[f(` `+D(e.name),1)]),_:2},1024))),128))],64)):e.type===`warning`?(C(),u(a,{key:2},[l(` 警告文案 `),d(`span`,Sn,` ⚠️ `+D(e.value),1)],2112)):(C(),u(a,{key:3},[l(` 普通文本 `),d(`span`,null,D(e.value),1)],2112))],2))),128))])):l(`v-if`,!0)])],2))),128))]),O(J).length===0?(C(),u(`div`,Cn,[p(O(t),{name:`mdi:file-document-outline`,size:48,color:`#d1d5db`}),r[23]||=d(`p`,null,`暂无流程节点`,-1)])):l(`v-if`,!0)]),_:1})]),_:1},8,[`show`])]))}}),[[`__scopeId`,`data-v-f5022473`]]);export{Ct as i,Nt as n,kt as r,Tn as t};
@@ -117,8 +117,8 @@ declare const __VLS_export: vue.DefineComponent<CronProps, CronExpose, {}, {}, {
117
117
  "onValidation-change"?: ((result: CronValidation) => any) | undefined;
118
118
  }>, {
119
119
  disabled: boolean;
120
- showTemplates: boolean;
121
120
  showPreview: boolean;
121
+ showTemplates: boolean;
122
122
  showSecond: boolean;
123
123
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
124
124
  declare const _default: typeof __VLS_export;
@@ -117,8 +117,8 @@ declare const __VLS_export: vue.DefineComponent<CronProps, CronExpose, {}, {}, {
117
117
  "onValidation-change"?: ((result: CronValidation) => any) | undefined;
118
118
  }>, {
119
119
  disabled: boolean;
120
- showTemplates: boolean;
121
120
  showPreview: boolean;
121
+ showTemplates: boolean;
122
122
  showSecond: boolean;
123
123
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
124
124
  declare const _default: typeof __VLS_export;
@@ -228,12 +228,12 @@ declare const __VLS_export: vue.DefineComponent<NotificationCenterProps, Notific
228
228
  onNavigate?: ((url: string) => any) | undefined;
229
229
  onViewAll?: (() => any) | undefined;
230
230
  }>, {
231
+ storageKey: string;
231
232
  autoStart: boolean;
232
233
  desktopNotification: boolean;
233
234
  maxBadgeCount: number;
234
235
  pollingInterval: number;
235
236
  pageSize: number;
236
- storageKey: string;
237
237
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
238
238
  declare const _default: typeof __VLS_export;
239
239
  //#endregion
@@ -228,12 +228,12 @@ declare const __VLS_export: vue.DefineComponent<NotificationCenterProps, Notific
228
228
  onNavigate?: ((url: string) => any) | undefined;
229
229
  onViewAll?: (() => any) | undefined;
230
230
  }>, {
231
+ storageKey: string;
231
232
  autoStart: boolean;
232
233
  desktopNotification: boolean;
233
234
  maxBadgeCount: number;
234
235
  pollingInterval: number;
235
236
  pageSize: number;
236
- storageKey: string;
237
237
  }, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
238
238
  declare const _default: typeof __VLS_export;
239
239
  //#endregion
@@ -197,31 +197,31 @@ type __VLS_Slots = {} & {
197
197
  };
198
198
  declare const __VLS_base: vue.DefineComponent<UploadProps, UploadExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
199
199
  change: (fileList: UploadFileItem[]) => any;
200
+ success: (file: UploadFileItem, response: unknown) => any;
200
201
  error: (file: UploadFileItem, error: Error) => any;
201
202
  progress: (file: UploadFileItem, percent: number) => any;
202
- success: (file: UploadFileItem, response: unknown) => any;
203
203
  remove: (file: UploadFileItem) => any;
204
204
  finish: (fileList: UploadFileItem[]) => any;
205
205
  exceed: (files: File[], fileList: UploadFileItem[]) => any;
206
206
  }, string, vue.PublicProps, Readonly<UploadProps> & Readonly<{
207
207
  onChange?: ((fileList: UploadFileItem[]) => any) | undefined;
208
+ onSuccess?: ((file: UploadFileItem, response: unknown) => any) | undefined;
208
209
  onError?: ((file: UploadFileItem, error: Error) => any) | undefined;
209
210
  onProgress?: ((file: UploadFileItem, percent: number) => any) | undefined;
210
- onSuccess?: ((file: UploadFileItem, response: unknown) => any) | undefined;
211
211
  onRemove?: ((file: UploadFileItem) => any) | undefined;
212
212
  onFinish?: ((fileList: UploadFileItem[]) => any) | undefined;
213
213
  onExceed?: ((files: File[], fileList: UploadFileItem[]) => any) | undefined;
214
214
  }>, {
215
- data: Record<string, unknown>;
216
- maxSize: number;
217
215
  disabled: boolean;
216
+ draggable: boolean;
218
217
  action: string;
219
- headers: Record<string, string>;
220
218
  multiple: boolean;
219
+ data: Record<string, unknown>;
220
+ headers: Record<string, string>;
221
221
  directory: boolean;
222
222
  accept: string;
223
+ maxSize: number;
223
224
  maxCount: number;
224
- draggable: boolean;
225
225
  pasteable: boolean;
226
226
  chunked: boolean;
227
227
  chunkSize: number;
@@ -197,31 +197,31 @@ type __VLS_Slots = {} & {
197
197
  };
198
198
  declare const __VLS_base: vue.DefineComponent<UploadProps, UploadExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {
199
199
  change: (fileList: UploadFileItem[]) => any;
200
+ success: (file: UploadFileItem, response: unknown) => any;
200
201
  error: (file: UploadFileItem, error: Error) => any;
201
202
  progress: (file: UploadFileItem, percent: number) => any;
202
- success: (file: UploadFileItem, response: unknown) => any;
203
203
  remove: (file: UploadFileItem) => any;
204
204
  finish: (fileList: UploadFileItem[]) => any;
205
205
  exceed: (files: File[], fileList: UploadFileItem[]) => any;
206
206
  }, string, vue.PublicProps, Readonly<UploadProps> & Readonly<{
207
207
  onChange?: ((fileList: UploadFileItem[]) => any) | undefined;
208
+ onSuccess?: ((file: UploadFileItem, response: unknown) => any) | undefined;
208
209
  onError?: ((file: UploadFileItem, error: Error) => any) | undefined;
209
210
  onProgress?: ((file: UploadFileItem, percent: number) => any) | undefined;
210
- onSuccess?: ((file: UploadFileItem, response: unknown) => any) | undefined;
211
211
  onRemove?: ((file: UploadFileItem) => any) | undefined;
212
212
  onFinish?: ((fileList: UploadFileItem[]) => any) | undefined;
213
213
  onExceed?: ((files: File[], fileList: UploadFileItem[]) => any) | undefined;
214
214
  }>, {
215
- data: Record<string, unknown>;
216
- maxSize: number;
217
215
  disabled: boolean;
216
+ draggable: boolean;
218
217
  action: string;
219
- headers: Record<string, string>;
220
218
  multiple: boolean;
219
+ data: Record<string, unknown>;
220
+ headers: Record<string, string>;
221
221
  directory: boolean;
222
222
  accept: string;
223
+ maxSize: number;
223
224
  maxCount: number;
224
- draggable: boolean;
225
225
  pasteable: boolean;
226
226
  chunked: boolean;
227
227
  chunkSize: number;
@@ -259,8 +259,8 @@ type PlayerInstance = InstanceType<typeof xgplayer.default>;
259
259
  //#region src/components/C_VideoPlayer/index.vue.d.ts
260
260
  declare const __VLS_export: vue.DefineComponent<VideoPlayerProps, VideoPlayerExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {} & {
261
261
  error: (error: Error) => any;
262
- ready: () => any;
263
262
  ended: () => any;
263
+ ready: () => any;
264
264
  stateChange: (state: PlayerState) => any;
265
265
  qualityChange: (quality: QualityLevel) => any;
266
266
  rateChange: (rate: number) => any;
@@ -272,8 +272,8 @@ declare const __VLS_export: vue.DefineComponent<VideoPlayerProps, VideoPlayerExp
272
272
  timeUpdate: (currentTime: number, duration: number) => any;
273
273
  }, string, vue.PublicProps, Readonly<VideoPlayerProps> & Readonly<{
274
274
  onError?: ((error: Error) => any) | undefined;
275
- onReady?: (() => any) | undefined;
276
275
  onEnded?: (() => any) | undefined;
276
+ onReady?: (() => any) | undefined;
277
277
  onStateChange?: ((state: PlayerState) => any) | undefined;
278
278
  onQualityChange?: ((quality: QualityLevel) => any) | undefined;
279
279
  onRateChange?: ((rate: number) => any) | undefined;
@@ -259,8 +259,8 @@ type PlayerInstance = InstanceType<typeof xgplayer.default>;
259
259
  //#region src/components/C_VideoPlayer/index.vue.d.ts
260
260
  declare const __VLS_export: vue.DefineComponent<VideoPlayerProps, VideoPlayerExpose, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {} & {
261
261
  error: (error: Error) => any;
262
- ready: () => any;
263
262
  ended: () => any;
263
+ ready: () => any;
264
264
  stateChange: (state: PlayerState) => any;
265
265
  qualityChange: (quality: QualityLevel) => any;
266
266
  rateChange: (rate: number) => any;
@@ -272,8 +272,8 @@ declare const __VLS_export: vue.DefineComponent<VideoPlayerProps, VideoPlayerExp
272
272
  timeUpdate: (currentTime: number, duration: number) => any;
273
273
  }, string, vue.PublicProps, Readonly<VideoPlayerProps> & Readonly<{
274
274
  onError?: ((error: Error) => any) | undefined;
275
- onReady?: (() => any) | undefined;
276
275
  onEnded?: (() => any) | undefined;
276
+ onReady?: (() => any) | undefined;
277
277
  onStateChange?: ((state: PlayerState) => any) | undefined;
278
278
  onQualityChange?: ((quality: QualityLevel) => any) | undefined;
279
279
  onRateChange?: ((rate: number) => any) | undefined;
package/dist/data.d.cts CHANGED
@@ -65,28 +65,28 @@ type __VLS_Slots = {} & { [K in NonNullable<typeof __VLS_37>]?: (props: typeof _
65
65
  declare const __VLS_base: vue.DefineComponent<CTabsProps, {
66
66
  activeValue: vue.WritableComputedRef<TabsValue | null, TabsValue | null>;
67
67
  }, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {} & {
68
+ close: (value: TabsValue) => any;
68
69
  "update:modelValue": (value: TabsValue) => any;
69
70
  change: (value: TabsValue, item: TabsItem | undefined) => any;
70
71
  add: () => any;
71
- close: (value: TabsValue) => any;
72
72
  }, string, vue.PublicProps, Readonly<CTabsProps> & Readonly<{
73
+ onClose?: ((value: TabsValue) => any) | undefined;
73
74
  "onUpdate:modelValue"?: ((value: TabsValue) => any) | undefined;
74
75
  onChange?: ((value: TabsValue, item: TabsItem | undefined) => any) | undefined;
75
76
  onAdd?: (() => any) | undefined;
76
- onClose?: ((value: TabsValue) => any) | undefined;
77
77
  }>, {
78
- modelValue: TabsValue | null;
79
- type: TabsType;
78
+ closable: boolean;
80
79
  size: TabsSize;
80
+ type: TabsType;
81
+ modelValue: TabsValue | null;
82
+ displayDirective: TabsDisplayDirective;
81
83
  defaultValue: TabsValue | null;
82
- items: readonly TabsItem[];
83
84
  placement: TabsPlacement;
84
- justifyContent: TabsJustifyContent;
85
+ items: readonly TabsItem[];
85
86
  animated: boolean;
86
- closable: boolean;
87
+ justifyContent: TabsJustifyContent;
87
88
  addable: boolean;
88
89
  tabsOnly: boolean;
89
- displayDirective: TabsDisplayDirective;
90
90
  paneClass: string;
91
91
  paneStyle: string | vue.CSSProperties;
92
92
  beforeChange: (target: TabsValue, current: TabsValue | null) => boolean | Promise<boolean>;