commonPanel.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. <template>
  2. <div>
  3. <el-form :model="bpmnFormData" label-width="80px" :rules="rules" size="small">
  4. <el-form-item :label="bpmnFormData.$type === 'bpmn:Process'? '流程标识': '节点ID'" prop="id">
  5. <el-input v-model="bpmnFormData.id" @change="updateElementTask('id')"/>
  6. </el-form-item>
  7. <el-form-item :label="bpmnFormData.$type === 'bpmn:Process'? '流程名称': '节点名称'" prop="name">
  8. <el-input v-model="bpmnFormData.name" @change="updateElementTask('name')"/>
  9. </el-form-item>
  10. <!--流程的基础属性-->
  11. <template v-if="bpmnFormData.$type === 'bpmn:Process'">
  12. <el-form-item label="流程分类" prop="processCategory">
  13. <el-select v-model="bpmnFormData.processCategory" placeholder="请选择流程分类" @change="updateElementTask('processCategory')">
  14. <el-option
  15. v-for="dict in dict.type.sys_process_category"
  16. :key="dict.value"
  17. :label="dict.label"
  18. :value="dict.value"
  19. ></el-option>
  20. </el-select>
  21. </el-form-item>
  22. </template>
  23. <el-form-item v-if="bpmnFormData.$type === 'bpmn:SubProcess'" label="状态">
  24. <el-switch v-model="bpmnFormData.isExpanded" active-text="展开" inactive-text="折叠" @change="updateElementTask('isExpanded')" />
  25. </el-form-item>
  26. <el-form-item label="节点描述">
  27. <el-input
  28. :rows="2"
  29. type="textarea"
  30. v-model="bpmnFormData.documentationValue"
  31. @change="updateDocumentation"
  32. />
  33. </el-form-item>
  34. </el-form>
  35. </div>
  36. </template>
  37. <script>
  38. import {StrUtil} from '@/utils/StrUtil'
  39. export default {
  40. name: "CommonPanel",
  41. dicts: ['sys_process_category'],
  42. /** 组件传值 */
  43. props : {
  44. id: {
  45. type: String,
  46. required: true
  47. },
  48. },
  49. data() {
  50. return {
  51. rules:{
  52. id: [
  53. { required: true, message: '节点Id 不能为空', trigger: 'blur' },
  54. ],
  55. name: [
  56. { required: true, message: '节点名称不能为空', trigger: 'blur' },
  57. ],
  58. },
  59. bpmnFormData: {}
  60. }
  61. },
  62. /** 传值监听 */
  63. watch: {
  64. id: {
  65. handler(newVal) {
  66. if (StrUtil.isNotBlank(newVal)) {
  67. this.resetTaskForm();
  68. }
  69. },
  70. immediate: true, // 立即生效
  71. },
  72. },
  73. created() {
  74. },
  75. methods: {
  76. resetTaskForm() {
  77. // this.bpmnFormData = JSON.parse(JSON.stringify(this.modelerStore.element.businessObject));
  78. this.bpmnFormData = Object.assign({}, this.modelerStore.element.businessObject);
  79. // 使用 $set 确保 documentationValue 是响应式的
  80. this.$set(this.bpmnFormData, 'documentationValue', this.modelerStore.element.businessObject.documentation?.[0]?.text || '');
  81. },
  82. updateElementTask(key) {
  83. const taskAttr = Object.create(null);
  84. taskAttr[key] = this.bpmnFormData[key] || null;
  85. this.modelerStore.modeling.updateProperties(this.modelerStore.element, taskAttr);
  86. },
  87. updateDocumentation() {
  88. // 确保 modelerStore 是 BPMN.js 的 Modeler 实例
  89. const modeler = this.modelerStore.modeler; // 获取实际的 modeler 实例
  90. const moddle = modeler.get('moddle'); // 通过 modeler 获取 moddle
  91. const modeling = modeler.get('modeling'); // 通过 modeler 获取 modeling
  92. // 创建新的文档对象
  93. const documentation = moddle.create('bpmn:Documentation', {
  94. text: this.bpmnFormData.documentationValue
  95. });
  96. // 获取当前元素的扩展元素
  97. let extensionElements = this.modelerStore.element.businessObject.extensionElements;
  98. if (!extensionElements) {
  99. // 如果没有扩展元素,创建一个新的
  100. extensionElements = moddle.create('bpmn:ExtensionElements', {
  101. values: []
  102. });
  103. }
  104. // 更新文档
  105. modeling.updateProperties(this.modelerStore.element, {
  106. documentation: [documentation],
  107. extensionElements: extensionElements
  108. });
  109. // 强制更新模型
  110. this.modelerStore.modeler.get('commandStack').execute('element.updateProperties', {
  111. element: this.modelerStore.element,
  112. properties: {
  113. documentation: [documentation]
  114. }
  115. });
  116. this.$emit('save');
  117. }
  118. }
  119. }
  120. </script>