create.vue 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <template>
  2. <ContentWrap>
  3. <!-- 第一步,通过流程定义的列表,选择对应的流程 -->
  4. <div v-if="!selectProcessInstance">
  5. <XTable @register="registerTable">
  6. <!-- 流程分类 -->
  7. <template #category_default="{ row }">
  8. <DictTag :type="DICT_TYPE.BPM_MODEL_CATEGORY" :value="Number(row?.category)" />
  9. </template>
  10. <template #version_default="{ row }">
  11. <el-tag v-if="row">v{{ row.version }}</el-tag>
  12. </template>
  13. <template #actionbtns_default="{ row }">
  14. <XTextButton preIcon="ep:plus" title="选择" @click="handleSelect(row)" />
  15. </template>
  16. </XTable>
  17. </div>
  18. <!-- 第二步,填写表单,进行流程的提交 -->
  19. <div v-else>
  20. <el-card class="box-card">
  21. <div class="clearfix">
  22. <span class="el-icon-document">申请信息【{{ selectProcessInstance.name }}】</span>
  23. <XButton
  24. style="float: right"
  25. type="primary"
  26. preIcon="ep:delete"
  27. title="选择其它流程"
  28. @click="selectProcessInstance = undefined"
  29. />
  30. </div>
  31. <el-col :span="16" :offset="6" style="margin-top: 20px">
  32. <form-create
  33. :rule="detailForm.rule"
  34. v-model:api="fApi"
  35. :option="detailForm.option"
  36. @submit="submitForm"
  37. />
  38. </el-col>
  39. </el-card>
  40. <el-card class="box-card">
  41. <div class="clearfix">
  42. <span class="el-icon-picture-outline">流程图</span>
  43. </div>
  44. <!-- TODO 芋艿:待完成??? -->
  45. <my-process-viewer
  46. key="designer"
  47. v-model="bpmnXML"
  48. :value="bpmnXML"
  49. v-bind="bpmnControlForm"
  50. :prefix="bpmnControlForm.prefix"
  51. />
  52. </el-card>
  53. </div>
  54. </ContentWrap>
  55. </template>
  56. <script setup lang="ts">
  57. // 业务相关的 import
  58. import { allSchemas } from './process.create'
  59. import * as DefinitionApi from '@/api/bpm/definition'
  60. import * as ProcessInstanceApi from '@/api/bpm/processInstance'
  61. import { setConfAndFields2 } from '@/utils/formCreate'
  62. import { ApiAttrs } from '@form-create/element-ui/types/config'
  63. import { DICT_TYPE } from '@/utils/dict'
  64. const router = useRouter() // 路由
  65. const message = useMessage() // 消息
  66. // ========== 列表相关 ==========
  67. const [registerTable] = useXTable({
  68. allSchemas: allSchemas,
  69. params: {
  70. suspensionState: 1
  71. },
  72. getListApi: DefinitionApi.getProcessDefinitionListApi,
  73. isList: true
  74. })
  75. // ========== 表单相关 ==========
  76. const fApi = ref<ApiAttrs>()
  77. // 流程表单详情
  78. const detailForm = ref({
  79. rule: [],
  80. option: {}
  81. })
  82. // 流程表单
  83. const selectProcessInstance = ref() // 选择的流程实例
  84. /** 处理选择流程的按钮操作 **/
  85. const handleSelect = async (row) => {
  86. // 设置选择的流程
  87. selectProcessInstance.value = row
  88. // 情况一:流程表单
  89. if (row.formType == 10) {
  90. // 设置表单
  91. setConfAndFields2(detailForm, row.formConf, row.formFields)
  92. // 加载流程图
  93. DefinitionApi.getProcessDefinitionBpmnXMLApi(row.id).then((response) => {
  94. bpmnXML.value = response
  95. })
  96. // 情况二:业务表单
  97. } else if (row.formCustomCreatePath) {
  98. await router.push({
  99. path: row.formCustomCreatePath
  100. })
  101. // 这里暂时无需加载流程图,因为跳出到另外个 Tab;
  102. }
  103. }
  104. /** 提交按钮 */
  105. const submitForm = async (formData) => {
  106. if (!fApi.value || !selectProcessInstance.value) {
  107. return
  108. }
  109. // 提交请求
  110. fApi.value.btn.loading(true)
  111. try {
  112. await ProcessInstanceApi.createProcessInstanceApi({
  113. processDefinitionId: selectProcessInstance.value.id,
  114. variables: formData
  115. })
  116. // 提示
  117. message.success('发起流程成功')
  118. // this.$tab.closeOpenPage();
  119. router.go(-1)
  120. } finally {
  121. fApi.value.btn.loading(false)
  122. }
  123. }
  124. // ========== 流程图相关 ==========
  125. // // BPMN 数据
  126. const bpmnXML = ref(null)
  127. const bpmnControlForm = ref({
  128. prefix: 'flowable'
  129. })
  130. </script>
  131. <style lang="scss">
  132. .my-process-designer {
  133. height: calc(100vh - 200px);
  134. }
  135. .box-card {
  136. width: 100%;
  137. margin-bottom: 20px;
  138. }
  139. </style>