create.vue 5.42 KB
Newer Older
sunhongwei's avatar
sunhongwei committed
1 2 3 4 5
<template>
  <div class="app-container">
    <!-- 第一步,通过流程定义的列表,选择对应的流程 -->
    <div v-if="!selectProcessInstance">
      <el-table v-loading="loading" :data="list">
dragondean@qq.com's avatar
dragondean@qq.com committed
6
        <el-table-column :label="$t('流程名称')" align="center" prop="name" width="200">
sunhongwei's avatar
sunhongwei committed
7 8 9 10 11 12
          <template slot-scope="scope">
            <el-button type="text" @click="handleBpmnDetail(scope.row)">
              <span>{{ scope.row.name }}</span>
            </el-button>
          </template>
        </el-table-column>
dragondean@qq.com's avatar
dragondean@qq.com committed
13
        <el-table-column :label="$t('流程分类')" align="center" prop="category" width="100">
sunhongwei's avatar
sunhongwei committed
14 15 16 17
          <template slot-scope="scope">
            <dict-tag :type="DICT_TYPE.BPM_MODEL_CATEGORY" :value="scope.row.category" />
          </template>
        </el-table-column>
dragondean@qq.com's avatar
dragondean@qq.com committed
18
        <el-table-column :label="$t('流程版本')" align="center" prop="processDefinition.version" width="80">
sunhongwei's avatar
sunhongwei committed
19 20 21 22
          <template slot-scope="scope">
            <el-tag size="medium" v-if="scope.row">v{{ scope.row.version }}</el-tag>
          </template>
        </el-table-column>
dragondean@qq.com's avatar
dragondean@qq.com committed
23 24
        <el-table-column :label="$t('流程描述')" align="center" prop="description" width="300" show-overflow-tooltip />
        <el-table-column :label="$t('操作')" align="center" class-name="small-padding fixed-width">
sunhongwei's avatar
sunhongwei committed
25
          <template slot-scope="scope">
dragondean@qq.com's avatar
dragondean@qq.com committed
26
            <el-button type="text" size="small" icon="el-icon-plus" @click="handleSelect(scope.row)">{{$t('选择')}}</el-button>
sunhongwei's avatar
sunhongwei committed
27 28 29 30 31 32 33 34
          </template>
        </el-table-column>
      </el-table>
    </div>
    <!-- 第二步,填写表单,进行流程的提交 -->
    <div v-else>
      <el-card class="box-card" >
        <div slot="header" class="clearfix">
dragondean@qq.com's avatar
dragondean@qq.com committed
35 36
          <span class="el-icon-document">{{$t('申请信息')}}【{{ selectProcessInstance.name }}】</span>
          <el-button style="float: right;" type="primary" @click="selectProcessInstance = undefined">{{$t('选择其它流程')}}</el-button>
sunhongwei's avatar
sunhongwei committed
37 38 39 40 41 42 43 44 45
        </div>
        <el-col :span="16" :offset="6">
          <div>
            <parser :key="new Date().getTime()" :form-conf="detailForm" @submit="submitForm" />
          </div>
        </el-col>
      </el-card>
      <el-card class="box-card">
        <div slot="header" class="clearfix">
dragondean@qq.com's avatar
dragondean@qq.com committed
46
          <span class="el-icon-picture-outline">{{$t('流程图')}}</span>
sunhongwei's avatar
sunhongwei committed
47 48 49 50 51 52 53 54 55
        </div>
        <my-process-viewer key="designer" v-model="bpmnXML" v-bind="bpmnControlForm" />
      </el-card>
    </div>

  </div>
</template>

<script>
chenjiuping's avatar
chenjiuping committed
56 57 58 59 60
import {
  getProcessDefinitionBpmnXML,
  getProcessDefinitionBpmnXMLByKey,
  getProcessDefinitionList
} from "@/api/bpm/definition";
sunhongwei's avatar
sunhongwei committed
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
import {DICT_TYPE, getDictDatas} from "@/utils/dict";
import {getForm} from "@/api/bpm/form";
import {decodeFields} from "@/utils/formGenerator";
import Parser from '@/components/parser/Parser'
import {createProcessInstance, getMyProcessInstancePage} from "@/api/bpm/processInstance";

// 流程实例的发起
export default {
  name: "ProcessInstanceCreate",
  components: {
    Parser
  },
  data() {
    return {
      // 遮罩层
      loading: true,
      // 表格数据
      list: [],

      // 流程表单详情
      detailForm: {
        fields: []
      },

      // BPMN 数据
      bpmnXML: null,
      bpmnControlForm: {
        prefix: "activiti"
      },

      // 流程表单
      selectProcessInstance: undefined, // 选择的流程实例

      // 数据字典
      categoryDictDatas: getDictDatas(DICT_TYPE.BPM_MODEL_CATEGORY),
    };
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询流程定义列表 */
    getList() {
      this.loading = true;
      getProcessDefinitionList({
        suspensionState: 1
      }).then(response => {
          this.list = response.data
          this.loading = false
        }
      );
    },
    /** 处理选择流程的按钮操作 **/
    handleSelect(row) {
      // 设置选择的流程
      this.selectProcessInstance = row;

      // 流程表单
      if (row.formId) {
        // 设置对应的表单
        this.detailForm = {
          ...JSON.parse(row.formConf),
          fields: decodeFields(row.formFields)
        }
        // 加载流程图
        getProcessDefinitionBpmnXML(row.id).then(response => {
          this.bpmnXML = response.data
        })
chenjiuping's avatar
chenjiuping committed
129 130 131
        /*getProcessDefinitionBpmnXMLByKey("sheet_sale").then(response => {
          this.bpmnXML = response.data
        })*/
sunhongwei's avatar
sunhongwei committed
132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
      } else if (row.formCustomCreatePath) {
        this.$router.push({ path: row.formCustomCreatePath});
        // 这里暂时无需加载流程图,因为跳出到另外个 Tab;
      }
    },
    /** 提交按钮 */
    submitForm(params) {
      if (!params) {
        return;
      }
      // 设置表单禁用
      const conf = params.conf;
      conf.disabled = true; // 表单禁用
      conf.formBtns = false; // 按钮隐藏

      // 提交表单,创建流程
      const variables = params.values;
      createProcessInstance({
        processDefinitionId: this.selectProcessInstance.id,
        variables: variables
      }).then(response => {
        this.$modal.msgSuccess("发起流程成功");
        // 关闭当前窗口
        this.$tab.closeOpenPage();
        this.$router.go(-1);
      }).catch(() => {
        conf.disabled = false; // 表单开启
        conf.formBtns = true; // 按钮展示
      })
    },
  }
};
</script>

<style lang="scss">
167
/* .my-process-designer {
sunhongwei's avatar
sunhongwei committed
168
  height: calc(100vh - 200px);
169
} */
sunhongwei's avatar
sunhongwei committed
170 171 172 173 174 175

.box-card {
  width: 100%;
  margin-bottom: 20px;
}
</style>