离校批量审核管理
diff --git a/leave-school-vue/src/api/handling-api.js b/leave-school-vue/src/api/handling-api.js
deleted file mode 100644
index 81f5de2..0000000
--- a/leave-school-vue/src/api/handling-api.js
+++ /dev/null
@@ -1,16 +0,0 @@
-import request from '@/utils/request'
-
-export function getList(params) {
-  return request({
-    url: '/api/statistical/handling/list-api',
-    method: 'get',
-    params
-  })
-}
-export function getItem(params) {
-  return request({
-    url: '/api/statistical/handling/get-item',
-    method: 'get',
-    params
-  })
-}
diff --git a/leave-school-vue/src/api/leavestudent-api.js b/leave-school-vue/src/api/leavestudent-api.js
index 2936d8f..8809120 100644
--- a/leave-school-vue/src/api/leavestudent-api.js
+++ b/leave-school-vue/src/api/leavestudent-api.js
@@ -1,9 +1,17 @@
 import request from '@/utils/request'
 
-export function getAuditList(params) {
+export function getPage(params) {
   return request({
     url: '/api/leaveprocess/leavestudent/auditlist-api',
     method: 'get',
     params
   })
 }
+
+export function saveAudit(data) {
+  return request({
+    url: '/api/leaveprocess/leavestudent/save-audit',
+    method: 'post',
+    data
+  })
+}
diff --git a/leave-school-vue/src/components/AuditStudentList/index.vue b/leave-school-vue/src/components/AuditStudentList/index.vue
index 3db11f7..fd32210 100644
--- a/leave-school-vue/src/components/AuditStudentList/index.vue
+++ b/leave-school-vue/src/components/AuditStudentList/index.vue
@@ -92,7 +92,7 @@
 
 <script>
 import { getBjListByZy } from '@/api/class-api'
-import { getAuditList } from '@/api/leavestudent-api'
+import { getPage } from '@/api/leavestudent-api'
 import { getDeptList as getAllDeptList } from '@/api/department-api'
 import { getZyListByYx } from '@/api/major-api'
 import waves from '@/directive/waves' // 水波纹指令
@@ -176,7 +176,7 @@
       })
     },
     handlePageList() {
-      crudPageList(this, getAuditList)
+      crudPageList(this, getPage)
     },
     handleReset() {
       resetForm(this.listQuery)
diff --git a/leave-school-vue/src/mock/handling.js b/leave-school-vue/src/mock/handling.js
deleted file mode 100644
index 32cd9dd..0000000
--- a/leave-school-vue/src/mock/handling.js
+++ /dev/null
@@ -1,113 +0,0 @@
-import Mock from 'mockjs'
-import { param2Obj } from '@/utils'
-
-const recordList = Mock.mock({
-  'list|26': [{
-    'id': '@increment',
-    'xh': '@word(5)',
-    'xm': '@cword(2, 3)',
-    'yx': '@cword(6, 15)',
-    'zy': '@cword(6, 15)',
-    'bj': '@cword(6, 15)',
-    'xslb': '@cword(3, 5)',
-    'sfzylx|1': ['准予', '不准予'],
-    'shjllist|4': [{
-      'shhj': '@cword(6, 8)',
-      'shzt|1': ['通过', '不通过'],
-      'shyj|3': [{
-        'shzt|1': ['通过', '不通过'],
-        'shsj': '@datetime',
-        'shr': '@cword(2, 3)',
-        'shyj': '@cword(6, 10)'
-      }]
-    }],
-    'blbmlist': [{
-      'bmmc': '后勤处',
-      'shjg|1': ['—', '×', '√']
-    },
-    {
-      'bmmc': '财务处',
-      'shjg|1': ['—', '×', '√']
-    },
-    {
-      'bmmc': '学生处',
-      'shjg|1': ['—', '×', '√']
-    },
-    {
-      'bmmc': '图书馆',
-      'shjg|1': ['—', '×', '√']
-    }]
-  }]
-}).list
-
-export default{
-  getList: config => {
-    const { pcmc, xh, xm, sfzylx, yx, zy, bj, xslb, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
-    const mockList = recordList.filter(item => {
-      if (pcmc && item.pcmc + '' !== pcmc + '') return false
-      if (xh && item.xh !== xh) return false
-      if (xm && item.xm !== xm) return false
-      if (sfzylx && item.sfzylx !== sfzylx) return false
-      if (yx && item.yx !== yx) return false
-      if (zy && item.zy !== zy) return false
-      if (bj && item.bj !== bj) return false
-      if (xslb && item.xslb !== xslb) return false
-      return true
-    })
-
-    const pageList = mockList.filter((item, index) => index < pageSize * pageIndex && index >= pageSize * (pageIndex - 1))
-    return {
-      items: pageList,
-      recordCount: mockList.length,
-      code: 200
-    }
-  },
-  getAllList: config => {
-    return {
-      items: recordList,
-      code: 200
-    }
-  },
-  getItem: config => {
-    const { id } = param2Obj(config.url)
-    const mockList = recordList.filter(item => item.id + '' === id + '')
-    return {
-      data: mockList.length > 0 ? mockList[0] : null,
-      code: 200
-    }
-  },
-  createData: config => {
-    const record = JSON.parse(config.body)
-    if (!record.id) {
-      record.id = '' + parseInt(Math.random() * 100) + 1024 // mock a id
-      recordList.unshift(record)
-    } else {
-      for (let i = 0; i < recordList.length; i++) {
-        if (recordList[i].id + '' === record.id + '') {
-          recordList.splice(i, 1, record)
-          break
-        }
-      }
-    }
-    return {
-      item: record,
-      code: 200
-    }
-  },
-  deleteData: config => {
-    const record = JSON.parse(config.body)
-    let index = -1
-    for (let i = 0; i < recordList.length; i++) {
-      if (recordList[i].id + '' === record.id + '') {
-        index = i
-        break
-      }
-    }
-    if (index > -1) {
-      recordList.splice(index, 1)
-    }
-    return {
-      code: 200
-    }
-  }
-}
diff --git a/leave-school-vue/src/mock/index.js b/leave-school-vue/src/mock/index.js
index f4c79a2..300b502 100644
--- a/leave-school-vue/src/mock/index.js
+++ b/leave-school-vue/src/mock/index.js
@@ -13,7 +13,6 @@
 import instructorApi from './instructor'
 import newspublishApi from './newspublish'
 
-import handlingApi from './handling'
 import leavestudentApi from './leavestudent'
 import nodereportApi from './nodereport'
 import deptreportApi from './deptreport'
@@ -107,12 +106,9 @@
 Mock.mock(/\/api\/news\/newspublish\/delete-newspublish/, 'delete', newspublishApi.deleteData)
 Mock.mock(/\/api\/news\/newspublish\/get-item/, 'get', newspublishApi.getItem)
 
-// 办理情况查询
-Mock.mock(/\/api\/statistical\/handling\/list-api/, 'get', handlingApi.getList)
-Mock.mock(/\/api\/statistical\/handling\/get-item/, 'get', handlingApi.getItem)
-
 // 离校学生审核查询
 Mock.mock(/\/api\/leaveprocess\/leavestudent\/auditlist-api/, 'get', leavestudentApi.getList)
+Mock.mock(/\/api\/leaveprocess\/leavestudent\/save-audit/, 'post', leavestudentApi.saveAudit)
 
 // 环节统计报表查询
 Mock.mock(/\/api\/statistical\/nodereport\/list-api/, 'get', nodereportApi.getList)
diff --git a/leave-school-vue/src/mock/leavestudent.js b/leave-school-vue/src/mock/leavestudent.js
index 17eefb4..919aef4 100644
--- a/leave-school-vue/src/mock/leavestudent.js
+++ b/leave-school-vue/src/mock/leavestudent.js
@@ -18,7 +18,34 @@
     'studentType': '@cword(6, 7)',
     'leaveSchoolType': '@cword(6, 7)',
     'graduateYear': '@cword(6, 7)',
-    'graduateMonth': '@cword(6, 7)'
+    'graduateMonth': '@cword(6, 7)',
+    'allowedLeave|1': ['准予', '不准予'],
+    'auditLogList|4': [{
+      'auditNode|1': ['后勤处', '财务处', '学生处', '图书馆'],
+      'auditResult|1': ['通过', '不通过'],
+      'auditOpinionList|3': [{
+        'auditResult|1': ['通过', '不通过'],
+        'auditTime': '@datetime',
+        'auditor': '@cword(2, 3)',
+        'auditOpinion': '@cword(6, 10)'
+      }]
+    }],
+    'nodelist': [{
+      'auditNode': '后勤处',
+      'auditResult|1': ['—', '×', '√']
+    },
+    {
+      'auditNode': '财务处',
+      'auditResult|1': ['—', '×', '√']
+    },
+    {
+      'auditNode': '学生处',
+      'auditResult|1': ['—', '×', '√']
+    },
+    {
+      'auditNode': '图书馆',
+      'auditResult|1': ['—', '×', '√']
+    }]
   }]
 }).list
 
@@ -56,9 +83,26 @@
     'label': '其他'
   }]
 )
+const auditResultList = Mock.mock(
+  [{
+    'value': 'TO_BE_AUDITED',
+    'label': '待审核'
+  },
+  {
+    'value': 'APPROVED',
+    'label': '审核通过'
+  },
+  {
+    'value': 'NOT_PASSED',
+    'label': '审核不通过'
+  }]
+)
 export default{
   getList: config => {
-    const { studentNumber, name, department, major, clazz, leaveSchoolBatch, studentType, leaveSchoolType, graduateYear, graduateMonth, pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
+    const { studentNumber, name, department, major, clazz,
+      leaveSchoolBatch, studentType, leaveSchoolType, graduateYear, graduateMonth,
+      auditNode, allowedLeave, auditResult,
+      pageIndex = 1, pageSize = 20 } = param2Obj(config.url)
     const mockList = clsList.filter(item => {
       if (studentNumber && item.studentNumber && item.studentNumber !== studentNumber) return false
       if (name && item.name && item.name !== name) return false
@@ -70,6 +114,9 @@
       if (leaveSchoolType && item.leaveSchoolType && item.leaveSchoolType !== leaveSchoolType) return false
       if (graduateYear && item.graduateYear && item.graduateYear !== graduateYear) return false
       if (graduateMonth && item.graduateMonth && item.graduateMonth !== graduateMonth) return false
+      if (auditNode && item.auditNode && item.auditNode !== auditNode) return false
+      if (allowedLeave && item.allowedLeave && item.allowedLeave !== allowedLeave) return false
+      if (auditResult && item.auditResult && item.auditResult !== auditResult) return false
       return true
     })
 
@@ -79,9 +126,16 @@
       leaveSchoolTypeList: leaveSchoolTypeList,
       studentTypeList: studentTypeList,
       leaveSchoolBatchList: leaveSchoolBatchList,
+      auditResultList: auditResultList,
       items: pageList,
       recordCount: mockList.length,
       code: 200
     }
+  },
+  saveAudit: config => {
+    return {
+      code: 200
+    }
   }
 }
+
diff --git a/leave-school-vue/src/views/procedures/batchAudit/index.vue b/leave-school-vue/src/views/procedures/batchAudit/index.vue
new file mode 100644
index 0000000..0871186
--- /dev/null
+++ b/leave-school-vue/src/views/procedures/batchAudit/index.vue
@@ -0,0 +1,508 @@
+<template>
+  <div class="app-container">
+    <div class="filter-container">
+      <el-row :gutter="20">
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.leaveSchoolBatch" placeholder="批次名称">
+            <el-option v-for="item in  pagedata.leaveSchoolBatchList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.auditNode" placeholder="审核环节">
+            <el-option v-for="item in  auditNodeList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.studentType" placeholder="学生类别">
+            <el-option v-for="item in pagedata.studentTypeList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="学号" v-model="listQuery.studentNumber">
+          </el-input>
+        </el-col>
+        <el-col :span="4">
+          <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查询</el-button>
+          <el-button class="filter-item" style="margin-left: 10px;" @click="handleReset" type="primary" icon="el-icon-edit">重置</el-button>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="4">
+          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="姓名" v-model="listQuery.name">
+          </el-input>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable @change="initMajorList" class="filter-item" v-model="listQuery.department" placeholder="院系">
+            <el-option v-for="item in  pagedata.departmentList" :key="item.id" :label="item.name" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable @change="initBjList" class="filter-item" v-model="listQuery.major" placeholder="专业">
+            <el-option v-for="item in  majorList" :key="item.id" :label="item.zymc" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.clazz" placeholder="班级">
+            <el-option v-for="item in  clazzList" :key="item.id" :label="item.bjmc" :value="item.id">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="showBatchAudit">批量审核</el-button>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.allowedLeave" placeholder="是否准予离校">
+            <el-option label="准予" value="1"></el-option>
+            <el-option label="不准予" value="0"></el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.auditResult" placeholder="审核环节状态">
+            <el-option v-for="item in pagedata.auditResultList" :key="item.value" :label="item.label" :value="item.value">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.graduateYear" placeholder="毕业年份">
+            <el-option v-for="n in  10" :key="year-n" :label="year-n" :value="year-n">
+            </el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.graduateMonth" placeholder="毕业月份">
+            <el-option v-for="n in  12" :key="n" :label="n" :value="n">
+            </el-option>
+          </el-select>
+        </el-col>
+      </el-row>
+    </div>
+    <el-table :height="height" :data="items" v-loading="listLoading" @selection-change="handleSelectionChange" element-loading-text="Loading" border fit highlight-current-row>
+      <el-table-column type="selection" align="center"></el-table-column>
+      <el-table-column fixed align="center" label='序号' width="95">
+        <template slot-scope="scope">
+          {{scope.row.rownum}}
+        </template>
+      </el-table-column>
+      <el-table-column label="学号" align="center">
+        <template slot-scope="scope">
+          {{scope.row.studentNumber}}
+        </template>
+      </el-table-column>
+      <el-table-column label="姓名" align="center">
+        <template slot-scope="scope">
+          {{scope.row.name}}
+        </template>
+      </el-table-column>
+      <el-table-column label="院系" align="center">
+        <template slot-scope="scope">
+          {{scope.row.department}}
+        </template>
+      </el-table-column>
+      <el-table-column label="专业" align="center">
+        <template slot-scope="scope">
+          {{scope.row.major}}
+        </template>
+      </el-table-column>
+      <el-table-column label="班级" align="center">
+        <template slot-scope="scope">
+          {{scope.row.clazz}}
+        </template>
+      </el-table-column>
+      <el-table-column label="学生类别" align="center">
+        <template slot-scope="scope">
+          {{scope.row.studentType}}
+        </template>
+      </el-table-column>
+      <el-table-column v-for="auditNode in colList" :label="auditNode" :key="auditNode" :prop="auditNode" align="center">
+      </el-table-column>
+      <el-table-column label="是否准予离校" align="center">
+        <template slot-scope="scope">
+          {{scope.row.allowedLeave}}
+        </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="showSingleAudit(scope.row, false)">审核</el-button>
+          <el-button type="text" size="small" @click="showTrace(scope.row, false)">办理轨迹</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <div class="pagination-container">
+      <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="listQuery.pageIndex" 
+      :page-sizes="[10,20,30, 50]" :page-size="listQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="recordCount">
+      </el-pagination>
+    </div>
+    <el-dialog title="审核意见" :visible.sync="dialogFormVisible" width="80%" top="10vh">
+      <div class="J_conWarp g-lr-mg">
+          <div id="dcMain">
+          <div id="index" class="mainBox" style=" height: auto;">
+            <table width="100%" border="0" cellspacing="0" cellpadding="0" class="indexBoxTwo">
+              <tbody>
+                <tr>
+                  <td width="85%" valign="top" class="pr">
+                    <div class="indexBox">
+                      <div class="boxTitle">基本信息</div>
+                      <ul>
+                        <table width="100%" border="0" cellspacing="0" cellpadding="7" class="tableBasic">
+                          <tbody>
+                            <tr>
+                              <td width="120">学号:</td>
+                              <td><b>{{ stuInfo.studentNumber }}</b></td>
+                              <td width="100">姓名:</td>
+                              <td><b>{{ stuInfo.name }}</b></td>
+                            </tr>
+                            <tr>
+                              <td>院系:</td>
+                              <td><b>{{ stuInfo.department }}</b></td>
+                              <td>专业:</td>
+                              <td><b>{{ stuInfo.major }}</b></td>
+                            </tr>
+                            <tr>
+                              <td>班级:</td>
+                              <td><b>{{ stuInfo.clazz }}</b></td>
+                              <td>学生类别:</td>
+                              <td><b>{{ stuInfo.studentType }}</b></td>
+                            </tr>
+                          </tbody>
+                        </table>
+                      </ul>
+                    </div>
+                  </td>
+                  <td valign="top" class="pl">
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+            
+            <div class="indexBox">
+              <div class="boxTitle">审核记录</div>
+              <ul>
+                <table width="100%" border="0" cellspacing="0" cellpadding="7" class="tableBasic">
+                  <tbody>
+                    <tr>
+                      <th width="35%">审核环节</th>
+                      <th>审核意见</th>
+                    </tr>
+                    <tr v-for="auditLog in auditLogList" :key="auditLog.auditTime">
+                      <td align="center">
+                        {{auditLog.auditNode}} 
+                        [<font color="green" v-if="auditLog.auditResult == '通过'">{{auditLog.auditResult}}</font>
+                        <font color="red" v-else>{{auditLog.auditResult}}</font>]
+                      </td>
+                      <td align="left">
+                        <template v-for="opinion in auditLog.auditOpinionList">
+                          [<font color="green" v-if="opinion.auditResult == '通过'">{{opinion.auditResult}}</font>
+                          <font color="red" v-else>{{opinion.auditResult}}</font>&nbsp;{{opinion.auditTime}}]
+                          【{{auditLog.auditNode}}】
+                          审核意见:{{opinion.auditOpinion}}
+                          <br>
+                        </template>
+                      </td>
+                    </tr>                    
+                  </tbody>
+                </table>
+              </ul>
+            </div>
+            
+          </div>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer" style="text-align:center">
+        <el-button @click="dialogFormVisible = false">关闭</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog title="审核" :visible.sync="auditFormVisible" width="80%" top="10vh">
+      <div class="J_conWarp g-lr-mg">
+          <div id="dcMain">
+          <div id="index" class="mainBox" style=" height: auto;">
+            <table v-show="stuInfoVisible" width="100%" border="0" cellspacing="0" cellpadding="0" class="indexBoxTwo">
+              <tbody>
+                <tr>
+                  <td width="65%" valign="top" class="pr">
+                    <div class="indexBox">
+                      <div class="boxTitle">基本信息</div>
+                      <ul>
+                        <table width="100%" border="0" cellspacing="0" cellpadding="7" class="tableBasic">
+                          <tbody>
+                            <tr>
+                              <td width="120">学号:</td>
+                              <td><b>{{ stuInfo.studentNumber }}</b></td>
+                              <td width="100">姓名:</td>
+                              <td><b>{{ stuInfo.name }}</b></td>
+                            </tr>
+                            <tr>
+                              <td>院系:</td>
+                              <td><b>{{ stuInfo.department }}</b></td>
+                              <td>专业:</td>
+                              <td><b>{{ stuInfo.major }}</b></td>
+                            </tr>
+                            <tr>
+                              <td>班级:</td>
+                              <td><b>{{ stuInfo.clazz }}</b></td>
+                              <td>学生类别:</td>
+                              <td><b>{{ stuInfo.studentType }}</b></td>
+                            </tr>
+                          </tbody>
+                        </table>
+                      </ul>
+                    </div>
+                  </td>
+                  <td valign="top" class="pl">
+                    <div class="indexBox">
+                      <div class="boxTitle">审核记录</div>
+                      <ul>
+                        <table width="100%" border="0" cellspacing="0" cellpadding="7" class="tableBasic">
+                          <tbody>
+                            <tr>
+                              <th width="15%">结果</th>
+                              <th width="55%">审核意见</th>
+                              <th width="35%">操作时间</th>
+                            </tr>
+                            <tr v-for="item in currentNodeLogList">
+                              <td align="center">
+                                <font color="green" v-if="item.auditResult == '通过'">{{item.auditResult}}</font>
+                                <font color="red" v-else>{{item.auditResult}}</font>
+                              </td>
+                              <td align="center">
+                                {{item.auditOpinion}}
+                              </td>
+                              <td align="center">
+                                {{item.auditTime}}
+                              </td>
+                            </tr>
+                          </tbody>
+                        </table>
+                      </ul>
+                    </div>
+                  </td>
+                  </td>
+                </tr>
+              </tbody>
+            </table>
+            <div class="indexBox">
+              <ul>
+                <table width="100%" border="0" cellspacing="0" cellpadding="7" class="tableBasic">
+                  <tbody>
+                    <tr>
+                      <td align="center"><b>审核意见:</b></td>
+                      <td>
+                        <textarea cols="80" rows="5" v-model="auditMsg.auditOpinion" class="textArea"></textarea></td>
+                    </tr>
+                  </tbody>
+                </table>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer" style="text-align:center">
+        <el-button type="primary" @click="auditPass()">审核通过</el-button>
+        <el-button type="primary" @click="auditReject()">审核不通过</el-button>
+        <el-button @click="auditFormVisible = false">关闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getBjListByZy } from '@/api/class-api'
+import { getPage, saveAudit } from '@/api/leavestudent-api'
+import { getZyListByYx } from '@/api/major-api'
+import waves from '@/directive/waves' // 水波纹指令
+import { resetForm } from '@/utils'
+import { crudPageList } from '@/utils/crud'
+import mixindata from '@/utils/crud'
+
+export default {
+  name: 'class',
+  directives: {
+    waves
+  },
+  mixins: [mixindata],
+  data() {
+    return {
+      auditNodeList: [{
+        'value': '1',
+        'label': '后勤处'
+      },
+      {
+        'value': '2',
+        'label': '财务处'
+      },
+      {
+        'value': '3',
+        'label': '学生处'
+      },
+      {
+        'value': '4',
+        'label': '图书馆'
+      }],
+      auditMsg: {},
+      stuInfoVisible: true,
+      auditFormVisible: false,
+      year: (new Date()).getFullYear() + 2,
+      majorList: [],
+      clazzList: [],
+      colList: [],
+      stuInfo: {},
+      auditLogList: [],
+      currentNodeLogList: [],
+      multipleSelection: []
+    }
+  },
+  filters: {
+    statusFilter(status) {
+      const statusMap = {
+        '1': 'success',
+        '0': 'danger'
+      }
+      return statusMap[status]
+    }
+  },
+  created() {
+    // this.handlePageList()
+    this.listLoading = false
+    this.height = window.innerHeight - 316
+  },
+  methods: {
+    handleSelectionChange(val) {
+      this.multipleSelection = val
+    },
+    initMajorList() {
+      getZyListByYx({ yx: this.listQuery.department }).then(response => {
+        this.majorList = response.items
+        // TODO 坑,this.listQuery.zy == null 直接赋值,专业下拉框选择出bug,无法选择,原因未知
+        for (const attr in this.listQuery) {
+          if (attr === 'zy') {
+            this.listQuery['zy'] = null
+          }
+        }
+      })
+    },
+    initBjList(cleanable = true) {
+      getBjListByZy({ zy: this.listQuery.major }).then(response => {
+        this.clazzList = response.items
+        if (cleanable) {
+          // TODO 坑,this.listQuery.bj == null 直接赋值,专业下拉框选择出bug,无法选择,原因未知
+          for (const attr in this.listQuery) {
+            if (attr === 'clazz') {
+              this.listQuery['clazz'] = null
+            }
+          }
+        }
+      })
+    },
+    parseItems() {
+      // 重新组织列表,动态生成列
+      for (let i = 0; i < this.items.length; i++) {
+        const item = this.items[i]
+        if (i === 0) {
+          for (const node of item.nodelist) {
+            if (this.colList.indexOf(node.auditNode) === -1) {
+              this.colList.push(node.auditNode)
+            }
+          }
+        }
+        for (const node of item.nodelist) {
+          item[node.auditNode] = node.auditResult
+        }
+      }
+    },
+    handlePageList() {
+      crudPageList(this, getPage, this.parseItems)
+    },
+    handleReset() {
+      resetForm(this.listQuery)
+    },
+    handleFilter() {
+      this.listQuery.pageIndex = 1
+      this.handlePageList()
+    },
+    handleSizeChange(val) {
+      this.listQuery.pageSize = val
+      this.handlePageList()
+    },
+    handleCurrentChange(val) {
+      this.listQuery.pageIndex = val
+      this.handlePageList()
+    },
+    showTrace(item) {
+      this.stuInfo = item
+      this.auditLogList = item.auditLogList
+      this.dialogFormVisible = true
+    },
+    showSingleAudit(item, isBatch) {
+      this.stuInfo = item
+      this.auditMsg = {
+        'leaveSchoolBatch': this.listQuery.leaveSchoolBatch,
+        'leaveSchoolProcess': this.listQuery.auditNode,
+        'leaveSchoolStrudent': item.id
+      }
+      const that = this
+      for (const auditLog of item.auditLogList) {
+        if (auditLog.auditNode === this.auditNodeList.find(obj => obj.value + '' === that.listQuery.auditNode + '')['label']) {
+          this.currentNodeLogList = auditLog.auditOpinionList
+          break
+        }
+      }
+      this.auditFormVisible = true
+      this.stuInfoVisible = true
+    },
+    showBatchAudit() {
+      let ids = ''
+      if (this.multipleSelection.length) {
+        for (const row of this.multipleSelection) {
+          ids += row.id + ','
+        }
+      }
+      if (!ids) {
+        this.$notify({
+          title: '通知',
+          message: '请先选择待审核学生!',
+          type: 'info',
+          duration: 2000
+        })
+        return
+      }
+      this.auditMsg = {
+        'leaveSchoolBatch': this.listQuery.leaveSchoolBatch,
+        'leaveSchoolProcess': this.listQuery.auditNode,
+        'leaveSchoolStrudent': ids
+      }
+      this.auditFormVisible = true
+      this.stuInfoVisible = false
+    },
+    savePageAudit(page) {
+      saveAudit(page.auditMsg).then(response => {
+        page.auditFormVisible = false
+        page.$notify({
+          title: '成功',
+          message: '审核成功',
+          type: 'success',
+          duration: 2000
+        })
+      })
+    },
+    auditPass() {
+      this.auditMsg['auditResult'] = 'APPROVED'
+      this.savePageAudit(this)
+    },
+    auditReject() {
+      this.auditMsg['auditResult'] = 'NOT_PASSED'
+      this.savePageAudit(this)
+    }
+  }
+}
+</script>
diff --git a/leave-school-vue/src/views/procedures/leavestudent/index.vue b/leave-school-vue/src/views/procedures/leavestudent/index.vue
index 6d0117e..4bf80c1 100644
--- a/leave-school-vue/src/views/procedures/leavestudent/index.vue
+++ b/leave-school-vue/src/views/procedures/leavestudent/index.vue
@@ -22,13 +22,6 @@
             </el-option>
           </el-select>
         </el-col>
-        <el-col :span="8">
-          <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查询</el-button>
-          <el-button class="filter-item" style="margin-left: 10px;" @click="handleCreate(null, 'create')" type="primary" icon="el-icon-edit">添加</el-button>
-          <el-button class="filter-item" style="margin-left: 10px;" @click="handleReset" type="primary" icon="el-icon-edit">重置</el-button>
-        </el-col>
-      </el-row>
-      <el-row :gutter="20">
         <el-col :span="4">
           <el-select clearable class="filter-item" v-model="listQuery.leaveSchoolType" placeholder="离校类型">
             <el-option v-for="item in  pagedata.leaveSchoolTypeList" :key="item.value" :label="item.label" :value="item.value">
@@ -36,13 +29,19 @@
           </el-select>
         </el-col>
         <el-col :span="4">
+          <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查询</el-button>
+          <el-button class="filter-item" style="margin-left: 10px;" @click="handleReset" type="primary" icon="el-icon-edit">重置</el-button>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="4">
           <el-select clearable @change="initMajorList" class="filter-item" v-model="listQuery.department" placeholder="院系">
             <el-option v-for="item in  pagedata.departmentList" :key="item.id" :label="item.name" :value="item.id">
             </el-option>
           </el-select>
         </el-col>
         <el-col :span="4">
-          <el-select clearable class="filter-item" v-model="listQuery.major" placeholder="专业">
+          <el-select clearable @change="initBjList" class="filter-item" v-model="listQuery.major" placeholder="专业">
             <el-option v-for="item in  majorList" :key="item.id" :label="item.zymc" :value="item.id">
             </el-option>
           </el-select>
@@ -53,8 +52,6 @@
             </el-option>
           </el-select>
         </el-col>
-      </el-row>
-      <el-row :gutter="20">
         <el-col :span="4">
           <el-select clearable class="filter-item" v-model="listQuery.graduateYear" placeholder="毕业年份">
             <el-option v-for="n in  10" :key="year-n" :label="year-n" :value="year-n">
@@ -136,7 +133,7 @@
 
 <script>
 import { getBjListByZy } from '@/api/class-api'
-import { getAuditList } from '@/api/leavestudent-api'
+import { getPage } from '@/api/leavestudent-api'
 import { getZyListByYx } from '@/api/major-api'
 import waves from '@/directive/waves' // 水波纹指令
 import { resetForm } from '@/utils'
@@ -167,7 +164,7 @@
   },
   created() {
     this.handlePageList()
-    this.height = window.innerHeight - 316
+    this.height = window.innerHeight - 266
   },
   methods: {
     initMajorList() {
@@ -195,7 +192,7 @@
       })
     },
     handlePageList() {
-      crudPageList(this, getAuditList)
+      crudPageList(this, getPage)
     },
     handleReset() {
       resetForm(this.listQuery)
diff --git a/leave-school-vue/src/views/statistical/handling/index.vue b/leave-school-vue/src/views/statistical/handling/index.vue
index 3e5fbfa..510b42c 100644
--- a/leave-school-vue/src/views/statistical/handling/index.vue
+++ b/leave-school-vue/src/views/statistical/handling/index.vue
@@ -3,57 +3,55 @@
     <div class="filter-container">
       <el-row :gutter="20">
         <el-col :span="4">
-          <el-select clearable @change="initZyList" class="filter-item" v-model="listQuery.pcmc" placeholder="批次名称">
-          </el-select>
-        </el-col>
-        <el-col :span="4">
-          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="学号" v-model="listQuery.xh">
-          </el-input>
-        </el-col>
-        <el-col :span="4">
-          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="姓名" v-model="listQuery.xm">
-          </el-input>
-        </el-col>
-        <el-col :span="4">
-          <el-select clearable @change="initZyList" class="filter-item" v-model="listQuery.sfzylx" placeholder="是否准予离校">
-            <el-option key="1" label="准予" value="1">
-            </el-option>
-            <el-option key="0" label="不准予" value="0">
+          <el-select clearable class="filter-item" v-model="listQuery.leaveSchoolBatch" placeholder="批次名称">
+            <el-option v-for="item in  pagedata.leaveSchoolBatchList" :key="item.value" :label="item.label" :value="item.value">
             </el-option>
           </el-select>
         </el-col>
-        <el-col :span="8">
+        <el-col :span="4">
+          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="学号" v-model="listQuery.studentNumber">
+          </el-input>
+        </el-col>
+        <el-col :span="4">
+          <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="姓名" v-model="listQuery.name">
+          </el-input>
+        </el-col>
+        <el-col :span="4">
+          <el-select clearable class="filter-item" v-model="listQuery.allowedLeave" placeholder="是否准予离校">
+            <el-option label="准予" value="1"></el-option>
+            <el-option label="不准予" value="0"></el-option>
+          </el-select>
+        </el-col>
+        <el-col :span="4">
           <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查询</el-button>
           <el-button class="filter-item" style="margin-left: 10px;" @click="handleReset" type="primary" icon="el-icon-edit">重置</el-button>
         </el-col>
       </el-row>
       <el-row :gutter="20">
         <el-col :span="4">
-          <el-select clearable @change="initZyList" class="filter-item" v-model="listQuery.yx" placeholder="院系">
-            <el-option v-for="item in  yxList" :key="item.id" :label="item.name" :value="item.id">
+          <el-select clearable @change="initMajorList" class="filter-item" v-model="listQuery.department" placeholder="院系">
+            <el-option v-for="item in  pagedata.departmentList" :key="item.id" :label="item.name" :value="item.id">
             </el-option>
           </el-select>
         </el-col>
         <el-col :span="4">
-          <el-select clearable @change="initBjList" class="filter-item" v-model="listQuery.zy" placeholder="专业">
-            <el-option v-for="item in  zyList" :key="item.id" :label="item.zymc" :value="item.id">
+          <el-select clearable @change="initBjList" class="filter-item" v-model="listQuery.major" placeholder="专业">
+            <el-option v-for="item in  majorList" :key="item.id" :label="item.zymc" :value="item.id">
             </el-option>
           </el-select>
         </el-col>
         <el-col :span="4">
-          <el-select clearable class="filter-item" v-model="listQuery.bj" placeholder="班级">
-            <el-option v-for="item in  bjList" :key="item.id" :label="item.bjmc" :value="item.id">
+          <el-select clearable class="filter-item" v-model="listQuery.clazz" placeholder="班级">
+            <el-option v-for="item in  clazzList" :key="item.id" :label="item.bjmc" :value="item.id">
             </el-option>
           </el-select>
         </el-col>
         <el-col :span="4">
-          <el-select clearable @change="initZyList" class="filter-item" v-model="listQuery.xslb" placeholder="学生类别">
-            <el-option v-for="item in  xslbList" :key="item.id" :label="item.name" :value="item.id">
+          <el-select clearable class="filter-item" v-model="listQuery.studentType" placeholder="学生类别">
+            <el-option v-for="item in pagedata.studentTypeList" :key="item.value" :label="item.label" :value="item.value">
             </el-option>
           </el-select>
         </el-col>
-        <el-col :span="12">
-        </el-col>
       </el-row>
     </div>
     <el-table :height="height" :data="items" v-loading="listLoading" element-loading-text="Loading" border fit highlight-current-row>
@@ -61,40 +59,40 @@
       </el-table-column>
       <el-table-column label="学号" align="center">
         <template slot-scope="scope">
-          {{scope.row.xh}}
+          {{scope.row.studentNumber}}
         </template>
       </el-table-column>
       <el-table-column label="姓名" align="center">
         <template slot-scope="scope">
-          <a href="javascript:void(0);" @click="showTrace(scope.row)">{{scope.row.xm}}</a>
+          <a href="javascript:void(0);" @click="showTrace(scope.row)">{{scope.row.name}}</a>
         </template>
       </el-table-column>
       <el-table-column label="院系" align="center">
         <template slot-scope="scope">
-          {{scope.row.yx}}
+          {{scope.row.department}}
         </template>
       </el-table-column>
       <el-table-column label="专业" align="center">
         <template slot-scope="scope">
-          {{scope.row.zy}}
+          {{scope.row.major}}
         </template>
       </el-table-column>
       <el-table-column label="班级" align="center">
         <template slot-scope="scope">
-          {{scope.row.bj}}
+          {{scope.row.clazz}}
         </template>
       </el-table-column>
       <el-table-column label="学生类别" align="center">
         <template slot-scope="scope">
-          {{scope.row.xslb}}
+          {{scope.row.studentType}}
         </template>
       </el-table-column>
-      <el-table-column v-for="blbm in colList" :label="blbm" :key="blbm" :prop="blbm" align="center">
+      <el-table-column v-for="auditNode in colList" :label="auditNode" :key="auditNode" :prop="auditNode" align="center">
       </el-table-column>
       <el-table-column label="是否准予离校" align="center">
         <template slot-scope="scope">
-          <font color="green" v-if="scope.row.sfzylx == '准予'">{{scope.row.sfzylx}}</font>
-          <font color="red" v-else>{{scope.row.sfzylx}}</font>
+          <font color="green" v-if="scope.row.allowedLeave == '准予'">{{scope.row.allowedLeave}}</font>
+          <font color="red" v-else>{{scope.row.allowedLeave}}</font>
         </template>
       </el-table-column>
     </el-table>
@@ -118,21 +116,21 @@
                           <tbody>
                             <tr>
                               <td width="120">学号:</td>
-                              <td><b>{{ jbxx.xh }}</b></td>
+                              <td><b>{{ stuInfo.studentNumber }}</b></td>
                               <td width="100">姓名:</td>
-                              <td><b>{{ jbxx.xm }}</b></td>
+                              <td><b>{{ stuInfo.name }}</b></td>
                             </tr>
                             <tr>
                               <td>院系:</td>
-                              <td><b>{{ jbxx.yx }}</b></td>
+                              <td><b>{{ stuInfo.department }}</b></td>
                               <td>专业:</td>
-                              <td><b>{{ jbxx.zy }}</b></td>
+                              <td><b>{{ stuInfo.major }}</b></td>
                             </tr>
                             <tr>
                               <td>班级:</td>
-                              <td><b>{{ jbxx.bj }}</b></td>
+                              <td><b>{{ stuInfo.clazz }}</b></td>
                               <td>学生类别:</td>
-                              <td><b>{{ jbxx.xslb }}</b></td>
+                              <td><b>{{ stuInfo.studentType }}</b></td>
                             </tr>
                           </tbody>
                         </table>
@@ -154,18 +152,18 @@
                       <th width="35%">审核环节</th>
                       <th>审核意见</th>
                     </tr>
-                    <tr v-for="shjl in shjllist" :key="shjl.shhj">
+                    <tr v-for="auditLog in auditLogList" :key="auditLog.auditTime">
                       <td align="center">
-                        {{shjl.shhj}} 
-                        [<font color="green" v-if="shjl.shzt == '通过'">{{shjl.shzt}}</font>
-                        <font color="red" v-else>{{shjl.shzt}}</font>]
+                        {{auditLog.auditNode}} 
+                        [<font color="green" v-if="auditLog.auditResult == '通过'">{{auditLog.auditResult}}</font>
+                        <font color="red" v-else>{{auditLog.auditResult}}</font>]
                       </td>
                       <td align="left">
-                        <template v-for="sj in shjl.shyj">
-                          [<font color="green" v-if="sj.shzt == '通过'">{{sj.shzt}}</font>
-                          <font color="red" v-else>{{sj.shzt}}</font>&nbsp;{{sj.shsj}}]
-                          【{{shjl.shhj}}】
-                          审核意见:{{sj.shyj}}
+                        <template v-for="opinion in auditLog.auditOpinionList">
+                          [<font color="green" v-if="opinion.auditResult == '通过'">{{opinion.auditResult}}</font>
+                          <font color="red" v-else>{{opinion.auditResult}}</font>&nbsp;{{opinion.auditTime}}]
+                          【{{auditLog.auditNode}}】
+                          审核意见:{{opinion.auditOpinion}}
                           <br>
                         </template>
                       </td>
@@ -187,9 +185,7 @@
 
 <script>
 import { getBjListByZy } from '@/api/class-api'
-import { getList } from '@/api/handling-api'
-import { getDicList } from '@/api/dictionary-api'
-import { getDeptList as getAllDeptList } from '@/api/department-api'
+import { getPage } from '@/api/leavestudent-api'
 import { getZyListByYx } from '@/api/major-api'
 import waves from '@/directive/waves' // 水波纹指令
 import { resetForm } from '@/utils'
@@ -204,14 +200,11 @@
   mixins: [mixindata],
   data() {
     return {
-      pcmcList: [],
-      yxList: [],
-      zyList: [],
-      bjList: [],
+      majorList: [],
+      clazzList: [],
       colList: [],
-      xslbList: [],
-      jbxx: {},
-      shjllist: []
+      stuInfo: {},
+      auditLogList: []
     }
   },
   filters: {
@@ -224,22 +217,13 @@
     }
   },
   created() {
-    this.initYxList()
-    this.initZyList()
-    this.initBjList()
-    this.initXslbList()
     this.handlePageList()
     this.height = window.innerHeight - 266
   },
   methods: {
-    initYxList() {
-      getAllDeptList(this.listQuery).then(response => {
-        this.yxList = response.items
-      })
-    },
-    initZyList() {
-      getZyListByYx({ yx: this.listQuery.yx }).then(response => {
-        this.zyList = response.items
+    initMajorList() {
+      getZyListByYx({ yx: this.listQuery.department }).then(response => {
+        this.majorList = response.items
         // TODO 坑,this.listQuery.zy == null 直接赋值,专业下拉框选择出bug,无法选择,原因未知
         for (const attr in this.listQuery) {
           if (attr === 'zy') {
@@ -248,32 +232,35 @@
         }
       })
     },
-    initXslbList() {
-      getDicList({ dicType: 'xslb' }).then(response => {
-        this.xslbList = response.items
-      })
-    },
-    initBjList() {
-      getBjListByZy({ zy: this.listQuery.zy }).then(response => {
-        this.bjList = response.items
+    initBjList(cleanable = true) {
+      getBjListByZy({ zy: this.listQuery.major }).then(response => {
+        this.clazzList = response.items
+        if (cleanable) {
+          // TODO 坑,this.listQuery.bj == null 直接赋值,专业下拉框选择出bug,无法选择,原因未知
+          for (const attr in this.listQuery) {
+            if (attr === 'clazz') {
+              this.listQuery['clazz'] = null
+            }
+          }
+        }
       })
     },
     handlePageList() {
-      crudPageList(this, getList, this.parseItems)
+      crudPageList(this, getPage, this.parseItems)
     },
     parseItems() {
       // 重新组织列表,动态生成列
       for (let i = 0; i < this.items.length; i++) {
         const item = this.items[i]
         if (i === 0) {
-          for (const blbm of item.blbmlist) {
-            if (this.colList.indexOf(blbm.bmmc) === -1) {
-              this.colList.push(blbm.bmmc)
+          for (const node of item.nodelist) {
+            if (this.colList.indexOf(node.auditNode) === -1) {
+              this.colList.push(node.auditNode)
             }
           }
         }
-        for (const blbm of item.blbmlist) {
-          item[blbm.bmmc] = blbm.shjg
+        for (const node of item.nodelist) {
+          item[node.auditNode] = node.auditResult
         }
       }
     },
@@ -296,8 +283,8 @@
       this.dialogFormVisible = true
     },
     showTrace(item) {
-      this.jbxx = item
-      this.shjllist = item.shjllist
+      this.stuInfo = item
+      this.auditLogList = item.auditLogList
       this.dialogFormVisible = true
     }
   }