feat: [bpm][antd] bpm设计器 多人审批方式优化

This commit is contained in:
jason
2025-12-07 23:59:50 +08:00
parent cfb9a9b3c9
commit 2cf7e70b70

View File

@@ -1,4 +1,4 @@
<!-- eslint-disable unused-imports/no-unused-vars -->
<!-- eslint-disable no-unused-vars -->
<script lang="ts" setup>
import { inject, nextTick, onBeforeUnmount, ref, toRaw, watch } from 'vue';
@@ -73,6 +73,7 @@ declare global {
const bpmnInstances = () => (window as any)?.bpmnInstances;
// eslint-disable-next-line unused-imports/no-unused-vars
const getElementLoop = (businessObject: any): void => {
if (!businessObject.loopCharacteristics) {
loopCharacteristics.value = 'Null';
@@ -278,6 +279,8 @@ const approveRatio = ref<number>(100);
const otherExtensions = ref<any[]>([]);
const getElementLoopNew = (): void => {
if (props.type === 'UserTask') {
const loopCharacteristics =
bpmnElement.value.businessObject?.loopCharacteristics;
const extensionElements =
bpmnElement.value.businessObject?.extensionElements ??
bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] });
@@ -294,10 +297,25 @@ const getElementLoopNew = (): void => {
approveMethod.value = ApproveMethodType.SEQUENTIAL_APPROVE;
updateLoopCharacteristics();
}
// 如果是按比例会签,从现有 completionCondition 中解析比例,反推到 approveRatio
if (
approveMethod.value === ApproveMethodType.APPROVE_BY_RATIO &&
loopCharacteristics?.completionCondition?.body
) {
const body = loopCharacteristics.completionCondition.body as string;
// 形如 "${ nrOfCompletedInstances/nrOfInstances >= 0.9 }"
const match = body.match(/>=\s*(\d+(?:\.\d+)?)/);
if (match) {
const ratio = Number(match[1]);
if (!Number.isNaN(ratio)) {
approveRatio.value = ratio * 100;
}
}
}
}
};
const onApproveMethodChange = (): void => {
approveRatio.value = 100;
updateLoopCharacteristics();
};
const onApproveRatioChange = (): void => {
@@ -393,31 +411,29 @@ watch(
</script>
<template>
<div class="panel-tab__content">
<div class="-mx-2 px-2">
<RadioGroup
v-if="type === 'UserTask'"
v-model:value="approveMethod"
@change="onApproveMethodChange"
>
<div class="flex-col">
<div class="flex flex-col gap-3">
<div v-for="(item, index) in APPROVE_METHODS" :key="index">
<Radio :value="item.value">
{{ item.label }}
</Radio>
<FormItem prop="approveRatio">
<InputNumber
v-model:value="approveRatio"
:min="10"
:max="100"
:step="10"
size="small"
v-if="
item.value === ApproveMethodType.APPROVE_BY_RATIO &&
approveMethod === ApproveMethodType.APPROVE_BY_RATIO
"
@change="onApproveRatioChange"
/>
</FormItem>
<InputNumber
v-if="
item.value === ApproveMethodType.APPROVE_BY_RATIO &&
approveMethod === ApproveMethodType.APPROVE_BY_RATIO
"
v-model:value="approveRatio"
:min="10"
:max="100"
:step="10"
size="small"
@change="onApproveRatioChange"
/>
</div>
</div>
</RadioGroup>