diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts index 0810c1f5..4cbac6e3 100644 --- a/src/components/SimpleProcessDesignerV2/src/node.ts +++ b/src/components/SimpleProcessDesignerV2/src/node.ts @@ -15,7 +15,6 @@ import { AssignStartUserHandlerType, AssignEmptyHandlerType, FieldPermissionType, - ProcessVariableEnum } from './consts' import { parseFormFields } from '@/components/FormCreate/src/utils/index' export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref { @@ -37,13 +36,6 @@ const parseFormCreateFields = (formFields?: string[]) => { parseFormFields(JSON.parse(fieldStr), result) }) } - // 固定添加发起人 ID 字段 - result.unshift({ - field: ProcessVariableEnum.START_USER_ID, - title: '发起人', - type: 'UserSelect', - required: true - }) return result } diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue index 09d6154f..f221f19d 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue @@ -102,7 +102,7 @@
{ const deleteConditionRule = (condition: Condition, idx: number) => { condition.rules.splice(idx, 1) } - const fieldsInfo = useFormFields() +/** 条件规则可选择的表单字段 */ +const fieldOptions = computed(() => { + const fieldsCopy = fieldsInfo.slice(); + // 固定添加发起人 ID 字段 + fieldsCopy.unshift({ + field: ProcessVariableEnum.START_USER_ID, + title: '发起人', + required: true + }) + return fieldsCopy +}) + + const getFieldTitle = (field: string) => { const item = fieldsInfo.find((item) => item.field === field) return item?.title diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index a088b6d0..fb5e780e 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -469,7 +469,8 @@ import { TimeoutHandlerType, ASSIGN_EMPTY_HANDLER_TYPES, AssignEmptyHandlerType, - FieldPermissionType + FieldPermissionType, + ProcessVariableEnum } from '../consts' import { @@ -519,6 +520,13 @@ const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFie useFormFieldsPermission(FieldPermissionType.READ) // 表单内用户字段选项, 必须是必填和用户选择器 const userFieldOnFormOptions = computed(() => { + // 固定添加发起人 ID 字段 + formFieldOptions.unshift({ + field: ProcessVariableEnum.START_USER_ID, + title: '发起人', + type: 'UserSelect', + required: true + }) return formFieldOptions.filter((item) => item.type === 'UserSelect') }) // 表单内部门字段选项, 必须是必填和部门选择器 diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue index c1a69089..f23b6cef 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue @@ -477,13 +477,12 @@ import { useUserStoreWithOut } from '@/store/modules/user' import { setConfAndFields2 } from '@/utils/formCreate' import * as TaskApi from '@/api/bpm/task' import * as ProcessInstanceApi from '@/api/bpm/processInstance' -import { propTypes } from '@/utils/propTypes' +import * as UserApi from '@/api/system/user' import { OperationButtonType, OPERATION_BUTTON_NAME } from '@/components/SimpleProcessDesignerV2/src/consts' -import { BpmProcessInstanceStatus } from '@/utils/constants' - +import { BpmProcessInstanceStatus, BpmModelFormType } from '@/utils/constants' defineOptions({ name: 'ProcessInstanceBtnContainer' }) const router = useRouter() // 路由 @@ -492,11 +491,15 @@ const { proxy } = getCurrentInstance() as any const userId = useUserStoreWithOut().getUser.id // 当前登录的编号 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 -const props = defineProps({ - processInstance: propTypes.object, // 流程实例信息 - processDefinition: propTypes.object, // 流程定义信息 - userOptions: propTypes.any -}) + +const props = defineProps< { + processInstance: any, // 流程实例信息 + processDefinition: any, // 流程定义信息 + userOptions: UserApi.UserVO[], + normalForm: any, // 流程表单 formCreate + normalFormApi: any, // 流程表单 formCreate Api + writableFields: string[] // 流程表单可以编辑的字段 +}>() const formLoading = ref(false) // 表单加载中 const popOverVisible = ref({ @@ -554,6 +557,14 @@ const openReturnPopover = async () => { /** 弹出气泡卡 */ const openPopover = async (type: string) => { + if (type === 'approve') { + // 校验流程表单 + const valid = await validateNormalForm(); + if (!valid) { + message.error('表单校验不通过,请先完善表单!!') + return; + } + } Object.keys(popOverVisible.value).forEach((item) => { popOverVisible.value[item] = item === type }) @@ -565,24 +576,29 @@ const openPopover = async (type: string) => { const handleAudit = async (pass: boolean) => { formLoading.value = true try { + // 校验审批表单 const genericFormRef = proxy.$refs['formRef'] - // 1.2 校验表单 const elForm = unref(genericFormRef) if (!elForm) return const valid = await elForm.validate() if (!valid) return - - // 2.1 提交审批 + // 提交审批 const data = { id: runningTask.value.id, - reason: genericForm.value.reason + reason: genericForm.value.reason, } if (pass) { + // 获取修改的流程变量, 暂时只支持流程表单 + const variables = getUpdatedProcessInstanceVaiables(); + // 审批通过, 把修改的字段值赋于流程实例变量 + // @ts-ignore + data.variables = variables // 审批通过,并且有额外的 approveForm 表单,需要校验 + 拼接到 data 表单里提交 const formCreateApi = approveFormFApi.value if (Object.keys(formCreateApi)?.length > 0) { await formCreateApi.validate() // @ts-ignore + // TODO 芋艿 任务有多表单这里要如何处理,会和可编辑的字段冲突 data.variables = approveForm.value.value } await TaskApi.approveTask(data) @@ -855,6 +871,30 @@ const loadTodoTask = (task: any) => { } } +/** 校验流程表单 */ +const validateNormalForm = async () => { + if (props.processDefinition?.formType === BpmModelFormType.NORMAL) { + let valid = true + try { + await props.normalFormApi?.validate() + } catch { + valid = false; + } + return valid; + } else { + return true; + } +} +/** 从可以编辑的流程表单字段,获取需要修改的流程实例的变量 */ +const getUpdatedProcessInstanceVaiables = ()=> { + const variables = {} + props.writableFields.forEach( (field) => { + const fieldValue = props.normalFormApi.getValue(field) + variables[field] = fieldValue; + }) + return variables +} + defineExpose({ loadTodoTask }) diff --git a/src/views/bpm/processInstance/detail/index.vue b/src/views/bpm/processInstance/detail/index.vue index 0461a202..c9fc539a 100644 --- a/src/views/bpm/processInstance/detail/index.vue +++ b/src/views/bpm/processInstance/detail/index.vue @@ -49,7 +49,7 @@ class="form-box flex flex-col mb-30px flex-1" > - + -
+
@@ -116,6 +116,9 @@ :process-instance="processInstance" :process-definition="processDefinition" :userOptions="userOptions" + :normal-form ="detailForm" + :normal-form-api="fApi" + :writable-fields="writableFields" @success="refresh" />
@@ -126,7 +129,7 @@