feat: [bpm][antd] todo 修改

pull/319/head
jason 2026-01-17 15:31:54 +08:00
parent db97d414ec
commit 012412ec22
6 changed files with 40 additions and 60 deletions

View File

@ -29,6 +29,7 @@ import {
import { getForm } from '#/api/bpm/form';
import { getModelList } from '#/api/bpm/model';
import { parseFormFields } from '#/components/form-create';
import {
CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE,
@ -42,12 +43,7 @@ import {
TIME_UNIT_TYPES,
TimeUnitType,
} from '../../consts';
import {
parseFormFields,
useFormFields,
useNodeName,
useWatchNode,
} from '../../helpers';
import { useFormFields, useNodeName, useWatchNode } from '../../helpers';
import { convertTimeUnit } from './utils';
defineOptions({ name: 'ChildProcessNodeConfig' });

View File

@ -6,9 +6,9 @@ import type { ComponentPublicInstance, Ref } from 'vue';
import type { ButtonSetting, SimpleFlowNode } from '../../consts';
import type { UserTaskFormType } from '../../helpers';
import { computed, nextTick, onMounted, reactive, ref } from 'vue';
import { computed, nextTick, onMounted, reactive, ref, watchEffect } from 'vue';
import { useVbenDrawer } from '@vben/common-ui';
import { useVbenDrawer, useVbenModal } from '@vben/common-ui';
import {
BpmModelFormType,
BpmNodeTypeEnum,
@ -39,6 +39,8 @@ import {
TypographyText,
} from 'ant-design-vue';
import { ProcessExpressionSelectModal } from '#/views/bpm/processExpression/components';
import {
APPROVE_METHODS,
APPROVE_TYPE,
@ -112,10 +114,20 @@ const [Drawer, drawerApi] = useVbenDrawer({
},
});
const [ExpressionSelectModal, expressionSelectModalApi] = useVbenModal({
connectedComponent: ProcessExpressionSelectModal,
destroyOnClose: true,
showConfirmButton: false,
});
//
const { nodeName, showInput, clickIcon, changeNodeName, inputRef } =
useNodeName(BpmNodeTypeEnum.USER_TASK_NODE);
watchEffect(() => {
void inputRef.value;
});
// Tab
const activeTabName = ref('user');
@ -218,9 +230,18 @@ function changeCandidateStrategy() {
configForm.value.deptLevel = 1;
configForm.value.formUser = '';
configForm.value.formDept = '';
configForm.value.expression = '';
configForm.value.approveMethod = ApproveMethodType.SEQUENTIAL_APPROVE;
}
function openExpressionSelect() {
expressionSelectModalApi.open();
}
function handleExpressionSelected(row: any) {
configForm.value.expression = row?.expression ?? '';
}
/** 审批方式改变 */
function approveMethodChanged() {
configForm.value.rejectHandlerType = RejectHandlerType.FINISH_PROCESS;
@ -843,7 +864,6 @@ onMounted(() => {
</SelectOption>
</Select>
</FormItem>
<!-- TODO @jason后续要支持选择已经存好的表达式 -->
<FormItem
v-if="
configForm.candidateStrategy === CandidateStrategy.EXPRESSION
@ -851,7 +871,15 @@ onMounted(() => {
label="流程表达式"
name="expression"
>
<Textarea v-model:value="configForm.expression" allow-clear />
<div class="flex gap-2">
<Textarea v-model:value="configForm.expression" :rows="2" />
<div class="flex flex-col gap-2">
<Button type="primary" @click="openExpressionSelect">
选择
</Button>
<Button @click="configForm.expression = ''">清空</Button>
</div>
</div>
</FormItem>
<!-- 多人审批/办理 方式 -->
<FormItem :label="`多人${nodeTypeName}方式`" name="approveMethod">
@ -1266,4 +1294,6 @@ onMounted(() => {
</TabPane>
</Tabs>
</Drawer>
<ExpressionSelectModal @select="handleExpressionSelected" />
</template>

View File

@ -20,6 +20,8 @@ import {
ProcessVariableEnum,
} from '@vben/constants';
import { parseFormFields } from '#/components/form-create';
import {
ApproveMethodType,
AssignEmptyHandlerType,
@ -56,49 +58,6 @@ function parseFormCreateFields(formFields?: string[]) {
return result;
}
/**
* field, title
*
* @param rule https://www.form-create.com/v3/guide/rule
* @param fields
* @param parentTitle
*/
export const parseFormFields = (
rule: Record<string, any>,
fields: Array<Record<string, any>> = [],
parentTitle: string = '',
) => {
const { type, field, $required, title: tempTitle, children } = rule;
if (field && tempTitle) {
let title = tempTitle;
if (parentTitle) {
title = `${parentTitle}.${tempTitle}`;
}
let required = false;
if ($required) {
required = true;
}
fields.push({
field,
title,
type,
required,
});
// TODO 子表单 需要处理子表单字段
// if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
// // 解析子表单的字段
// rule.props.rule.forEach((item) => {
// parseFields(item, fieldsPermission, title)
// })
// }
}
if (children && Array.isArray(children)) {
children.forEach((rule) => {
parseFormFields(rule, fields);
});
}
};
/**
* @description
*/

View File

@ -7,5 +7,3 @@ export { default as SimpleProcessDesigner } from './components/simple-process-de
export { default as SimpleProcessViewer } from './components/simple-process-viewer.vue';
export type { SimpleFlowNode } from './consts';
export { parseFormFields } from './helpers';

View File

@ -32,7 +32,7 @@ defineProps<{
const emit = defineEmits(['success', 'init-finished']);
const formFields = ref<string[]>([]); //
const formType = ref(BpmModelFormType.NORMAL); // TODO @jason
const formType = ref(BpmModelFormType.NORMAL); //
provide('formFields', formFields);
provide('formType', formType);
@ -40,7 +40,6 @@ const xmlString = inject('processData') as Ref; // 注入流程数据
const modelData = inject('modelData') as Ref; //
const modeler = shallowRef(); // BPMN Modeler
const processDesigner = ref();
const controlForm = ref({
simulation: true,
labelEditing: false,
@ -102,7 +101,6 @@ onBeforeUnmount(() => {
:value="xmlString"
v-bind="controlForm"
keyboard
ref="processDesigner"
@init-finished="initModeler"
:additional-model="controlForm.additionalModel"
:model="model"

View File

@ -15,8 +15,7 @@ import {
cancelProcessInstanceByAdmin,
getProcessInstanceManagerPage,
} from '#/api/bpm/processInstance';
// TODO @jason ele antd 使 parseFormFields ele import { parseFormFields } from '#/components/form-create';
import { parseFormFields } from '#/views/bpm/components/simple-process-design';
import { parseFormFields } from '#/components/form-create';
import { useGridColumns, useGridFormSchema } from './data';