Kaynağa Gözat

```快速構建增加流程設置

fangq 4 yıl önce
ebeveyn
işleme
1ac27c6de6

+ 18 - 2
src/api/bank/autodata.js

@@ -34,7 +34,7 @@ export const remove = (ids) => {
 
 export const add = (row) => {
   return request({
-    url: '/api/bank/autodata/submit',
+    url: '/api/bank/autodata/save',
     method: 'post',
     data: row
   })
@@ -42,7 +42,23 @@ export const add = (row) => {
 
 export const update = (row) => {
   return request({
-    url: '/api/bank/autodata/submit',
+    url: '/api/bank/autodata/update',
+    method: 'post',
+    data: row
+  })
+}
+
+export const approveYes = (row) => {
+  return request({
+    url: '/api/bank/autodata/approveYes',
+    method: 'post',
+    data: row
+  })
+}
+
+export const approveNo = (row) => {
+  return request({
+    url: '/api/bank/autodata/approveNo',
     method: 'post',
     data: row
   })

+ 12 - 0
src/api/system/user.js

@@ -142,6 +142,18 @@ export const getPage = (current, size, params, hasOrgNo) => {
   })
 }
 
+export const getPageAll = (current, size, params) => {
+  return request({
+    url: '/api/blade-system/expand/user/pageAll',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}
+
 export const getUserList = () => {
   return request({
     url: '/api/blade-user/user-list',

+ 192 - 0
src/components/autostruct/auto-setting.vue

@@ -0,0 +1,192 @@
+<template>
+  <div>
+    <el-row>
+      <avue-form ref="form" v-model="form" :option="option" @submit="settingSave">
+        <template slot="setting">
+          <el-row v-if="form.num > 1">
+            <el-steps :active="active">
+              <el-step v-for="i in form.num" @click.native="stepClick(i)" :key="i"></el-step>
+            </el-steps>
+          </el-row>
+          <el-row  v-for="i in form.num" :key="i">
+            <div v-if="i == active">
+              <select-user :multiple="form.approveType == 2" :name="selectPersonName" :callback="selectCallback"></select-user>
+            </div>
+          </el-row>
+        </template>
+      </avue-form>
+    </el-row>
+
+
+  </div>
+</template>
+
+<script>
+  import SelectUser from "../select-dialog/select-user";
+  export default {
+    name: "auto-setting",
+    components: {SelectUser},
+    props: {
+      flowSetting: Object,
+      default: {}
+    },
+    data(){
+      return {
+        active: 1,
+        form: {
+          num: 1,
+          approveType: 1,
+          settingType: 1,
+        },
+        selectPersonName: '',
+        settingPersons:[
+          {
+            id:'',
+            name:'',
+            ehr:'',
+          },
+        ],
+        option: {
+          column: [
+            {
+              label: "串並行",
+              prop: "approveType",
+              span: 6,
+              type: "radio",
+              dicData: [{
+                label: '串行',
+                value: 1
+              }, {
+                label: '並行',
+                value: 2
+              }],
+            },
+            {
+              label: "設置方式",
+              prop: "settingType",
+              span: 6,
+              type: "radio",
+              display: true,
+              dicData: [{
+                label: '統一設置',
+                value: 1
+              }, {
+                label: '逐級設置',
+                value: 2
+              }],
+            },
+            {
+              label: "審批節點",
+              prop: "num",
+              type: 'number',
+              span: 6,
+              minRows: 1,
+              maxRows: 6,
+              row:true,
+              readonly: true,
+              value: 1
+            },
+            {
+              label: "節點設置",
+              prop: "setting",
+              display: true,
+              formslot: true
+            }
+          ]
+        }
+
+
+      }
+    },
+    created() {
+      if (this.flowSetting.approveType > 0){
+        this.form.approveType = this.flowSetting.approveType;
+        this.form.settingType = this.flowSetting.settingType;
+        this.form.num = this.flowSetting.num;
+        this.form.setting = this.flowSetting.setting;
+
+        this.settingPersons = JSON.parse(this.form.setting);
+        if (this.form.approveType == 2){
+          //並行,多選
+          let nameArr = [];
+          this.settingPersons.forEach(item => {
+            nameArr.push(item.name)
+          })
+          this.selectPersonName = nameArr.join()
+        }else{
+          this.selectPersonName = this.settingPersons[0].name;
+        }
+        console.log(this.selectPersonName)
+      }
+    },
+    watch: {
+      "form.approveType": function(newValue, oldValue){
+        this.option.column[1].display = newValue == 1
+        this.option.column[2].display = newValue == 1
+        this.option.column[3].display = newValue == 2 || ( newValue == 1 && this.form.settingType == 1)
+      },
+      "form.settingType": function(newValue, oldValue){
+        // this.option.column[2].display = newValue == 2
+        this.option.column[3].display = newValue == 1
+        // this.option.column[3].display = newValue == 1 && this.form.approveType == 2
+      },
+      "form.num": function(newValue, oldValue){
+        if (Math.abs(newValue-oldValue) > 1){
+          return;
+        }
+        console.log(newValue + '-' + oldValue)
+        if (newValue < oldValue){
+          //-
+          this.settingPersons.pop()
+        }else{
+          //+
+          let item = {
+            id:'',
+            name:'',
+            ehr:'',
+          }
+          this.settingPersons.push(item)
+        }
+      },
+    },
+    computed(){
+      /*test: function(){
+        return false;
+      }*/
+    },
+    methods: {
+      stepClick(step){
+        this.active = step;
+        let selectObj = this.settingPersons[step-1];
+        console.log('stepClick')
+        console.log(this.settingPersons)
+        this.selectPersonName = selectObj.name;
+        console.log(this.selectPersonName)
+      },
+      handleChange(){
+
+      },
+      selectCallback(selectList){
+        if (this.form.approveType == 1){
+          let row = selectList[0]
+          let item = {}
+          item.id = row.id;
+          item.name = row.name;
+          item.ehr = row.ehr;
+          this.settingPersons[this.active-1] = item;
+        }else{
+          this.settingPersons = selectList;
+        }
+      },
+      settingSave(row, done){
+        row.setting = JSON.stringify(this.settingPersons);
+        this.$emit("callback", row)
+        done();
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 247 - 0
src/components/select-dialog/select-user.vue

@@ -0,0 +1,247 @@
+<template>
+  <!--<div v-if="visible">
+    <avue-input-table :disabled="disabled" :props="props" :column="column" :formatter="formatter" :on-load="loadData" v-model="value" placeholder="請選擇"></avue-input-table>
+  </div>-->
+  <div>
+    <el-input v-model="text" readonly @click.native="visible = true"></el-input>
+    <el-dialog :append-to-body="true" :modal-append-to-body="false" :destroy-on-close="true" :visible.sync="visible" title="" width="80%">
+      <basic-container v-if="visible">
+        <avue-crud :option="option"
+                   :search.sync="search"
+                   :table-loading="loading"
+                   :data="data"
+                   ref="crud"
+                   v-model="form"
+                   :page.sync="page"
+                   @row-click="rowClick"
+                   @search-change="searchChange"
+                   @search-reset="searchReset"
+                   @selection-change="selectionChange"
+                   @current-change="currentChange"
+                   @size-change="sizeChange"
+                   @refresh-change="refreshChange"
+                   @on-load="onLoad">
+        </avue-crud>
+        <div style="float: right;margin: 0 15px 15px">
+          <el-button type="primary" :disabled="selectionList.length == 0" icon="el-icon-check" @click.native="selectUser">確 定</el-button>
+        </div>
+      </basic-container>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+
+  import {getPageAll} from "@/api/system/user";
+  import {getRoleTree} from "@/api/system/role";
+
+  export default {
+    name: "select-user",
+    data(){
+      return {
+        text: '',
+
+        form: {},
+        search:{},
+        query: {},
+        loading: true,
+        page: {
+          pageSize: 10,
+          currentPage: 1,
+          total: 0
+        },
+        selectionList: [],
+        data: [],
+
+
+        visible: false,
+        option:{
+          border: true,
+          selection:true,
+          reserveSelection:true,
+
+          header: false,
+          menu: false,
+          searchMenuSpan: 6,
+          // searchMenuPosition: "left",
+          column: [
+            {
+              label: "登錄帳號",
+              prop: "account",
+              search: true,
+              searchSpan: 4,
+              display: false
+            },
+            {
+              label: "EHR號",
+              prop: "ehr",
+              slot: true,
+              display: false
+            },
+            {
+              label: "用戶姓名",
+              prop: "name",
+              search: true,
+              searchSpan: 4,
+              display: false
+            },
+            {
+              label: "所屬角色",
+              prop: "roleName",
+              slot: true,
+              display: false
+            },
+            {
+              label: "所屬角色",
+              prop: "roleId",
+              search: true,
+              multiple: true,
+              hide: true,
+              type: "tree",
+              dicData: [],
+              props: {
+                label: "title"
+              },
+              checkStrictly: true,
+              slot: true,
+              rules: [{
+                required: true,
+                message: "請選擇所屬角色",
+                trigger: "click"
+              }]
+            },
+            {
+              label: "所屬部門",
+              prop: "deptName",
+              slot: true,
+              display: false
+            },
+            /*{
+              label: "用戶平臺",
+              prop: "userTypeName",
+              slot: true,
+              display: false
+            },
+            {
+              label: "用戶平臺",
+              type: "select",
+              dicUrl: "/api/blade-system/dict/dictionary?code=user_type",
+              props: {
+                label: "dictValue",
+                value: "dictKey"
+              },
+              dataType: "number",
+              search: true,
+              hide: true,
+              display: false,
+              prop: "userType",
+              rules: [{
+                required: true,
+                message: "請選擇用戶平臺",
+                trigger: "blur"
+              }]
+            },*/
+          ],
+        },
+      }
+    },
+    props: {
+      callback: {
+        type: Function
+      },
+      name: {
+        type: String
+      },
+      multiple: {
+        type: Boolean,
+        default: false
+      }
+    },
+    created() {
+      getRoleTree("000000").then(res => {
+        const column = this.findObject(this.option.column, "roleId");
+        column.dicData = res.data.data;
+      });
+      this.init()
+    },
+    methods: {
+      init(){
+        this.text = this.name;
+      },
+      formatter(row){
+        if(!row.name) return '';
+        if (row.name && this.callback){
+          this.callback(row)
+        }
+        return row.name;
+        // return row.name + '-' + row.ehr;
+      },
+
+      rowClick(row, column, event){
+        if (!this.multiple){
+          this.selectionClear();
+        }
+        let $target = event.currentTarget.firstElementChild;
+        $target.firstChild.firstChild.click();
+      },
+      selectUser(){
+        let nameArr = [];
+        let selectList = [];
+        this.selectionList.forEach(item => {
+          nameArr.push(item.name)
+          let obj = {};
+          obj.id = item.id,obj.name = item.name,obj.ehr = item.ehr;
+          selectList.push(obj)
+        })
+        this.text = nameArr.join()
+        this.callback(selectList)
+        this.visible = false;
+      },
+
+      searchReset() {
+        this.query = {};
+        this.onLoad(this.page);
+      },
+      searchChange(params, done) {
+        this.query = params;
+        this.page.currentPage = 1;
+        this.onLoad(this.page, params);
+        done();
+      },
+      selectionChange(list) {
+        this.selectionList = list;
+      },
+      selectionClear() {
+        this.selectionList = [];
+        this.$refs.crud.toggleSelection();
+      },
+      currentChange(currentPage) {
+        this.page.currentPage = currentPage;
+      },
+      sizeChange(pageSize) {
+        this.page.pageSize = pageSize;
+      },
+      refreshChange() {
+        this.onLoad(this.page, this.query);
+      },
+      onLoad(page, params = {}){
+        //分頁查詢信息
+        getPageAll(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
+          var data = res.data.data;
+          this.page.total = data.total;
+          this.data = data.records;
+          this.loading = false;
+          if (!this.option.reserveSelection){
+            this.selectionClear();
+          }
+          // callback({total: data.total, data: data.records});
+        })
+      },
+    }
+  }
+</script>
+
+<style scoped>
+
+</style>

+ 2 - 2
src/util/util.js

@@ -317,7 +317,7 @@ export const getQueryString = (name) => {
  * @param {String} name - 文檔名,eg: test.png
  */
 export const downloadFileBlob = (path, name) => {
-  /*const xhr = new XMLHttpRequest();
+  const xhr = new XMLHttpRequest();
   xhr.open('get', path);
   xhr.responseType = 'blob';
   xhr.send();
@@ -338,7 +338,7 @@ export const downloadFileBlob = (path, name) => {
       document.body.removeChild(a);
       URL.revokeObjectURL(url);
     }
-  };*/
+  };
 
   request({
     url: path,

+ 209 - 4
src/views/bank/autodata.vue

@@ -39,21 +39,98 @@
                      @click="handleDelete">刪 除
           </el-button>
         </template>
+
+        <template slot="fileForm" slot-scope="{row}">
+          <avue-form ref="form" :option="attachOption" v-model="attachForm" :upload-after="uploadAfter" :upload-error="uploadError" :upload-delete="uploadDelete" :upload-preview="uploadPreview">
+          </avue-form>
+        </template>
+
+        <template slot="receiverNameForm" slot-scope="{row}">
+          <select-user :multiple="false" :name="approvePerson.name" :callback="selectCallback"></select-user>
+<!--          <select-dialog-user :id="approvePerson.id" :name="approvePerson.name" :ehr="approvePerson.ehr" :disabled="false" :callback="selectCallback"></select-dialog-user>-->
+        </template>
+
+        <template slot-scope="{row}" slot="menu">
+          <el-button type="text" icon="el-icon-download" size="small" v-if="row.file" @click="handleDownload(row)">下載</el-button>
+          <el-button type="text" icon="el-icon-check" size="small" v-if="approveSwitch == 1 && row.process > 0 && row.process < approveNum && userInfo.user_id == row.receiverId"
+                     @click.native="approveShow(row)">審批</el-button>
+        </template>
       </avue-crud>
+
+
+      <el-dialog :append-to-body="true" :modal-append-to-body="false" :destroy-on-close="true" :visible.sync="approveVisible" title="審批" width="70%">
+        <div v-if="approveVisible">
+          <avue-form ref="approveForm" :option="approveOption" v-model="approveForm" @submit="approveYes">
+            <template slot="receiverName">
+              <select-user :multiple="false" :name="approvePerson.name" :callback="selectCallback"></select-user>
+<!--              <select-dialog-user :id="approvePerson.id" :name="approvePerson.name" :ehr="approvePerson.ehr" :disabled="false" :callback="selectCallback"></select-dialog-user>-->
+            </template>
+
+            <template slot-scope="scope" slot="menuForm">
+              <el-button type="danger" size="small" v-if="bohuiBtn" icon="el-icon-close" @click="approveNo">駁回</el-button>
+            </template>
+          </avue-form>
+        </div>
+      </el-dialog>
     </div>
   </basic-container>
 </template>
 
 <script>
-  import {getList, getDetail, add, update, remove} from "@/api/bank/autodata";
+  import {getList, getDetail, add, update, remove, approveYes, approveNo} from "@/api/bank/autodata";
   import {mapGetters} from "vuex";
   import {getSelectAndPermissionByDept} from "@/api/bank/autostruct";
   import {opStr2opObj} from "../../api/bank/autostruct";
   import { getCurrentDept } from "@/api/system/dept";
+  import {downloadFileBase64, downloadFileBlob} from "@/util/util";
+  import SelectDialogUser from "../../components/select-dialog/select-dialog-user";
+  import SelectUser from "../../components/select-dialog/select-user";
 
   export default {
+    components: {SelectUser, SelectDialogUser},
     data() {
       return {
+
+        attachBox: false,
+        attachForm: {},
+        attachOption: {
+          submitBtn: false,
+          emptyBtn: false,
+          column: [
+            {
+              // label: '附件上傳',
+              prop: 'attachFile',
+              type: 'upload',
+              disabled: true,
+              drag: true,
+              loadText: '模板上傳中,請稍等',
+              span: 24,
+              fileSize: 5120,
+              propsHttp: {
+                res: 'data'
+              },
+              name: "namesrc",
+              action: "/api/blade-resource/oss/endpoint/put-file-attach"
+            }
+          ]
+        },
+
+        approvePerson: {
+          id: '',
+          name: '',
+          ehr: '',
+        },
+        approveSwitch: false,
+        bohuiBtn: false,
+        approveNum: 0,
+        approveVisible: false,
+        approveForm: {},
+        approveOption: {
+          submitText: "通過",
+          emptyBtn: false,
+          column: []
+        },
+
         show: false,
         value: '',
         tableList: [],
@@ -108,6 +185,25 @@
               trigger: "blur"
             }]
           },
+          {
+            label: "審批人",
+            prop: "receiverName",
+            viewDisplay: false,
+            addDisplay: true,
+            editDisplay: true,
+            formslot: true,
+            rules: [{
+              required: true,
+              message: "請選擇審批人",
+              trigger: "change"
+            }]
+          },
+          {
+            label: "備註",
+            prop: "remark",
+            type: "textarea",
+            span: 24,
+          }
         ]
       };
     },
@@ -135,6 +231,70 @@
       this.initTableList();
     },
     methods: {
+      approveYes(data, done){
+        let row = this.deepClone(this.approveForm);
+        delete row.createTime,delete row.createUser,delete row.createUserName;
+        let form = this.beforeSave(row);
+        form.id = row.id, form.remark = row.remark;
+        approveYes(form).then(res => {
+          this.approveVisible = false;
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "審批成功!"
+          });
+        })
+        done();
+      },
+      approveNo(){
+        let row = this.deepClone(this.approveForm);
+        delete row.createTime,delete row.createUser,delete row.createUserName;
+        let form = this.beforeSave(row);
+        form.id = row.id, form.remark = row.remark;
+        approveNo(form).then(res => {
+          this.approveVisible = false;
+          this.onLoad(this.page);
+          this.$message({
+            type: "success",
+            message: "駁回成功!"
+          });
+        })
+      },
+      approveShow(row){
+        this.bohuiBtn = row.process > 1;
+        this.approveForm = row;
+        delete this.approveForm.receiverName;
+        this.approvePerson.name = '';
+        this.approveVisible = true;
+      },
+      selectCallback(list){
+        let data = list[0];
+        this.form.receiverName = data.name;
+        this.approveForm.receiverName = data.name;
+        this.approvePerson.id = data.id;
+        this.approvePerson.name = data.name;
+        this.approvePerson.ehr = data.ehr;
+      },
+      handleDownload(row) {
+        let fileName = row.file.split("/").pop();
+        downloadFileBase64(row.file, fileName);
+      },
+
+      uploadError(error,column){
+        this.$message.warning(error + ',不能大於' + column.fileSize + 'KB');
+      },
+      uploadAfter(res, done, loading, column) {
+        this.attachForm.attachFile = [res];
+        this.form.file = res.link;
+        this.attachBox = false;
+        done(res);
+      },
+      uploadDelete(column,file) {
+        return this.$confirm(`是否確定移除該選項?`);
+      },
+      uploadPreview(){
+      },
+
       initTableList(){
         getSelectAndPermissionByDept().then(res => {
           const data = res.data.data;
@@ -149,6 +309,8 @@
         let _this = this;
         this.show = false;
         let tableStruct = this.getItemById(value);
+        this.approveSwitch = tableStruct.approveSwitch;
+        this.approveNum = tableStruct.num;
         let option = opStr2opObj(tableStruct.columns);
         option.addBtn = tableStruct.canWrite;
         _this.deleteBatch = tableStruct.isManageRole;
@@ -166,10 +328,27 @@
               return res.data;
             };
           }
+          if (item.prop === 'file'){
+            item.hide = true;
+          }
         });
         option.column.push(this.defaultColumn[0]);
         option.column.push(this.defaultColumn[1]);
+        //開流程 && 串行 && 逐級審批
+        if (tableStruct.approveSwitch == 1 && tableStruct.approveType == 1 && tableStruct.settingType == 2){
+          // 增加審批人選擇
+          option.column.push(this.defaultColumn[2])
+        }
         this.option = option;
+        this.approveOption.column = this.deepClone(option.column);
+        this.approveOption.column.forEach(item => {
+          item.disabled = true;
+          if (item.prop == 'receiverName'){
+            item.disabled = false;
+          }
+        })
+        this.approveOption.column.push(this.defaultColumn[3])
+
         setTimeout(() => {
           _this.show = true;
           _this.onLoad(this.page)
@@ -190,7 +369,7 @@
         let n = 1;
         for(let i = 0; i < keys.length; i++){
           let item = {};
-          if (keys[i].indexOf("$") == 0 || keys[i].indexOf("createTime") != -1 || keys[i].indexOf("createUser") != -1){
+          if (keys[i].indexOf("$") == 0 || keys[i] == ("id") || keys[i].indexOf("createTime") != -1 || keys[i].indexOf("createUser") != -1 || keys[i].indexOf("receiverName") != -1 || keys[i].indexOf("remark") != -1){
           }else{
             item['' + keys[i]] = row[''+keys[i]];
             form['params'+(n++)] = JSON.stringify(item);
@@ -198,6 +377,9 @@
 
         }
         form.tableId = this.value;
+        form.receiverId = this.approvePerson.id;
+        form.receiverName = this.approvePerson.name;
+        form.receiverNo = this.approvePerson.ehr;
         return form;
       },
       rowSave(row, done, loading) {
@@ -217,7 +399,8 @@
       },
       rowUpdate(row, index, done, loading) {
         let formTem = this.deepClone(row);
-        delete formTem.$index,delete formTem.createDept,delete formTem.createTime,delete formTem.createUser,delete formTem.id;
+        delete formTem.$index,delete formTem.createDept,delete formTem.createTime,delete formTem.createUser;
+      // ,delete formTem.id
         let form = this.beforeSave(formTem);
         form.id = row.id;
         update(form).then(() => {
@@ -272,6 +455,20 @@
           });
       },
       beforeOpen(done, type) {
+
+        // 查看時,把上傳組件設為禁用
+        this.attachForm = {};
+        this.attachOption.column[0].disabled = type == 'view';
+
+        let data = this.form;
+        if (data.file){
+          let fileName = data.file.split("/").pop();
+          data.name = fileName;
+          this.attachForm.attachFile = [
+            {label: data.name, value: fileName}
+          ];
+        }
+
         if (["edit", "view"].includes(type)) {
           /*getDetail(this.form.id).then(res => {
             this.form = res.data.data;
@@ -338,7 +535,12 @@
           let row = data[i];
           let form = {};
           form.id = row.id, form.createUser = row.createUser,form.createUserName = row.createUserName, form.createTime = row.createTime, form.createDept = row.createDept;
-          delete row.id, delete row.createUser, delete row.createUserName, delete row.createTime, delete row.createDept;
+          // delete row.id,
+            delete row.createUser, delete row.createUserName, delete row.createTime, delete row.createDept;
+          form.receiverId = row.receiverId, form.receiverNo = row.receiverNo, form.receiverName = row.receiverName;
+          // this.approvePerson.id = row.receiverId, this.approvePerson.ehr = row.receiverNo, this.approvePerson.name = row.receiverName;
+          delete row.receiverId, delete row.receiverNo, delete row.receiverName;
+          form.process = row.process, form.remark = row.remark, form.approveId = row.approveId, form.approveName = row.approveName, form.approveNo = row.approveNo;
           let keys = Object.keys(row);
           for (let j = 0; j < keys.length; j++) {
             let key = keys[j];
@@ -354,6 +556,9 @@
           }
           newData.push(form)
         }
+        // 設置審核按鈕權限
+        /*if (this.userInfo.user_id == form.receiverId){
+        }*/
         return newData;
       },
       onLoad(page, params = {}) {

+ 63 - 1
src/views/bank/autostruct.vue

@@ -36,6 +36,15 @@
                    @click="designOption = row.columns, designVisible = true">設計
         </el-button>
       </template>
+
+      <template slot="settingForm" slot-scope="{row}">
+        <el-button type="primary"
+                   size="small"
+                   icon="el-icon-design"
+                   plain
+                   @click="flowSetting = row, settingVisible = true">設置
+        </el-button>
+      </template>
     </avue-crud>
 
     <el-dialog :append-to-body="true" :modal-append-to-body="false" :destroy-on-close="true" :fullscreen="true" :visible.sync="designVisible" title="表單設計">
@@ -44,6 +53,12 @@
       </div>
     </el-dialog>
 
+    <el-dialog :append-to-body="true" :modal-append-to-body="false" :destroy-on-close="true" :visible.sync="settingVisible" title="流程設置" width="70%">
+      <div v-if="settingVisible">
+        <auto-setting @callback="settingCallback" :flow-setting="flowSetting"></auto-setting>
+      </div>
+    </el-dialog>
+
   </basic-container>
 </template>
 
@@ -55,15 +70,18 @@
   import {getRoleTree} from "@/api/system/role";
   import website from '@/config/website';
   import {opStr2opObj} from "../../api/bank/autostruct";
+  import AutoSetting from "../../components/autostruct/auto-setting";
 
   export default {
-    components: {CyFormDesign},
+    components: {AutoSetting, CyFormDesign},
     data() {
       return {
         designVisible: false,
+        settingVisible: false,
         designOption: {},
 
         form: {},
+        flowSetting: {},
         query: {},
         loading: true,
         page: {
@@ -82,6 +100,7 @@
           index: true,
           viewBtn: true,
           selection: true,
+          reserveSelection:true,
           dialogClickModal: false,
           column: [
             {
@@ -103,6 +122,34 @@
               viewDisplay: false,
               formslot: true,
             },
+            {
+              label: "流程開關",
+              prop: "approveSwitch",
+              span: 12,
+              type: "switch",
+              dicData: [{
+                label: '關',
+                value: 0
+              }, {
+                label: '開',
+                value: 1
+              }],
+              hide: true,
+              change: ({value}) => {
+                let setObj = this.findObject(this.option.column, "setting");
+                setObj.display = value == 1;
+                this.findObject(this.option.column, "approveSwitch").span = value == 1 ? 6 : 12;
+              }
+            },
+            {
+              label: "流程设置",
+              prop: "setting",
+              span: 6,
+              hide: true,
+              display: false,
+              viewDisplay: false,
+              formslot: true,
+            },
             {
               label: "填寫部門",
               prop: "deptId",
@@ -222,11 +269,22 @@
       });
     },
     methods: {
+      settingCallback(value){
+        this.settingVisible = false;
+        this.form.approveType = value.approveType;
+        this.form.settingType = value.settingType;
+        this.form.setting = value.setting;
+        this.form.num = value.num;
+      },
       designCallback(value){
         this.designVisible = false;
         this.form.columns = value;
       },
       rowSave(row, done, loading) {
+        if (row.approveType == 1 && row.settingType == 2){
+          // 串行-逐級設置
+          delete row.setting;
+        }
         add(row).then(() => {
           this.onLoad(this.page);
           this.$message({
@@ -240,6 +298,10 @@
         });
       },
       rowUpdate(row, index, done, loading) {
+        if (row.approveType == 1 && row.settingType == 2){
+          // 串行-逐級設置
+          delete row.setting;
+        }
         update(row).then(() => {
           this.onLoad(this.page);
           this.$message({