Переглянути джерело

新增访客预约记录、访客登记记录、访客白名单

zmj 3 тижнів тому
батько
коміт
8057229bfa

+ 44 - 0
src/api/base/appointmentRecord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询访客预约记录列表
+export function listAppointmentRecord(query) {
+  return request({
+    url: '/base/appointmentRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询访客预约记录详细
+export function getAppointmentRecord(id) {
+  return request({
+    url: '/base/appointmentRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增访客预约记录
+export function addAppointmentRecord(data) {
+  return request({
+    url: '/base/appointmentRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改访客预约记录
+export function updateAppointmentRecord(data) {
+  return request({
+    url: '/base/appointmentRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除访客预约记录
+export function delAppointmentRecord(id) {
+  return request({
+    url: '/base/appointmentRecord/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/base/visitorRecord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询访客登记记录列表
+export function listVisitorRecord(query) {
+  return request({
+    url: '/base/visitorRecord/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询访客登记记录详细
+export function getVisitorRecord(id) {
+  return request({
+    url: '/base/visitorRecord/' + id,
+    method: 'get'
+  })
+}
+
+// 新增访客登记记录
+export function addVisitorRecord(data) {
+  return request({
+    url: '/base/visitorRecord',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改访客登记记录
+export function updateVisitorRecord(data) {
+  return request({
+    url: '/base/visitorRecord',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除访客登记记录
+export function delVisitorRecord(id) {
+  return request({
+    url: '/base/visitorRecord/' + id,
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/base/whitelist.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询访客白名单列表
+export function listWhitelist(query) {
+  return request({
+    url: '/base/whitelist/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询访客白名单详细
+export function getWhitelist(id) {
+  return request({
+    url: '/base/whitelist/' + id,
+    method: 'get'
+  })
+}
+
+// 新增访客白名单
+export function addWhitelist(data) {
+  return request({
+    url: '/base/whitelist',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改访客白名单
+export function updateWhitelist(data) {
+  return request({
+    url: '/base/whitelist',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除访客白名单
+export function delWhitelist(id) {
+  return request({
+    url: '/base/whitelist/' + id,
+    method: 'delete'
+  })
+}

+ 389 - 0
src/views/base/appointmentRecord/index.vue

@@ -0,0 +1,389 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="预约单号" prop="appointmentNo">
+        <el-input
+          v-model="queryParams.appointmentNo"
+          placeholder="请输入预约单号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="访客姓名" prop="visitorName">
+        <el-input
+          v-model="queryParams.visitorName"
+          placeholder="请输入访客姓名"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="访客手机号" prop="mobile">
+        <el-input
+          v-model="queryParams.mobile"
+          placeholder="请输入访客手机号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="被访人/被访对象" prop="visitedPerson">
+        <el-input
+          v-model="queryParams.visitedPerson"
+          placeholder="请输入被访人/被访对象"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="预约到访时间" prop="appointmentTime">
+        <el-date-picker clearable
+          v-model="queryParams.appointmentTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择预约到访时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="预约状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择预约状态" clearable>
+          <el-option
+            v-for="dict in appointment_record_status"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="同步到本地时间" prop="syncTime">
+        <el-date-picker clearable
+          v-model="queryParams.syncTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择同步到本地时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="来源平台" prop="sourcePlatform">
+        <el-input
+          v-model="queryParams.sourcePlatform"
+          placeholder="请输入来源平台"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @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="Plus"
+          @click="handleAdd"
+          v-hasPermi="['base:appointmentRecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['base:appointmentRecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['base:appointmentRecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['base:appointmentRecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="appointmentRecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="预约单号" align="center" prop="appointmentNo" />
+      <el-table-column label="访客姓名" align="center" prop="visitorName" />
+      <el-table-column label="访客手机号" align="center" prop="mobile" />
+      <el-table-column label="被访人/被访对象" align="center" prop="visitedPerson" />
+      <el-table-column label="预约到访时间" align="center" prop="appointmentTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.appointmentTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="预约状态" align="center" prop="status">
+        <template #default="scope">
+          <dict-tag :options="appointment_record_status" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="同步到本地时间" align="center" prop="syncTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.syncTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="来源平台" align="center" prop="sourcePlatform" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['base:appointmentRecord:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['base:appointmentRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改访客预约记录对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="appointmentRecordRef" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="预约单号" prop="appointmentNo">
+              <el-input v-model="form.appointmentNo" placeholder="请输入预约单号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="访客姓名" prop="visitorName">
+              <el-input v-model="form.visitorName" placeholder="请输入访客姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="访客手机号" prop="mobile">
+              <el-input v-model="form.mobile" placeholder="请输入访客手机号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="被访人/被访对象" prop="visitedPerson">
+              <el-input v-model="form.visitedPerson" placeholder="请输入被访人/被访对象" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="预约到访时间" prop="appointmentTime">
+              <el-date-picker clearable
+                v-model="form.appointmentTime"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择预约到访时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="预约状态" prop="status">
+              <el-radio-group v-model="form.status">
+                <el-radio
+                  v-for="dict in appointment_record_status"
+                  :key="dict.value"
+                  :label="parseInt(dict.value)"
+                >{{dict.label}}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="同步到本地时间" prop="syncTime">
+              <el-date-picker clearable
+                v-model="form.syncTime"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择同步到本地时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="来源平台" prop="sourcePlatform">
+              <el-input v-model="form.sourcePlatform" placeholder="请输入来源平台" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="AppointmentRecord">
+import { listAppointmentRecord, getAppointmentRecord, delAppointmentRecord, addAppointmentRecord, updateAppointmentRecord } from "@/api/base/appointmentRecord"
+
+const { proxy } = getCurrentInstance()
+const { appointment_record_status } = useDict('appointment_record_status')
+
+const appointmentRecordList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    appointmentNo: undefined,
+    visitorName: undefined,
+    mobile: undefined,
+    visitedPerson: undefined,
+    appointmentTime: undefined,
+    status: undefined,
+    syncTime: undefined,
+    sourcePlatform: undefined,
+  },
+  rules: {
+    appointmentNo: [
+      { required: true, message: "预约单号不能为空", trigger: "blur" }
+    ],
+    status: [
+      { required: true, message: "预约状态不能为空", trigger: "change" }
+    ],
+  }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 查询访客预约记录列表 */
+function getList() {
+  loading.value = true
+  listAppointmentRecord(queryParams.value).then(response => {
+    appointmentRecordList.value = response.rows
+    total.value = response.total
+    loading.value = false
+  })
+}
+
+/** 取消按钮 */
+function cancel() {
+  open.value = false
+  reset()
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    id: null,
+    appointmentNo: null,
+    visitorName: null,
+    mobile: null,
+    visitedPerson: null,
+    appointmentTime: null,
+    status: null,
+    syncTime: null,
+    sourcePlatform: null,
+    remark: null,
+    createTime: null,
+    updateTime: null
+  }
+  proxy.resetForm("appointmentRecordRef")
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id)
+  single.value = selection.length != 1
+  multiple.value = !selection.length
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset()
+  open.value = true
+  title.value = "添加访客预约记录"
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset()
+  const _id = row.id || ids.value
+  getAppointmentRecord(_id).then(response => {
+    form.value = response.data
+    open.value = true
+    title.value = "修改访客预约记录"
+  })
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["appointmentRecordRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateAppointmentRecord(form.value).then(() => {
+          proxy.$modal.msgSuccess("修改成功")
+          open.value = false
+          getList()
+        })
+      } else {
+        addAppointmentRecord(form.value).then(() => {
+          proxy.$modal.msgSuccess("新增成功")
+          open.value = false
+          getList()
+        })
+      }
+    }
+  })
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value
+  proxy.$modal.confirm('是否确认删除访客预约记录编号为"' + _ids + '"的数据项?').then(function() {
+    return delAppointmentRecord(_ids)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('base/appointmentRecord/export', {
+    ...queryParams.value
+  }, `appointmentRecord_${new Date().getTime()}.xlsx`)
+}
+
+getList()
+</script>

+ 412 - 0
src/views/base/visitorRecord/index.vue

@@ -0,0 +1,412 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="访客姓名" prop="visitorName">
+        <el-input
+          v-model="queryParams.visitorName"
+          placeholder="请输入访客姓名"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="访客手机号" prop="mobile">
+        <el-input
+          v-model="queryParams.mobile"
+          placeholder="请输入访客手机号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="证件号码" prop="idCardNo">
+        <el-input
+          v-model="queryParams.idCardNo"
+          placeholder="请输入证件号码"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="登记方式" prop="registerType">
+        <el-select v-model="queryParams.registerType" placeholder="请选择登记方式" clearable>
+          <el-option
+            v-for="dict in visitor_register_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="访客照片地址" prop="visitorPhoto">
+        <el-input
+          v-model="queryParams.visitorPhoto"
+          placeholder="请输入访客照片地址"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="关联预约单号" prop="appointmentNo">
+        <el-input
+          v-model="queryParams.appointmentNo"
+          placeholder="请输入关联预约单号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="被访人/被访对象" prop="visitedPerson">
+        <el-input
+          v-model="queryParams.visitedPerson"
+          placeholder="请输入被访人/被访对象"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="来访时间/登记时间" prop="visitTime">
+        <el-date-picker clearable
+          v-model="queryParams.visitTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择来访时间/登记时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="来源类型" prop="sourceType">
+        <el-select v-model="queryParams.sourceType" placeholder="请选择来源类型" clearable>
+          <el-option
+            v-for="dict in source_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @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="Plus"
+          @click="handleAdd"
+          v-hasPermi="['base:visitorRecord:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['base:visitorRecord:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['base:visitorRecord:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['base:visitorRecord:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="visitorRecordList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="访客姓名" align="center" prop="visitorName" />
+      <el-table-column label="访客手机号" align="center" prop="mobile" />
+      <el-table-column label="证件号码" align="center" prop="idCardNo" />
+      <el-table-column label="登记方式" align="center" prop="registerType">
+        <template #default="scope">
+          <dict-tag :options="visitor_register_type" :value="scope.row.registerType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="访客照片地址" align="center" prop="visitorPhoto" />
+      <el-table-column label="关联预约单号" align="center" prop="appointmentNo" />
+      <el-table-column label="被访人/被访对象" align="center" prop="visitedPerson" />
+      <el-table-column label="来访时间/登记时间" align="center" prop="visitTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.visitTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="登记结果:SUCCESS成功,FAIL失败,WHITELIST命中白名单" align="center" prop="resultStatus" />
+      <el-table-column label="来源类型" align="center" prop="sourceType">
+        <template #default="scope">
+          <dict-tag :options="source_type" :value="scope.row.sourceType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['base:visitorRecord:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['base:visitorRecord:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改访客登记记录对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="visitorRecordRef" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="访客姓名" prop="visitorName">
+              <el-input v-model="form.visitorName" placeholder="请输入访客姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="访客手机号" prop="mobile">
+              <el-input v-model="form.mobile" placeholder="请输入访客手机号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="证件号码" prop="idCardNo">
+              <el-input v-model="form.idCardNo" placeholder="请输入证件号码" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="登记方式" prop="registerType">
+              <el-select v-model="form.registerType" placeholder="请选择登记方式">
+                <el-option
+                  v-for="dict in visitor_register_type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="parseInt(dict.value)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="访客照片地址" prop="visitorPhoto">
+              <el-input v-model="form.visitorPhoto" placeholder="请输入访客照片地址" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="关联预约单号" prop="appointmentNo">
+              <el-input v-model="form.appointmentNo" placeholder="请输入关联预约单号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="被访人/被访对象" prop="visitedPerson">
+              <el-input v-model="form.visitedPerson" placeholder="请输入被访人/被访对象" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="来访时间/登记时间" prop="visitTime">
+              <el-date-picker clearable
+                v-model="form.visitTime"
+                type="date"
+                value-format="YYYY-MM-DD"
+                placeholder="请选择来访时间/登记时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="来源类型" prop="sourceType">
+              <el-select v-model="form.sourceType" placeholder="请选择来源类型">
+                <el-option
+                  v-for="dict in source_type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="parseInt(dict.value)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="VisitorRecord">
+import { listVisitorRecord, getVisitorRecord, delVisitorRecord, addVisitorRecord, updateVisitorRecord } from "@/api/base/visitorRecord"
+
+const { proxy } = getCurrentInstance()
+const { visitor_register_type, source_type } = useDict('visitor_register_type', 'source_type')
+
+const visitorRecordList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    visitorName: undefined,
+    mobile: undefined,
+    idCardNo: undefined,
+    registerType: undefined,
+    visitorPhoto: undefined,
+    appointmentNo: undefined,
+    visitedPerson: undefined,
+    visitTime: undefined,
+    resultStatus: undefined,
+    sourceType: undefined,
+  },
+  rules: {
+    registerType: [
+      { required: true, message: "登记方式不能为空", trigger: "change" }
+    ],
+    sourceType: [
+      { required: true, message: "来源类型不能为空", trigger: "change" }
+    ],
+  }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 查询访客登记记录列表 */
+function getList() {
+  loading.value = true
+  listVisitorRecord(queryParams.value).then(response => {
+    visitorRecordList.value = response.rows
+    total.value = response.total
+    loading.value = false
+  })
+}
+
+/** 取消按钮 */
+function cancel() {
+  open.value = false
+  reset()
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    id: null,
+    visitorName: null,
+    mobile: null,
+    idCardNo: null,
+    registerType: null,
+    visitorPhoto: null,
+    appointmentNo: null,
+    visitedPerson: null,
+    visitTime: null,
+    resultStatus: null,
+    sourceType: null,
+    remark: null,
+    createTime: null
+  }
+  proxy.resetForm("visitorRecordRef")
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id)
+  single.value = selection.length != 1
+  multiple.value = !selection.length
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset()
+  open.value = true
+  title.value = "添加访客登记记录"
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset()
+  const _id = row.id || ids.value
+  getVisitorRecord(_id).then(response => {
+    form.value = response.data
+    open.value = true
+    title.value = "修改访客登记记录"
+  })
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["visitorRecordRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateVisitorRecord(form.value).then(() => {
+          proxy.$modal.msgSuccess("修改成功")
+          open.value = false
+          getList()
+        })
+      } else {
+        addVisitorRecord(form.value).then(() => {
+          proxy.$modal.msgSuccess("新增成功")
+          open.value = false
+          getList()
+        })
+      }
+    }
+  })
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value
+  proxy.$modal.confirm('是否确认删除访客登记记录编号为"' + _ids + '"的数据项?').then(function() {
+    return delVisitorRecord(_ids)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('base/visitorRecord/export', {
+    ...queryParams.value
+  }, `visitorRecord_${new Date().getTime()}.xlsx`)
+}
+
+getList()
+</script>

+ 330 - 0
src/views/base/whitelist/index.vue

@@ -0,0 +1,330 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="人员姓名" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入人员姓名"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号" prop="mobile">
+        <el-input
+          v-model="queryParams.mobile"
+          placeholder="请输入手机号"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="白名单类型" prop="whitelistType">
+        <el-select v-model="queryParams.whitelistType" placeholder="请选择白名单类型" clearable>
+          <el-option
+            v-for="dict in whitelist__type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="来源类型" prop="sourceType">
+        <el-select v-model="queryParams.sourceType" placeholder="请选择来源类型" clearable>
+          <el-option
+            v-for="dict in source_type"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @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="Plus"
+          @click="handleAdd"
+          v-hasPermi="['base:whitelist:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['base:whitelist:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['base:whitelist:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['base:whitelist:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="whitelistList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="主键ID" align="center" prop="id" />
+      <el-table-column label="人员姓名" align="center" prop="name" />
+      <el-table-column label="手机号" align="center" prop="mobile" />
+      <el-table-column label="白名单类型" align="center" prop="whitelistType">
+        <template #default="scope">
+          <dict-tag :options="whitelist__type" :value="scope.row.whitelistType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="来源类型" align="center" prop="sourceType">
+        <template #default="scope">
+          <dict-tag :options="source_type" :value="scope.row.sourceType"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="启用状态:0停用,1启用" align="center" prop="status" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['base:whitelist:edit']">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['base:whitelist:remove']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改访客白名单对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="whitelistRef" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="人员姓名" prop="name">
+              <el-input v-model="form.name" placeholder="请输入人员姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="手机号" prop="mobile">
+              <el-input v-model="form.mobile" placeholder="请输入手机号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="白名单类型" prop="whitelistType">
+              <el-select v-model="form.whitelistType" placeholder="请选择白名单类型">
+                <el-option
+                  v-for="dict in whitelist__type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="parseInt(dict.value)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="来源类型" prop="sourceType">
+              <el-select v-model="form.sourceType" placeholder="请选择来源类型">
+                <el-option
+                  v-for="dict in source_type"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="parseInt(dict.value)"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Whitelist">
+import { listWhitelist, getWhitelist, delWhitelist, addWhitelist, updateWhitelist } from "@/api/base/whitelist"
+
+const { proxy } = getCurrentInstance()
+const { source_type, whitelist__type } = useDict('source_type', 'whitelist__type')
+
+const whitelistList = ref([])
+const open = ref(false)
+const loading = ref(true)
+const showSearch = ref(true)
+const ids = ref([])
+const single = ref(true)
+const multiple = ref(true)
+const total = ref(0)
+const title = ref("")
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: undefined,
+    mobile: undefined,
+    whitelistType: undefined,
+    sourceType: undefined,
+    status: undefined,
+  },
+  rules: {
+    name: [
+      { required: true, message: "人员姓名不能为空", trigger: "blur" }
+    ],
+    whitelistType: [
+      { required: true, message: "白名单类型不能为空", trigger: "change" }
+    ],
+    sourceType: [
+      { required: true, message: "来源类型不能为空", trigger: "change" }
+    ],
+    status: [
+      { required: true, message: "启用状态:0停用,1启用不能为空", trigger: "change" }
+    ],
+  }
+})
+
+const { queryParams, form, rules } = toRefs(data)
+
+/** 查询访客白名单列表 */
+function getList() {
+  loading.value = true
+  listWhitelist(queryParams.value).then(response => {
+    whitelistList.value = response.rows
+    total.value = response.total
+    loading.value = false
+  })
+}
+
+/** 取消按钮 */
+function cancel() {
+  open.value = false
+  reset()
+}
+
+/** 表单重置 */
+function reset() {
+  form.value = {
+    id: null,
+    name: null,
+    mobile: null,
+    whitelistType: null,
+    sourceType: null,
+    status: null,
+    remark: null,
+    createTime: null,
+    updateTime: null
+  }
+  proxy.resetForm("whitelistRef")
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef")
+  handleQuery()
+}
+
+/** 多选框选中数据 */
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id)
+  single.value = selection.length != 1
+  multiple.value = !selection.length
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset()
+  open.value = true
+  title.value = "添加访客白名单"
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset()
+  const _id = row.id || ids.value
+  getWhitelist(_id).then(response => {
+    form.value = response.data
+    open.value = true
+    title.value = "修改访客白名单"
+  })
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["whitelistRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateWhitelist(form.value).then(() => {
+          proxy.$modal.msgSuccess("修改成功")
+          open.value = false
+          getList()
+        })
+      } else {
+        addWhitelist(form.value).then(() => {
+          proxy.$modal.msgSuccess("新增成功")
+          open.value = false
+          getList()
+        })
+      }
+    }
+  })
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value
+  proxy.$modal.confirm('是否确认删除访客白名单编号为"' + _ids + '"的数据项?').then(function() {
+    return delWhitelist(_ids)
+  }).then(() => {
+    getList()
+    proxy.$modal.msgSuccess("删除成功")
+  }).catch(() => {})
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('base/whitelist/export', {
+    ...queryParams.value
+  }, `whitelist_${new Date().getTime()}.xlsx`)
+}
+
+getList()
+</script>