From 3da12323ba999d0af15646e2384a4c18fb414683 Mon Sep 17 00:00:00 2001
From: 唐耀东 <18861537@qq.com>
Date: 星期四, 09 十二月 2021 15:00:19 +0800
Subject: [PATCH] 提交代码

---
 src/views/device/equipment/index.vue      |  516 +++++++++++++++++
 src/views/system/user/index.vue           |   99 ++
 src/api/oa/equipment.js                   |   44 +
 src/views/device/peripheralUnit/index.vue |  473 +++++++++++++++
 src/views/system/dept/index.vue           |  169 ++++-
 src/api/oa/peripheralUnit.js              |   44 +
 src/api/oa/batch.js                       |   44 +
 src/api/common/common.js                  |   32 +
 src/views/device/batch/index.vue          |  323 ++++++++++
 src/components/FileUpload/index.vue       |    7 
 10 files changed, 1,688 insertions(+), 63 deletions(-)

diff --git a/src/api/common/common.js b/src/api/common/common.js
index e1e227d..6a32e09 100644
--- a/src/api/common/common.js
+++ b/src/api/common/common.js
@@ -15,3 +15,35 @@
     method: 'get'
   })
 }
+
+// 楂樻牎涓嬫媺鍒楄〃
+export function listSchool() {
+  return request({
+    url: '/oa/school/select',
+    method: 'get'
+  })
+}
+
+// 鐢熶骇鎵规涓嬫媺鍒楄〃
+export function listBatch() {
+  return request({
+    url: '/oa/batch/select',
+    method: 'get'
+  })
+}
+
+// 鐢ㄦ埛涓嬫媺鍒楄〃
+export function listUser() {
+  return request({
+    url: '/system/user/select',
+    method: 'get'
+  })
+}
+
+// 閫氳繃閮ㄩ棬id鑾峰彇鐢ㄦ埛琛ㄦ牸
+export function listUserDept(p) {
+  return request({
+    url: `/system/user/byDept?deptId=${p.deptId}&pageNum=${p.pageNum}&pageSize=${p.pageSize}`,
+    method: 'get'
+  })
+}
diff --git a/src/api/oa/batch.js b/src/api/oa/batch.js
new file mode 100644
index 0000000..12da058
--- /dev/null
+++ b/src/api/oa/batch.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐢熶骇鎵规鍒楄〃
+export function listBatch(query) {
+  return request({
+    url: '/oa/batch/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐢熶骇鎵规璇︾粏
+export function getBatch(id) {
+  return request({
+    url: '/oa/batch/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鐢熶骇鎵规
+export function addBatch(data) {
+  return request({
+    url: '/oa/batch',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐢熶骇鎵规
+export function updateBatch(data) {
+  return request({
+    url: '/oa/batch',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐢熶骇鎵规
+export function delBatch(id) {
+  return request({
+    url: '/oa/batch/' + id,
+    method: 'delete'
+  })
+}
diff --git a/src/api/oa/equipment.js b/src/api/oa/equipment.js
new file mode 100644
index 0000000..064550d
--- /dev/null
+++ b/src/api/oa/equipment.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鏅烘帶璁惧鍒楄〃
+export function listEquipment(query) {
+  return request({
+    url: '/oa/equipment/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鏅烘帶璁惧璇︾粏
+export function getEquipment(id) {
+  return request({
+    url: '/oa/equipment/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鏅烘帶璁惧
+export function addEquipment(data) {
+  return request({
+    url: '/oa/equipment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鏅烘帶璁惧
+export function updateEquipment(data) {
+  return request({
+    url: '/oa/equipment',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鏅烘帶璁惧
+export function delEquipment(id) {
+  return request({
+    url: '/oa/equipment/' + id,
+    method: 'delete'
+  })
+}
diff --git a/src/api/oa/peripheralUnit.js b/src/api/oa/peripheralUnit.js
new file mode 100644
index 0000000..bf77707
--- /dev/null
+++ b/src/api/oa/peripheralUnit.js
@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 鏌ヨ澶栬鍗曞厓鍒楄〃
+export function listPeripheralUnit(query) {
+  return request({
+    url: '/oa/peripheralUnit/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ澶栬鍗曞厓璇︾粏
+export function getPeripheralUnit(id) {
+  return request({
+    url: '/oa/peripheralUnit/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板澶栬鍗曞厓
+export function addPeripheralUnit(data) {
+  return request({
+    url: '/oa/peripheralUnit',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼澶栬鍗曞厓
+export function updatePeripheralUnit(data) {
+  return request({
+    url: '/oa/peripheralUnit',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎澶栬鍗曞厓
+export function delPeripheralUnit(id) {
+  return request({
+    url: '/oa/peripheralUnit/' + id,
+    method: 'delete'
+  })
+}
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index a5971f2..606e65f 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="upload-file">
     <el-upload
+      :disabled="disabled"
       :action="uploadFileUrl"
       :before-upload="handleBeforeUpload"
       :file-list="fileList"
@@ -31,7 +32,7 @@
           <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
         </el-link>
         <div class="ele-upload-list__item-content-action">
-          <el-link :underline="false" @click="handleDelete(index)" type="danger">鍒犻櫎</el-link>
+          <el-link :underline="false" @click="handleDelete(index)" type="danger" :disabled="disabled">鍒犻櫎</el-link>
         </div>
       </li>
     </transition-group>
@@ -65,6 +66,10 @@
     isShowTip: {
       type: Boolean,
       default: true
+    },
+    disabled: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
diff --git a/src/views/device/batch/index.vue b/src/views/device/batch/index.vue
new file mode 100644
index 0000000..0bde533
--- /dev/null
+++ b/src/views/device/batch/index.vue
@@ -0,0 +1,323 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="鐢熶骇鎵规" prop="batch">
+        <el-input
+          v-model="queryParams.batch"
+          placeholder="璇疯緭鍏ョ敓浜ф壒娆�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="涓嬪崟鏃ユ湡" prop="orderDate">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.orderDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="閫夋嫨涓嬪崟鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="鍒拌揣鏃ユ湡" prop="arrivalDate">
+        <el-date-picker clearable size="small"
+          v-model="queryParams.arrivalDate"
+          type="date"
+          value-format="yyyy-MM-dd"
+          placeholder="閫夋嫨鍒拌揣鏃ユ湡">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['oa:batch:add']"
+        >鏂板</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['oa:batch:edit']"
+        >淇敼</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['oa:batch:remove']"
+        >鍒犻櫎</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="batchList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="搴忓彿" align="center" width="50">
+        <template slot-scope="scope">
+          <span>{{ scope.$index + (queryParams.pageNum - 1) * queryParams.pageSize + 1 }} </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐢熶骇鎵规" align="center" prop="batch" />
+      <el-table-column label="涓嬪崟鏃ユ湡" align="center" prop="orderDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.orderDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鍒拌揣鏃ユ湡" align="center" prop="arrivalDate" width="180">
+        <template slot-scope="scope">
+          <span>{{ parseTime(scope.row.arrivalDate, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎵规璇存槑" align="center" prop="illustrate" />
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['oa:batch:edit']"
+          >淇敼</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['oa:batch:remove']"
+          >鍒犻櫎</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀圭敓浜ф壒娆″璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="鐢熶骇鎵规" prop="batch">
+          <el-input v-model="form.batch" placeholder="璇疯緭鍏ョ敓浜ф壒娆�" />
+        </el-form-item>
+        <el-form-item label="涓嬪崟鏃ユ湡" prop="orderDate">
+          <el-date-picker clearable size="small"
+            v-model="form.orderDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨涓嬪崟鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鍒拌揣鏃ユ湡" prop="arrivalDate">
+          <el-date-picker clearable size="small"
+            v-model="form.arrivalDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="閫夋嫨鍒拌揣鏃ユ湡">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="鎵规璇存槑" prop="illustrate">
+          <el-input v-model="form.illustrate" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listBatch, getBatch, delBatch, addBatch, updateBatch } from "@/api/oa/batch";
+
+export default {
+  name: "Batch",
+  data() {
+    return {
+      // 鎸夐挳loading
+      buttonLoading: false,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢熶骇鎵规琛ㄦ牸鏁版嵁
+      batchList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        batch: undefined,
+        orderDate: undefined,
+        arrivalDate: undefined,
+        illustrate: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        batch: [
+          { required: true, message: "鐢熶骇鎵规涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        orderDate: [
+          { required: true, message: "涓嬪崟鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        arrivalDate: [
+          { required: true, message: "鍒拌揣鏃ユ湡涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        // illustrate: [
+        //   { required: true, message: "鎵规璇存槑涓嶈兘涓虹┖", trigger: "blur" }
+        // ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ鐢熶骇鎵规鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listBatch(this.queryParams).then(response => {
+        this.batchList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        batch: undefined,
+        orderDate: undefined,
+        arrivalDate: undefined,
+        illustrate: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: undefined,
+        version: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "娣诲姞鐢熶骇鎵规";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.loading = true;
+      this.reset();
+      const id = row.id || this.ids
+      getBatch(id).then(response => {
+        this.loading = false;
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鐢熶骇鎵规";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.buttonLoading = true;
+          if (this.form.id != null) {
+            updateBatch(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          } else {
+            addBatch(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎鐢熶骇鎵规缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�').then(() => {
+        this.loading = true;
+        return delBatch(ids);
+      }).then(() => {
+        this.loading = false;
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).finally(() => {
+        this.loading = false;
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('oa/batch/export', {
+        ...this.queryParams
+      }, `batch_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/src/views/device/equipment/index.vue b/src/views/device/equipment/index.vue
new file mode 100644
index 0000000..051ade7
--- /dev/null
+++ b/src/views/device/equipment/index.vue
@@ -0,0 +1,516 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+      <el-form-item label="璁惧绫诲瀷" prop="type">
+        <el-select v-model="queryParams.type" placeholder="璇烽�夋嫨璁惧绫诲瀷" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.DICT101"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="纭欢搴忓垪鐮�" prop="sequenceCode">
+        <el-input
+          v-model="queryParams.sequenceCode"
+          placeholder="璇疯緭鍏ュ簭鍒楃爜"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐗堟湰" prop="edition">
+        <el-input
+          v-model="queryParams.edition"
+          placeholder="璇疯緭鍏ョ増鏈�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="楂樻牎" prop="schoolId">
+        <el-select v-model="queryParams.schoolId" placeholder="璇烽�夋嫨楂樻牎" clearable size="small">
+          <el-option
+            v-for="item in querySchoolList"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="涓绘満ID" prop="hostId">
+        <el-input
+          v-model="queryParams.hostId"
+          placeholder="璇疯緭鍏ヤ富鏈篒D"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="尾缃戠粶ID" prop="networkId">
+        <el-input
+          v-model="queryParams.networkId"
+          placeholder="璇疯緭鍏ノ茬綉缁淚D"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="尾宸ヤ綔棰戞" prop="frequencyBand">
+        <el-select v-model="queryParams.frequencyBand" placeholder="璇烽�夋嫨尾宸ヤ綔棰戞" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.DICT102"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="鍦ㄧ敤鐘舵��" prop="useStatus">
+        <el-select v-model="queryParams.useStatus" placeholder="璇烽�夋嫨鍦ㄧ敤鐘舵��" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.DICT104"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['oa:equipment:add']"
+        >鏂板
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['oa:equipment:edit']"
+        >淇敼
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['oa:equipment:remove']"
+        >鍒犻櫎
+        </el-button>
+      </el-col>
+      <!--      <el-col :span="1.5">-->
+      <!--        <el-button-->
+      <!--          type="warning"-->
+      <!--          plain-->
+      <!--          icon="el-icon-download"-->
+      <!--          size="mini"-->
+      <!--          @click="handleExport"-->
+      <!--          v-hasPermi="['oa:equipment:export']"-->
+      <!--        >瀵煎嚭</el-button>-->
+      <!--      </el-col>-->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="equipmentList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="搴忓彿" align="center" width="50">
+        <template slot-scope="scope">
+          <span>{{ scope.$index + (queryParams.pageNum - 1) * queryParams.pageSize + 1 }} </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="璁惧绫诲瀷" align="center" prop="type">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.DICT101" :value="scope.row.type"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="纭欢搴忓垪鐮�" align="center" prop="sequenceCode"/>
+      <el-table-column label="杞欢鐗堟湰" align="center" prop="edition"/>
+      <el-table-column label="瀛︽牎鍚嶇О" align="center" prop="schoolId_dictText"/>
+      <el-table-column label="涓绘満ID" align="center" prop="hostId"/>
+      <el-table-column label="尾缃戠粶ID" align="center" prop="networkId"/>
+      <el-table-column label="尾宸ヤ綔棰戞" align="center" prop="frequencyBand">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.DICT102" :value="scope.row.frequencyBand"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="鐢熶骇鎵规" align="center" prop="batchId_dictText"/>
+      <el-table-column label="鍦ㄧ敤" align="center" prop="useStatus">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.DICT104" :value="scope.row.useStatus"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['oa:equipment:edit']"
+          >淇敼
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['oa:equipment:remove']"
+          >鍒犻櫎
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀规櫤鎺ц澶囧璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+        <el-form-item label="搴忓垪鍙�" prop="serialNumber">
+          <el-input v-model="form.serialNumber" :disabled="disabled" placeholder="璇疯緭鍏ュ簭鍒楀彿"/>
+        </el-form-item>
+        <el-form-item label="璁惧绫诲瀷" prop="type">
+          <el-select v-model="form.type" placeholder="璇烽�夋嫨璁惧绫诲瀷" :disabled="disabled">
+            <el-option
+              v-for="dict in dict.type.DICT101"
+              :key="dict.value"
+              :label="dict.label"
+              :value="parseInt(dict.value)"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="搴忓垪鐮�" prop="sequenceCode">
+          <el-input v-model="form.sequenceCode" :disabled="disabled" placeholder="璇疯緭鍏ュ簭鍒楃爜"/>
+        </el-form-item>
+        <el-form-item label="鐗堟湰" prop="edition">
+          <el-input v-model="form.edition" :disabled="disabled" placeholder="璇疯緭鍏ョ増鏈�"/>
+        </el-form-item>
+        <el-form-item label="楂樻牎" prop="schoolId">
+          <el-select v-model="form.schoolId" :disabled="disabled" placeholder="璇烽�夋嫨楂樻牎" clearable size="small">
+            <el-option
+              v-for="item in formSchoolList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="涓绘満ID" prop="hostId">
+          <el-input v-model="form.hostId" :disabled="disabled" placeholder="璇疯緭鍏ヤ富鏈篒D"/>
+        </el-form-item>
+        <el-form-item label="尾缃戠粶ID" prop="networkId">
+          <el-input v-model="form.networkId" :disabled="disabled" placeholder="璇疯緭鍏ノ茬綉缁淚D"/>
+        </el-form-item>
+        <el-form-item label="尾宸ヤ綔棰戞" prop="frequencyBand">
+          <el-select v-model="form.frequencyBand" :disabled="disabled" placeholder="璇烽�夋嫨尾宸ヤ綔棰戞" clearable size="small">
+            <el-option
+              v-for="dict in dict.type.DICT102"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐢熶骇鎵规" prop="batchId">
+          <el-select v-model="form.batchId" placeholder="璇烽�夌敓浜ф壒娆�" clearable size="small">
+            <el-option
+              v-for="item in formBatchList"
+              :key="item.id"
+              :label="item.batch"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鍦ㄧ敤鐘舵��" prop="useStatus">
+          <el-select v-model="form.useStatus" placeholder="璇烽�夋嫨鍦ㄧ敤鐘舵��" clearable size="small">
+            <el-option
+              v-for="dict in dict.type.DICT104"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remarks">
+          <el-input v-model="form.remarks" type="textarea" placeholder="璇疯緭鍏ュ娉�"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {listEquipment, getEquipment, delEquipment, addEquipment, updateEquipment} from "@/api/oa/equipment";
+import {listSchool, listBatch} from "@/api/common/common";
+
+export default {
+  name: "Equipment",
+  dicts: ['DICT101', 'DICT102', 'DICT104'],
+  data() {
+    return {
+      // 鎸夐挳loading
+      buttonLoading: false,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鏅烘帶璁惧琛ㄦ牸鏁版嵁
+      equipmentList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        serialNumber: undefined,
+        type: undefined,
+        sequenceCode: undefined,
+        edition: undefined,
+        schoolId: undefined,
+        hostId: undefined,
+        networkId: undefined,
+        frequencyBand: undefined,
+        useStatus: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          {required: true, message: "id涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        serialNumber: [
+          {required: true, message: "搴忓垪鍙蜂笉鑳戒负绌�", trigger: "blur"}
+        ],
+        type: [
+          {required: true, message: "璁惧绫诲瀷涓嶈兘涓虹┖", trigger: "change"}
+        ],
+        sequenceCode: [
+          {required: true, message: "搴忓垪鐮佷笉鑳戒负绌�", trigger: "blur"}
+        ],
+        edition: [
+          {required: true, message: "鐗堟湰涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        schoolId: [
+          {required: true, message: "瀛︽牎id涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        hostId: [
+          {required: true, message: "涓绘満ID涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        networkId: [
+          {required: true, message: "尾缃戠粶ID涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        frequencyBand: [
+          {required: true, message: "尾宸ヤ綔棰戞涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        batchId: [
+          {required: true, message: "鐢熶骇鎵规涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        useStatus: [
+          {required: true, message: "鍦ㄧ敤鐘舵�佷笉鑳戒负绌�", trigger: "blur"}
+        ],
+      },
+      querySchoolList: [],
+      queryBatchList: [],
+      formSchoolList: [],
+      formBatchList: [],
+      disabled: false
+    };
+  },
+  created() {
+    this.getList();
+    this.getSchool()
+    this.getBatch()
+  },
+  methods: {
+    /** 鏌ヨ鏅烘帶璁惧鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listEquipment(this.queryParams).then(response => {
+        this.equipmentList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 瀛︽牎
+    getSchool() {
+      listSchool().then(res => {
+        this.querySchoolList = res.data
+      })
+    },
+    // 鎵规
+    getBatch() {
+      listBatch().then(res => {
+        this.queryBatchList = res.data
+      })
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        serialNumber: undefined,
+        type: undefined,
+        sequenceCode: undefined,
+        edition: undefined,
+        schoolId: undefined,
+        hostId: undefined,
+        networkId: undefined,
+        frequencyBand: undefined,
+        batchId: undefined,
+        useStatus: undefined,
+        remarks: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: undefined,
+        version: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    // 瀛︽牎
+    getFormSchool() {
+      listSchool().then(res => {
+        this.formSchoolList = res.data
+      })
+    },
+    // 鎵规
+    getFormBatch() {
+      listBatch().then(res => {
+        this.formBatchList = res.data
+      })
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.getFormSchool()
+      this.getFormBatch()
+      this.reset();
+      this.open = true;
+      this.disabled = false;
+      this.title = "娣诲姞鏅烘帶璁惧";
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.loading = true;
+      this.getFormSchool()
+      this.getFormBatch()
+      this.reset();
+      this.disabled = true;
+      const id = row.id || this.ids
+      getEquipment(id).then(response => {
+        this.loading = false;
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼鏅烘帶璁惧";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.buttonLoading = true;
+          if (this.form.id != null) {
+            updateEquipment(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          } else {
+            addEquipment(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎鏅烘帶璁惧缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�').then(() => {
+        this.loading = true;
+        return delEquipment(ids);
+      }).then(() => {
+        this.loading = false;
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).finally(() => {
+        this.loading = false;
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('oa/equipment/export', {
+        ...this.queryParams
+      }, `equipment_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/src/views/device/peripheralUnit/index.vue b/src/views/device/peripheralUnit/index.vue
new file mode 100644
index 0000000..9e4c41b
--- /dev/null
+++ b/src/views/device/peripheralUnit/index.vue
@@ -0,0 +1,473 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="澶栬浠g爜" prop="code">
+        <el-input
+          v-model="queryParams.code"
+          placeholder="璇疯緭鍏ュ璁句唬鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="澶栬鍚嶇О" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="璇疯緭鍏ュ璁惧悕绉�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+        <el-input
+          v-model="queryParams.model"
+          placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">
+        <el-input
+          v-model="queryParams.manufacturer"
+          placeholder="璇疯緭鍏ョ敓浜у巶鍟�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="鍘傚晢浠g爜" prop="vendorCode">
+        <el-input
+          v-model="queryParams.vendorCode"
+          placeholder="璇疯緭鍏ュ巶鍟嗕唬鐮�"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="娉㈢壒鐜�" prop="baudRate">
+        <el-select v-model="queryParams.baudRate" placeholder="璇烽�夋嫨娉㈢壒鐜�" clearable size="small">
+          <el-option
+            v-for="dict in dict.type.DICT103"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['oa:peripheralUnit:add']"
+        >鏂板
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['oa:peripheralUnit:edit']"
+        >淇敼
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['oa:peripheralUnit:remove']"
+        >鍒犻櫎
+        </el-button>
+      </el-col>
+      <!--      <el-col :span="1.5">-->
+      <!--        <el-button-->
+      <!--          type="warning"-->
+      <!--          plain-->
+      <!--          icon="el-icon-download"-->
+      <!--          size="mini"-->
+      <!--          @click="handleExport"-->
+      <!--          v-hasPermi="['oa:peripheralUnit:export']"-->
+      <!--        >瀵煎嚭</el-button>-->
+      <!--      </el-col>-->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="peripheralUnitList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center"/>
+      <el-table-column label="搴忓彿" align="center" width="50">
+        <template slot-scope="scope">
+          <span>{{ scope.$index + (queryParams.pageNum - 1) * queryParams.pageSize + 1 }} </span>
+        </template>
+      </el-table-column>
+      <el-table-column label="澶栬浠g爜" align="center" prop="code"/>
+      <el-table-column label="澶栬鍚嶇О" align="center" prop="name"/>
+      <el-table-column label="瑙勬牸鍨嬪彿" align="center" prop="model"/>
+      <el-table-column label="鐢熶骇鍘傚晢" align="center" prop="manufacturer"/>
+      <el-table-column label="鍘傚晢浠g爜" align="center" prop="vendorCode"/>
+      <el-table-column label="娉㈢壒鐜�" align="center" prop="baudRate">
+        <template slot-scope="scope">
+          <dict-tag :options="dict.type.DICT103" :value="scope.row.baudRate"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="璇绘暟鎸囦护" align="center" prop="readInstruction"/>
+      <el-table-column label="鍥炴暟闀垮害" align="center" prop="loopLength"/>
+      <el-table-column label="鍔熻兘鎻忚堪" align="center" prop="description"/>
+      <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleInfo(scope.row)"
+            v-hasPermi="['oa:peripheralUnit:info']"
+          >鏌ョ湅
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['oa:peripheralUnit:edit']"
+          >淇敼
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['oa:peripheralUnit:remove']"
+          >鍒犻櫎
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleUpload(scope.row)"
+          >闄勪欢
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 娣诲姞鎴栦慨鏀瑰璁惧崟鍏冨璇濇 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="澶栬浠g爜" prop="code">
+          <el-input v-model="form.code" placeholder="璇疯緭鍏ュ璁句唬鐮�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="澶栬鍚嶇О" prop="name">
+          <el-input v-model="form.name" placeholder="璇疯緭鍏ュ璁惧悕绉�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+          <el-input v-model="form.model" placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="鐢熶骇鍘傚晢" prop="manufacturer">
+          <el-input v-model="form.manufacturer" placeholder="璇疯緭鍏ョ敓浜у巶鍟�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="鍘傚晢浠g爜" prop="vendorCode">
+          <el-input v-model="form.vendorCode" placeholder="璇疯緭鍏ュ巶鍟嗕唬鐮�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="娉㈢壒鐜�" prop="baudRate">
+          <el-select v-model="form.baudRate" placeholder="璇烽�夋嫨娉㈢壒鐜�" :disabled="disabled">
+            <el-option
+              v-for="dict in dict.type.DICT103"
+              :key="dict.value"
+              :label="dict.label"
+              :value="dict.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇绘暟鎸囦护" prop="readInstruction">
+          <el-input v-model="form.readInstruction" placeholder="璇疯緭鍏ヨ鏁版寚浠�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="鍥炴暟闀垮害" prop="loopLength">
+          <el-input v-model="form.loopLength" placeholder="璇疯緭鍏ュ洖鏁伴暱搴�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="鍔熻兘鎻忚堪" prop="description">
+          <el-input v-model="form.description" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" :disabled="disabled"/>
+        </el-form-item>
+        <el-form-item label="闄勪欢">
+          <fileUpload v-model="form.filePath" :disabled="disabled"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 闄勪欢绐椾綋 -->
+    <el-dialog :title="title" :visible.sync="uploadFlag" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="闄勪欢">
+          <fileUpload v-model="form.filePath" limit="1"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listPeripheralUnit,
+  getPeripheralUnit,
+  delPeripheralUnit,
+  addPeripheralUnit,
+  updatePeripheralUnit
+} from "@/api/oa/peripheralUnit";
+
+export default {
+  name: "PeripheralUnit",
+  dicts: ['DICT103'],
+  data() {
+    return {
+      // 鎸夐挳loading
+      buttonLoading: false,
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 澶栬鍗曞厓琛ㄦ牸鏁版嵁
+      peripheralUnitList: [],
+      // 寮瑰嚭灞傛爣棰�
+      title: "",
+      // 鏄惁鏄剧ず寮瑰嚭灞�
+      open: false,
+      uploadFlag: false,
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: undefined,
+        name: undefined,
+        model: undefined,
+        manufacturer: undefined,
+        vendorCode: undefined,
+        baudRate: undefined,
+      },
+      // 琛ㄥ崟鍙傛暟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        id: [
+          {required: true, message: "id涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        code: [
+          {required: true, message: "澶栬浠g爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        name: [
+          {required: true, message: "澶栬鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        model: [
+          {required: true, message: "瑙勬牸鍨嬪彿涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        manufacturer: [
+          {required: true, message: "鐢熶骇鍘傚晢涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        vendorCode: [
+          {required: true, message: "鍘傚晢浠g爜涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        baudRate: [
+          {required: true, message: "娉㈢壒鐜囦笉鑳戒负绌�", trigger: "change"}
+        ],
+        readInstruction: [
+          {required: true, message: "璇绘暟鎸囦护涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        loopLength: [
+          {required: true, message: "鍥炴暟闀垮害涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        filePath: [
+          {required: true, message: "闄勪欢涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+      },
+      disabled: false
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 鏌ヨ澶栬鍗曞厓鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listPeripheralUnit(this.queryParams).then(response => {
+        this.peripheralUnitList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.open = false;
+      this.uploadFlag = false;
+      this.reset();
+    },
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        model: undefined,
+        manufacturer: undefined,
+        vendorCode: undefined,
+        baudRate: undefined,
+        readInstruction: undefined,
+        loopLength: undefined,
+        description: undefined,
+        filePath: undefined,
+        createBy: undefined,
+        createTime: undefined,
+        updateBy: undefined,
+        updateTime: undefined,
+        delFlag: undefined,
+        version: undefined
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.reset();
+      this.form.baudRate = '3'
+      this.open = true;
+      this.title = "娣诲姞澶栬鍗曞厓";
+    },
+    handleInfo(row) {
+      this.loading = true;
+      this.reset();
+      this.disabled = true
+      const id = row.id || this.ids
+      getPeripheralUnit(id).then(response => {
+        this.loading = false;
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼澶栬鍗曞厓";
+      });
+    },
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.loading = true;
+      this.reset();
+      const id = row.id || this.ids
+      getPeripheralUnit(id).then(response => {
+        this.loading = false;
+        this.form = response.data;
+        this.open = true;
+        this.title = "淇敼澶栬鍗曞厓";
+      });
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.buttonLoading = true;
+          if (this.form.id != null) {
+            updatePeripheralUnit(this.form).then(response => {
+              this.$modal.msgSuccess("淇敼鎴愬姛");
+              this.open = false;
+              this.uploadFlag = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          } else {
+            addPeripheralUnit(this.form).then(response => {
+              this.$modal.msgSuccess("鏂板鎴愬姛");
+              this.open = false;
+              this.getList();
+            }).finally(() => {
+              this.buttonLoading = false;
+            });
+          }
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('鏄惁纭鍒犻櫎澶栬鍗曞厓缂栧彿涓�"' + ids + '"鐨勬暟鎹」锛�').then(() => {
+        this.loading = true;
+        return delPeripheralUnit(ids);
+      }).then(() => {
+        this.loading = false;
+        this.getList();
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+      }).finally(() => {
+        this.loading = false;
+      });
+    },
+    handleUpload(row) {
+      this.loading = true;
+      this.reset();
+      const id = row.id || this.ids
+      getPeripheralUnit(id).then(response => {
+        this.loading = false;
+        this.form = response.data;
+        this.uploadFlag = true;
+        this.title = "涓婁紶闄勪欢";
+      });
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.download('oa/peripheralUnit/export', {
+        ...this.queryParams
+      }, `peripheralUnit_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
index e215b1c..1cd40ea 100644
--- a/src/views/system/dept/index.vue
+++ b/src/views/system/dept/index.vue
@@ -1,17 +1,17 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
-      <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
+      <el-form-item label="鏈烘瀯鍚嶇О" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
-          placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�"
+          placeholder="璇疯緭鍏ユ満鏋勫悕绉�"
           clearable
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="鐘舵��" prop="status">
-        <el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable size="small">
+      <el-form-item label="鏈烘瀯鐘舵��" prop="status">
+        <el-select v-model="queryParams.status" placeholder="鏈烘瀯鐘舵��" clearable size="small">
           <el-option
             v-for="dict in dict.type.sys_normal_disable"
             :key="dict.value"
@@ -35,7 +35,8 @@
           size="mini"
           @click="handleAdd"
           v-hasPermi="['system:dept:add']"
-        >鏂板</el-button>
+        >鏂板
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
@@ -44,7 +45,8 @@
           icon="el-icon-sort"
           size="mini"
           @click="toggleExpandAll"
-        >灞曞紑/鎶樺彔</el-button>
+        >灞曞紑/鎶樺彔
+        </el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
@@ -57,13 +59,17 @@
       :default-expand-all="isExpandAll"
       :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
     >
-      <el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="260"></el-table-column>
-      <el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>
+      <el-table-column prop="deptName" label="鏈烘瀯鍚嶇О" width="260"></el-table-column>
+      <el-table-column prop="code" label="鏈烘瀯缂栧彿" width="200"></el-table-column>
+<!--      <el-table-column prop="orderNum" label="鎺掑簭" width="200"></el-table-column>-->
       <el-table-column prop="status" label="鐘舵��" width="100">
         <template slot-scope="scope">
           <dict-tag :options="dict.type.sys_normal_disable" :value="scope.row.status"/>
         </template>
       </el-table-column>
+      <el-table-column prop="leaderName" label="涓昏礋璐d汉" width="200"></el-table-column>
+      <el-table-column prop="leaderAssistantName" label="鍓礋璐d汉" width="200"></el-table-column>
+      <el-table-column prop="remarks" label="鏈烘瀯鑱岃兘" width="200"></el-table-column>
       <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="200">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
@@ -75,16 +81,25 @@
             size="mini"
             type="text"
             icon="el-icon-edit"
+            @click="handleUser(scope.row)"
+          >鎴愬憳
+          </el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:dept:edit']"
-          >淇敼</el-button>
+          >淇敼
+          </el-button>
           <el-button
             size="mini"
             type="text"
             icon="el-icon-plus"
             @click="handleAdd(scope.row)"
             v-hasPermi="['system:dept:add']"
-          >鏂板</el-button>
+          >鏂板
+          </el-button>
           <el-button
             v-if="scope.row.parentId != 0"
             size="mini"
@@ -92,7 +107,8 @@
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             v-hasPermi="['system:dept:remove']"
-          >鍒犻櫎</el-button>
+          >鍒犻櫎
+          </el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -102,44 +118,74 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="24" v-if="form.parentId !== 0">
-            <el-form-item label="涓婄骇閮ㄩ棬" prop="parentId">
-              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="閫夋嫨涓婄骇閮ㄩ棬" />
+            <el-form-item label="涓婄骇鏈烘瀯" prop="parentId">
+              <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="閫夋嫨涓婄骇閮ㄩ棬"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
-              <el-input v-model="form.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" />
+            <el-form-item label="鏈烘瀯鍚嶇О" prop="deptName">
+              <el-input v-model="form.deptName" placeholder="璇疯緭鍏ユ満鏋勫悕绉�"/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈烘瀯缂栧彿" prop="code">
+              <el-input v-model="form.code" placeholder="璇疯緭鍏ユ満鏋勫悕绉�"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鏄剧ず鎺掑簭" prop="orderNum">
-              <el-input-number v-model="form.orderNum" controls-position="right" :min="0" />
+              <el-input-number v-model="form.orderNum" controls-position="right" :min="0"/>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="璐熻矗浜�" prop="leader">
-              <el-input v-model="form.leader" placeholder="璇疯緭鍏ヨ礋璐d汉" maxlength="20" />
+            <el-form-item label="涓昏礋璐d汉" prop="leader">
+              <el-select v-model="form.leader" placeholder="璇烽�夋嫨涓昏礋璐d汉" clearable size="small">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.userId"
+                  :label="dict.nickName"
+                  :value="dict.userId"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">
-              <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />
+            <el-form-item label="鍓礋璐d汉" prop="leaderAssistant">
+              <el-select v-model="form.leaderAssistant" placeholder="璇烽�夋嫨鍓礋璐d汉" clearable size="small">
+                <el-option
+                  v-for="dict in userList"
+                  :key="dict.userId"
+                  :label="dict.nickName"
+                  :value="dict.userId"
+                />
+              </el-select>
             </el-form-item>
           </el-col>
+          <!--          <el-col :span="12">-->
+          <!--            <el-form-item label="鑱旂郴鐢佃瘽" prop="phone">-->
+          <!--              <el-input v-model="form.phone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" maxlength="11" />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
+          <!--          <el-col :span="12">-->
+          <!--            <el-form-item label="閭" prop="email">-->
+          <!--              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />-->
+          <!--            </el-form-item>-->
+          <!--          </el-col>-->
           <el-col :span="12">
-            <el-form-item label="閭" prop="email">
-              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="閮ㄩ棬鐘舵��">
+            <el-form-item label="鏈烘瀯鐘舵��">
               <el-radio-group v-model="form.status">
                 <el-radio
                   v-for="dict in dict.type.sys_normal_disable"
                   :key="dict.value"
                   :label="dict.value"
-                >{{dict.label}}</el-radio>
+                >{{dict.label}}
+                </el-radio>
               </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="鏈烘瀯鑱岃兘" prop="remarks">
+              <el-input v-model="form.remarks" type="textarea" placeholder="璇疯緭鍏ユ満鏋勮亴鑳�" controls-position="right" :min="0"/>
             </el-form-item>
           </el-col>
         </el-row>
@@ -149,18 +195,39 @@
         <el-button @click="cancel">鍙� 娑�</el-button>
       </div>
     </el-dialog>
+
+    <!--鏈烘瀯鎴愬憳-->
+    <el-drawer
+      title="鏈烘瀯鎴愬憳"
+      :visible.sync="drawer"
+      direction="rtl"
+      size="50%">
+      <el-table :data="userTable">
+        <el-table-column property="nickName" label="濮撳悕" width="150"></el-table-column>
+        <el-table-column property="phonenumber" label="鐢佃瘽" width="200"></el-table-column>
+        <el-table-column property="userName" label="璐﹀彿"></el-table-column>
+      </el-table>
+      <pagination
+        v-show="tableTotal>0"
+        :total="tableTotal"
+        :page.sync="queryTable.pageNum"
+        :limit.sync="queryTable.pageSize"
+        @pagination="getList"
+      />
+    </el-drawer>
   </div>
 </template>
 
 <script>
-import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept";
+import {listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild} from "@/api/system/dept";
+import {listUser, listUserDept} from "@/api/common/common";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Dept",
   dicts: ['sys_normal_disable'],
-  components: { Treeselect },
+  components: {Treeselect},
   data() {
     return {
       // 閬僵灞�
@@ -189,13 +256,16 @@
       // 琛ㄥ崟鏍¢獙
       rules: {
         parentId: [
-          { required: true, message: "涓婄骇閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }
+          {required: true, message: "涓婄骇鏈烘瀯涓嶈兘涓虹┖", trigger: "blur"}
         ],
         deptName: [
-          { required: true, message: "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }
+          {required: true, message: "鏈烘瀯鍚嶇О涓嶈兘涓虹┖", trigger: "blur"}
+        ],
+        code: [
+          {required: true, message: "鏈烘瀯缂栧彿涓嶈兘涓虹┖", trigger: "blur"}
         ],
         orderNum: [
-          { required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }
+          {required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur"}
         ],
         email: [
           {
@@ -211,6 +281,17 @@
             trigger: "blur"
           }
         ]
+      },
+      // 涓嬫媺鐢ㄦ埛
+      userList: [],
+      // 鎴愬憳鎶藉眽
+      drawer: false,
+      // 鎴愬憳琛ㄦ牸
+      userTable: [],
+      tableTotal: 0,
+      queryTable: {
+        pageNum: 1,
+        pageSize: 10
       }
     };
   },
@@ -268,6 +349,7 @@
     /** 鏂板鎸夐挳鎿嶄綔 */
     handleAdd(row) {
       this.reset();
+      this.getUserList()
       if (row != undefined) {
         this.form.parentId = row.deptId;
       }
@@ -277,6 +359,12 @@
         this.deptOptions = this.handleTree(response.data, "deptId");
       });
     },
+    // 鐢ㄦ埛涓嬫媺鍒楄〃
+    getUserList() {
+      listUser().then(res => {
+        this.userList = res.data
+      })
+    },
     /** 灞曞紑/鎶樺彔鎿嶄綔 */
     toggleExpandAll() {
       this.refreshTable = false;
@@ -285,9 +373,19 @@
         this.refreshTable = true;
       });
     },
+    // 鏈烘瀯鎴愬憳
+    handleUser(row) {
+      this.drawer = true
+      listUserDept(Object.assign({}, {deptId: row.deptId}, this.queryTable)).then(res => {
+        console.log(res)
+        this.userTable = res.data.records
+        this.tableTotal = res.data.total
+      })
+    },
     /** 淇敼鎸夐挳鎿嶄綔 */
     handleUpdate(row) {
       this.reset();
+      this.getUserList()
       getDept(row.deptId).then(response => {
         this.form = response.data;
         this.open = true;
@@ -298,7 +396,7 @@
       });
     },
     /** 鎻愪氦鎸夐挳 */
-    submitForm: function() {
+    submitForm: function () {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.deptId != undefined) {
@@ -319,12 +417,13 @@
     },
     /** 鍒犻櫎鎸夐挳鎿嶄綔 */
     handleDelete(row) {
-      this.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」锛�').then(function() {
+      this.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」锛�').then(function () {
         return delDept(row.deptId);
       }).then(() => {
         this.getList();
         this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
+      }).catch(() => {
+      });
     }
   }
 };
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 1ff9b90..ae03d32 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -211,12 +211,24 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴锋樀绉�" maxlength="30" />
+            <el-form-item v-if="form.userId == undefined" label="璐﹀彿" prop="userName">
+              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="褰掑睘閮ㄩ棬" prop="deptId">
+            <el-form-item v-if="form.userId == undefined" label="瀵嗙爜" prop="password">
+              <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鐢ㄦ埛鍚嶇О" prop="nickName">
+              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鎵�鍦ㄩ儴闂�" prop="deptId">
               <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" placeholder="璇烽�夋嫨褰掑睘閮ㄩ棬" />
             </el-form-item>
           </el-col>
@@ -228,27 +240,20 @@
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="閭" prop="email">
-              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />
+            <el-form-item label="璇佷欢鍙风爜" prop="certificateNo">
+              <el-input v-model="form.certificateNo" placeholder="璇疯緭鍏ヨ瘉浠跺彿鐮�" maxlength="18" />
             </el-form-item>
           </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛鍚嶇О" prop="userName">
-              <el-input v-model="form.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" maxlength="30" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item v-if="form.userId == undefined" label="鐢ㄦ埛瀵嗙爜" prop="password">
-              <el-input v-model="form.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" type="password" maxlength="20" show-password/>
-            </el-form-item>
-          </el-col>
+<!--          <el-col :span="12">-->
+<!--            <el-form-item label="閭" prop="email">-->
+<!--              <el-input v-model="form.email" placeholder="璇疯緭鍏ラ偖绠�" maxlength="50" />-->
+<!--            </el-form-item>-->
+<!--          </el-col>-->
         </el-row>
         <el-row>
           <el-col :span="12">
             <el-form-item label="鐢ㄦ埛鎬у埆">
-              <el-select v-model="form.sex" placeholder="璇烽�夋嫨">
+              <el-select v-model="form.sex" placeholder="璇烽�夋嫨" prop="sex">
                 <el-option
                   v-for="dict in dict.type.sys_user_sex"
                   :key="dict.value"
@@ -305,6 +310,23 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鍏ヨ亴鏃堕棿">
+              <el-date-picker
+                v-model="form.entryTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                placeholder="閫夋嫨鍏ヨ亴鏃堕棿">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鐓х墖">
+              <imageUpload v-model="form.photo" :limit="1"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
@@ -356,6 +378,18 @@
   dicts: ['sys_normal_disable', 'sys_user_sex'],
   components: { Treeselect },
   data() {
+    // 韬唤璇佸彿鏍¢獙
+    let checkIdNum = (rule, value, callback) => {
+      const reg =
+        /(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)/
+      if (!value) {
+        return callback(new Error('璇佷欢鍙风爜涓嶈兘涓虹┖'))
+      } else if (!reg.test(value)) {
+        return callback(new Error('璇佷欢鍙风爜涓嶆纭�'))
+      } else {
+        callback()
+      }
+    }
     return {
       // 閬僵灞�
       loading: true,
@@ -430,8 +464,8 @@
       // 琛ㄥ崟鏍¢獙
       rules: {
         userName: [
-          { required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" },
-          { min: 2, max: 20, message: '鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' }
+          { required: true, message: "璐﹀彿涓嶈兘涓虹┖", trigger: "blur" },
+          { min: 2, max: 20, message: '璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' }
         ],
         nickName: [
           { required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }
@@ -440,19 +474,30 @@
           { required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
           { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' }
         ],
-        email: [
-          {
-            type: "email",
-            message: "'璇疯緭鍏ユ纭殑閭鍦板潃",
-            trigger: ["blur", "change"]
-          }
-        ],
+        // email: [
+        //   {
+        //     type: "email",
+        //     message: "'璇疯緭鍏ユ纭殑閭鍦板潃",
+        //     trigger: ["blur", "change"]
+        //   }
+        // ],
         phonenumber: [
+          { required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
           {
             pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
             message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜",
             trigger: "blur"
           }
+        ],
+        certificateNo: [
+          { required: true, message: "璇佷欢鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
+          { validator: checkIdNum, trigger: 'blur' }
+        ],
+        sex: [
+          { required: true, message: "鎬у埆涓嶈兘涓虹┖", trigger: "blur" }
+        ],
+        deptId: [
+          { required: true, message: "鎵�鍦ㄩ儴闂ㄤ笉鑳戒负绌�", trigger: "blur" }
         ]
       }
     };

--
Gitblit v1.9.1