ElementBaseInfo.vue 5.5 KB

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