ElementBaseInfo.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <template>
  2. <div class="panel-tab__content">
  3. <el-form label-width="90px" :model="needProps" :rules="rules">
  4. <div v-if="needProps.type == 'bpmn:Process'">
  5. <!-- 如果是 Process 信息的时候,使用自定义表单 -->
  6. <el-link
  7. href="https://doc.iocoder.cn/bpm/#_3-%E6%B5%81%E7%A8%8B%E5%9B%BE%E7%A4%BA%E4%BE%8B"
  8. type="danger"
  9. target="_blank"
  10. >如何实现实现会签、或签?</el-link
  11. >
  12. <el-form-item label="流程标识" prop="id">
  13. <el-input
  14. v-model="needProps.id"
  15. placeholder="请输入流标标识"
  16. :disabled="needProps.id !== undefined && needProps.id.length > 0"
  17. @change="handleKeyUpdate"
  18. />
  19. </el-form-item>
  20. <el-form-item label="流程名称" prop="name">
  21. <el-input
  22. v-model="needProps.name"
  23. placeholder="请输入流程名称"
  24. clearable
  25. @change="handleNameUpdate"
  26. />
  27. </el-form-item>
  28. </div>
  29. <div v-else>
  30. <el-form-item label="ID">
  31. <el-input v-model="elementBaseInfo.id" clearable @change="updateBaseInfo('id')" />
  32. </el-form-item>
  33. <el-form-item label="名称">
  34. <el-input v-model="elementBaseInfo.name" clearable @change="updateBaseInfo('name')" />
  35. </el-form-item>
  36. </div>
  37. </el-form>
  38. </div>
  39. </template>
  40. <script setup lang="ts" name="ElementBaseInfo">
  41. import { ref, reactive, watch, onMounted, onBeforeUnmount, toRaw } from 'vue'
  42. import { ElLink, ElForm, ElFormItem, ElInput } from 'element-plus'
  43. const props = defineProps({
  44. businessObject: Object,
  45. model: Object // 流程模型的数据
  46. })
  47. const needProps = ref({})
  48. const bpmnElement = ref()
  49. const elementBaseInfo = ref({})
  50. // 流程表单的下拉框的数据
  51. // const forms = ref([])
  52. // 流程模型的校验
  53. const rules = reactive({
  54. id: [{ required: true, message: '流程标识不能为空', trigger: 'blur' }],
  55. name: [{ required: true, message: '流程名称不能为空', trigger: 'blur' }]
  56. })
  57. const resetBaseInfo = () => {
  58. console.log(window, 'window')
  59. console.log(bpmnElement, 'bpmnElement')
  60. bpmnElement.value = window?.bpmnInstances?.bpmnElement
  61. console.log(bpmnElement.value, 'resetBaseInfo11111111111')
  62. elementBaseInfo.value = bpmnElement.value.businessObject
  63. needProps.value['type'] = bpmnElement.value.businessObject.$type
  64. // elementBaseInfo.value['typess'] = bpmnElement.value.businessObject.$type
  65. // elementBaseInfo.value = JSON.parse(JSON.stringify(bpmnElement.value.businessObject))
  66. console.log(elementBaseInfo.value, 'elementBaseInfo22222222222')
  67. }
  68. const handleKeyUpdate = (value) => {
  69. // 校验 value 的值,只有 XML NCName 通过的情况下,才进行赋值。否则,会导致流程图报错,无法绘制的问题
  70. if (!value) {
  71. return
  72. }
  73. if (!value.match(/[a-zA-Z_][\-_.0-9a-zA-Z$]*/)) {
  74. console.log('key 不满足 XML NCName 规则,所以不进行赋值')
  75. return
  76. }
  77. console.log('key 满足 XML NCName 规则,所以进行赋值')
  78. // 在 BPMN 的 XML 中,流程标识 key,其实对应的是 id 节点
  79. elementBaseInfo.value['id'] = value
  80. updateBaseInfo('id')
  81. }
  82. const handleNameUpdate = (value) => {
  83. console.log(elementBaseInfo, 'elementBaseInfo')
  84. if (!value) {
  85. return
  86. }
  87. elementBaseInfo.value['name'] = value
  88. updateBaseInfo('name')
  89. }
  90. // const handleDescriptionUpdate=(value)=> {
  91. // TODO 芋艿:documentation 暂时无法修改,后续在看看
  92. // this.elementBaseInfo['documentation'] = value;
  93. // this.updateBaseInfo('documentation');
  94. // }
  95. const updateBaseInfo = (key) => {
  96. console.log(key, 'key')
  97. // 触发 elementBaseInfo 对应的字段
  98. const attrObj = Object.create(null)
  99. // console.log(attrObj, 'attrObj')
  100. attrObj[key] = elementBaseInfo.value[key]
  101. // console.log(attrObj, 'attrObj111')
  102. // const attrObj = {
  103. // id: elementBaseInfo.value[key]
  104. // // di: { id: `${elementBaseInfo.value[key]}_di` }
  105. // }
  106. console.log(elementBaseInfo, 'elementBaseInfo11111111111')
  107. needProps.value = { ...elementBaseInfo.value, ...needProps.value }
  108. if (key === 'id') {
  109. console.log('jinru')
  110. console.log(window, 'window')
  111. console.log(bpmnElement.value, 'bpmnElement')
  112. console.log(toRaw(bpmnElement.value), 'bpmnElement')
  113. window.bpmnInstances.modeling.updateProperties(toRaw(bpmnElement.value), {
  114. id: elementBaseInfo.value[key],
  115. di: { id: `${elementBaseInfo.value[key]}_di` }
  116. })
  117. } else {
  118. console.log(attrObj, 'attrObj')
  119. window.bpmnInstances.modeling.updateProperties(bpmnElement.value, attrObj)
  120. }
  121. }
  122. onMounted(() => {
  123. // 针对上传的 bpmn 流程图时,需要延迟 1 秒的时间,保证 key 和 name 的更新
  124. setTimeout(() => {
  125. console.log(props.model, 'props.model')
  126. handleKeyUpdate(props.model.key)
  127. handleNameUpdate(props.model.name)
  128. console.log(props, 'propsssssssssssssssssssss')
  129. }, 1000)
  130. })
  131. watch(
  132. () => props.businessObject,
  133. (val) => {
  134. console.log(val, 'val11111111111111111111')
  135. if (val) {
  136. // nextTick(() => {
  137. resetBaseInfo()
  138. // })
  139. }
  140. }
  141. )
  142. // watch(
  143. // () => ({ ...props }),
  144. // (oldVal, newVal) => {
  145. // console.log(oldVal, 'oldVal')
  146. // console.log(newVal, 'newVal')
  147. // if (newVal) {
  148. // needProps.value = newVal
  149. // }
  150. // },
  151. // {
  152. // immediate: true
  153. // }
  154. // )
  155. // 'model.key': {
  156. // immediate: false,
  157. // handler: function (val) {
  158. // this.handleKeyUpdate(val)
  159. // }
  160. // }
  161. onBeforeUnmount(() => {
  162. bpmnElement.value = null
  163. })
  164. </script>