diff --git a/src/api/sys/WFDelegate.ts b/src/api/sys/WFDelegate.ts new file mode 100644 index 0000000..6111cc5 --- /dev/null +++ b/src/api/sys/WFDelegate.ts @@ -0,0 +1,16 @@ +// WFDelegate 流程模版基本信息 +import { defHttp } from '@/utils/http/axios'; +import {DetailParams} from './model/wfSchemeInfoModel' + + enum Api { + // 创建流程 + LoadMyUserList = '/api/WFDelegate/LoadMyUserList', + +} + +/** + * @description: getLoadMyUserList + */ + export function getLoadMyUserList(params?: DetailParams) { + return defHttp.get({ url: Api.LoadMyUserList, params }); +} \ No newline at end of file diff --git a/src/api/sys/WFProcess.ts b/src/api/sys/WFProcess.ts new file mode 100644 index 0000000..82dc14b --- /dev/null +++ b/src/api/sys/WFProcess.ts @@ -0,0 +1,34 @@ + +// WFProcess 流程模版基本信息 +import { defHttp } from '@/utils/http/axios'; +import {CreateParams} from './model/WFProcessModel' + + enum Api { + // 创建流程 + Create = '/api/WFProcess/Create', + SaveDraft='/api/WFProcess/SaveDraft' + +} + +/** + * @description: 创建流程 + */ +export function create( params?:CreateParams) { + return defHttp.post( + { + url: Api.Create, + params, + }, + ); +} +/** + * @description: 保存草稿 + */ + export function saveDraft( params?:CreateParams) { + return defHttp.post( + { + url: Api.SaveDraft, + params, + }, + ); +} \ No newline at end of file diff --git a/src/api/sys/WFSchemeInfo.ts b/src/api/sys/WFSchemeInfo.ts index 882995d..5b56b7e 100644 --- a/src/api/sys/WFSchemeInfo.ts +++ b/src/api/sys/WFSchemeInfo.ts @@ -14,6 +14,8 @@ import {SchemeListParams,GetSchemeModel,AddParams, // 流程模板详细信息 LoadHistoryPage= '/api/WFScheme/LoadPage', UpdateScheme='/api/WFSchemeInfo/UpdateScheme', + // 获取自定义流程列表(流程发起页) + GetInfoList='/api/WFSchemeInfo/GetInfoList' } /** @@ -59,3 +61,10 @@ export function updateScheme(params:SchemeParams){ return defHttp.post({ url: Api.UpdateScheme + "?id=" + params.id +"&schemeId="+params.schemeId}); } +/** + * @description: getInfoList 获取流程自定义列表 + */ + export function getInfoList(params) { + return defHttp.get({ url: Api.GetInfoList, params }); +} + diff --git a/src/api/sys/model/WFProcessModel.ts b/src/api/sys/model/WFProcessModel.ts new file mode 100644 index 0000000..144629d --- /dev/null +++ b/src/api/sys/model/WFProcessModel.ts @@ -0,0 +1,21 @@ +/** + * @description: 创建流程参数 + */ + export interface CreateParams { + processId: string, + schemeCode: string, + title: string, + userId: string, + toUserId: string, + nextUsers: { + additionalProp1: string, + additionalProp2: string, + additionalProp3: string + }, + des: string, + code: string, + name: string, + stampImg: string, + stampPassWord: string, + nextId: string +} \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/PropertiesPanel.vue b/src/components/ProcessDesigner/package/penal/PropertiesPanel.vue index b9729f0..a48cbcd 100644 --- a/src/components/ProcessDesigner/package/penal/PropertiesPanel.vue +++ b/src/components/ProcessDesigner/package/penal/PropertiesPanel.vue @@ -2,22 +2,39 @@
+ + + + + + + + + + + + + @@ -55,10 +72,12 @@ import userTaskOption from './userTask/index.vue' // 结束节点 import endEventOption from './endEvent/index.vue' - // 网关和 - import gatewayAndOption from './config/gatewayAnd.vue' + // 并行网关 + import parallelGatewayOption from './parallelGateway/index.vue' // 排他网关 import exclusiveGatewayOption from './exclusiveGateway/index.vue' + // 包容网关 + import inclusiveGatewayOption from './inclusiveGateway/index.vue' // 网关Xor import gatewayXorOption from './config/gatewayXor.vue' // 脚本任务 @@ -96,13 +115,15 @@ const taskRef = ref < any > () const endRef = ref < any > () const subprocessRef = ref < any > () - const exclusiveGatewayRef = ref < any > () + const exclusiveGatewayRef = ref < any > () + const parallelGatewayRef = ref < any > () + const inclusiveGatewayRef = ref < any > () const configActiveName = ref('2') const data = reactive({ currentWfNode: undefined, wfNodeName: "", - wfData:[], - flowRef:{} + wfData: [], + flowRef: {} }) watch( () => props.element, @@ -153,6 +174,20 @@ type: newVal.type } break; + case 'ParallelGateway': + data.wfNodeName = "并行网关" + data.currentWfNode = { + id: newVal.id, + type: newVal.type + } + break; + case 'InclusiveGateway': + data.wfNodeName = "包含网关" + data.currentWfNode = { + id: newVal.id, + type: newVal.type + } + break; case 'SequenceFlow': data.wfNodeName = "线条" data.currentWfNode = { @@ -160,9 +195,9 @@ type: newVal.type } // 获取线条两头的节点id - data.flowRef={ - from:newVal.businessObject.sourceRef.id, - to:newVal.businessObject.targetRef.id, + data.flowRef = { + from: newVal.businessObject.sourceRef.id, + to: newVal.businessObject.targetRef.id, } // 获取排他网关和审核节点的数据,为选择流转条件使用 getWfData() @@ -279,8 +314,8 @@ } } }); - data.wfData = wfData - + data.wfData = wfData + } async function validatePanel() { let res = await shcemeinfoRef.value.validateForm(); @@ -320,6 +355,16 @@ if (gatewayInclusiveFrom != undefined) { wfData.push(gatewayInclusiveFrom) } + // 并排网关 + let parallelGatewayFrom = await !(parallelGatewayRef.value) ? {} : parallelGatewayRef.value.getForm(); + if (parallelGatewayFrom != undefined) { + wfData.push(parallelGatewayFrom) + } + // 包含网关 + let inclusiveGatewayFrom = await !(inclusiveGatewayRef.value) ? {} : inclusiveGatewayRef.value.getForm(); + if (inclusiveGatewayFrom != undefined) { + wfData.push(inclusiveGatewayFrom) + } // 3.流程节点信息 wfData.forEach(node => { if (node.type == 'myline' && !node.isInit) { diff --git a/src/components/ProcessDesigner/package/penal/config/gatewayAnd.vue b/src/components/ProcessDesigner/package/penal/config/gatewayAnd.vue deleted file mode 100644 index 80a70ed..0000000 --- a/src/components/ProcessDesigner/package/penal/config/gatewayAnd.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/exclusiveGateway/index.vue b/src/components/ProcessDesigner/package/penal/exclusiveGateway/index.vue index e7702e6..a87f402 100644 --- a/src/components/ProcessDesigner/package/penal/exclusiveGateway/index.vue +++ b/src/components/ProcessDesigner/package/penal/exclusiveGateway/index.vue @@ -41,6 +41,7 @@ \ No newline at end of file + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/inclusiveGateway/index.vue b/src/components/ProcessDesigner/package/penal/inclusiveGateway/index.vue new file mode 100644 index 0000000..618042a --- /dev/null +++ b/src/components/ProcessDesigner/package/penal/inclusiveGateway/index.vue @@ -0,0 +1,178 @@ + + + + + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/parallelGateway/index.vue b/src/components/ProcessDesigner/package/penal/parallelGateway/index.vue new file mode 100644 index 0000000..355b56e --- /dev/null +++ b/src/components/ProcessDesigner/package/penal/parallelGateway/index.vue @@ -0,0 +1,94 @@ + + + + + + \ No newline at end of file diff --git a/src/components/ProcessDesigner/package/penal/startEvent/index.vue b/src/components/ProcessDesigner/package/penal/startEvent/index.vue index 94fedaf..26c5dbd 100644 --- a/src/components/ProcessDesigner/package/penal/startEvent/index.vue +++ b/src/components/ProcessDesigner/package/penal/startEvent/index.vue @@ -218,6 +218,14 @@ node.value.authFields = node.value.authFields.filter(item => item.field !== key); } function getForm() { + if(node.value.messageType != ""){ + if(node.value.messageType.length > 1){ + node.value.messageType = node.value.messageType.join(',') + + }else{ + node.value.messageType = node.value.messageType[0] + } + } return node.value } defineExpose({ diff --git a/src/components/ProcessDesigner/package/penal/userTask/index.vue b/src/components/ProcessDesigner/package/penal/userTask/index.vue index d9e5040..13208cc 100644 --- a/src/components/ProcessDesigner/package/penal/userTask/index.vue +++ b/src/components/ProcessDesigner/package/penal/userTask/index.vue @@ -334,7 +334,6 @@ let wfData = scheme.wfData wfData.forEach(element => { if (element.id == node.value.id) { - console.log(node) node.value = element } }); @@ -420,6 +419,11 @@ } function getForm() { if (node.value.id != '') { + if (node.value.overtimeMessageType.length > 1) { + node.value.overtimeMessageType = node.value.overtimeMessageType.join(',') + } else { + node.value.overtimeMessageType = node.value.overtimeMessageType[0] + } return node.value } } diff --git a/src/components/ProcessViewer/index.vue b/src/components/ProcessViewer/index.vue new file mode 100644 index 0000000..e7fe146 --- /dev/null +++ b/src/components/ProcessViewer/index.vue @@ -0,0 +1,102 @@ + + + + \ No newline at end of file diff --git a/src/locales/lang/zh-CN/routes/demo.json b/src/locales/lang/zh-CN/routes/demo.json index e6ef77e..6421486 100644 --- a/src/locales/lang/zh-CN/routes/demo.json +++ b/src/locales/lang/zh-CN/routes/demo.json @@ -178,6 +178,7 @@ "vxeTable": "VxeTable" }, "workflow":{ - "scheme_preview":"流程模板设计" + "scheme_preview":"流程模板设计", + "create_preview":"流程发起" } } diff --git a/src/router/routes/modules/dashboard.ts b/src/router/routes/modules/dashboard.ts index 3dc2716..febd17e 100644 --- a/src/router/routes/modules/dashboard.ts +++ b/src/router/routes/modules/dashboard.ts @@ -25,7 +25,7 @@ const dashboard: AppRouteModule = { }, { path: 'scheme_preview/:id', - name: 'AccountDetail', + name: 'SchemePreview', meta: { hideMenu: true, title: t('routes.demo.workflow.scheme_preview'), @@ -35,6 +35,18 @@ const dashboard: AppRouteModule = { }, component: () => import('@/views/demo/workflow/scheme/preview.vue'), }, + { + path: 'create_preview/:id', + name: 'CreatePreview', + meta: { + hideMenu: true, + title: t('routes.demo.workflow.create_preview'), + ignoreKeepAlive: true, + showMenu: false, + currentActiveMenu: '/workflow/create', + }, + component: () => import('@/views/demo/workflow/create/preview.vue'), + }, ], }; diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts index 548bcf3..934b9f0 100644 --- a/src/utils/uuid.ts +++ b/src/utils/uuid.ts @@ -2,7 +2,21 @@ const hexList: string[] = []; for (let i = 0; i <= 15; i++) { hexList[i] = i.toString(16); } - +export function buildGUID(): string { + let guid = ''; + for (let i = 1; i <= 36; i++) { + if (i === 9 || i === 14 || i === 19 || i === 24) { + guid += '-'; + } else if (i === 15) { + guid += 4; + } else if (i === 20) { + guid += hexList[(Math.random() * 4) | 8]; + } else { + guid += hexList[(Math.random() * 16) | 0]; + } + } + return guid; +} export function buildUUID(): string { let uuid = ''; for (let i = 1; i <= 36; i++) { diff --git a/src/views/demo/workflow/create/index.vue b/src/views/demo/workflow/create/index.vue index 503810e..2ebde91 100644 --- a/src/views/demo/workflow/create/index.vue +++ b/src/views/demo/workflow/create/index.vue @@ -1,3 +1,105 @@ \ No newline at end of file + +
+
{{item.category}}【{{item.data.length}}】
+ + + + + +
+
+ + + \ No newline at end of file diff --git a/src/views/demo/workflow/create/preview.vue b/src/views/demo/workflow/create/preview.vue new file mode 100644 index 0000000..65c998c --- /dev/null +++ b/src/views/demo/workflow/create/preview.vue @@ -0,0 +1,161 @@ + + + + \ No newline at end of file diff --git a/src/views/demo/workflow/scheme/HistoryDrawer.vue b/src/views/demo/workflow/scheme/HistoryDrawer.vue index e516d7e..443550e 100644 --- a/src/views/demo/workflow/scheme/HistoryDrawer.vue +++ b/src/views/demo/workflow/scheme/HistoryDrawer.vue @@ -18,7 +18,7 @@