ElementBaseInfo.vue 5.4 KB

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