feat:【antd】【bpm】model/form/ 代码评审

pull/239/MERGE
YunaiV 2025-10-24 13:57:31 +08:00
parent bbd32a274e
commit d568ab0fe9
9 changed files with 78 additions and 115 deletions

View File

@ -12,7 +12,6 @@ import { Button, Tooltip } from 'ant-design-vue';
import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import { getProcessDefinitionPage } from '#/api/bpm/definition';
// FormCreate
import FormCreateDetail from '../../form/modules/detail.vue';
import { useGridColumns } from './data';

View File

@ -39,7 +39,6 @@ import ProcessDesign from './modules/process-design.vue';
defineOptions({ name: 'BpmModelCreate' });
//
type BpmProcessDefinitionType = Omit<
BpmProcessDefinitionApi.ProcessDefinition,
'modelId' | 'modelType'
@ -49,42 +48,17 @@ type BpmProcessDefinitionType = Omit<
};
const router = useRouter();
const route = useRoute();
const userStore = useUserStore();
const tabs = useTabs();
//
const basicInfoRef = ref<InstanceType<typeof BasicInfo>>();
//
const formDesignRef = ref<InstanceType<typeof FormDesign>>();
//
const processDesignRef = ref<InstanceType<typeof ProcessDesign>>();
//
const extraSettingRef = ref<InstanceType<typeof ExtraSetting>>();
/** 步骤校验函数 */
async function validateBasic() {
await basicInfoRef.value?.validate();
}
/** 表单设计校验 */
async function validateForm() {
await formDesignRef.value?.validate();
}
/** 流程设计校验 */
async function validateProcess() {
await processDesignRef.value?.validate();
}
/** 更多设置校验 */
async function validateExtra() {
await extraSettingRef.value?.validate();
}
const basicInfoRef = ref<InstanceType<typeof BasicInfo>>(); //
const formDesignRef = ref<InstanceType<typeof FormDesign>>(); //
const processDesignRef = ref<InstanceType<typeof ProcessDesign>>(); //
const extraSettingRef = ref<InstanceType<typeof ExtraSetting>>(); //
const actionType = route.params.type as string; // createcopyupdate
const currentStep = ref(-1); // -1
const steps = [
{ title: '基本信息', validator: validateBasic },
{ title: '表单设计', validator: validateForm },
@ -92,7 +66,6 @@ const steps = [
{ title: '更多设置', validator: validateExtra },
];
//
const formData: any = ref({
id: undefined,
name: '',
@ -128,22 +101,38 @@ const formData: any = ref({
summary: [],
},
allowWithdrawTask: false,
});
}); //
const processData = ref<any>(); //
//
const processData = ref<any>();
provide('processData', processData);
provide('modelData', formData);
//
const formList = ref<BpmFormApi.Form[]>([]);
const categoryList = ref<BpmCategoryApi.Category[]>([]);
const userList = ref<SystemUserApi.User[]>([]);
const deptList = ref<SystemDeptApi.Dept[]>([]);
provide('processData', processData);
provide('modelData', formData);
/** 步骤校验函数 */
async function validateBasic() {
await basicInfoRef.value?.validate();
}
/** 表单设计校验 */
async function validateForm() {
await formDesignRef.value?.validate();
}
/** 流程设计校验 */
async function validateProcess() {
await processDesignRef.value?.validate();
}
/** 更多设置校验 */
async function validateExtra() {
await extraSettingRef.value?.validate();
}
/** 初始化数据 */
const actionType = route.params.type as string;
async function initData() {
if (actionType === 'definition') {
//
@ -212,7 +201,6 @@ async function initData() {
// currentStep
currentStep.value = 0;
//
extraSettingRef.value?.initData();
}
@ -291,7 +279,6 @@ async function handleSave() {
formData.value.id = await createModel(modelData);
//
message.success('复制成功,可点击【发布】按钮,进行发布模型');
break;
}
case 'definition': {
@ -299,15 +286,13 @@ async function handleSave() {
await updateModel(modelData);
//
message.success('恢复成功,可点击【发布】按钮,进行发布模型');
break;
}
case 'update': {
//
//
await updateModel(modelData);
//
message.success('修改成功,可点击【发布】按钮,进行发布模型');
break;
}
default: {
@ -324,6 +309,7 @@ async function handleSave() {
}
} catch (error: any) {
console.error('保存失败:', error);
// TODO @jason
// message.warning(error.msg || '');
}
}
@ -331,28 +317,28 @@ async function handleSave() {
/** 发布操作 */
async function handleDeploy() {
try {
//
// 1.1
if (!formData.value.id) {
await confirm('是否确认发布该流程?');
}
//
// 1.2
await validateAllSteps();
//
// 2.1
const modelData = {
...formData.value,
};
//
// 2.2
if (formData.value.id) {
await updateModel(modelData);
} else {
const result = await createModel(modelData);
formData.value.id = result.id;
}
//
// 2.3
await deployModel(formData.value.id);
// 3.
message.success('发布成功');
await router.push({ name: 'BpmModel' });
} catch (error: any) {
@ -386,13 +372,9 @@ async function handleStepClick(index: number) {
}
}
const tabs = useTabs();
/** 返回列表页 */
function handleBack() {
//
tabs.closeCurrentTab();
//
router.push({ name: 'BpmModel' });
}

View File

@ -53,21 +53,15 @@ const [DeptSelectModalComp, deptSelectModalApi] = useVbenModal({
destroyOnClose: true,
});
//
const formRef = ref();
const formRef = ref(); //
const modelData = defineModel<any>(); //
//
const selectedStartUsers = ref<SystemUserApi.User[]>([]);
const selectedStartUsers = ref<SystemUserApi.User[]>([]); //
const selectedStartDepts = ref<SystemDeptApi.Dept[]>([]); //
//
const selectedStartDepts = ref<SystemDeptApi.Dept[]>([]);
//
const selectedManagerUsers = ref<SystemUserApi.User[]>([]);
const selectedManagerUsers = ref<SystemUserApi.User[]>([]); //
const currentSelectType = ref<'manager' | 'start'>('start');
//
const selectedUsers = ref<number[]>();
const selectedUsers = ref<number[]>(); //
const rules: Record<string, Rule[]> = {
name: [{ required: true, message: '流程名称不能为空', trigger: 'blur' }],
key: [
@ -99,10 +93,7 @@ const rules: Record<string, Rule[]> = {
],
};
//
const modelData = defineModel<any>();
//
/** 初始化选中的用户 */
watch(
() => modelData.value,
(newVal) => {
@ -140,6 +131,7 @@ function openStartUserSelect() {
function openStartDeptSelect() {
deptSelectModalApi.setData({ selectedList: selectedStartDepts.value }).open();
}
/** 处理部门选择确认 */
function handleDeptSelectConfirm(depts: SystemDeptApi.Dept[]) {
modelData.value = {
@ -191,7 +183,6 @@ function handleStartUserTypeChange(value: SelectValue) {
startUserIds: [],
startDeptIds: [],
};
break;
}
case 1: {
@ -199,7 +190,6 @@ function handleStartUserTypeChange(value: SelectValue) {
...modelData.value,
startDeptIds: [],
};
break;
}
case 2: {
@ -207,7 +197,6 @@ function handleStartUserTypeChange(value: SelectValue) {
...modelData.value,
startUserIds: [],
};
break;
}
}

View File

@ -31,17 +31,13 @@ defineProps<{
const emit = defineEmits(['success', 'init-finished']);
//
const formFields = ref<string[]>([]);
//
const formType = ref(BpmModelFormType.NORMAL);
const formFields = ref<string[]>([]); //
const formType = ref(BpmModelFormType.NORMAL); // TODO @jason
provide('formFields', formFields);
provide('formType', formType);
//
const xmlString = inject('processData') as Ref;
//
const modelData = inject('modelData') as Ref;
const xmlString = inject('processData') as Ref; //
const modelData = inject('modelData') as Ref; //
const modeler = shallowRef(); // BPMN Modeler
const processDesigner = ref();
@ -57,7 +53,6 @@ const model = ref<BpmModelApi.Model>(); // 流程模型的信息
/** 初始化 modeler */
const initModeler = async (item: any) => {
//
model.value = modelData.value;
modeler.value = item;
};
@ -87,7 +82,7 @@ watch(
{ immediate: true },
);
//
/** 在组件卸载时清理 */
onBeforeUnmount(() => {
modeler.value = null;
//
@ -127,6 +122,7 @@ onBeforeUnmount(() => {
</ContentWrap>
</template>
<style lang="scss">
// TODO @jasontailwind
.process-panel__container {
position: absolute;
top: 172px;

View File

@ -179,8 +179,7 @@ const formFieldOptions4Summary = computed(() => {
});
});
const unParsedFormFields = ref<string[]>([]); //
// HttpRequestSetting 使
provide('formFields', unParsedFormFields);
provide('formFields', unParsedFormFields); // HttpRequestSetting 使
/** 兼容以前未配置更多设置的流程 */
function initData() {
@ -246,8 +245,8 @@ watch(
},
{ immediate: true },
);
//
const formRef = ref();
const formRef = ref(); //
/** 表单校验 */
async function validate() {
await formRef.value?.validate();

View File

@ -33,10 +33,7 @@ const props = defineProps({
const formRef = ref();
//
const modelData = defineModel<any>();
//
const modelData = defineModel<any>(); //
const formPreview = ref({
formData: {} as any,
rule: [],
@ -45,9 +42,20 @@ const formPreview = ref({
resetBtn: false,
formData: {},
},
});
}); //
/** 监听表单ID变化加载表单数据 */
const rules: Record<string, Rule[]> = {
formType: [{ required: true, message: '表单类型不能为空', trigger: 'blur' }],
formId: [{ required: true, message: '流程表单不能为空', trigger: 'blur' }],
formCustomCreatePath: [
{ required: true, message: '表单提交路由不能为空', trigger: 'blur' },
],
formCustomViewPath: [
{ required: true, message: '表单查看地址不能为空', trigger: 'blur' },
],
};
/** 监听表单 ID 变化,加载表单数据 */
watch(
() => modelData.value.formId,
async (newFormId) => {
@ -65,17 +73,6 @@ watch(
{ immediate: true },
);
const rules: Record<string, Rule[]> = {
formType: [{ required: true, message: '表单类型不能为空', trigger: 'blur' }],
formId: [{ required: true, message: '流程表单不能为空', trigger: 'blur' }],
formCustomCreatePath: [
{ required: true, message: '表单提交路由不能为空', trigger: 'blur' },
],
formCustomViewPath: [
{ required: true, message: '表单查看地址不能为空', trigger: 'blur' },
],
};
/** 表单校验 */
async function validate() {
await formRef.value?.validate();

View File

@ -8,9 +8,7 @@ import { BpmModelType } from '@vben/constants';
import BpmModelEditor from './bpm-model-editor.vue';
import SimpleModelDesign from './simple-model-design.vue';
//
const modelData = defineModel<any>();
const modelData = defineModel<any>(); //
const processData = inject('processData') as Ref;
const simpleDesign = ref();
@ -30,6 +28,7 @@ async function validate() {
}
return true;
}
/** 处理设计器保存成功 */
async function handleDesignSuccess(data?: any) {
if (data) {
@ -39,7 +38,7 @@ async function handleDesignSuccess(data?: any) {
bpmnXml: modelData.value.type === BpmModelType.BPMN ? data : null,
simpleModel: modelData.value.type === BpmModelType.BPMN ? null : data,
};
// 使emit
// 使 emit
await nextTick();
//
modelData.value = newModelData;
@ -50,6 +49,7 @@ async function handleDesignSuccess(data?: any) {
const showDesigner = computed(() => {
return Boolean(modelData.value?.key && modelData.value?.name);
});
defineExpose({ validate });
</script>
<template>

View File

@ -16,6 +16,7 @@ defineProps<{
}>();
const emit = defineEmits(['success']);
const designerRef = ref();
/** 保存成功回调 */
@ -24,10 +25,12 @@ function handleSuccess(data?: any) {
emit('success', data);
}
}
/** 设计器配置校验 */
async function validateConfig() {
return await designerRef.value.validate();
}
defineExpose({ validateConfig });
</script>
<template>

View File

@ -17,11 +17,9 @@ import {
import { getModelList } from '#/api/bpm/model';
import { router } from '#/router';
//
import CategoryForm from '../category/modules/form.vue';
import CategoryDraggableModel from './modules/category-draggable-model.vue';
//
const [CategoryFormModal, categoryFormModalApi] = useVbenModal({
connectedComponent: CategoryForm,
destroyOnClose: true,