添加离校环节编辑审核人及编辑负责人功能
diff --git a/leave-school-vue/src/api/leaveschoolnode-api.js b/leave-school-vue/src/api/leaveschoolnode-api.js
index be89f15..381fe14 100644
--- a/leave-school-vue/src/api/leaveschoolnode-api.js
+++ b/leave-school-vue/src/api/leaveschoolnode-api.js
@@ -37,3 +37,59 @@
     data
   })
 }
+
+export function getUser(params) {
+  return request({
+    url: '/api/procedures/node/get-user',
+    method: 'get',
+    params
+  })
+}
+
+export function getAuditorList(params) {
+  return request({
+    url: '/api/procedures/node/auditor-list',
+    method: 'get',
+    params
+  })
+}
+
+export function createNodeAuditor(data) {
+  return request({
+    url: '/api/procedures/node/create-node-auditor',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteNodeAuditor(data) {
+  return request({
+    url: '/api/procedures/node/delete-node-auditor',
+    method: 'delete',
+    data
+  })
+}
+
+export function getPrincipalList(params) {
+  return request({
+    url: '/api/procedures/node/principal-list',
+    method: 'get',
+    params
+  })
+}
+
+export function createNodePrincipal(data) {
+  return request({
+    url: '/api/procedures/node/create-node-principal',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteNodePrincipal(data) {
+  return request({
+    url: '/api/procedures/node/delete-node-principal',
+    method: 'delete',
+    data
+  })
+}
diff --git a/leave-school-vue/src/mock/index.js b/leave-school-vue/src/mock/index.js
index 34a75e5..6faf31e 100644
--- a/leave-school-vue/src/mock/index.js
+++ b/leave-school-vue/src/mock/index.js
@@ -125,6 +125,13 @@
 Mock.mock(/\/api\/procedures\/node\/create-node/, 'post', leaveschoolnodeApi.createData)
 Mock.mock(/\/api\/procedures\/node\/delete-node/, 'delete', leaveschoolnodeApi.deleteData)
 Mock.mock(/\/api\/procedures\/node\/get-item/, 'get', leaveschoolnodeApi.getItem)
+Mock.mock(/\/api\/procedures\/node\/get-user/, 'get', leaveschoolnodeApi.getUser)
+Mock.mock(/\/api\/procedures\/node\/auditor-list/, 'get', leaveschoolnodeApi.getAuditorList)
+Mock.mock(/\/api\/procedures\/node\/create-node-auditor/, 'post', leaveschoolnodeApi.createNodeAuditor)
+Mock.mock(/\/api\/procedures\/node\/delete-node-auditor/, 'delete', leaveschoolnodeApi.deleteNodeAuditor)
+Mock.mock(/\/api\/procedures\/node\/principal-list/, 'get', leaveschoolnodeApi.getPrincipalList)
+Mock.mock(/\/api\/procedures\/node\/create-node-principal/, 'post', leaveschoolnodeApi.createNodeAuditor)
+Mock.mock(/\/api\/procedures\/node\/delete-node-principal/, 'delete', leaveschoolnodeApi.deleteNodeAuditor)
 
 // 用户管理
 Mock.mock(/\/api\/system\/user\/list-api/, 'get', userApi.getPage)
diff --git a/leave-school-vue/src/mock/leaveschoolnode.js b/leave-school-vue/src/mock/leaveschoolnode.js
index 10c7257..914b82a 100644
--- a/leave-school-vue/src/mock/leaveschoolnode.js
+++ b/leave-school-vue/src/mock/leaveschoolnode.js
@@ -42,6 +42,47 @@
   }
 ]
 
+const userList = [
+  {
+    'id': '1',
+    'xm': '张三',
+    'xb': { 'value': 'male', 'label': '男' },
+    'ghxh': '11'
+  },
+  {
+    'id': '2',
+    'xm': '李四',
+    'xb': { 'value': 'female', 'label': '女' },
+    'ghxh': '22'
+  }
+]
+
+const auditorList = [
+  {
+    'id': '11',
+    'auditNode': { 'id': '26', 'name': '后勤处' },
+    'user': { 'id': '3', 'ghxh': '33', 'xm': '王五', 'xb': { 'value': 'male', 'label': '男' }}
+  },
+  {
+    'id': '22',
+    'auditNode': { 'id': '28', 'name': '图书馆' },
+    'user': { 'id': '4', 'ghxh': '44', 'xm': '赵六', 'xb': { 'value': 'female', 'label': '女' }}
+  }
+]
+
+const principalList = [
+  {
+    'id': '11',
+    'auditNode': { 'id': '26', 'name': '后勤处' },
+    'user': { 'id': '3', 'ghxh': '33', 'xm': '王六', 'xb': { 'value': 'male', 'label': '男' }}
+  },
+  {
+    'id': '11',
+    'auditNode': { 'id': '28', 'name': '图书馆' },
+    'user': { 'id': '4', 'ghxh': '44', 'xm': '赵七', 'xb': { 'value': 'female', 'label': '女' }}
+  }
+]
+
 export default{
   getList: config => {
     const { name, auditType, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
@@ -99,5 +140,97 @@
     return {
       code: 200
     }
+  },
+  getUser: config => {
+    const { ghxh } = param2Obj(config.url)
+    const mockList = userList.filter(item => item.ghxh + '' === ghxh + '')
+    return {
+      data: mockList.length > 0 ? mockList[0] : null,
+      code: 200
+    }
+  },
+  getAuditorList: config => {
+    const { nodeId } = param2Obj(config.url)
+    const mockList = auditorList.filter(item => item.auditNode.id + '' === nodeId + '')
+    return {
+      items: mockList,
+      code: 200
+    }
+  },
+  createNodeAuditor: config => {
+    const nodeAuditor = JSON.parse(config.body)
+    if (!nodeAuditor.id) {
+      nodeAuditor.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      auditorList.unshift(nodeAuditor)
+    } else {
+      for (let i = 0; i < auditorList.length; i++) {
+        if (auditorList[i].id + '' === nodeAuditor.id + '') {
+          auditorList.splice(i, 1, nodeAuditor)
+          break
+        }
+      }
+    }
+    return {
+      item: nodeAuditor,
+      code: 200
+    }
+  },
+  deleteNodeAuditor: config => {
+    const nodeAuditor = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < auditorList.length; i++) {
+      if (auditorList[i].id + '' === nodeAuditor.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      auditorList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
+  },
+  getPrincipalList: config => {
+    const { nodeId } = param2Obj(config.url)
+    const mockList = principalList.filter(item => item.auditNode.id + '' === nodeId + '')
+    return {
+      items: mockList,
+      code: 200
+    }
+  },
+  createNodePrincipal: config => {
+    const nodePrincipal = JSON.parse(config.body)
+    if (!nodePrincipal.id) {
+      nodePrincipal.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
+      principalList.unshift(nodePrincipal)
+    } else {
+      for (let i = 0; i < principalList.length; i++) {
+        if (principalList[i].id + '' === nodePrincipal.id + '') {
+          principalList.splice(i, 1, nodePrincipal)
+          break
+        }
+      }
+    }
+    return {
+      item: nodePrincipal,
+      code: 200
+    }
+  },
+  deleteNodePrincipal: config => {
+    const nodePrincipal = JSON.parse(config.body)
+    let index = -1
+    for (let i = 0; i < principalList.length; i++) {
+      if (principalList[i].id + '' === nodePrincipal.id + '') {
+        index = i
+        break
+      }
+    }
+    if (index > -1) {
+      principalList.splice(index, 1)
+    }
+    return {
+      code: 200
+    }
   }
 }
diff --git a/leave-school-vue/src/views/procedures/node/index.vue b/leave-school-vue/src/views/procedures/node/index.vue
index 648e4f2..8c21bc2 100644
--- a/leave-school-vue/src/views/procedures/node/index.vue
+++ b/leave-school-vue/src/views/procedures/node/index.vue
@@ -76,6 +76,8 @@
         <template slot-scope="scope">
           <el-button type="text" size="small" @click="handleCreate(scope.row.id, 'update')">修改</el-button>
           <el-button type="text" size="small" @click="handleDelete(scope.row.id)">删除</el-button>
+          <el-button type="text" size="small" @click="handleAuditor(scope.row.id)">编辑审核人</el-button>
+          <el-button type="text" size="small" @click="handlePrincipal(scope.row.id)">编辑负责人</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -84,7 +86,7 @@
       </el-pagination>
     </div>
 
-    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="80%" top="10vh">
+    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" width="60%" top="10vh">
       <el-form :rules="rules" ref="dataForm" :model="temp" label-position="left" label-width="150px" style='margin-left:50px;'>
         <el-form-item label="审核环节名称" prop="name">
           <el-input v-model="temp.name"></el-input>
@@ -132,17 +134,118 @@
         <el-button type="primary" @click="createData">提交</el-button>
       </div>
     </el-dialog>
+    <el-dialog title="编辑审核人" :visible.sync="dialogAuditorVisible" width="70%" top="10vh">
+      <el-form :inline="true" class="demo-form-inline"  :model="auditor" style='margin-left:50px;' >
+        <el-form-item label="工号" prop="ghxh">
+          <el-input v-model="auditor.ghxh" @blur="handleGetAuditor"></el-input>
+          <input type="hidden" v-model="auditor.id" />
+          <input type="hidden" v-model="nodeId" />
+        </el-form-item>
+        <el-form-item label="姓名" prop="xm">
+          <el-input v-model="auditor.xm" disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item label="性别" prop="xb">
+          <el-input v-model="auditor.xb" disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSaveAuditor">保存</el-button>
+        </el-form-item>
+      </el-form>
+      <el-table :data="auditorList" v-loading="listLoading" element-loading-text="Loading" border fit highlight-current-row>
+      <el-table-column align="center" type="index" label='序号' width="95">
+      </el-table-column>
+      <el-table-column label="工号" align="center">
+        <template slot-scope="scope">
+          {{scope.row.user.ghxh}}
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center">
+        <template slot-scope="scope">
+          <span>{{scope.row.user.xm}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="性别" align="center">
+        <template slot-scope="scope">
+          {{scope.row.user.xb.label}}
+        </template>
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleDeleteAuditor(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogAuditorVisible = false">返回</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog title="编辑负责人" :visible.sync="dialogPrincipalVisible" width="70%" top="10vh">
+      <el-form :inline="true" class="demo-form-inline"  :model="principal" style='margin-left:50px;' >
+        <el-form-item label="工号" prop="ghxh">
+          <el-input v-model="principal.ghxh" @blur="handleGetPrincipal"></el-input>
+          <input type="hidden" v-model="principal.id" />
+          <input type="hidden" v-model="nodeId" />
+        </el-form-item>
+        <el-form-item label="姓名" prop="xm">
+          <el-input v-model="principal.xm" disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item label="性别" prop="xb">
+          <el-input v-model="principal.xb" disabled="true"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="handleSavePrincipal">保存</el-button>
+        </el-form-item>
+      </el-form>
+      <el-table :data="principalList" v-loading="listLoading" element-loading-text="Loading" border fit highlight-current-row>
+      <el-table-column align="center" type="index" label='序号' width="95">
+      </el-table-column>
+      <el-table-column label="工号" align="center">
+        <template slot-scope="scope">
+          {{scope.row.user.ghxh}}
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center">
+        <template slot-scope="scope">
+          <span>{{scope.row.user.xm}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="性别" align="center">
+        <template slot-scope="scope">
+          {{scope.row.user.xb.label}}
+        </template>
+      </el-table-column>
+      <el-table-column
+        fixed="right"
+        header-align="center"
+        align="center"
+        width="150"
+        label="操作">
+        <template slot-scope="scope">
+          <el-button type="text" size="small" @click="handleDeletePrincipal(scope.row.id)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogPrincipalVisible = false">返回</el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { getList, getItem, createNode, deleteNode } from '@/api/leaveschoolnode-api'
+import { getList, getItem, createNode, deleteNode, getUser, getAuditorList, createNodeAuditor, deleteNodeAuditor, getPrincipalList, createNodePrincipal, deleteNodePrincipal } from '@/api/leaveschoolnode-api'
 import { getDicList } from '@/api/dictionary-api'
 import { getDeptList } from '@/api/department-api'
 import waves from '@/directive/waves' // 水波纹指令
 import { resetForm } from '@/utils'
 import { crudPageList, crudGetItem, crudCreate, crudDelete } from '@/utils/crud'
 import mixindata from '@/utils/crud'
+import { MessageBox } from 'element-ui'
 
 const initData = { auditType: '25', defaultAuditStatus: '22' }
 export default {
@@ -161,6 +264,15 @@
       auditTypeList: [],
       scopeList: [],
       statusList: [],
+      nodeId: '',
+      dialogAuditorVisible: false,
+      dialogPrincipalVisible: false,
+      auditor: {},
+      nodeAuditor: {},
+      auditorList: [],
+      principal: {},
+      nodePrincipal: {},
+      principalList: [],
       rules: {
         name: [{ required: true, message: '环节名称', trigger: 'blur' }],
         scope: [{ required: true, message: '范围控制', trigger: 'change' }],
@@ -225,6 +337,110 @@
     },
     handleDelete(rowid) {
       crudDelete(this, deleteNode, rowid, this.handlePageList)
+    },
+    handleAuditor(rowid) {
+      this.auditor = {}
+      this.nodeId = rowid
+      this.handleAuditorList()
+      this.dialogAuditorVisible = true
+    },
+    handleAuditorList() {
+      getAuditorList({ nodeId: this.nodeId }).then(response => {
+        this.auditorList = response.items
+      })
+    },
+    handleGetAuditor(event) {
+      const ghxh = event.target.value
+      if (ghxh) {
+        getUser({ ghxh: ghxh }).then(response => {
+          if (response.data) {
+            this.auditor = { 'id': response.data.id, 'ghxh': response.data.ghxh, 'xm': response.data.xm, 'xb': response.data.xb.label }
+          } else {
+            MessageBox.alert('用户不存在,请重新重新输入工号!', '消息', {
+              confirmButtonText: '确定'
+            })
+            this.auditor = {}
+          }
+        })
+      } else {
+        MessageBox.alert('请填写工号!', '消息', {
+          confirmButtonText: '确定'
+        })
+        this.auditor = {}
+      }
+    },
+    handleSaveAuditor() {
+      if (!this.auditor.id) {
+        MessageBox.alert('请填写正确的工号!', '消息', {
+          confirmButtonText: '确定'
+        })
+        return
+      }
+      this.nodeAuditor = { 'auditNode': { 'id': this.nodeId }, 'user': { 'id': this.auditor.id }}
+      createNodeAuditor(this.nodeAuditor).then(response => {
+        this.handleAuditorList()
+        this.$notify({
+          title: '成功',
+          message: '创建成功',
+          type: 'success',
+          duration: 2000
+        })
+      })
+    },
+    handleDeleteAuditor(rowid) {
+      crudDelete(this, deleteNodeAuditor, rowid, this.handleAuditorList)
+    },
+    handlePrincipal(rowid) {
+      this.principal = {}
+      this.nodeId = rowid
+      this.handlePrincipalList()
+      this.dialogPrincipalVisible = true
+    },
+    handlePrincipalList() {
+      getPrincipalList({ nodeId: this.nodeId }).then(response => {
+        this.principalList = response.items
+      })
+    },
+    handleGetPrincipal(event) {
+      const ghxh = event.target.value
+      if (ghxh) {
+        getUser({ ghxh: ghxh }).then(response => {
+          if (response.data) {
+            this.principal = { 'id': response.data.id, 'ghxh': response.data.ghxh, 'xm': response.data.xm, 'xb': response.data.xb.label }
+          } else {
+            MessageBox.alert('用户不存在,请重新重新输入工号!', '消息', {
+              confirmButtonText: '确定'
+            })
+            this.principal = {}
+          }
+        })
+      } else {
+        MessageBox.alert('请填写工号!', '消息', {
+          confirmButtonText: '确定'
+        })
+        this.principal = {}
+      }
+    },
+    handleSavePrincipal() {
+      if (!this.principal.id) {
+        MessageBox.alert('请填写正确的工号!', '消息', {
+          confirmButtonText: '确定'
+        })
+        return
+      }
+      this.nodePrincipal = { 'auditNode': { 'id': this.nodeId }, 'user': { 'id': this.principal.id }}
+      createNodePrincipal(this.nodePrincipal).then(response => {
+        this.handlePrincipalList()
+        this.$notify({
+          title: '成功',
+          message: '创建成功',
+          type: 'success',
+          duration: 2000
+        })
+      })
+    },
+    handleDeletePrincipal(rowid) {
+      crudDelete(this, deleteNodePrincipal, rowid, this.handlePrincipalList)
     }
   }
 }