Skip to content

Commit bad11ff

Browse files
committed
feat: 子流程-多实例
1 parent 2ff1bcc commit bad11ff

File tree

3 files changed

+148
-7
lines changed

3 files changed

+148
-7
lines changed

src/components/SimpleProcessDesignerV2/src/NodeHandler.vue

+3
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,9 @@ const addNode = (type: number) => {
306306
},
307307
timeoutSetting: {
308308
enable: false
309+
},
310+
multiInstanceSetting: {
311+
enable: false
309312
}
310313
}
311314
}

src/components/SimpleProcessDesignerV2/src/consts.ts

+27
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,7 @@ export type ChildProcessSetting = {
821821
skipStartUserNode: boolean,
822822
startUserSetting: StartUserSetting,
823823
timeoutSetting: TimeoutSetting,
824+
multiInstanceSetting: MultiInstanceSetting,
824825
}
825826
export type IOParameter = {
826827
source: string
@@ -836,6 +837,13 @@ export type TimeoutSetting = {
836837
type?: DelayTypeEnum,
837838
timeExpression?: string,
838839
}
840+
export type MultiInstanceSetting = {
841+
enable: boolean,
842+
sequential?: boolean,
843+
completeRatio?: number,
844+
sourceType?: ChildProcessMultiInstanceSourceTypeEnum,
845+
source?: string,
846+
}
839847
export enum ChildProcessStartUserTypeEnum {
840848
/**
841849
* 同主流程发起人
@@ -869,3 +877,22 @@ export const CHILD_PROCESS_START_USER_EMPTY_TYPE = [
869877
{ label: '子流程管理员', value: ChildProcessStartUserEmptyTypeEnum.CHILD_PROCESS_ADMIN },
870878
{ label: '主流程管理员', value: ChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_ADMIN }
871879
]
880+
export enum ChildProcessMultiInstanceSourceTypeEnum {
881+
/**
882+
* 固定数量
883+
*/
884+
FIXED_QUANTITY = 1,
885+
/**
886+
* 数字表单
887+
*/
888+
DIGITAL_FORM = 2,
889+
/**
890+
* 多项表单
891+
*/
892+
MULTI_FORM = 3,
893+
}
894+
export const CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE = [
895+
{ label: '固定数量', value: ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY },
896+
{ label: '数字表单', value: ChildProcessMultiInstanceSourceTypeEnum.DIGITAL_FORM },
897+
{ label: '多项表单', value: ChildProcessMultiInstanceSourceTypeEnum.MULTI_FORM }
898+
]

src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue

+118-7
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,10 @@
164164
<el-radio
165165
v-for="item in CHILD_PROCESS_START_USER_TYPE"
166166
:key="item.value"
167-
:value="item.value">
168-
{{ item.label }}</el-radio>
167+
:value="item.value"
168+
>
169+
{{ item.label }}</el-radio
170+
>
169171
</el-radio-group>
170172
</el-form-item>
171173
<el-form-item
@@ -177,8 +179,10 @@
177179
<el-radio
178180
v-for="item in CHILD_PROCESS_START_USER_EMPTY_TYPE"
179181
:key="item.value"
180-
:value="item.value">
181-
{{ item.label }}</el-radio>
182+
:value="item.value"
183+
>
184+
{{ item.label }}</el-radio
185+
>
182186
</el-radio-group>
183187
</el-form-item>
184188
<el-form-item
@@ -249,6 +253,68 @@
249253
<el-text>后进入下一节点</el-text>
250254
</el-form-item>
251255
</div>
256+
257+
<el-divider content-position="left">多实例设置</el-divider>
258+
<el-form-item label="启用开关" prop="multiInstanceEnable">
259+
<el-switch
260+
v-model="configForm.multiInstanceEnable"
261+
active-text="开启"
262+
inactive-text="关闭"
263+
/>
264+
</el-form-item>
265+
<div v-if="configForm.multiInstanceEnable">
266+
<el-form-item prop="sequential">
267+
<el-switch
268+
v-model="configForm.sequential"
269+
active-text="串行"
270+
inactive-text="并行"
271+
/>
272+
</el-form-item>
273+
<el-form-item prop="completeRatio">
274+
<el-text>完成比例(%)</el-text>
275+
<el-input-number
276+
class="ml-10px"
277+
v-model="configForm.completeRatio"
278+
:min="10"
279+
:max="100"
280+
:step="10"
281+
/>
282+
</el-form-item>
283+
<el-form-item prop="multiInstanceSourceType">
284+
<el-text>多实例来源</el-text>
285+
<el-select class="ml-10px w-200px!" v-model="configForm.multiInstanceSourceType" @change="handleMultiInstanceSourceTypeChange">
286+
<el-option
287+
v-for="item in CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE"
288+
:key="item.value"
289+
:label="item.label"
290+
:value="item.value"
291+
/>
292+
</el-select>
293+
</el-form-item>
294+
<el-form-item v-if="configForm.multiInstanceSourceType === 1">
295+
<el-input-number v-model="configForm.multiInstanceSource" :min="1" />
296+
</el-form-item>
297+
<el-form-item v-if="configForm.multiInstanceSourceType === 2">
298+
<el-select class="w-200px!" v-model="configForm.multiInstanceSource">
299+
<el-option
300+
v-for="(field, fIdx) in digitalFormFieldOptions"
301+
:key="fIdx"
302+
:label="field.title"
303+
:value="field.field"
304+
/>
305+
</el-select>
306+
</el-form-item>
307+
<el-form-item v-if="configForm.multiInstanceSourceType === 3">
308+
<el-select class="w-200px!" v-model="configForm.multiInstanceSource">
309+
<el-option
310+
v-for="(field, fIdx) in multiFormFieldOptions"
311+
:key="fIdx"
312+
:label="field.title"
313+
:value="field.field"
314+
/>
315+
</el-select>
316+
</el-form-item>
317+
</div>
252318
</el-form>
253319
</div>
254320
</el-tab-pane>
@@ -276,7 +342,9 @@ import {
276342
ChildProcessStartUserTypeEnum,
277343
CHILD_PROCESS_START_USER_TYPE,
278344
ChildProcessStartUserEmptyTypeEnum,
279-
CHILD_PROCESS_START_USER_EMPTY_TYPE
345+
CHILD_PROCESS_START_USER_EMPTY_TYPE,
346+
CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE,
347+
ChildProcessMultiInstanceSourceTypeEnum
280348
} from '../consts'
281349
import { useWatchNode, useDrawer, useNodeName, useFormFieldsAndStartUser } from '../node'
282350
import { parseFormFields } from '@/components/FormCreate/src/utils'
@@ -315,7 +383,8 @@ const formRules = reactive({
315383
timeoutEnable: [{ required: true, message: '超时设置是否开启不能为空', trigger: 'change' }],
316384
timeoutType: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }],
317385
timeDuration: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }],
318-
dateTime: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }]
386+
dateTime: [{ required: true, message: '超时设置时间不能为空', trigger: 'change' }],
387+
multiInstanceEnable: [{ required: true, message: '多实例设置不能为空', trigger: 'change' }]
319388
})
320389
type ChildProcessFormType = {
321390
async: boolean
@@ -331,6 +400,11 @@ type ChildProcessFormType = {
331400
timeDuration: number
332401
timeUnit: TimeUnitType
333402
dateTime: string
403+
multiInstanceEnable: boolean
404+
sequential: boolean
405+
completeRatio: number
406+
multiInstanceSourceType: ChildProcessMultiInstanceSourceTypeEnum
407+
multiInstanceSource: string
334408
}
335409
const configForm = ref<ChildProcessFormType>({
336410
async: false,
@@ -345,10 +419,21 @@ const configForm = ref<ChildProcessFormType>({
345419
timeoutType: DelayTypeEnum.FIXED_TIME_DURATION,
346420
timeDuration: 1,
347421
timeUnit: TimeUnitType.HOUR,
348-
dateTime: ''
422+
dateTime: '',
423+
multiInstanceEnable: false,
424+
sequential: false,
425+
completeRatio: 100,
426+
multiInstanceSourceType: ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY,
427+
multiInstanceSource: ''
349428
})
350429
const childProcessOptions = ref()
351430
const formFieldOptions = useFormFieldsAndStartUser()
431+
const digitalFormFieldOptions = computed(() => {
432+
return formFieldOptions.filter((item) => item.type === 'inputNumber')
433+
})
434+
const multiFormFieldOptions = computed(() => {
435+
return formFieldOptions.filter((item) => item.type === 'select' || item.type === 'checkbox')
436+
})
352437
const childFormFieldOptions = ref()
353438
354439
// 保存配置
@@ -393,6 +478,19 @@ const saveConfig = async () => {
393478
configForm.value.dateTime
394479
}
395480
}
481+
// 8. 多实例设置
482+
currentNode.value.childProcessSetting.multiInstanceSetting = {
483+
enable: configForm.value.multiInstanceEnable
484+
}
485+
if (configForm.value.multiInstanceEnable) {
486+
currentNode.value.childProcessSetting.multiInstanceSetting.sequential = configForm.value.sequential
487+
currentNode.value.childProcessSetting.multiInstanceSetting.completeRatio =
488+
configForm.value.completeRatio
489+
currentNode.value.childProcessSetting.multiInstanceSetting.sourceType =
490+
configForm.value.multiInstanceSourceType
491+
currentNode.value.childProcessSetting.multiInstanceSetting.source =
492+
configForm.value.multiInstanceSource
493+
}
396494
}
397495
398496
currentNode.value.showText = `调用子流程:${childInfo.name}`
@@ -436,6 +534,16 @@ const showChildProcessNodeConfig = (node: SimpleFlowNode) => {
436534
configForm.value.dateTime = node.childProcessSetting.timeoutSetting.timeExpression ?? ''
437535
}
438536
}
537+
// 8. 多实例设置
538+
configForm.value.multiInstanceEnable =
539+
node.childProcessSetting.multiInstanceSetting.enable ?? false
540+
if (configForm.value.multiInstanceEnable) {
541+
configForm.value.sequential = node.childProcessSetting.multiInstanceSetting.sequential ?? false
542+
configForm.value.completeRatio = node.childProcessSetting.multiInstanceSetting.completeRatio ?? 100
543+
configForm.value.multiInstanceSourceType =
544+
node.childProcessSetting.multiInstanceSetting.sourceType ?? ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY
545+
configForm.value.multiInstanceSource = node.childProcessSetting.multiInstanceSetting.source ?? ''
546+
}
439547
}
440548
loadFormInfo()
441549
}
@@ -481,6 +589,9 @@ const getIsoTimeDuration = () => {
481589
}
482590
return strTimeDuration
483591
}
592+
const handleMultiInstanceSourceTypeChange = () => {
593+
configForm.value.multiInstanceSource = ''
594+
}
484595
485596
onMounted(async () => {
486597
childProcessOptions.value = await getModelList(undefined)

0 commit comments

Comments
 (0)