【代码评审】BPM:子流程的多实例配置

This commit is contained in:
YunaiV 2025-02-26 21:59:36 +08:00
parent 5f2a220007
commit 9994059cad
4 changed files with 92 additions and 69 deletions

View File

@ -815,13 +815,13 @@ export const TRIGGER_TYPES: DictDataVO[] = [
export type ChildProcessSetting = { export type ChildProcessSetting = {
calledProcessDefinitionKey: string calledProcessDefinitionKey: string
calledProcessDefinitionName: string calledProcessDefinitionName: string
async: boolean, async: boolean
inVariables?: IOParameter[], inVariables?: IOParameter[]
outVariables?: IOParameter[], outVariables?: IOParameter[]
skipStartUserNode: boolean, skipStartUserNode: boolean
startUserSetting: StartUserSetting, startUserSetting: StartUserSetting
timeoutSetting: TimeoutSetting, timeoutSetting: TimeoutSetting
multiInstanceSetting: MultiInstanceSetting, multiInstanceSetting: MultiInstanceSetting
} }
export type IOParameter = { export type IOParameter = {
source: string source: string
@ -833,16 +833,16 @@ export type StartUserSetting = {
emptyType?: ChildProcessStartUserEmptyTypeEnum emptyType?: ChildProcessStartUserEmptyTypeEnum
} }
export type TimeoutSetting = { export type TimeoutSetting = {
enable: boolean, enable: boolean
type?: DelayTypeEnum, type?: DelayTypeEnum
timeExpression?: string, timeExpression?: string
} }
export type MultiInstanceSetting = { export type MultiInstanceSetting = {
enable: boolean, enable: boolean
sequential?: boolean, sequential?: boolean
completeRatio?: number, completeRatio?: number
sourceType?: ChildProcessMultiInstanceSourceTypeEnum, sourceType?: ChildProcessMultiInstanceSourceTypeEnum
source?: string, source?: string
} }
export enum ChildProcessStartUserTypeEnum { export enum ChildProcessStartUserTypeEnum {
/** /**
@ -852,7 +852,7 @@ export enum ChildProcessStartUserTypeEnum {
/** /**
* *
*/ */
FROM_FORM = 2, FROM_FORM = 2
} }
export const CHILD_PROCESS_START_USER_TYPE = [ export const CHILD_PROCESS_START_USER_TYPE = [
{ label: '同主流程发起人', value: ChildProcessStartUserTypeEnum.MAIN_PROCESS_START_USER }, { label: '同主流程发起人', value: ChildProcessStartUserTypeEnum.MAIN_PROCESS_START_USER },
@ -870,7 +870,7 @@ export enum ChildProcessStartUserEmptyTypeEnum {
/** /**
* *
*/ */
MAIN_PROCESS_ADMIN = 3, MAIN_PROCESS_ADMIN = 3
} }
export const CHILD_PROCESS_START_USER_EMPTY_TYPE = [ export const CHILD_PROCESS_START_USER_EMPTY_TYPE = [
{ label: '同主流程发起人', value: ChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER }, { label: '同主流程发起人', value: ChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER },
@ -889,10 +889,10 @@ export enum ChildProcessMultiInstanceSourceTypeEnum {
/** /**
* *
*/ */
MULTI_FORM = 3, MULTI_FORM = 3
} }
export const CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE = [ export const CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE = [
{ label: '固定数量', value: ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY }, { label: '固定数量', value: ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY },
{ label: '数字表单', value: ChildProcessMultiInstanceSourceTypeEnum.DIGITAL_FORM }, { label: '数字表单', value: ChildProcessMultiInstanceSourceTypeEnum.DIGITAL_FORM }, // TODO @lesanDIGITAL 改成 NUMBER和 Element plus 更接近?
{ label: '多项表单', value: ChildProcessMultiInstanceSourceTypeEnum.MULTI_FORM } { label: '多项表单', value: ChildProcessMultiInstanceSourceTypeEnum.MULTI_FORM } // TODO @lesan多选表单multiple 是这个解释。另外 MULTI => MULTIPLE
] ]

View File

@ -166,12 +166,12 @@
:key="item.value" :key="item.value"
:value="item.value" :value="item.value"
> >
{{ item.label }}</el-radio {{ item.label }}
> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
v-if="configForm.startUserType === 2" v-if="configForm.startUserType === ChildProcessStartUserTypeEnum.FROM_FORM"
label="当子流程发起人为空时" label="当子流程发起人为空时"
prop="startUserType" prop="startUserType"
> >
@ -181,8 +181,8 @@
:key="item.value" :key="item.value"
:value="item.value" :value="item.value"
> >
{{ item.label }}</el-radio {{ item.label }}
> </el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
@ -282,7 +282,11 @@
</el-form-item> </el-form-item>
<el-form-item prop="multiInstanceSourceType"> <el-form-item prop="multiInstanceSourceType">
<el-text>多实例来源</el-text> <el-text>多实例来源</el-text>
<el-select class="ml-10px w-200px!" v-model="configForm.multiInstanceSourceType" @change="handleMultiInstanceSourceTypeChange"> <el-select
class="ml-10px w-200px!"
v-model="configForm.multiInstanceSourceType"
@change="handleMultiInstanceSourceTypeChange"
>
<el-option <el-option
v-for="item in CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE" v-for="item in CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE"
:key="item.value" :key="item.value"
@ -291,6 +295,7 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- TODO @lesan枚举 -->
<el-form-item v-if="configForm.multiInstanceSourceType === 1"> <el-form-item v-if="configForm.multiInstanceSourceType === 1">
<el-input-number v-model="configForm.multiInstanceSource" :min="1" /> <el-input-number v-model="configForm.multiInstanceSource" :min="1" />
</el-form-item> </el-form-item>
@ -483,7 +488,8 @@ const saveConfig = async () => {
enable: configForm.value.multiInstanceEnable enable: configForm.value.multiInstanceEnable
} }
if (configForm.value.multiInstanceEnable) { if (configForm.value.multiInstanceEnable) {
currentNode.value.childProcessSetting.multiInstanceSetting.sequential = configForm.value.sequential currentNode.value.childProcessSetting.multiInstanceSetting.sequential =
configForm.value.sequential
currentNode.value.childProcessSetting.multiInstanceSetting.completeRatio = currentNode.value.childProcessSetting.multiInstanceSetting.completeRatio =
configForm.value.completeRatio configForm.value.completeRatio
currentNode.value.childProcessSetting.multiInstanceSetting.sourceType = currentNode.value.childProcessSetting.multiInstanceSetting.sourceType =
@ -538,11 +544,15 @@ const showChildProcessNodeConfig = (node: SimpleFlowNode) => {
configForm.value.multiInstanceEnable = configForm.value.multiInstanceEnable =
node.childProcessSetting.multiInstanceSetting.enable ?? false node.childProcessSetting.multiInstanceSetting.enable ?? false
if (configForm.value.multiInstanceEnable) { if (configForm.value.multiInstanceEnable) {
configForm.value.sequential = node.childProcessSetting.multiInstanceSetting.sequential ?? false configForm.value.sequential =
configForm.value.completeRatio = node.childProcessSetting.multiInstanceSetting.completeRatio ?? 100 node.childProcessSetting.multiInstanceSetting.sequential ?? false
configForm.value.completeRatio =
node.childProcessSetting.multiInstanceSetting.completeRatio ?? 100
configForm.value.multiInstanceSourceType = configForm.value.multiInstanceSourceType =
node.childProcessSetting.multiInstanceSetting.sourceType ?? ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY node.childProcessSetting.multiInstanceSetting.sourceType ??
configForm.value.multiInstanceSource = node.childProcessSetting.multiInstanceSetting.source ?? '' ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY
configForm.value.multiInstanceSource =
node.childProcessSetting.multiInstanceSetting.source ?? ''
} }
} }
loadFormInfo() loadFormInfo()

View File

@ -48,7 +48,7 @@ import { getDefaultConditionNodeName } from '../utils'
import { useFormFieldsAndStartUser, getConditionShowText } from '../node' import { useFormFieldsAndStartUser, getConditionShowText } from '../node'
import Condition from './components/Condition.vue' import Condition from './components/Condition.vue'
import { cloneDeep } from 'lodash-es' import { cloneDeep } from 'lodash-es'
const message = useMessage() //
defineOptions({ defineOptions({
name: 'ConditionNodeConfig' name: 'ConditionNodeConfig'
}) })
@ -69,14 +69,18 @@ const condition = ref<any>({
conditionExpression: '', conditionExpression: '',
conditionGroups: { conditionGroups: {
and: true, and: true,
conditions: [{ conditions: [
and: true, {
rules: [{ and: true,
opCode: '==', rules: [
leftSide: '', {
rightSide: '' opCode: '==',
}] leftSide: '',
}] rightSide: ''
}
]
}
]
} }
}) })
const open = () => { const open = () => {
@ -90,14 +94,18 @@ const open = () => {
conditionExpression: '', conditionExpression: '',
conditionGroups: { conditionGroups: {
and: true, and: true,
conditions: [{ conditions: [
and: true, {
rules: [{ and: true,
opCode: '==', rules: [
leftSide: '', {
rightSide: '' opCode: '==',
}] leftSide: '',
}] rightSide: ''
}
]
}
]
} }
} }
} }
@ -162,8 +170,14 @@ const saveConfig = async () => {
currentNode.value.conditionSetting = cloneDeep({ currentNode.value.conditionSetting = cloneDeep({
...currentNode.value.conditionSetting, ...currentNode.value.conditionSetting,
conditionType: condition.value?.conditionType, conditionType: condition.value?.conditionType,
conditionExpression: condition.value?.conditionType === ConditionType.EXPRESSION ? condition.value?.conditionExpression : undefined, conditionExpression:
conditionGroups: condition.value?.conditionType === ConditionType.RULE ? condition.value?.conditionGroups : undefined condition.value?.conditionType === ConditionType.EXPRESSION
? condition.value?.conditionExpression
: undefined,
conditionGroups:
condition.value?.conditionType === ConditionType.RULE
? condition.value?.conditionGroups
: undefined
}) })
} }
settingVisible.value = false settingVisible.value = false

View File

@ -157,25 +157,24 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
} }
/** 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次 */ /** 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次 */
// TODO @ @lesan watch(
// watch( detailForm.value,
// detailForm.value, (newValue) => {
// (newValue) => { if (newValue && Object.keys(newValue.value).length > 0) {
// if (newValue && Object.keys(newValue.value).length > 0) { //
// // tempStartUserSelectAssignees.value = startUserSelectAssignees.value
// tempStartUserSelectAssignees.value = startUserSelectAssignees.value startUserSelectAssignees.value = {}
// startUserSelectAssignees.value = {} //
// // getApprovalDetail({
// getApprovalDetail({ id: props.selectProcessDefinition.id,
// id: props.selectProcessDefinition.id, processVariablesStr: JSON.stringify(newValue.value) // GET String JSON
// processVariablesStr: JSON.stringify(newValue.value) // GET String JSON })
// }) }
// } },
// }, {
// { immediate: true
// immediate: true }
// } )
// )
/** 获取审批详情 */ /** 获取审批详情 */
const getApprovalDetail = async (row: any) => { const getApprovalDetail = async (row: any) => {