gaoluyang
2026-06-29 27cd042df9aca0383a49f3514bc21958dd890912
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<script lang="ts" setup>
import { computed, inject, nextTick, onMounted, ref, toRaw, watch } from 'vue';
 
import { cloneDeep } from '../../../../../../../packages/utils/src';
 
import { Form, FormItem, Select } from 'ant-design-vue';
 
import { getFormSimpleList } from '#/api/bpm/form';
 
defineOptions({ name: 'ElementForm' });
 
const props = defineProps({
  id: {
    type: String,
    default: '',
  },
  type: {
    type: String,
    default: '',
  },
});
const prefix = inject('prefix');
 
const formKey = ref<number | string | undefined>(undefined);
const businessKey = ref('');
const fieldList = ref<any[]>([]);
const bpmnELement = ref();
const elExtensionElements = ref();
const formData = ref();
const otherExtensions = ref();
 
const bpmnInstances = () => (window as any)?.bpmnInstances;
const resetFormList = () => {
  bpmnELement.value = bpmnInstances().bpmnElement;
  formKey.value = bpmnELement.value.businessObject.formKey;
  // if (formKey.value?.length > 0) {
  //   formKey.value = parseInt(formKey.value)
  // }
  // 获取元素扩展属性 或者 创建扩展属性
  elExtensionElements.value =
    bpmnELement.value.businessObject.get('extensionElements') ||
    bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] });
  // 获取元素表单配置 或者 创建新的表单配置
  formData.value =
    elExtensionElements.value.values.find(
      (ex: any) => ex.$type === `${prefix}:FormData`,
    ) || bpmnInstances().moddle.create(`${prefix}:FormData`, { fields: [] });
 
  // 业务标识 businessKey, 绑定在 formData 中
  businessKey.value = formData.value.businessKey;
 
  // 保留剩余扩展元素,便于后面更新该元素对应属性
  otherExtensions.value = elExtensionElements.value.values.filter(
    (ex: any) => ex.$type !== `${prefix}:FormData`,
  );
 
  // 复制原始值,填充表格
  fieldList.value = cloneDeep(formData.value.fields || []);
 
  // 更新元素扩展属性,避免后续报错
  updateElementExtensions();
};
const updateElementFormKey = () => {
  bpmnInstances().modeling.updateProperties(toRaw(bpmnELement.value), {
    formKey: formKey.value,
  });
};
const _updateElementBusinessKey = () => {
  bpmnInstances().modeling.updateModdleProperties(
    toRaw(bpmnELement.value),
    formData.value,
    {
      businessKey: businessKey.value,
    },
  );
};
 
const updateElementExtensions = () => {
  // 更新回扩展元素
  const newElExtensionElements = bpmnInstances().moddle.create(
    `bpmn:ExtensionElements`,
    {
      values: [...otherExtensions.value, formData.value],
    },
  );
  // 更新到元素上
  bpmnInstances().modeling.updateProperties(toRaw(bpmnELement.value), {
    extensionElements: newElExtensionElements,
  });
};
 
const formList = ref<any[]>([]); // 流程表单的下拉框的数据
const formOptions = computed(() => {
  return formList.value.map((form: any) => ({
    value: form.id,
    label: form.name,
  }));
});
 
onMounted(async () => {
  formList.value = await getFormSimpleList();
  formKey.value = formKey.value
    ? Number.parseInt(formKey.value as string)
    : undefined;
});
 
watch(
  () => props.id,
  (val: any) => {
    val &&
      val.length > 0 &&
      nextTick(() => {
        resetFormList();
      });
  },
  { immediate: true },
);
</script>
 
<template>
  <div class="panel-tab__content">
    <Form>
      <FormItem label="流程表单">
        <!--        <Input v-model:value="formKey" @change="updateElementFormKey" />-->
        <Select
          v-model:value="formKey"
          allow-clear
          @change="updateElementFormKey"
          :options="formOptions"
        />
      </FormItem>
      <FormItem label="业务标识">
        <Select
          v-model:value="businessKey"
          @change="_updateElementBusinessKey"
          allow-clear
        >
          <Select.Option v-for="i in fieldList" :key="i.id" :value="i.id">
            {{ i.label }}
          </Select.Option>
          <Select.Option value="">无</Select.Option>
        </Select>
      </FormItem>
    </Form>
  </div>
</template>