CzRger 1 天之前
父节点
当前提交
7c2bbeaded

+ 3 - 0
src/api/modules/workflow/meta.ts

@@ -16,3 +16,6 @@ export const workflowMetaDel = (id) =>
 // 工作流-详情
 export const workflowMetaDetail = (id) =>
   get(`/workflow/meta/${id}`, {}, {}, proxy)
+// 工作流-发布
+export const workflowPublish = (id, params) =>
+  post(`/workflow/publish/${id}`, params, {}, proxy)

+ 16 - 1
src/views/manage/app/workflow/index.vue

@@ -25,7 +25,7 @@
         <div class="text-[#576275]" v-if="state.autoSaveTimestamp">
           自动保存{{ state.autoSaveTimestamp }}
         </div>
-        <!--        <CzrButton type="primary" title="发布" />-->
+        <CzrButton type="primary" title="发布" @click="onPublish" />
       </div>
       <div class="mt-4 flex-1 rounded-sm bg-[var(--czr-main-color)]/5 shadow">
         <workflowGraph
@@ -39,6 +39,10 @@
       :transfer="state.detailCom.transfer"
       @refresh="initDetail"
     />
+    <publishCom
+      v-model:show="state.publishCom.show"
+      :transfer="state.publishCom.transfer"
+    />
   </div>
 </template>
 
@@ -50,6 +54,7 @@ import { ElLoading, ElMessage } from 'element-plus'
 import { YMDHms } from '@/utils/czr-util'
 import workflowGraph from '@/views/workflow/index.vue'
 import detailCom from '@/views/workflow/detail/index.vue'
+import publishCom from '@/views/workflow/detail/publish.vue'
 import { useRoute } from 'vue-router'
 import { workflowMetaDetail } from '@/api/modules/workflow/meta'
 
@@ -63,6 +68,10 @@ const state: any = reactive({
     show: false,
     transfer: {},
   },
+  publishCom: {
+    show: false,
+    transfer: {},
+  },
 })
 
 const onEdit = () => {
@@ -72,6 +81,12 @@ const onEdit = () => {
   }
   state.detailCom.show = true
 }
+const onPublish = () => {
+  state.publishCom.transfer = {
+    id: state.ID,
+  }
+  state.publishCom.show = true
+}
 onMounted(() => {
   initDetail()
 })

+ 13 - 10
src/views/workflow/chart/context-menu-tool.tsx

@@ -2,6 +2,7 @@ import { ToolsView } from '@antv/x6'
 import { createApp } from 'vue'
 import contextMenuTool from './context-menu-tool.vue'
 import { domRootHasAttr } from '@/utils/czr-util'
+import { NodeType } from '@/views/workflow/types'
 
 let app: any = null
 let timer: any = null
@@ -26,17 +27,19 @@ class ContextMenuTool extends ToolsView.ToolItem {
 
     if (visible && pos) {
       const { data, delFlag }: any = this.options
-      app = createApp(contextMenuTool, {
-        data,
-        delFlag,
-        onClose: this.onMouseDown,
-      })
-      // 减去本身元素的宽高
-      if (dom) {
-        dom.style = `left: ${pos.x}px;top: ${pos.y}px;position: absolute;z-index: 100;`
+      if (data.data.type !== NodeType.Start) {
+        app = createApp(contextMenuTool, {
+          data,
+          delFlag,
+          onClose: this.onMouseDown,
+        })
+        // 减去本身元素的宽高
+        if (dom) {
+          dom.style = `left: ${pos.x}px;top: ${pos.y}px;position: absolute;z-index: 100;`
+        }
+        app.mount(`#${ID}`)
+        document.addEventListener('mousedown', this.onMouseDown)
       }
-      app.mount(`#${ID}`)
-      document.addEventListener('mousedown', this.onMouseDown)
     }
   }
 

+ 2 - 2
src/views/workflow/chart/node-add.vue

@@ -2,7 +2,7 @@
   <div class="flex flex-col gap-1">
     <template v-for="(value, key) in nodeSources">
       <div
-        v-if="value.isAdd"
+        v-if="key !== NodeType.Start"
         class="__hover-bg flex items-center rounded-sm px-1 py-0.5 text-xs"
         @click="$emit('onAddNode', { type: key, e: $event })"
       >
@@ -14,7 +14,7 @@
 </template>
 
 <script setup lang="ts">
-import { getCurrentInstance, reactive, ref } from 'vue'
+import { getCurrentInstance, reactive } from 'vue'
 import { NodeType, NodeTypeObj } from '@/views/workflow/types'
 import { nodeSources } from '@/views/workflow/config'
 

+ 0 - 6
src/views/workflow/config.ts

@@ -49,7 +49,6 @@ export const nodeSources = {
           ...startNodeDefault.defaultValue(),
         },
       },
-    isAdd: false,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/start/node/index.vue'),
     ),
@@ -69,7 +68,6 @@ export const nodeSources = {
           ...answerNodeDefault.defaultValue(),
         },
       },
-    isAdd: true,
     icon: answerImg,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/answer/node/index.vue'),
@@ -90,7 +88,6 @@ export const nodeSources = {
           ...llmNodeDefault.defaultValue(),
         },
       },
-    isAdd: true,
     icon: llmImg,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/llm/node/index.vue'),
@@ -111,7 +108,6 @@ export const nodeSources = {
           ...knowledgeNodeDefault.defaultValue(),
         },
       },
-    isAdd: true,
     icon: knowledgeImg,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/knowledge/node/index.vue'),
@@ -141,7 +137,6 @@ export const nodeSources = {
           ],
         },
       },
-    isAdd: true,
     icon: ifElseImg,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/if-else/node/index.vue'),
@@ -170,7 +165,6 @@ export const nodeSources = {
           ],
         },
       },
-    isAdd: true,
     icon: switchImg,
     nodeCom: defineAsyncComponent(
       () => import('@/views/workflow/instance/switch/node/index.vue'),

+ 105 - 0
src/views/workflow/detail/publish.vue

@@ -0,0 +1,105 @@
+<template>
+  <CzrDialog
+    :show="show"
+    :title="titleCpt"
+    @onClose="$emit('update:show', false)"
+    @onSubmit="onSubmit"
+    width="42.5rem"
+    height="auto"
+    :loading="state.loading"
+  >
+    <div class="bm-form">
+      <CzrForm ref="ref_form" :form-view="isViewCpt" layout="y">
+        <CzrFormColumn
+          label="版本描述"
+          :span="24"
+          v-model:param="state.form.versionDescription"
+          type="textarea"
+          :rows="4"
+        />
+      </CzrForm>
+    </div>
+  </CzrDialog>
+</template>
+
+<script setup lang="ts">
+import {
+  computed,
+  getCurrentInstance,
+  nextTick,
+  reactive,
+  ref,
+  watch,
+} from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { useAppStore, useDialogStore, useDictionaryStore } from '@/stores'
+import {
+  workflowMetaAdd,
+  workflowMetaDetail,
+  workflowMetaEdit,
+  workflowPublish,
+} from '@/api/modules/workflow/meta'
+import { workflowDraftSave } from '@/api/modules/workflow/chart'
+
+const AppStore = useAppStore()
+const DictionaryStore = useDictionaryStore()
+const DialogStore = useDialogStore()
+const emit = defineEmits(['update:show', 'refresh'])
+const { proxy } = getCurrentInstance()
+const props = defineProps({
+  show: { default: false },
+  transfer: <any>{},
+})
+const state: any = reactive({
+  loading: false,
+  form: {},
+})
+const ref_form = ref()
+const titleCpt = computed(() => {
+  let t = '发布工作流'
+  return t
+})
+const isViewCpt = computed(() => props.transfer?.mode === 'view')
+watch(
+  () => props.show,
+  (n) => {
+    if (n) {
+      state.form = {}
+      nextTick(() => {
+        ref_form.value.reset()
+      })
+    }
+  },
+)
+const onSubmit = () => {
+  ref_form.value
+    .submit()
+    .then(() => {
+      DialogStore.confirm({
+        content: `请确认是否提交?`,
+        onSubmit: () => {
+          state.loading = true
+          workflowPublish(props.transfer.id, state.form)
+            .then(() => {
+              ElMessage.success(`${titleCpt.value}成功!`)
+              emit('update:show', false)
+              emit('refresh')
+            })
+            .catch(() => {})
+            .finally(() => {
+              state.loading = false
+            })
+        },
+      })
+    })
+    .catch((e) => {
+      ElMessage({
+        message: e[0].message,
+        grouping: true,
+        type: 'warning',
+      })
+    })
+}
+</script>
+
+<style lang="scss" scoped></style>