index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. <!-- 流程图预览 -->
  41. <ProcessInstanceBpmnViewer :bpmn-xml="bpmnXML" />
  42. </div>
  43. </ContentWrap>
  44. </template>
  45. <script setup lang="ts">
  46. import { DICT_TYPE } from '@/utils/dict'
  47. // 业务相关的 import
  48. import { allSchemas } from './process.create'
  49. import * as DefinitionApi from '@/api/bpm/definition'
  50. import * as ProcessInstanceApi from '@/api/bpm/processInstance'
  51. import { setConfAndFields2 } from '@/utils/formCreate'
  52. import type { ApiAttrs } from '@form-create/element-ui/types/config'
  53. import ProcessInstanceBpmnViewer from '../detail/ProcessInstanceBpmnViewer.vue'
  54. const router = useRouter() // 路由
  55. const message = useMessage() // 消息
  56. // ========== 列表相关 ==========
  57. const [registerTable] = useXTable({
  58. allSchemas: allSchemas,
  59. params: {
  60. suspensionState: 1
  61. },
  62. getListApi: DefinitionApi.getProcessDefinitionList,
  63. isList: true
  64. })
  65. // ========== 表单相关 ==========
  66. const fApi = ref<ApiAttrs>()
  67. // 流程表单详情
  68. const detailForm = ref({
  69. rule: [],
  70. option: {}
  71. })
  72. // 流程表单
  73. const selectProcessInstance = ref() // 选择的流程实例
  74. /** 处理选择流程的按钮操作 **/
  75. const handleSelect = async (row) => {
  76. // 设置选择的流程
  77. selectProcessInstance.value = row
  78. // 情况一:流程表单
  79. if (row.formType == 10) {
  80. // 设置表单
  81. setConfAndFields2(detailForm, row.formConf, row.formFields)
  82. // 加载流程图
  83. DefinitionApi.getProcessDefinitionBpmnXML(row.id).then((response) => {
  84. bpmnXML.value = response
  85. })
  86. // 情况二:业务表单
  87. } else if (row.formCustomCreatePath) {
  88. await router.push({
  89. path: row.formCustomCreatePath
  90. })
  91. // 这里暂时无需加载流程图,因为跳出到另外个 Tab;
  92. }
  93. }
  94. /** 提交按钮 */
  95. const submitForm = async (formData) => {
  96. if (!fApi.value || !selectProcessInstance.value) {
  97. return
  98. }
  99. // 提交请求
  100. fApi.value.btn.loading(true)
  101. try {
  102. await ProcessInstanceApi.createProcessInstanceApi({
  103. processDefinitionId: selectProcessInstance.value.id,
  104. variables: formData
  105. })
  106. // 提示
  107. message.success('发起流程成功')
  108. router.go(-1)
  109. } finally {
  110. fApi.value.btn.loading(false)
  111. }
  112. }
  113. // ========== 流程图相关 ==========
  114. // // BPMN 数据
  115. const bpmnXML = ref(null)
  116. </script>