SubProcessPanel.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <div>
  3. <el-form ref="formRef" :model="formData" :rules="formRules" label-width="90px">
  4. <el-collapse v-model="currentCollapseItem">
  5. <el-collapse-item name="1">
  6. <template #title>
  7. <div class="collapse__title">
  8. <el-icon>
  9. <InfoFilled />
  10. </el-icon>
  11. 常规
  12. </div>
  13. </template>
  14. <div>
  15. <el-form-item prop="id" label="节点 ID">
  16. <el-input v-model="formData.id" @change="idChange"> </el-input>
  17. </el-form-item>
  18. <el-form-item prop="name" label="节点名称">
  19. <el-input v-model="formData.name" @change="nameChange"> </el-input>
  20. </el-form-item>
  21. </div>
  22. </el-collapse-item>
  23. <el-collapse-item name="2">
  24. <template #title>
  25. <div class="collapse__title">
  26. <el-icon>
  27. <BellFilled />
  28. </el-icon>
  29. 执行监听器
  30. </div>
  31. </template>
  32. <div>
  33. <ExecutionListener :element="element"></ExecutionListener>
  34. </div>
  35. </el-collapse-item>
  36. <el-collapse-item name="3">
  37. <template #title>
  38. <div class="collapse__title">
  39. <el-icon>
  40. <HelpFilled />
  41. </el-icon>
  42. 多实例
  43. </div>
  44. </template>
  45. <div>
  46. <el-form-item label="多实例类型">
  47. <el-select v-model="formData.multiInstanceType" @change="multiInstanceTypeChange">
  48. <el-option v-for="item in constant.MultiInstanceType" :key="item.id" :value="item.value" :label="item.label"> </el-option>
  49. </el-select>
  50. </el-form-item>
  51. <div v-if="formData.multiInstanceType !== MultiInstanceTypeEnum.NONE">
  52. <el-form-item label="集合">
  53. <template #label>
  54. <span>
  55. 集合
  56. <el-tooltip placement="top">
  57. <el-icon><QuestionFilled /></el-icon>
  58. <template #content>
  59. 属性会作为表达式进行解析。如果表达式解析为字符串而不是一个集合,<br />
  60. 不论是因为本身配置的就是静态字符串值,还是表达式计算结果为字符串,<br />
  61. 这个字符串都会被当做变量名,并从流程变量中用于获取实际的集合。
  62. </template>
  63. </el-tooltip>
  64. </span>
  65. </template>
  66. <el-input v-model="formData.collection" @change="collectionChange"></el-input>
  67. </el-form-item>
  68. <el-form-item label="元素变量">
  69. <template #label>
  70. <span>
  71. 元素变量
  72. <el-tooltip placement="top">
  73. <el-icon><QuestionFilled /></el-icon>
  74. <template #content>
  75. 每创建一个用户任务前,先以该元素变量为label,集合中的一项为value,<br />
  76. 创建(局部)流程变量,该局部流程变量被用于指派用户任务。<br />
  77. 一般来说,该字符串应与指定人员变量相同。
  78. </template>
  79. </el-tooltip>
  80. </span>
  81. </template>
  82. <el-input v-model="formData.elementVariable" @change="elementVariableChange"> </el-input>
  83. </el-form-item>
  84. <el-form-item label="完成条件">
  85. <template #label>
  86. <span>
  87. 完成条件
  88. <el-tooltip placement="top">
  89. <el-icon><QuestionFilled /></el-icon>
  90. <template #content>
  91. 多实例活动在所有实例都完成时结束,然而也可以指定一个表达式,在每个实例<br />
  92. 结束时进行计算。当表达式计算为true时,将销毁所有剩余的实例,并结束多实例<br />
  93. 活动,继续执行流程。例如 ${nrOfCompletedInstances/nrOfInstances >= 0.6 },<br />
  94. 表示当任务完成60%时,该节点就算完成
  95. </template>
  96. </el-tooltip>
  97. </span>
  98. </template>
  99. <el-input v-model="formData.completionCondition" @change="completionConditionChange"> </el-input>
  100. </el-form-item>
  101. </div>
  102. </div>
  103. </el-collapse-item>
  104. </el-collapse>
  105. </el-form>
  106. </div>
  107. </template>
  108. <script setup lang="ts">
  109. import ExecutionListener from './property/ExecutionListener.vue';
  110. import useParseElement from '../hooks/useParseElement';
  111. import usePanel from '../hooks/usePanel';
  112. import type { ModdleElement } from 'bpmn';
  113. import type { SubProcessPanel } from 'bpmnDesign';
  114. import { MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums';
  115. interface PropType {
  116. element: ModdleElement;
  117. }
  118. const props = withDefaults(defineProps<PropType>(), {});
  119. const { nameChange, idChange, updateProperties, createModdleElement, constant } = usePanel({
  120. element: toRaw(props.element)
  121. });
  122. const { parseData } = useParseElement({
  123. element: toRaw(props.element)
  124. });
  125. const formData = ref(parseData<SubProcessPanel>());
  126. const currentCollapseItem = ref(['1', '2', '3']);
  127. const multiInstanceTypeChange = (newVal) => {
  128. if (newVal !== MultiInstanceTypeEnum.NONE) {
  129. let loopCharacteristics = props.element.businessObject.get('loopCharacteristics');
  130. if (!loopCharacteristics) {
  131. loopCharacteristics = createModdleElement('bpmn:MultiInstanceLoopCharacteristics', {}, props.element.businessObject);
  132. }
  133. loopCharacteristics.isSequential = newVal === MultiInstanceTypeEnum.SERIAL;
  134. updateProperties({ loopCharacteristics: loopCharacteristics });
  135. } else {
  136. updateProperties({ loopCharacteristics: undefined });
  137. }
  138. };
  139. const collectionChange = (newVal) => {
  140. let loopCharacteristics = props.element.businessObject.get('loopCharacteristics');
  141. if (!loopCharacteristics) {
  142. loopCharacteristics = createModdleElement('bpmn:MultiInstanceLoopCharacteristics', {}, props.element.businessObject);
  143. }
  144. loopCharacteristics.collection = newVal && newVal.length > 0 ? newVal : undefined;
  145. updateProperties({ loopCharacteristics: loopCharacteristics });
  146. };
  147. const elementVariableChange = (newVal) => {
  148. let loopCharacteristics = props.element.businessObject.get('loopCharacteristics');
  149. if (!loopCharacteristics) {
  150. loopCharacteristics = createModdleElement('bpmn:MultiInstanceLoopCharacteristics', {}, props.element.businessObject);
  151. }
  152. loopCharacteristics.elementVariable = newVal && newVal.length > 0 ? newVal : undefined;
  153. updateProperties({ loopCharacteristics: loopCharacteristics });
  154. };
  155. const completionConditionChange = (newVal) => {
  156. let loopCharacteristics = props.element.businessObject.get<ModdleElement>('loopCharacteristics');
  157. if (!loopCharacteristics) {
  158. loopCharacteristics = createModdleElement('bpmn:MultiInstanceLoopCharacteristics', {}, props.element.businessObject);
  159. }
  160. if (newVal && newVal.length > 0) {
  161. if (!loopCharacteristics.completionCondition) {
  162. loopCharacteristics.completionCondition = createModdleElement('bpmn:Expression', { body: newVal }, loopCharacteristics);
  163. } else {
  164. loopCharacteristics.completionCondition.body = newVal;
  165. }
  166. } else {
  167. loopCharacteristics.completionCondition = undefined;
  168. }
  169. updateProperties({ loopCharacteristics: loopCharacteristics });
  170. };
  171. onBeforeMount(() => {
  172. if (formData.value.loopCharacteristics) {
  173. const loopCharacteristics = formData.value.loopCharacteristics;
  174. formData.value.collection = loopCharacteristics.collection || '';
  175. formData.value.elementVariable = loopCharacteristics.elementVariable || '';
  176. formData.value.completionCondition = loopCharacteristics.completionCondition?.body || '';
  177. formData.value.multiInstanceType = loopCharacteristics.isSequential ? MultiInstanceTypeEnum.SERIAL : MultiInstanceTypeEnum.PARALLEL;
  178. }
  179. });
  180. const formRules = ref<ElFormRules>({
  181. id: [{ required: true, message: '请输入', trigger: 'blur' }],
  182. name: [{ required: true, message: '请输入', trigger: 'blur' }]
  183. });
  184. </script>
  185. <style lang="scss" scoped></style>