yangbifan před 2 roky
rodič
revize
3e3b567c0b

+ 420 - 0
src/pages/main/processinst/doDistribution.vue

@@ -0,0 +1,420 @@
+<template>
+  <el-dialog title="权限分配" width="90%" top="1%" v-if="visible" :visible.sync="visible"  append-to-body>
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <el-card>
+          <el-button @click="loadSingleBpmn" type="primary">初始化</el-button>
+          <el-table
+            class="mb20"
+            :data="tableData3"
+            :header-cell-style="{background:'#e0f3ff',color:'#5f95b7'}"
+
+            border
+            stripe
+            :highlight-current-row="true"
+            style="width: 100%"
+            @cell-click="cellClick"
+          >
+
+            <el-table-column align="center" prop="id" label="ID"></el-table-column>
+            <el-table-column align="center" prop="procdefkey" label="流程定义key"></el-table-column>
+            <el-table-column align="center" prop="procdefname" label="流程定义名称"></el-table-column>
+             <el-table-column align="center" prop="taskdefkey" label="任务key"></el-table-column>
+            <el-table-column align="center" prop="taskname" label="名称"></el-table-column>
+            <el-table-column align="center" prop="usergroup" label="角色"></el-table-column>
+            <el-table-column align="center" prop="candidateids" label="受理人"></el-table-column>
+
+          </el-table>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12">
+        <el-card>
+          <el-button @click="doSure" type="primary">确认分配</el-button>
+          <div style="margin-top: 20px" v-if="comms">
+            <el-radio-group v-model="taskType"  size="small">
+              <el-radio label="1" border>固定受理人(唯一)</el-radio>
+              <el-radio label="2" border>固定候选人(多个)</el-radio>
+              <el-radio label="3" border>固定候选组(多个)</el-radio>
+              <!-- <el-radio label="4" border>动态指定人</el-radio> -->
+            </el-radio-group>
+          </div>
+
+          <el-form class="mt20" :model="model" v-if="taskType==1||taskType==2"  ref="form1" label-width="100px" >
+        <el-row :gutter="20">
+          <el-col :span="16" >
+            <el-form-item  label="审核角色"   prop="data1"  >
+              <el-select  v-model="model.data1" :multiple="taskType==2" @remove-tag ="removeTag"  placeholder="请选择..." @change="role">
+              <el-option
+                    v-for="item in tableData2"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="16">
+            <el-form-item  label="审核人"  prop="nextDealMan">
+              <el-select  v-model="model.nextDealMan"  :multiple="taskType==2"  placeholder="请选择...">
+              <el-option
+                    v-for="item in options2"
+                    :key="item.id"
+                    :label="item.name"
+                    :value="item.id"
+                  ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+
+        </el-row>
+
+      </el-form>
+          <el-table
+            v-if="taskType==4||taskType==3"
+            class="mb20 mt20"
+            :data="tableData2"
+            height="500px"
+            :header-cell-style="{background:'#e0f3ff',color:'#5f95b7'}"
+            border
+            stripe
+            ref="roleTable"
+
+            :highlight-current-row="true"
+            style="width: 100%"
+          >
+            <el-table-column align="center" type="selection" width="55"></el-table-column>
+
+            <el-table-column align="center" prop="code" label="角色ID"></el-table-column>
+            <el-table-column align="center" prop="name" label="角色名称"></el-table-column>
+            <!-- <el-table-column align="center" prop="org" label="所属部门"></el-table-column> -->
+            <el-table-column align="center" prop="description" label="角色描述"></el-table-column>
+            <el-table-column align="center" prop="locked" label="角色状态">
+              <template slot-scope="scope">
+                <el-tag type="success" v-show="!scope.row.locked">启用</el-tag>
+                <el-tag type="danger" v-show="scope.row.locked">停用</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </el-col>
+    </el-row>
+    <span slot="footer" class="dialog-footer">
+      <!-- <el-button type="primary" @click="doAprove()">确认</el-button> -->
+      <el-button @click="visible = false">关闭</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+// import moment from 'moment';
+// //import util from '@/util'
+export default {
+  data() {
+    return {
+      selectIndex:null,
+      comms:false,
+      items: [],
+      visible: false,
+      pageTotal: 0,
+      candidateids:"",
+      gid:null,
+      procdefkey: null,
+      taskType:'4',
+      processDefinitionId: null,
+      usergroup:"",
+      model:{
+        data1:'',
+        nextDealMan:[]
+      },
+      form: {
+        name: "",
+        pageNum: "1",
+        pageSize: "9999"
+      },
+      tableData3: [
+
+      ],
+      tableData2: [],
+      selectedRows: []
+    };
+  },
+  created() {},
+  watch:{
+    taskType(value){
+       var str = ''
+
+      if(value==1){
+        str = this.tableData2[0].id;
+      }else if(value==2){
+        str = [this.tableData2[0].id];
+        this.model.nextDealMan = [];
+      } else{
+        return false;
+      }
+
+      this.model.data1 = str
+      this.role(str)
+
+    }
+  },
+  methods: {
+    init(key, id) {
+      this.visible = true;
+
+      this.procdefkey = key;
+      this.processDefinitionId = id;
+      this.doSearch();
+    },
+
+    changeFun(){
+        var arr = [];
+
+
+        if(this.taskType==1){
+          this.candidateids = this.model.nextDealMan;
+        }else if(this.taskType==2){
+          this.candidateids = this.model.nextDealMan.join(",");
+        }else if(this.taskType==3){
+          let val = this.$refs.roleTable.selection;
+          val.forEach((element)=>{
+              arr.push(element.id)
+          })
+          this.candidateids = this.usergroup = arr.join(",");
+        }else if(this.taskType==4){
+          let val = this.$refs.roleTable.selection;
+          val.forEach((element)=>{
+              arr.push(element.id)
+          })
+          this.candidateids = this.usergroup = arr.join(",");
+        }
+    },
+    doSearch() {
+      let self = this;
+      var obj = {
+        url: this.$url.processinst.getUserTaskList,
+        data: {
+          procdefkey: this.procdefkey
+        }
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+        console.log(data)
+        if(data.data.length==0){
+           self.loadSingleBpmn();
+        }else{
+          if(data.data[0].taskdefkey.indexOf("multiNext")!=-1){
+            self.comms = true;
+            self.taskType='3';
+          }else{
+            self.comms = false;
+            self.taskType='4';
+            self.tableData3 = data.data;
+            self.gid = data.data[0].id;
+            self.usergroup = data.data[0].usergroup
+            self.doSearchRole(1);
+          }
+        }
+      }
+    },
+    doSearchRole(value) {
+      this.form.pageNum = value;
+
+      let self = this;
+      // var obj = {
+      //   url: this.$url.roleManag.getList,
+      //   data: this.form
+      // };
+      // this.common.httpPost(obj, success);
+      // function success(data) {
+      //   self.tableData2 = data.rows;
+      //   if(self.taskType==2){
+      //     self.model.data1 = [data.rows[0].id];
+      //   }else{
+      //     self.model.data1 = data.rows[0].id;
+      //   }
+
+      //   self.cheacked();
+      // }
+       this.$http({
+          url: this.$url.roleManag.getList,
+          method: "post",
+          headers: {
+              "Content-Type": "application/json",
+          },
+          data: this.form,
+      }).then((res) => {
+        console.log(res.data.data);
+        self.tableData2 = res.data.data.rows;
+        if(self.taskType==2){
+          self.model.data1 = [res.data.data.rows[0].id];
+        }else{
+          self.model.data1 = res.data.data.rows[0].id;
+        }
+
+        self.cheacked();
+      });
+    },
+    loadSingleBpmn() {
+      let self = this;
+      var obj = {
+        url: this.$url.processinst.loadSingleBpmn,
+        data: {
+          processDefinitionId: this.processDefinitionId
+        }
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+        self.doSearch();
+      }
+    },
+    doSure(){
+
+
+      this.changeFun();
+
+      let self = this;
+      var oob = {
+          id: this.gid,
+          tasktype:this.taskType,
+
+      }
+      if(this.taskType==4){
+        oob.usergroup=this.usergroup
+      }else if(this.taskType==3){
+        oob.candidateids=this.usergroup
+      }else{
+        oob.candidateids = this.candidateids
+      }
+      var obj = {
+        url: this.$url.processinst.setPermission,
+
+        data: oob
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+         self.$message({
+             message:"已分配",
+             type:"success"
+         })
+         self.doSearch();
+      }
+    },
+    cheacked(){
+
+        let self = this;
+        try {
+          self.$refs.roleTable.clearSelection();
+
+        } catch (error) {
+
+        }
+        if(!this.usergroup){
+          return false;
+        }
+        let arr = this.usergroup.split(",");
+        let arr1 = []
+        this.tableData2.forEach((elment,index)=>{
+          arr.forEach((i,o)=>{
+
+            if(elment.id==i){
+              arr1.push(index)
+            }
+          })
+
+        })
+        this.$nextTick(function () {
+
+          // if(arr1.length==0){
+          // }else{
+
+            arr1.forEach((ob)=>{
+              self.$refs.roleTable.toggleRowSelection(self.tableData2[ob],true);
+            })
+          // }
+        })
+    },
+    cellClick(row){
+
+      if(row.taskdefkey.indexOf("multiNext")!=-1){
+        this.comms = true;
+        if(row.taskType){
+
+          this.taskType=row.tasktype;
+        }else{
+          this.taskType = '1';
+        }
+      }else{
+         this.comms = false;
+          this.taskType = '4';
+
+
+      }
+
+      this.usergroup = row.usergroup;
+      this.gid = row.id;
+      this.cheacked();
+    },
+    role(row){
+      var str = ''
+
+        if(typeof row =="object"){
+          if(row.length==0){
+            return false;
+          }
+          str = row.join(",");
+        }else{
+          if(!row){
+            return false;
+          }
+          str = String(row)
+        }
+
+        let self = this;
+        let obj = {
+          roleId:str,
+          excludeMeWhenSelectNextHandler:self.common.excludeMeWhenSelectNextHandler,
+          excludeFormerHanlder:self.common.excludeMeWhenSelectNextHandler,
+          procinstid:self.procinstid
+        };
+       this.common.selectInit(this.$url.activeti.getUsersByRoleIds,success,obj,'options2');
+       function success(data,str){
+         self.$nextTick(()=>{
+
+            if( self.taskType==2){
+              self.nextDeal(data[0].id);
+            }else{
+
+              self.model.nextDealMan = data[0].id;
+            }
+            self[str] = data;
+         })
+
+      }
+    },
+    nextDeal(id){
+
+     if( typeof this.model.nextDealMan!="object"){
+       this.model.nextDealMan = [];
+     }
+     if(this.model.nextDealMan.length>0){
+
+       var tag = this.model.nextDealMan.find(i=>{
+           return i == id;
+         })
+         if(!tag){
+           this.model.nextDealMan.push(id);
+         }
+     }else{
+       this.model.nextDealMan.push(id);
+     }
+    },
+  }
+};
+</script>
+<style >
+ .mt20{
+   margin-top: 20px;
+ }
+</style>

+ 149 - 0
src/pages/main/processinst/index.vue

@@ -0,0 +1,149 @@
+<template>
+    <div class="container">
+        <div class="mod-role" style="height:100%;overflow:auto;">
+            <el-form :inline="true" @submit.native.prevent @keyup.enter.native="loadProcessDefList(1)" style="margin:20px 0px 0px 10px">
+                <el-form-item>
+                    <el-input v-model="form.searchKey" placeholder="流程定义key" clearable></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button icon="el-icon-search" type="search" @click="loadProcessDefList(1)">查询</el-button>
+                    <!-- <el-button icon="el-icon-search" type="search" @click="loadProcessDefList(1)">流程导入</el-button> -->
+                    <!-- <el-button icon="el-icon-upload2" type="primary" @click="doImport()">导入</el-button> -->
+                </el-form-item>
+            </el-form>
+            <el-table  @selection-change="handleSelectionChange" :data="list" border v-loading="loading">
+                <el-table-column align="center" prop="key" label="流程定义key"></el-table-column>
+                <el-table-column align="center" prop="name" label="流程名称"></el-table-column>
+
+                <el-table-column align="center" prop="deploymentTime" :formatter="$util.YYMM" label="部署时间"></el-table-column>
+                <el-table-column align="center" prop="diagramResourceName" label="资源名称"></el-table-column>
+
+                <el-table-column align="center" prop="version" label="版本" width="55"></el-table-column>
+                <el-table-column align="center" prop="deploymentId" label="部署ID"></el-table-column>
+                <el-table-column align="center" prop="id" label="流程定义ID"></el-table-column>
+                <el-table-column align="center" label="操作" fixed="left" width="250">
+                    <template slot-scope="scope">
+                        <!-- <el-button @click="doStart(scope)" type="text" size="small">启动</el-button> -->
+                        <el-button @click="doView(scope)" type="text" size="small">查看流程图</el-button>
+                        <el-button @click="doDistribution(scope.row)" type="text" size="small">分配权限</el-button>
+                        <el-button @click="doEexport(scope.row)" type="text" size="small">流程导出</el-button>
+                        <!-- <el-button @click="doCopy(scope)" type="text" size="small"></el-button> -->
+                        <!-- <el-button @click="doDesign(scope)" type="text" size="small">待办</el-button>
+            <el-button @click="doDeploy(scope)" type="text" size="small">跳转</el-button>-->
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination style="margin:10px 10px 0px 10px;float:right" @current-change="loadProcessDefList"  :page-size="form.rows" layout="total, prev, pager, next, jumper" :total="total"></el-pagination>
+
+            <so-distribution v-if="soDistributionVisible" ref="soDistribution"  ></so-distribution>
+            <el-dialog title="查看" v-if="editFormVisible" :visible.sync="editFormVisible" width="80%" style="text-align:center"  append-to-body>
+                <div>
+                    <img :src="viewImg" alt />
+                </div>
+                <span slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="editFormVisible = false">确 定</el-button>
+                </span>
+            </el-dialog>
+        </div>
+    </div>
+</template>
+<script>
+// import UserOpenDialog from '@/page/components/userOpenDialog'
+import WfActivitySelect from './wfActivitySelect'
+import SoDistribution from './doDistribution'
+export default {
+    data() {
+        return {
+            multipleSelection: [],
+            loading:false,
+            editFormVisible: false,
+            soDistributionVisible: false,
+            checkededRows: [],
+            list: null,
+            viewImg: null,
+            processDefinationlist: [{}, {}],
+            startDateRange: null,
+            total: 0,
+            form: {
+                page: 1,
+                rows: 10,
+                searchKey: ''
+            },
+            importFormVisible: false
+        }
+    },
+    components: {
+        SoDistribution,
+        WfActivitySelect,
+    },
+    mounted() {
+        this.loadProcessDefList(1)
+    },
+    methods: {
+        handleSelectionChange(val){
+            this.multipleSelection = val;
+        },
+        onGotoDialogSelect(){
+
+        },
+        loadProcessDefList(value) {
+            this.importFormVisible = false
+            let self = this
+            this.form.page = value
+            console.log(this.form)
+            var obj = {
+                url: this.$url.processinst.getList,
+                data: this.form,
+                type: 'post'
+            }
+            this.common.httpPost(obj, success)
+            function success(data) {
+                self.list = data.data.rows
+                self.total = data.data.total
+            }
+            // tapp.services.wf_Model.getMadelList().then(function(result) {
+            //   self.processDefinationlist = result;
+            // })
+        },
+        onStartDateRangeChanged(val) {
+            this.form.startDateBegin = val[0]
+            this.form.startDateEnd = val[1]
+        },
+        //  流程导出
+        doEexport(row) {
+            console.log(`${this.$url.processinst.getExportFile}/${row.id}`)
+            window.location.href = `${this.$url.processinst.getExportFile}/${row.id}`
+        },
+        doTask(key, row) {
+            if (row.taskAssignee != null && row.taskAssignee.length > 0) {
+                //办理
+                this.$router.push({
+                    path: row.taskFormUrl
+                })
+                return
+            } else if (row.taskCandidate != null && row.taskCandidate.length > 0) {
+            } else {
+            }
+        },
+
+        doDistribution(row) {
+            this.soDistributionVisible = true
+            this.$nextTick(() => {
+                this.$refs.soDistribution.init(row.key, row.id)
+            })
+        },
+
+        doView(scope) {
+            this.editFormVisible = true
+            let row = scope.row
+            let self = this
+            this.viewImg = this.$url.processinst.view + '?resourceType=png&processDefinitionId=' + row.id
+        }
+    }
+}
+</script>
+<style lang="scss" scoped>
+::v-deep .el-table td, .el-table th{
+    padding: 3px 0px;
+}
+</style>

+ 30 - 0
src/pages/main/processinst/processHistory.vue

@@ -0,0 +1,30 @@
+
+<template>
+<div>
+  <wf-processtrack ref="processtrack" :procInstId="procInstId">
+  </wf-processtrack> 
+</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      procInstId: null,
+    }
+  },
+  components: {},
+  created() {
+    this.procInstId = this.$route.query.procInstId;
+  },
+  activated() {
+
+  },
+  computed: {
+
+  },
+  methods: {
+
+  }
+}
+</script>

+ 64 - 0
src/pages/main/processinst/wfActivitySelect.vue

@@ -0,0 +1,64 @@
+
+<template>
+<el-dialog title="流程节点信息" v-if="visible" :visible.sync="visible" :append-to-body="true">
+  <el-form ref="form" @submit.native.prevent  @keyup.enter.native="dataFormSubmit()" label-width="80px">
+    <el-form-item label="流程节点">
+      <el-select filterable  placeholder="流程节点" v-model="selectedActivityId">
+        <el-option v-for="(item, index) in activitylist" :key='item.id' :label="item.name" :value="item.id"></el-option>
+      </el-select>
+    </el-form-item>
+  </el-form>
+  <span slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="onOk()">确定</el-button>
+      <el-button @click="visible = false">关闭</el-button>
+    </span>
+</el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      visible: false, title:"添加",
+      disabled:false,
+      btn:"提交",
+      aproveVisible: false,
+      processDefinationKey: null,
+      activitylist: {},
+      selectedActivityId: null,
+    }
+  },
+  created() {
+
+  },
+  activated() {
+
+  },
+  methods: {
+    // 初始化
+    init(processDefinationKey) {
+      this.visible = true
+      this.processDefinationKey = processDefinationKey;
+      let self = this;
+      // tapp.services.wf_Model.getProcessActivities(this.processDefinationKey).then(function(result) {
+      //   self.activitylist = result.filter(p => {
+      //     return p.implementation != undefined || p.assignee != undefined
+      //   });
+
+      // });
+    },
+    onOk() {
+      let self = this;
+      if (!this.selectedActivityId) {
+        self.$notify.error({
+          title: '错误',
+          message: '未选择流程节点!'
+        });
+        return false;
+      }
+      this.visible = false;
+      this.$emit('select', this.selectedActivityId);
+    },
+  }
+}
+</script>

+ 248 - 0
src/pages/main/processruns/doDistribution.vue

@@ -0,0 +1,248 @@
+<template>
+  <el-dialog title="权限分配" width="90%" top="1%" v-if="visible" :visible.sync="visible">
+    <el-row :gutter="20">
+      <el-col :span="12">
+        <el-card>
+          <el-button @click="loadSingleBpmn" type="primary">初始化</el-button>
+          <el-table
+            class="mb20"
+            :data="tableData3"
+            :header-cell-style="{background:'#e0f3ff',color:'#5f95b7'}"
+            cell-click="cellClick"
+            border
+            stripe
+            highlight-current-row="true"
+            style="width: 100%"
+            @cell-click="cellClick"
+          >
+
+            <el-table-column align="center" prop="id" label="ID"></el-table-column>
+            <el-table-column align="center" prop="procdefkey" label="流程定义key"></el-table-column>
+            <el-table-column align="center" prop="procdefname" label="流程定义名称"></el-table-column>
+             <el-table-column align="center" prop="taskdefkey" label="任务key"></el-table-column>
+            <el-table-column align="center" prop="taskname" label="名称"></el-table-column>
+            <el-table-column align="center" prop="usergroup" label="角色"></el-table-column>
+
+          </el-table>
+        </el-card>
+      </el-col>
+
+      <el-col :span="12">
+        <el-card>
+          <el-button @click="doSure" type="primary">确认分配</el-button>
+ <!-- @selection-change="changeFun" -->
+          <el-table
+            class="mb20"
+            :data="tableData2"
+            height="500px"
+            :header-cell-style="{background:'#e0f3ff',color:'#5f95b7'}"
+            border
+            stripe
+            ref="roleTable"
+
+            highlight-current-row="true"
+            style="width: 100%"
+          >
+            <el-table-column align="center" type="selection" width="55"></el-table-column>
+
+            <el-table-column align="center" prop="code" label="角色ID"></el-table-column>
+            <el-table-column align="center" prop="name" label="角色名称"></el-table-column>
+            <el-table-column align="center" prop="org" label="所属部门"></el-table-column>
+            <el-table-column align="center" prop="description" label="角色描述"></el-table-column>
+            <el-table-column align="center" prop="locked" label="角色状态">
+              <template slot-scope="scope">
+                <el-tag type="success" v-show="!scope.row.locked">启用</el-tag>
+                <el-tag type="danger" v-show="scope.row.locked">停用</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-card>
+      </el-col>
+    </el-row>
+    <span slot="footer" class="dialog-footer">
+      <!-- <el-button type="primary" @click="doAprove()">确认</el-button> -->
+      <el-button @click="visible = false">关闭</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+// import moment from 'moment';
+// //import util from '@/util'
+export default {
+  data() {
+    return {
+      selectIndex:null,
+      items: [],
+      visible: false,
+      pageTotal: 0,
+      gid:null,
+      procdefkey: null,
+      processDefinitionId: null,
+      usergroup:"",
+      form: {
+        name: "",
+        pageNum: "1",
+        pageSize: "9999"
+      },
+      tableData3: [
+        {
+          date: "2016-05-03",
+          name: "王小虎",
+          address: "上海市普陀区金沙"
+        }
+      ],
+      tableData2: [],
+      selectedRows: []
+    };
+  },
+  created() {},
+  methods: {
+    init(key, id) {
+      this.visible = true;
+
+      this.procdefkey = key;
+      this.processDefinitionId = id;
+      this.doSearch();
+    },
+
+    cellClick(row, column, cell, event) {
+      // let self = this;
+      // var obj ={
+      //   url:this.$url.workflowdef.getList,
+      //   data:this.form
+      // }
+      // this.common.httpPost(obj,success);
+      // function success(data){
+      //     self.list = data.data.rows
+      //     self.total = data.data.total
+      // }
+    },
+    changeFun(){
+        var arr = [];
+        let val = this.$refs.roleTable.selection;
+        val.forEach((element)=>{
+            arr.push(element.id)
+        })
+        this.usergroup = arr.join(",")
+    },
+    doSearch() {
+      let self = this;
+      var obj = {
+        url: this.$url.processinst.getUserTaskList,
+        data: {
+          procdefkey: this.procdefkey
+        }
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+        if(data.data.length==0){
+           self.loadSingleBpmn();
+        }else{
+
+          self.tableData3 = data.data;
+          self.gid = data.data[0].id;
+          self.usergroup = data.data[0].usergroup
+          self.doSearchRole(1);
+        }
+      }
+    },
+    doSearchRole(value) {
+      this.form.pageNum = value;
+
+      let self = this;
+      // var obj = {
+      //   url: this.$url.roleManag.getList,
+      //   data: this.form
+      // };
+      // this.common.httpPost(obj, success);
+      // function success(data) {
+      //   self.tableData2 = data.rows;
+      //   self.cheacked();
+      // }
+      this.$http({
+          url: this.$url.roleManag.getList,
+          method: "post",
+          headers: {
+              "Content-Type": "application/json",
+          },
+          data: this.form,
+      }).then((res) => {
+          self.tableData2 =  res.data.rows;
+          self.cheacked();
+      });
+    },
+    loadSingleBpmn() {
+      let self = this;
+      var obj = {
+        url: this.$url.processinst.loadSingleBpmn,
+        data: {
+          processDefinitionId: this.processDefinitionId
+        }
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+        self.doSearch();
+      }
+    },
+    doSure(){
+
+
+      this.changeFun();
+
+        let self = this;
+        console.log(this.gid)
+      var obj = {
+        url: this.$url.processinst.setPermission,
+
+        data: {
+          id: this.gid,
+          usergroup:this.usergroup
+        }
+      };
+      this.common.httpPost(obj, success);
+      function success(data) {
+         self.$message({
+             message:"已分配",
+             type:"success"
+         })
+         self.doSearch();
+      }
+    },
+    cheacked(){
+
+        let self = this;
+        self.$refs.roleTable.clearSelection();
+        if(!this.usergroup){
+          return false;
+        }
+        let arr = this.usergroup.split(",");
+        let arr1 = []
+        this.tableData2.forEach((elment,index)=>{
+          arr.forEach((i,o)=>{
+
+            if(elment.id==i){
+              arr1.push(index)
+            }
+          })
+
+        })
+        this.$nextTick(function () {
+
+          // if(arr1.length==0){
+          // }else{
+
+            arr1.forEach((ob)=>{
+              self.$refs.roleTable.toggleRowSelection(self.tableData2[ob],true);
+            })
+          // }
+        })
+    },
+    cellClick(row){
+      this.usergroup = row.usergroup;
+      this.gid = row.id;
+      this.cheacked();
+    }
+  }
+};
+</script>

+ 30 - 0
src/pages/main/processruns/processHistory.vue

@@ -0,0 +1,30 @@
+
+<template>
+<div>
+  <wf-processtrack ref="processtrack" :procInstId="procInstId">
+  </wf-processtrack> 
+</div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      procInstId: null,
+    }
+  },
+  components: {},
+  created() {
+    this.procInstId = this.$route.query.procInstId;
+  },
+  activated() {
+
+  },
+  computed: {
+
+  },
+  methods: {
+
+  }
+}
+</script>

+ 326 - 0
src/pages/main/processruns/processruns.vue

@@ -0,0 +1,326 @@
+<template>
+    <div class="container">
+        <div class="mod-role" style="height:100%;overflow:auto;">
+            <el-form :inline="true" @submit.native.prevent @keyup.enter.native="loadProcessDefList(1)" style="margin:20px 0px 0px 10px">
+                <el-form-item>
+                    <el-input v-model="form.procdefkey" placeholder="流程定义key" clearable></el-input>
+                </el-form-item>
+                  <el-form-item>
+                    <el-input v-model="form.processInstanceId" placeholder="实例ID" clearable></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button icon="el-icon-search" type="search" @click="loadProcessDefList(1)">查询</el-button>
+                </el-form-item>
+                <el-form-item>
+                    <el-button icon="el-icon-position" type="search" @click="doView()">重发待办</el-button>
+                </el-form-item>
+                <el-form-item>
+                    <el-button icon="el-icon-refresh-left" type="search" @click="doRecall()">召回</el-button>
+                </el-form-item>
+            </el-form>
+
+            <el-table :data="list" border  v-loading="loading" style="width: 100%">
+                <!-- <el-table-column align="center" label="选择" :selectable="chkstu" width="80" type="selection"></el-table-column> -->
+                <el-table-column type="expand">
+                    <template slot-scope="props">
+                        <el-table @selection-change="checkedChange" @select="select" ref="multipleTable" @select-all="selectAll" :data="props.row.taskList" :header-cell-style="{ background: '#e0f3ff', color: '#5f95b7' }" border stripe highlight-current-row="true" style="width: 100%">
+                            <!-- :selectable="chkstu" 禁止选用-->
+                            <el-table-column align="center" label="选择"  width="80" type="selection"></el-table-column>
+                            <el-table-column align="center" prop="taskId" label="任务id"></el-table-column>
+                            <el-table-column align="center" prop="taskName" label="名称"></el-table-column>
+                            <el-table-column align="center" prop="userName" label="任务处理人"></el-table-column>
+                            <el-table-column align="center" prop="assignee" label="任务处理人id"></el-table-column>
+                        </el-table>
+                    </template>
+                </el-table-column>
+                <el-table-column align="center" prop="processInstanceId" label="实例ID"></el-table-column>
+                <el-table-column align="center" prop="processDefinitionKey" label="流程定义key"></el-table-column>
+                <el-table-column align="center" prop="processDefinitionId" label="流程定义id"></el-table-column>
+
+                <el-table-column align="center" prop="processDefinitionName" label="流程名称"></el-table-column>
+            </el-table>
+            <el-pagination style="margin:10px 10px 0px 10px;float:right" @current-change="loadProcessDefList"  :page-size="form.rows" layout="total, prev, pager, next, jumper" :total="total"></el-pagination>
+
+            <so-distribution v-if="soDistributionVisible" ref="soDistribution" @select="onGotoDialogSelect"></so-distribution>
+            <el-dialog title="重发代办" v-if="editFormVisible" :visible.sync="editFormVisible" width="40%" @close="closeEliminateData" style="text-align:left">
+                <div style="padding:20px">
+                    <el-form label-position="left" label-width="80px" :inline="true" @submit.native.prevent @keyup.enter.native="doSearch(1)">
+                        <el-row>
+                            <el-col :span="24">
+                                <el-form-item label="处理节点:">
+                                    {{ taskname }}
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="审核角色:">
+                                    <el-select v-model="userRole" @change="changeUser" placeholder="请选择...">
+                                        <el-option v-for="item in userArr" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="24">
+                                <el-form-item label="审核人:">
+                                    <el-select v-model="userMan" @change="userIdchange" placeholder="请选择...">
+                                        <el-option v-for="item in userArr1" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+                <span slot="footer" class="dialog-footer">
+                    <el-button type="primary" @click="addSend">确 定</el-button>
+                </span>
+            </el-dialog>
+        </div>
+    </div>
+</template>
+<script>
+// import UserOpenDialog from '@/page/components/userOpenDialog'
+import WfActivitySelect from './wfActivitySelect'
+import SoDistribution from './doDistribution'
+import { processDefinitionKey as getService } from '@/components/components/approvalDialog/index-mixins.js'
+export default {
+  data() {
+    return {
+      loading:false,
+      editFormVisible: false,
+      soDistributionVisible: false,
+      checkededRows: [],
+      list: null,
+      viewImg: null,
+      processDefinationlist: [{}, {}],
+      startDateRange: null,
+      total: 0,
+      form: {
+        page: 1,
+        rows: 10,
+        procdefkey: '',
+        processInstanceId: ''
+      },
+      tableData3: [],
+      userId: '',
+      userArr: [],
+      userArr1: [],
+      userRole: '', //审核角色
+      userMan: '',
+      taskname: '',
+
+      taskId: '',
+      userId: '',
+      // 上一个选中的表格组件
+      previousTableCom: null
+      // activeti.getUsersByRoleIds
+    }
+  },
+  components: {
+    SoDistribution,
+    WfActivitySelect
+  },
+  mounted() {
+    this.loadProcessDefList(1)
+  },
+  methods: {
+    loadProcessDefList(value) {
+      let self = this
+      this.form.page = value
+
+      var obj = {
+        url: this.$url.workflowdef.getruns,
+        data: this.form,
+        type: 'post'
+      }
+      this.common.httpPost(obj, success)
+      function success(data) {
+        data.data.rows.forEach(el => {
+          el.taskList.forEach(element => {
+            element.processDefinitionKey = el.processDefinitionKey
+          })
+        })
+        self.list = data.data.rows
+        self.list.forEach(el => {
+          el.taskList.map(item => {
+            item.processInstanceId = el.processInstanceId
+            item.processDefinitionKey = el.processDefinitionKey
+          })
+        })
+        self.total = data.data.total
+      }
+    },
+    onStartDateRangeChanged(val) {
+      this.form.startDateBegin = val[0]
+      this.form.startDateEnd = val[1]
+    },
+    chkstu(row, index) {
+      return row.assignee ? false : true
+    },
+    // 禁用全选按钮
+    selectAll() {
+      this.$refs.multipleTable.clearSelection()
+    },
+    async addSend() {
+      // console.log(this.userId)
+      // console.log(this.taskId)
+      if (!(this.userId && this.taskId)) return this.$message.error('请选择审核角色或审核人!')
+      var obj = {
+        url: this.$url.processinst.setPermission1,
+        data: {
+          userId: this.userId + '',
+          taskId: this.taskId
+        }
+      }
+      const { data: res } = await this.common.postRequest(obj)
+      // console.log(res)
+      if (res.code !== 1) return this.$message.error(res.message)
+      this.$message.success(res.message)
+      this.editFormVisible = false
+      this.loadProcessDefList(1)
+    },
+    // 召回
+    doRecall() {
+      if (!(this.deleteList && this.deleteList.length > 0)) return this.$message.error('选择要召回的待办!')
+      this.$confirm('此操作将把待办召回, 是否继续?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      })
+        .then(async () => {
+            console.log( this.deleteList[0]);
+          let { businessKey, processInstanceId } = this.deleteList[0]
+          let service = getService(this.deleteList[0].processDefinitionKey, true)
+          let url = eval('`' + this.$url.activeti.recallProcess + '`')
+          console.log(this.deleteList[0])
+
+          let obj = {
+            url,
+            data: {
+              id: businessKey,
+              processInstanceId
+            }
+          }
+          const res = await this.common.postRequest(obj)
+          if (res.code !== '1') return this.$message.error('召回失败!')
+          this.$message.success('召回成功!')
+          this.loadProcessDefList(1)
+        })
+        .catch(err => {
+          this.$message({
+            type: 'info',
+            message: '已取消召回!'
+          })
+        })
+    },
+    // 只能选择一个
+    select(selection, row) {
+      // console.log(this.$refs.multipleTable)
+      // console.log('---------------')
+      // if (this.previousTableCom) {
+      //     this.previousTableCom.clearSelection()
+      // }
+      // this.previousTableCom = this.$refs.multipleTable
+      // console.log('当用户手动勾选数据行的 Checkbox 时触发的事件', selection, row)
+
+      // 选择项大于1时
+
+      if (selection.length > 1) {
+        let del_row = selection.shift()
+
+        // console.log('把数组的第一个元素从其中删除后', selection);
+
+        this.$refs.multipleTable.toggleRowSelection(del_row, false) // 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)
+      }
+    },
+    userIdchange(value) {
+      this.userId = value
+      // console.log(this.taskId)
+      // console.log(this.userId)
+    },
+    // 关闭事件
+    closeEliminateData() {
+      // this.taskId = ''
+      this.userArr = []
+      this.userArr1 = []
+      this.userRole = ''
+      this.userMan = ''
+      this.userId = ''
+      this.taskname = ''
+    },
+    doTask(key, row) {
+      if (row.taskAssignee != null && row.taskAssignee.length > 0) {
+        //办理
+        this.$router.push({
+          path: row.taskFormUrl
+        })
+        return
+      } else if (row.taskCandidate != null && row.taskCandidate.length > 0) {
+      } else {
+      }
+    },
+
+    doDistribution(row) {
+      this.soDistributionVisible = true
+      this.$nextTick(() => {
+        this.$refs.soDistribution.init(row.key, row.id)
+      })
+    },
+
+    async doView() {
+      // this.userArr = []
+      // this.userArr1 = []
+
+      // this.userId = ''
+      if (!(this.deleteList && this.deleteList.length > 0)) return this.$message.error('选择要发起的流程!')
+      this.editFormVisible = true
+      var obj = {
+        url: this.$url.processinst.getUserTask,
+        data: {
+          procdefkey: this.deleteList[0].processDefinitionKey,
+          taskdefkey: this.deleteList[0].taskDefinitionKey
+        }
+      }
+      const { data: res } = await this.common.postRequest(obj)
+      if (res.code !== 1) return this.$message.error(res.message)
+      this.taskname = res.data[0].taskname
+      let arrTemp = res.data[0].usergroup ? res.data[0].usergroup.split(',') : []
+      if (arrTemp.length > 0) {
+        arrTemp.forEach(id => {
+          this.getuser_info(id)
+        })
+      }
+    },
+    async getuser_info(id) {
+      var obj = {
+        url: this.$url.roleManag.getById,
+        data: {
+          id
+        }
+      }
+      const { data: res } = await this.common.postRequest(obj)
+      this.userArr.push(res)
+    },
+
+    checkedChange(value) {
+      console.log(value)
+      if (value.length > 0) {
+        this.taskId = value[0].taskId
+        this.deleteList = value
+      } else {
+        this.deleteList = value
+      }
+    },
+    // 选择角色事件
+    async changeUser(value) {
+      var obj = {
+        url: this.$url.activeti.getUsersByRoleIds,
+        data: {
+          excludeMeWhenSelectNextHandler: this.common.excludeMeWhenSelectNextHandler,
+          excludeFormerHanlder: this.common.excludeMeWhenSelectNextHandler,
+          roleId: value + ''
+        }
+      }
+      const { data: res } = await this.common.postRequest(obj)
+      this.userArr1 = res
+    }
+  }
+}
+</script>

+ 64 - 0
src/pages/main/processruns/wfActivitySelect.vue

@@ -0,0 +1,64 @@
+
+<template>
+<el-dialog title="流程节点信息" v-if="visible" :visible.sync="visible" :append-to-body="true">
+  <el-form ref="form" @submit.native.prevent  @keyup.enter.native="dataFormSubmit()" label-width="80px">
+    <el-form-item label="流程节点">
+      <el-select filterable  placeholder="流程节点" v-model="selectedActivityId">
+        <el-option v-for="(item, index) in activitylist" :key='item.id' :label="item.name" :value="item.id"></el-option>
+      </el-select>
+    </el-form-item>
+  </el-form>
+  <span slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="onOk()">确定</el-button>
+      <el-button @click="visible = false">关闭</el-button>
+    </span>
+</el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      visible: false, title:"添加",
+      disabled:false,
+      btn:"提交",
+      aproveVisible: false,
+      processDefinationKey: null,
+      activitylist: {},
+      selectedActivityId: null,
+    }
+  },
+  created() {
+
+  },
+  activated() {
+
+  },
+  methods: {
+    // 初始化
+    init(processDefinationKey) {
+      this.visible = true
+      this.processDefinationKey = processDefinationKey;
+      let self = this;
+      // tapp.services.wf_Model.getProcessActivities(this.processDefinationKey).then(function(result) {
+      //   self.activitylist = result.filter(p => {
+      //     return p.implementation != undefined || p.assignee != undefined
+      //   });
+
+      // });
+    },
+    onOk() {
+      let self = this;
+      if (!this.selectedActivityId) {
+        self.$notify.error({
+          title: '错误',
+          message: '未选择流程节点!'
+        });
+        return false;
+      }
+      this.visible = false;
+      this.$emit('select', this.selectedActivityId);
+    },
+  }
+}
+</script>

+ 188 - 0
src/pages/main/workflowdef/Import.vue

@@ -0,0 +1,188 @@
+<template>
+    <el-dialog title="导入" @close="closeDialog" :close-on-click-modal="false" v-if="visible" :visible.sync="visible" append-to-body>
+        <el-form style="margin-top:20px" :model="model" ref="form" @submit.native.prevent @keyup.enter.native="dataFormSubmit()" label-width="80px">
+            <el-form-item label="模板文件" prop="file" verify :maxLength="255" label-width="100px" class="is-required exportFile">
+                <el-input v-model="model.file" style="display:none;width:100%;height:100%"></el-input>
+                <div class="btnUpfileBox">
+                    <div class="filename">{{ this.model.file }}<span v-if="!this.model.file" style="color: rgb(204, 204, 204);">(请选择上传文件)</span></div>
+                    <el-button type="primary" @click="uploadTrigger">点击上传<i class="el-icon-upload el-icon--right"></i></el-button>
+                </div>
+                <input type="file" @change="onDataFileSelect" style="display:none;width:100%;height:100%" ref="upFilesDataRef" />
+            </el-form-item>
+            <el-form-item label="模板名称" prop="name" verify :maxLength="255" label-width="100px" class="is-required">
+                <el-input v-model="model.name"></el-input>
+            </el-form-item>
+            <el-form-item label="模板key" prop="key" verify :maxLength="255" label-width="100px" class="is-required">
+                <el-input v-model="model.key"></el-input>
+            </el-form-item>
+            <el-form-item label="模型描述" prop="description" class="is-required" verify label-width="100px" :maxLength="200">
+                <el-input type="textarea" v-model="model.description"></el-input>
+            </el-form-item>
+            <el-form-item label="模型分类" verify can-be-empty label-width="100px" :maxLength="200">
+                <el-input  v-model="model.category"></el-input>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+            <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+            <el-button @click="visible = false">关闭</el-button>
+        </span>
+    </el-dialog>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            formAction: 0, //0 add,//1,edit
+            visible: false,
+            title: '添加',
+            disabled: false,
+            btn: '提交',
+            aproveVisible: false,
+            model: {
+                file: '',
+                name: '',
+                key: '',
+                description: '',
+                category: ''
+            },
+            filesData: '',
+            filename: ''
+        }
+    },
+    created() {},
+    activated() {},
+    methods: {
+        init(id) {
+            Object.assign(this.$data, this.$options.data.call(this))
+            this.visible = true
+
+            if (id) {
+                let self = this
+                var obj = {
+                    url: this.$url.workflowdef.getById,
+                    data: {
+                        id: id
+                    }
+                }
+                this.common.httpPost(obj, success)
+                function success(data) {
+                    self.model = data.data
+                    self.model.description = self.model.desc
+                }
+            } else {
+                this.model = {}
+                self.formAction = 0
+
+                // self.$nextTick(() => {
+                //   self.$refs.form.resetFields();
+                //   self.formAction = 0;
+                // })
+            }
+        },
+        uploadTrigger() {
+            this.$refs.upFilesDataRef.click()
+        },
+        // 上传科研数据的事件
+        onDataFileSelect(e) {
+            // if (this.$refs.upFilesDataRef.value.indexOf('.txt') != -1) return this.$message('不支持.txt格式的文件 ')
+            var f = e.target.files || e.dataTransfer.files
+            if (!f.length) return
+            this.filesData = f[0]
+            console.log(this.filesData)
+
+            // 上传进度
+            var _this = this
+            this.$refs.upFilesDataRef.onchange = function() {
+                var fr = new FileReader()
+                fr.readAsDataURL(this.files[0])
+                var total = this.files[0].size
+                fr.onprogress = function(ev) {
+                    _this.percentage = parseInt((ev.loaded / total) * 100) + '%'
+                    console.log(_this.percentage)
+                    if (_this.percentage == '100%') {
+                        _this.$set(_this.model, 'file', _this.filesData.name)
+                    }
+                }
+            }
+            this.$refs.upFilesDataRef.onchange()
+        },
+        closeDialog() {
+            this.$refs.form.resetFields()
+            this.filesData = ''
+            this.$refs.upFilesDataRef.value = ''
+        },
+        dataFormSubmit() {
+            let self = this
+            self.$refs['form'].validate(async valid => {
+                if (valid) {
+                    var formdata = new FormData()
+                    // form.append('name', this.model.name)
+                    // form.append('key', this.model.name)
+                    // form.append('description', this.model.name)
+                    // form.append('category', this.model.name)
+                    if (!this.model.file) return this.$message.error('请检查您的文件!')
+                    formdata.append('file', this.filesData)
+                    console.log(this.filesData)
+                    delete this.model.file
+                    var obj = {
+                        url: this.$url.processinst.exportFile,
+                        data: this.model
+                    }
+                    const  {data:res} = await this.common.postRequestHybid(obj, formdata)
+                    console.log(res)
+                    if(res.code!==1) return this.$message.error('导入失败!')
+                    this.$emit('change')
+                    // let model = self.model
+                    // var obj = {
+                    //     url: this.$url.workflowdef.add,
+                    //     data: self.model
+                    // }
+                    // this.common.httpPost(obj, success)
+                    // function success(data) {
+                    //     self.$notify.success({
+                    //         title: '',
+                    //         message: '操作成功!'
+                    //     })
+                    //     self.$parent.editFormVisible = false
+                    //     self.$parent.doSearch(1)
+                    // }
+                } else {
+                    self.$notify.error({
+                        title: '错误',
+                        message: '系统输入验证失败!'
+                    })
+                    return false
+                }
+            })
+        }
+    }
+}
+</script>
+<style>
+.exportFile input {
+    border: none !important;
+    /* width: 75px;
+    height: 25px;
+    opacity: 0;
+    filter: alpha(opacity=0);
+    background-color: lawngreen; */
+}
+.btnUpfileBox {
+    display: flex;
+}
+.btnUpfileBox .filename {
+    width: 300px;
+    margin-right: 10px;
+}
+.btnUpfileBox .btnUpfile {
+    width: 100px;
+    height: 100%;
+    background-color: #409eff;
+}
+.btnUpfileBox span {
+    display: inline-block;
+    width: 100%;
+    text-align: right;
+}
+</style>

+ 0 - 0
src/pages/main/workflowdef/codeView.vue


+ 45 - 0
src/pages/main/workflowdef/design.vue

@@ -0,0 +1,45 @@
+
+<template>
+<el-dialog @close="close" ref='dailog' title="流程设计" :close-on-click-modal="false"  v-if="visible" :visible.sync="visible" width="80%" height="100%" append-to-body>
+  <div>
+    <iframe :src="designSrc" id="show-iframe" frameborder=0 name="showHere" scrolling=auto :height="iframeHeight" width="100%" />
+  </div>
+</el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      designSrc: null,
+      visible: false, title:"添加",
+      disabled:false,
+      btn:"提交",
+      aproveVisible: false,
+      iframeHeight:'800px',
+    };
+  },
+  created() {
+
+
+  },
+  activated() {},
+  mounted(){
+  this.$nextTick(() => {
+      //const deviceWidth = document.documentElement.clientWidth;
+      const deviceHeight = document.documentElement.clientHeight;
+      this.iframeHeight = (deviceHeight-125) + 'px';
+    })
+},
+  methods: {
+    init(id) {
+        Object.assign(this.$data, this.$options.data.call(this))
+      this.visible = true;
+      this.designSrc =this.$url.workflowdef.modeler+id;// window.SITE_CONFIG.wfDesingUrl + id;
+    },
+    close(){
+      this.$parent.doSearch(1)
+    }
+  }
+  }
+  </script>

+ 105 - 0
src/pages/main/workflowdef/edit.vue

@@ -0,0 +1,105 @@
+
+<template>
+<el-dialog :title="formAction == 0 ? '新增' : '修改'" :close-on-click-modal="false" v-if="visible" :visible.sync="visible" append-to-body>
+  <el-form :model="model" ref="form" @submit.native.prevent  @keyup.enter.native="dataFormSubmit()" label-width="80px">
+    <el-form-item label="标识" prop="key" verify :maxLength="255" class="is-required">
+      <el-input v-model="model.key"></el-input>
+    </el-form-item>
+
+    <el-form-item label="名称" prop="name" verify :maxLength="255" class="is-required">
+      <el-input v-model="model.name"></el-input>
+    </el-form-item>
+    <!-- <el-form-item label="分类" prop="category" verify :maxLength="255" class="is-required">
+      <el-input v-model="model.category"></el-input>
+    </el-form-item> -->
+    <el-form-item label="描述" prop="description" verify can-be-empty :maxLength="200">
+      <el-input type="textarea" v-model="model.description"></el-input>
+    </el-form-item>
+
+  </el-form>
+  <span slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
+      <el-button @click="visible = false">关闭</el-button>
+    </span>
+</el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      formAction: 0, //0 add,//1,edit
+      visible: false, title:"添加",
+      disabled:false,
+      btn:"提交",
+      aproveVisible: false,
+      model: {
+
+      },
+    };
+  },
+  created() {
+
+  },
+  activated() {},
+  methods: {
+    init(id) {
+        Object.assign(this.$data, this.$options.data.call(this))
+      this.visible = true;
+
+      if (id) {
+        let self = this;
+        var obj ={
+          url:this.$url.workflowdef.getById,
+          data:{
+            id:id
+          }
+        }
+        this.common.httpPost(obj,success);
+        function success(data){
+           self.model = data.data
+            self.model.description = self.model.desc
+        }
+
+      }else{
+        this.model = {};
+        self.formAction = 0;
+
+        // self.$nextTick(() => {
+        //   self.$refs.form.resetFields();
+        //   self.formAction = 0;
+        // })
+      }
+    },
+    dataFormSubmit() {
+      let self = this;
+      self.$refs['form'].validate((valid) => {
+        if (valid) {
+          let model = self.model;
+          var obj ={
+            url:this.$url.workflowdef.add,
+            data:self.model
+          }
+          this.common.httpPost(obj,success);
+          function success(data){
+              self.$notify.success({
+                title: '',
+                message: '操作成功!'
+              });
+              self.$parent.editFormVisible = false;
+              self.$parent.doSearch(1)
+          }
+
+        } else {
+          self.$notify.error({
+            title: '错误',
+            message: '系统输入验证失败!'
+          });
+          return false;
+        }
+      });
+    },
+
+  }
+  }
+  </script>

+ 294 - 0
src/pages/main/workflowdef/index.vue

@@ -0,0 +1,294 @@
+<template>
+    <div class="container">
+        <div class="mod-role" style="height:100%;overflow:auto;">
+            <el-form :inline="true" @submit.native.prevent @keyup.enter.native="doSearch(1)" style="margin:20px 0px 0px 10px">
+                <el-form-item>
+                    <el-input v-model="form.searchKey" placeholder="模型名称" clearable></el-input>
+                </el-form-item>
+                <el-form-item>
+                    <el-button icon="el-icon-search" type="primary" @click="doSearch(1)">查询</el-button>
+                    <el-button icon="el-icon-plus" type="primary" @click="doNew()">新增</el-button>
+                    <el-button icon="el-icon-upload2" type="primary" @click="doImport()">导入</el-button>
+                    <!-- <el-button icon="el-icon-upload2" type="primary" @click="doImport()">导入</el-button>
+                    <el-button icon="el-icon-download" type="primary" @click="download()">导出</el-button> -->
+                    <!-- 暂时禁用批量删除
+      <el-button icon="el-icon-delete" type="danger" @click="doBatchDelete()" :disabled="selectedRows.length <= 0">批量删除</el-button>
+      -->
+
+                    <!-- <el-button icon="el-icon-download" @click="doExportExcel()">导出</el-button> -->
+                </el-form-item>
+            </el-form>
+            <el-table  @selection-change="handleSelectionChange" :data="list" border ref="searchReulstList"  style="width: 100%">
+                <el-table-column align="center" type="selection" width="55"> </el-table-column>
+                <el-table-column align="center" type="index" :index="index" label="行数" width="50"></el-table-column>
+                <!-- <el-table-column align="center"  prop="key" label="模型标志" width="180"></el-table-column> -->
+                <el-table-column align="center" prop="name" label="模型名称"></el-table-column>
+                <el-table-column align="center" prop="metaInfo" label="描述">
+                    <template slot-scope="scope">
+                        {{ scope.row.metaInfo ?JSON.parse(scope.row.metaInfo).description : '' }}
+                    </template>
+                </el-table-column>
+                <!-- <el-table-column align="center"  prop="category" label="分类" ></el-table-column> -->
+                <el-table-column align="center" prop="createTime" :formatter="$util.YYMM" label="时间"></el-table-column>
+                <el-table-column align="center" prop="lastUpdateTime" :formatter="$util.YYMM" label="最后更新时间"></el-table-column>
+                <el-table-column align="center" label="操作" fixed="right" width="250">
+                    <template slot-scope="scope">
+                        <!-- <el-button @click="doEdit(scope)" type="text" size="small">查看</el-button> -->
+                        <el-button @click="doCopy(scope)" type="text" size="small">复制</el-button>
+                        <el-button @click="doDesign(scope)" type="text" size="small">设计</el-button>
+                        <el-button @click="doDeploy(scope)" type="text" size="small">部署</el-button>
+                        <el-button @click="doDelete(scope)" type="text" size="small">删除</el-button>
+                        <!-- <el-button @click="dd" type="text" size="small">下载</el-button>
+        <el-button @click="dd" type="text" size="small">上传</el-button> -->
+                    </template>
+                </el-table-column>
+            </el-table>
+            <el-pagination style="margin:10px 10px 0px 10px;float:right" @current-change="doSearch"  :page-size="form.rows" layout="total, prev, pager, next, jumper" :total="total"> </el-pagination>
+            <!-- <t-grid ref="searchReulstList" :options="gridOptions" @selection-change="handleSelectionChange">
+  </t-grid> -->
+            <!-- 弹窗, 新增 / 修改 -->
+            <edit-form v-if="editFormVisible" ref="editForm" @change="doSearch(1)"></edit-form>
+            <import-form v-if="importFormVisible" ref="importForm" @change="doSearch(1)"></import-form>
+            <design-form v-if="designFormVisible" ref="designForm"></design-form>
+            <code-view-form v-if="codeViewFormVisible" ref="codeViewForm"></code-view-form>
+        </div>
+    </div>
+</template>
+
+<script>
+import EditForm from './edit'
+import DesignForm from './design'
+import CodeViewForm from './codeView'
+import ImportForm from './Import'
+import AproveStep from '../comWin/aproveStep'
+// 重发代办
+export default {
+    data() {
+        return {
+            editFormVisible: false,
+            designFormVisible: false,
+            codeViewFormVisible: false,
+            uploadFormVisible: false,
+            importFormVisible: false,
+            selectedRows: [],
+            index(i) {
+                return ++i
+            },
+            total: 0,
+            list: [],
+            form: {
+                page: 1,
+                rows: 10,
+                searchKey: ''
+            }
+        }
+    },
+    components: {
+        EditForm,
+        AproveStep,
+        DesignForm,
+        CodeViewForm,
+        ImportForm
+    },
+    created() {
+        this.doSearch(1)
+    },
+    methods: {
+        YYMM(row, column, cellValue) {
+            return this.$util.datetimeFormat(cellValue)
+        },
+        doSearch(value) {
+            this.importFormVisible = false
+            this.form.page = value
+
+            let self = this
+            var obj = {
+                url: this.$url.workflowdef.getList,
+                data: this.form,
+                type: 'post'
+            }
+            this.common.httpPost(obj, success)
+            function success(data) {
+                self.list = data.data.rows
+                self.total = data.data.total
+            }
+        },
+        doImport() {
+            this.importFormVisible = true
+            this.$nextTick(() => {
+                console.log(this)
+                this.$refs.importForm.init(null)
+            })
+        },
+        doNew() {
+            this.editFormVisible = true
+            this.$nextTick(() => {
+                this.$refs.editForm.init(null)
+            })
+        },
+        // doImport() {
+        //     this.importFormVisible = true
+        //     this.$nextTick(() => {
+        //         console.log(this)
+        //         this.$refs.importForm.init(null)
+        //     })
+        // },
+        doEdit(row) {
+            this.editFormVisible = true
+
+            this.$nextTick(() => {
+                this.$refs.editForm.init(row.row.id)
+            })
+        },
+
+        doCopy(row) {
+            row = row.row
+            let self = this
+            var obj = {
+                url: this.$url.workflowdef.copyById,
+                data: {
+                    id: row.id
+                }
+            }
+            this.common.httpPost(obj, success)
+            function success(data) {
+                self.$notify.success({
+                    title: '操作成功',
+                    message: '模型已复制成功!'
+                })
+                self.doSearch(1)
+            }
+            // tapp.services.wf_Model.copy(row.id).then(function(result) {
+            //   self.$notify.success({
+            //     title: '操作成功',
+            //     message: '模型已复制成功!'
+            //   });
+            //   self.$refs.searchReulstList.refresh();
+            // })
+        },
+        doDesign(row) {
+            row = row.row
+            this.designFormVisible = true
+            this.$nextTick(() => {
+                this.$refs.designForm.init(row.id)
+            })
+        },
+        doViewCode(row) {
+            this.codeViewFormVisible = true
+            console.log(row)
+            this.$nextTick(() => {
+                this.$refs.codeViewForm.init(row.key)
+            })
+        },
+        download() {
+            console.log(this.$url)
+            window.location.href = this.$url.workflowdef.getExportFile
+        },
+        doDeploy(row) {
+            row = row.row
+            let self = this
+            var obj = {
+                url: this.$url.workflowdef.deploy,
+                data: {
+                    modelId: row.id
+                }
+            }
+            this.common.httpPost(obj, success)
+            function success(data) {
+                self.$notify.success({
+                    title: '操作成功',
+                    message: '模型已部署成功!'
+                })
+                self.doSearch(1)
+            }
+        },
+        doDelete(row) {
+            row = row.row
+            let self = this
+            var obj = {
+                url: this.$url.workflowdef.deleteModelById,
+                data: {
+                    id: row.id
+                }
+            }
+            this.common.httpPost(obj, success)
+            function success(data) {
+                self.$notify.success({
+                    title: '操作成功',
+                    message: '模型已删除!'
+                })
+                self.doSearch(1)
+            }
+        },
+        handleSelectionChange(val) {
+            this.selectedRows = val
+        },
+
+        doBatchDelete() {
+            let self = this
+            if (!self.selectedRows || self.selectedRows.length == 0) {
+                self.$notify.info({
+                    title: '系统提示',
+                    message: '您没选择任何行,无法操作!'
+                })
+                return
+            }
+            let ids = new Array()
+            // ids[0] = '5';
+            // for(let i=0;i<self.selectedRows.length;i++){
+            //   ids.push(self.selectedRows[i].id)
+            // }
+            self.selectedRows.map(function(row) {
+                ids.push(row.id)
+            })
+            ids = ids.join(',')
+            console.log(ids)
+            self.$confirm('此操作将永久删除' + ids.length + '个模型, 是否继续?', '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(() => {
+                var obj = {
+                    url: this.$url.workflowdef.del,
+                    data: {
+                        ids: ids
+                    }
+                }
+                this.common.httpPost(obj, success)
+                function success(data) {
+                    self.$notify.success({
+                        title: '操作成功',
+                        message: '模型已删除成功!'
+                    })
+                    self.doSearch(1)
+                }
+            })
+        },
+        doExportExcel() {
+            this.$refs.searchReulstList.exportCSV('模型列表')
+        }
+        // ,
+        // doSearch(value) {
+        //   this.form.page = value;
+
+        // let self = this;
+        // var obj ={
+        //   url:this.$url.workflowdef.getList,
+        //   data:this.form
+        // }
+        // this.common.httpPost(obj,success);
+        // function success(data){
+
+        //     self.list = data.data.rows
+        //     self.total = data.data.total
+
+        // }
+        // }
+    }
+}
+</script>
+<style lang="scss" scoped>
+::v-deep .el-table td, .el-table th{
+    padding: 3px 0px;
+}
+</style>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 692 - 671
src/router/index.js