Skip to content

Commit 0b6af85

Browse files
committed
【功能完善】审批时,流程表单可编辑字段,可修改。
1 parent ee46a31 commit 0b6af85

File tree

5 files changed

+93
-31
lines changed

5 files changed

+93
-31
lines changed

src/components/SimpleProcessDesignerV2/src/node.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import {
1515
AssignStartUserHandlerType,
1616
AssignEmptyHandlerType,
1717
FieldPermissionType,
18-
ProcessVariableEnum
1918
} from './consts'
2019
import { parseFormFields } from '@/components/FormCreate/src/utils/index'
2120
export function useWatchNode(props: { flowNode: SimpleFlowNode }): Ref<SimpleFlowNode> {
@@ -37,13 +36,6 @@ const parseFormCreateFields = (formFields?: string[]) => {
3736
parseFormFields(JSON.parse(fieldStr), result)
3837
})
3938
}
40-
// 固定添加发起人 ID 字段
41-
result.unshift({
42-
field: ProcessVariableEnum.START_USER_ID,
43-
title: '发起人',
44-
type: 'UserSelect',
45-
required: true
46-
})
4739
return result
4840
}
4941

src/components/SimpleProcessDesignerV2/src/nodes-config/ConditionNodeConfig.vue

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@
102102
<div class="mr-2">
103103
<el-select style="width: 160px" v-model="rule.leftSide">
104104
<el-option
105-
v-for="(item, index) in fieldsInfo"
105+
v-for="(item, index) in fieldOptions"
106106
:key="index"
107107
:label="item.title"
108108
:value="item.field"
@@ -160,7 +160,8 @@ import {
160160
COMPARISON_OPERATORS,
161161
ConditionGroup,
162162
Condition,
163-
ConditionRule
163+
ConditionRule,
164+
ProcessVariableEnum
164165
} from '../consts'
165166
import { getDefaultConditionNodeName } from '../utils'
166167
import { useFormFields } from '../node'
@@ -364,9 +365,21 @@ const addConditionRule = (condition: Condition, idx: number) => {
364365
const deleteConditionRule = (condition: Condition, idx: number) => {
365366
condition.rules.splice(idx, 1)
366367
}
367-
368368
const fieldsInfo = useFormFields()
369369
370+
/** 条件规则可选择的表单字段 */
371+
const fieldOptions = computed(() => {
372+
const fieldsCopy = fieldsInfo.slice();
373+
// 固定添加发起人 ID 字段
374+
fieldsCopy.unshift({
375+
field: ProcessVariableEnum.START_USER_ID,
376+
title: '发起人',
377+
required: true
378+
})
379+
return fieldsCopy
380+
})
381+
382+
370383
const getFieldTitle = (field: string) => {
371384
const item = fieldsInfo.find((item) => item.field === field)
372385
return item?.title

src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,8 @@ import {
469469
TimeoutHandlerType,
470470
ASSIGN_EMPTY_HANDLER_TYPES,
471471
AssignEmptyHandlerType,
472-
FieldPermissionType
472+
FieldPermissionType,
473+
ProcessVariableEnum
473474
} from '../consts'
474475
475476
import {
@@ -519,6 +520,13 @@ const { formType, fieldsPermissionConfig, formFieldOptions, getNodeConfigFormFie
519520
useFormFieldsPermission(FieldPermissionType.READ)
520521
// 表单内用户字段选项, 必须是必填和用户选择器
521522
const userFieldOnFormOptions = computed(() => {
523+
// 固定添加发起人 ID 字段
524+
formFieldOptions.unshift({
525+
field: ProcessVariableEnum.START_USER_ID,
526+
title: '发起人',
527+
type: 'UserSelect',
528+
required: true
529+
})
522530
return formFieldOptions.filter((item) => item.type === 'UserSelect')
523531
})
524532
// 表单内部门字段选项, 必须是必填和部门选择器

src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -477,13 +477,12 @@ import { useUserStoreWithOut } from '@/store/modules/user'
477477
import { setConfAndFields2 } from '@/utils/formCreate'
478478
import * as TaskApi from '@/api/bpm/task'
479479
import * as ProcessInstanceApi from '@/api/bpm/processInstance'
480-
import { propTypes } from '@/utils/propTypes'
480+
import * as UserApi from '@/api/system/user'
481481
import {
482482
OperationButtonType,
483483
OPERATION_BUTTON_NAME
484484
} from '@/components/SimpleProcessDesignerV2/src/consts'
485-
import { BpmProcessInstanceStatus } from '@/utils/constants'
486-
485+
import { BpmProcessInstanceStatus, BpmModelFormType } from '@/utils/constants'
487486
defineOptions({ name: 'ProcessInstanceBtnContainer' })
488487
489488
const router = useRouter() // 路由
@@ -492,11 +491,15 @@ const { proxy } = getCurrentInstance() as any
492491
493492
const userId = useUserStoreWithOut().getUser.id // 当前登录的编号
494493
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
495-
const props = defineProps({
496-
processInstance: propTypes.object, // 流程实例信息
497-
processDefinition: propTypes.object, // 流程定义信息
498-
userOptions: propTypes.any
499-
})
494+
495+
const props = defineProps< {
496+
processInstance: any, // 流程实例信息
497+
processDefinition: any, // 流程定义信息
498+
userOptions: UserApi.UserVO[],
499+
normalForm: any, // 流程表单 formCreate
500+
normalFormApi: any, // 流程表单 formCreate Api
501+
writableFields: string[] // 流程表单可以编辑的字段
502+
}>()
500503
501504
const formLoading = ref(false) // 表单加载中
502505
const popOverVisible = ref({
@@ -554,6 +557,14 @@ const openReturnPopover = async () => {
554557
555558
/** 弹出气泡卡 */
556559
const openPopover = async (type: string) => {
560+
if (type === 'approve') {
561+
// 校验流程表单
562+
const valid = await validateNormalForm();
563+
if (!valid) {
564+
message.error('表单校验不通过,请先完善表单!!')
565+
return;
566+
}
567+
}
557568
Object.keys(popOverVisible.value).forEach((item) => {
558569
popOverVisible.value[item] = item === type
559570
})
@@ -565,24 +576,29 @@ const openPopover = async (type: string) => {
565576
const handleAudit = async (pass: boolean) => {
566577
formLoading.value = true
567578
try {
579+
// 校验审批表单
568580
const genericFormRef = proxy.$refs['formRef']
569-
// 1.2 校验表单
570581
const elForm = unref(genericFormRef)
571582
if (!elForm) return
572583
const valid = await elForm.validate()
573584
if (!valid) return
574-
575-
// 2.1 提交审批
585+
// 提交审批
576586
const data = {
577587
id: runningTask.value.id,
578-
reason: genericForm.value.reason
588+
reason: genericForm.value.reason,
579589
}
580590
if (pass) {
591+
// 获取修改的流程变量, 暂时只支持流程表单
592+
const variables = getUpdatedProcessInstanceVaiables();
593+
// 审批通过, 把修改的字段值赋于流程实例变量
594+
// @ts-ignore
595+
data.variables = variables
581596
// 审批通过,并且有额外的 approveForm 表单,需要校验 + 拼接到 data 表单里提交
582597
const formCreateApi = approveFormFApi.value
583598
if (Object.keys(formCreateApi)?.length > 0) {
584599
await formCreateApi.validate()
585600
// @ts-ignore
601+
// TODO 芋艿 任务有多表单这里要如何处理,会和可编辑的字段冲突
586602
data.variables = approveForm.value.value
587603
}
588604
await TaskApi.approveTask(data)
@@ -855,6 +871,30 @@ const loadTodoTask = (task: any) => {
855871
}
856872
}
857873
874+
/** 校验流程表单 */
875+
const validateNormalForm = async () => {
876+
if (props.processDefinition?.formType === BpmModelFormType.NORMAL) {
877+
let valid = true
878+
try {
879+
await props.normalFormApi?.validate()
880+
} catch {
881+
valid = false;
882+
}
883+
return valid;
884+
} else {
885+
return true;
886+
}
887+
}
888+
/** 从可以编辑的流程表单字段,获取需要修改的流程实例的变量 */
889+
const getUpdatedProcessInstanceVaiables = ()=> {
890+
const variables = {}
891+
props.writableFields.forEach( (field) => {
892+
const fieldValue = props.normalFormApi.getValue(field)
893+
variables[field] = fieldValue;
894+
})
895+
return variables
896+
}
897+
858898
defineExpose({ loadTodoTask })
859899
</script>
860900

src/views/bpm/processInstance/detail/index.vue

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
class="form-box flex flex-col mb-30px flex-1"
5050
>
5151
<!-- 情况一:流程表单 -->
52-
<el-col v-if="processDefinition?.formType === 10">
52+
<el-col v-if="processDefinition?.formType === BpmModelFormType.NORMAL">
5353
<form-create
5454
v-model="detailForm.value"
5555
v-model:api="fApi"
@@ -58,7 +58,7 @@
5858
/>
5959
</el-col>
6060
<!-- 情况二:业务表单 -->
61-
<div v-if="processDefinition?.formType === 20">
61+
<div v-if="processDefinition?.formType === BpmModelFormType.CUSTOM">
6262
<BusinessFormComponent :id="processInstance.businessKey" />
6363
</div>
6464
</div>
@@ -116,6 +116,9 @@
116116
:process-instance="processInstance"
117117
:process-definition="processDefinition"
118118
:userOptions="userOptions"
119+
:normal-form ="detailForm"
120+
:normal-form-api="fApi"
121+
:writable-fields="writableFields"
119122
@success="refresh"
120123
/>
121124
</div>
@@ -126,7 +129,7 @@
126129
<script lang="ts" setup>
127130
import { formatDate } from '@/utils/formatTime'
128131
import { DICT_TYPE } from '@/utils/dict'
129-
import { BpmModelType } from '@/utils/constants'
132+
import { BpmModelType,BpmModelFormType } from '@/utils/constants'
130133
import { setConfAndFields2 } from '@/utils/formCreate'
131134
import { registerComponent } from '@/utils/routerHelper'
132135
import type { ApiAttrs } from '@form-create/element-ui/types/config'
@@ -171,6 +174,9 @@ const detailForm = ref({
171174
value: {}
172175
}) // 流程实例的表单详情
173176
177+
// 表单可以编辑的字段
178+
const writableFields : Array<string> = [];
179+
174180
/** 获得详情 */
175181
const getDetail = () => {
176182
getApprovalDetail()
@@ -202,11 +208,12 @@ const getApprovalDetail = async () => {
202208
processDefinition.value = data.processDefinition
203209
204210
// 设置表单信息
205-
if (processDefinition.value.formType === 10) {
211+
if (processDefinition.value.formType === BpmModelFormType.NORMAL) {
206212
// 获取表单字段权限
207213
const formFieldsPermission = data.formFieldsPermission
208-
209-
if (detailForm.value.rule.length > 0) {
214+
// 清空可编辑字段为空
215+
writableFields.splice(0)
216+
if (detailForm.value.rule?.length > 0) {
210217
// 避免刷新 form-create 显示不了
211218
detailForm.value.value = processInstance.value.formVariables
212219
} else {
@@ -271,6 +278,8 @@ const setFieldPermission = (field: string, permission: string) => {
271278
if (permission === FieldPermissionType.WRITE) {
272279
//@ts-ignore
273280
fApi.value?.disabled(false, field)
281+
// 加入可以编辑的字段
282+
writableFields.push(field);
274283
}
275284
if (permission === FieldPermissionType.NONE) {
276285
//@ts-ignore
@@ -314,6 +323,7 @@ $process-header-height: 194px;
314323
overflow: auto;
315324
316325
.form-scroll-area {
326+
display: flex;
317327
height: calc(
318328
100vh - var(--top-tool-height) - var(--tags-view-height) - var(--app-footer-height) - 35px -
319329
$process-header-height - 40px
@@ -323,7 +333,6 @@ $process-header-height: 194px;
323333
$process-header-height - 40px
324334
);
325335
overflow: auto;
326-
display: flex;
327336
flex-direction: column;
328337
329338
:deep(.box-card) {

0 commit comments

Comments
 (0)