From c14fd6f05f96c36693db8b3058be2ceb8e7c87d1 Mon Sep 17 00:00:00 2001
From: wenminjie <1036699586@qq.com>
Date: 星期五, 10 七月 2026 09:34:02 +0800
Subject: [PATCH] 访客机侧代码

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitAreaController.java      |   56 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorMachineServiceImpl.java |   54 ++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java            |    5 
 ruoyi-system/src/main/resources/mapper/system/SysVisitorRecordMapper.xml                   |   45 ++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysVisitorRecordMapper.java             |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/IndexLookDataVo.java                        |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorMachineDetailRequest.java        |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionReassignVO.java                     |    3 
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketController.java     |    6 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java         |   20 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitAreaVO.java                         |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorRecordAddRequest.java            |   86 ++++
 ruoyi-system/src/main/resources/mapper/system/EmployeeMapper.xml                           |   39 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/PositioningDetailVO.java                    |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysVisitorConfigController.java     |   24 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitAreaService.java              |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDoorDeviceServiceImpl.java     |    2 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitorRecordController.java  |  105 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/enums/VerifyResultEnum.java                    |   32 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitAreaServiceImpl.java      |    1 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitorConfigVO.java                     |   19 
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitorMachineService.java         |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/domain/Employee.java                           |   45 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDoorDeviceService.java             |    1 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java      |   38 -
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/EmployeeMapper.java                     |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/service/EmployeeVerifyService.java             |   13 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserPageVo.java                         |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiDoorMachineController.java    |   54 ++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/SysDoorDeviceDetailRequest.java            |    7 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java  |   68 --
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java                       |   11 
 /dev/null                                                                                  |   69 ---
 ruoyi-system/src/main/java/com/ruoyi/system/dto/CardVerifyRequest.java                     |   22 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java                   |   11 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java           |   49 --
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionAssignRuleVO.java                   |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionVO.java                             |   11 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java               |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmployeeVerifyServiceImpl.java    |   62 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EmployeeVerifyController.java       |   39 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java           |   47 --
 ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketAuthHandler.java    |   80 ---
 43 files changed, 783 insertions(+), 407 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EmployeeVerifyController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EmployeeVerifyController.java
new file mode 100644
index 0000000..862784b
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/EmployeeVerifyController.java
@@ -0,0 +1,39 @@
+package com.ruoyi.web.controller.api;
+
+
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.dto.CardVerifyRequest;
+import com.ruoyi.system.service.EmployeeVerifyService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 接待人(被访者)刷卡验证接口。
+ * 数据源:t_employee 员工管理表(含内部员工及已授权的外部人员)。
+ */
+@Api(tags = "接待人验证接口")
+@RestController
+@RequestMapping("/api/employee/verify")
+public class EmployeeVerifyController extends BaseController {
+
+    @Resource
+    private EmployeeVerifyService employeeVerifyService;
+
+    /**
+     * 刷卡验证:现场读卡器读取卡号后调用本接口,与接待人绑定的卡号比对。
+     */
+    @PostMapping("/card")
+    @ApiOperation(value = "接待人刷卡验证", notes = "根据传入的卡号与接待人(employeeId)绑定的卡号进行比对,"
+            + "仅对启用且未删除的接待人生效")
+    public AjaxResult verifyByCard(@RequestBody @Valid CardVerifyRequest request) {
+        return employeeVerifyService.verifyByCard(request);
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiDoorMachineController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiDoorMachineController.java
new file mode 100644
index 0000000..8e9146a
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiDoorMachineController.java
@@ -0,0 +1,54 @@
+package com.ruoyi.web.controller.api;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.dto.*;
+import com.ruoyi.system.service.ISysVisitorMachineService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 访客机设备激活/注销
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/api/visitmachine")
+@Api(tags = "访客机设备激活、注销" , value = "访客机设备激活、注销")
+public class SysApiDoorMachineController extends BaseController
+{
+    @Autowired
+    private ISysVisitorMachineService visitorMachineService;
+
+    /**
+     * 激活设备
+     */
+    @Log(title = "访客机设备", businessType = BusinessType.UPDATE)
+    @PostMapping("/activate")
+    @ApiOperation(value = "激活访客机设备")
+    public AjaxResult activate(@Valid @RequestBody SysVisitorMachineDetailRequest request) {
+        int result = visitorMachineService.activateDevice(request.getMachineId());
+        return result > 0 ? success("设备激活成功") : error("设备激活失败");
+    }
+
+    /**
+     * 注销设备
+     */
+    @Log(title = "访客机设备", businessType = BusinessType.UPDATE)
+    @PostMapping("/deactivate")
+    @ApiOperation(value = "注销访客机设备")
+    public AjaxResult deactivate(@Valid @RequestBody SysVisitorMachineDetailRequest request) {
+        int result = visitorMachineService.deactivateDevice(request.getMachineId());
+        return result > 0 ? success("设备注销成功") : error("设备注销失败");
+    }
+
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitAreaController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitAreaController.java
new file mode 100644
index 0000000..2e1b3b2
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitAreaController.java
@@ -0,0 +1,56 @@
+package com.ruoyi.web.controller.api;
+
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.system.dto.*;
+import com.ruoyi.system.service.ISysVisitAreaService;
+import com.ruoyi.system.vo.SysVisitAreaVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 访问区域管理接口
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/api/visitArea")
+@Api(tags = "访问区域管理")
+public class SysApiVisitAreaController extends BaseController
+{
+    @Autowired
+    private ISysVisitAreaService visitAreaService;
+
+    /**
+     * 查询访问区域树
+     */
+    @ApiOperation(
+            value = "查询访问区域树",
+            notes = "返回所有访问区域树形结构",
+            response = SysVisitAreaVO.class,
+            responseContainer = "List"
+    )
+    @ApiResponses({
+            @ApiResponse(
+                    code = 200,
+                    message = "成功",
+                    response = AjaxResult.class,
+                    responseContainer = "List"
+            )
+    })
+    @PostMapping("/tree")
+    public AjaxResult<List<SysVisitAreaVO>> tree() {
+        return success(visitAreaService.tree(null));
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitorRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitorRecordController.java
new file mode 100644
index 0000000..c50a907
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysApiVisitorRecordController.java
@@ -0,0 +1,105 @@
+package com.ruoyi.web.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.system.domain.SysVisitorRecord;
+import com.ruoyi.system.dto.SysVisitorRecordAddRequest;
+import com.ruoyi.system.dto.SysVisitorRecordPageRequest;
+import com.ruoyi.system.mapper.SysVisitorRecordMapper;
+import com.ruoyi.system.service.ISysVisitorRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+
+@RestController
+@RequestMapping("/api/visitorRecord")
+@Api(tags = "访客登记")
+public class SysApiVisitorRecordController extends BaseController {
+
+    @Autowired
+    private SysVisitorRecordMapper visitorRecordMapper;
+
+    @PostMapping("/add")
+    @ApiOperation(value = "访客登记", notes = "现场访客登记")
+    public AjaxResult add(
+            @RequestBody
+            @ApiParam(value = "访客登记信息", required = true)
+            SysVisitorRecordAddRequest request) {
+
+        // ================= 参数校验 =================
+        if (StringUtils.isBlank(request.getVisitorName())) {
+            return AjaxResult.error("访客姓名不能为空");
+        }
+
+        if (StringUtils.isBlank(request.getIntervieweeName())) {
+            return AjaxResult.error("被访人不能为空");
+        }
+
+        if (StringUtils.isNotBlank(request.getIdCard())) {
+
+            LambdaQueryWrapper<SysVisitorRecord> wrapper = Wrappers.lambdaQuery();
+
+            wrapper.eq(SysVisitorRecord::getIdCard, request.getIdCard())
+                    .eq(SysVisitorRecord::getDelFlag, "0")
+                    .in(SysVisitorRecord::getStatus,
+                            "VISITING",
+                            "PENDING_CONFIRM")
+                    .last("limit 1");
+
+            SysVisitorRecord oldRecord = visitorRecordMapper.selectOne(wrapper);
+
+            if (oldRecord != null) {
+                return AjaxResult.error("该访客当前已有未结束的登记,请勿重复登记");
+            }
+        }
+
+        // ================= 保存 =================
+        SysVisitorRecord record = new SysVisitorRecord();
+        BeanUtils.copyProperties(request, record);
+
+        record.setRegisterNo(generateRegisterNo());
+        record.setRegisterType("ONSITE");
+        record.setRegisterSource("访客机");
+        record.setStatus("VISITING");
+        record.setRegisterTime(new Date());
+        record.setDelFlag("0");
+
+        int rows = visitorRecordMapper.insert(record);
+
+        if (rows > 0) {
+            return AjaxResult.success(record.getRegisterNo());
+        }
+
+        return AjaxResult.error("登记失败");
+    }
+
+    /**
+     * 生成登记编号
+     * 格式:
+     * VIS + 年月日 + 6位随机数
+     * 例如:
+     * VIS20260707123456
+     */
+    private String generateRegisterNo() {
+
+        String date =
+                new java.text.SimpleDateFormat("yyyyMMddHHmmss")
+                        .format(new Date());
+
+        String random =
+                String.valueOf((int)((Math.random() * 900000) + 100000));
+
+        return "VIS" + date + random;
+    }
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysVisitorConfigController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysVisitorConfigController.java
index d42182e..d9c14a1 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysVisitorConfigController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysVisitorConfigController.java
@@ -6,6 +6,12 @@
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.system.dto.SysVisitorConfigSaveRequest;
 import com.ruoyi.system.service.ISysVisitorConfigService;
+import com.ruoyi.system.vo.SysVisitorConfigVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -20,6 +26,7 @@
  */
 @RestController
 @RequestMapping("/system/visitor/config")
+@Api(tags = "访客系统配置接口")
 public class SysVisitorConfigController extends BaseController
 {
     @Autowired
@@ -31,9 +38,15 @@
     @Log(title = "访客系统配置", businessType = BusinessType.SELECT)
     @PreAuthorize("@ss.hasPermi('visitor:config:view')")
     @PostMapping("/detail")
-    public AjaxResult detail()
+    @ApiOperation(value = "查询访客系统配置")
+    @ApiResponses({
+            @ApiResponse(
+                    code = 200, message = "查询成功", response = SysVisitorConfigVO.class, responseContainer = "Data"  // 指定数据在 data 字段中
+            )
+    })
+    public AjaxResult<SysVisitorConfigVO> detail()
     {
-        return success(visitorConfigService.selectConfig());
+        return AjaxResult.success(visitorConfigService.selectConfig());
     }
 
     /**
@@ -42,8 +55,13 @@
     @Log(title = "访客系统配置", businessType = BusinessType.UPDATE)
     @PreAuthorize("@ss.hasPermi('visitor:config:edit')")
     @PostMapping("/save")
+    @ApiOperation(
+            value = "设置访客系统配置",
+            response = AjaxResult.class
+    )
     public AjaxResult save(@RequestBody SysVisitorConfigSaveRequest request)
     {
-        return success(visitorConfigService.saveConfig(request, getUsername()));
+        visitorConfigService.saveConfig(request, getUsername());
+        return success();
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
index cec5006..1b8a39e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
@@ -4,6 +4,9 @@
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,6 +31,7 @@
  */
 @RestController
 @RequestMapping("/common")
+@Api(tags = "图片上传接口")
 public class CommonController
 {
     private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@@ -73,6 +77,7 @@
      * 通用上传请求(单个)
      */
     @PostMapping("/upload")
+    @ApiOperation(value = "上传图片 MultipartFile file")
     public AjaxResult uploadFile(MultipartFile file) throws Exception
     {
         try
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
index 117d8f6..f2a10e6 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -10,7 +10,6 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysMenu;
-import com.ruoyi.system.dto.SysRoleDTO;
 import com.ruoyi.system.query.SysRoleQuery;
 import com.ruoyi.system.service.ISysMenuService;
 import com.ruoyi.system.vo.RoleInfoVO;
@@ -148,54 +147,6 @@
     public AjaxResult roleInfoFromUserId(@RequestParam Long userId)
     {
         return AjaxResult.success(roleService.roleInfoFromUserId(userId));
-    }
-
-
-    /**
-     * 新增角色
-     */
-//    @PreAuthorize("@ss.hasPermi('system:role:add')")
-    @ApiOperation(value = "新增角色")
-    @Log(title = "角色信息-新增角色", businessType = BusinessType.INSERT)
-    @PostMapping("/system/role/add")
-    public AjaxResult add(@Validated @RequestBody SysRoleDTO dto)
-    {
-        Boolean flag= roleService.isExit(dto.getRoleId(),dto.getRoleName());
-        if(flag){
-            return error("新增角色'" + dto.getRoleName() + "'失败,角色名称已存在");
-        }
-        roleService.saveRole(dto);
-        return AjaxResult.success();
-
-    }
-
-    /**
-     * 修改保存角色
-     */
-//    @PreAuthorize("@ss.hasPermi('system:role:edit')")
-    @ApiOperation(value = "编辑角色",response = SysRoleDTO.class)
-    @Log(title = "角色信息-编辑角色", businessType = BusinessType.UPDATE)
-    @PostMapping("/api/system/role/edit")
-    public R<String> edit(@RequestBody String param)
-    {
-        SysRoleDTO dto = JSON.parseObject(param, SysRoleDTO.class);
-        Boolean flag= roleService.isExit(dto.getRoleId(),dto.getRoleName());
-        if (flag){
-            return R.fail("修改角色'" + dto.getRoleName() + "'失败,角色名称已存在");
-        }
-        if (roleService.editRole(dto) > 0)
-        {
-            // 更新缓存用户权限
-            LoginUser loginUser = getLoginUser();
-            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
-            {
-                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
-                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
-                tokenService.setLoginUser(loginUser);
-            }
-            return R.ok();
-        }
-        return R.fail("修改角色'" + dto.getRoleName() + "'失败,请联系管理员");
     }
 
     /**
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
deleted file mode 100644
index 8959f2b..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
+++ /dev/null
@@ -1,69 +0,0 @@
-package com.ruoyi.web.controller.task;
-
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.system.model.TAppUser;
-import com.ruoyi.system.model.TAppUserPositioning;
-import com.ruoyi.system.service.TAppUserPositioningService;
-import com.ruoyi.system.service.TAppUserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.stereotype.Component;
-import org.springframework.util.CollectionUtils;
-import org.springframework.util.StringUtils;
-
-import java.time.LocalDate;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author xiaochen
- * @date 2025/10/11 8:39
- */
-@Component
-public class TaskUtil {
-
-    @Autowired
-    private RedisCache redisCache;
-    @Autowired
-    private TAppUserService appUserService;
-    @Autowired
-    private TAppUserPositioningService appUserPositioningService;
-
-    //每天0点30分执行
-    @Scheduled(cron = "0 30 0 * * ?")
-    public void dayOfSavePositioning() {
-        try {
-            // 获取前一天时间
-            LocalDate localDate = LocalDate.now().minusDays(1);
-            // 查询所有的用户
-            List<TAppUser> appUserList = appUserService.list(Wrappers.lambdaQuery(TAppUser.class)
-                    .eq(TAppUser::getState, 1)
-                    .eq(TAppUser::getState, 1));
-
-            List<TAppUserPositioning> appUserPositioningList = new ArrayList<>();
-
-            for (TAppUser appUser : appUserList) {
-                TAppUserPositioning appUserPositioning = new TAppUserPositioning();
-                // 获取定位
-                String location = redisCache.getCacheObject(Constants.LOCATION + appUser.getId() + ":" + localDate);
-                if(StringUtils.hasLength(location)){
-                    appUserPositioning.setAppUserId(appUser.getId());
-                    appUserPositioning.setUserLocation(location);
-                    appUserPositioning.setCreateTime(localDate.atStartOfDay());
-                    appUserPositioningList.add(appUserPositioning);
-                }
-            }
-            if(!CollectionUtils.isEmpty(appUserPositioningList)){
-                appUserPositioningService.saveBatch(appUserPositioningList);
-            }
-
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-
-}
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketAuthHandler.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketAuthHandler.java
index b475c5a..9d5a138 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketAuthHandler.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketAuthHandler.java
@@ -3,8 +3,6 @@
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.model.LoginUserApplet;
 import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.system.model.TAppUser;
-import com.ruoyi.system.service.TAppUserService;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.Jwts;
 import lombok.extern.slf4j.Slf4j;
@@ -23,9 +21,7 @@
 @Slf4j
 public class WebSocketAuthHandler {
 
-    @Autowired
-    private TAppUserService appUserService;
-    
+
     @Autowired
     private RedisCache redisCache;
     
@@ -33,48 +29,7 @@
     @Value("${token.secret}")
     private String secret;
 
-    /**
-     * 验证用户认证信息
-     * @param appUserId 用户ID
-     * @param token 认证令牌(可选)
-     * @return 认证结果
-     */
-    public AuthResult authenticateUser(String appUserId, String token) {
-        try {
-            if (appUserId == null || appUserId.trim().isEmpty()) {
-                return AuthResult.failure("用户ID不能为空");
-            }
 
-            // 查询用户信息
-            TAppUser appUser = appUserService.getById(appUserId);
-            if (appUser == null) {
-                return AuthResult.failure("用户不存在");
-            }
-
-            // 检查用户状态
-            if (appUser.getStatus() == null || appUser.getStatus() != 1) {
-                return AuthResult.failure("用户已被禁用");
-            }
-
-            // 检查用户审核状态
-            if (appUser.getState() == null || appUser.getState() != 1) {
-                return AuthResult.failure("用户未通过审核");
-            }
-
-            // 这里可以添加token验证逻辑
-            if (token != null && !token.trim().isEmpty()) {
-                // 验证token的有效性
-                if (!validateToken(appUserId, token)) {
-                    return AuthResult.failure("认证令牌无效");
-                }
-            }
-
-            return AuthResult.success(appUser);
-        } catch (Exception e) {
-            log.error("用户认证失败,用户ID: {}, 错误: {}", appUserId, e.getMessage(), e);
-            return AuthResult.failure("认证过程中发生错误: " + e.getMessage());
-        }
-    }
 
     /**
      * 验证token
@@ -165,40 +120,7 @@
         return com.ruoyi.common.constant.CacheConstants.LOGIN_TOKEN_KEY + uuid;
     }
 
-    /**
-     * 认证结果类
-     */
-    public static class AuthResult {
-        private final boolean success;
-        private final String message;
-        private final TAppUser appUser;
 
-        private AuthResult(boolean success, String message, TAppUser appUser) {
-            this.success = success;
-            this.message = message;
-            this.appUser = appUser;
-        }
-
-        public static AuthResult success(TAppUser appUser) {
-            return new AuthResult(true, "认证成功", appUser);
-        }
-
-        public static AuthResult failure(String message) {
-            return new AuthResult(false, message, null);
-        }
-
-        public boolean isSuccess() {
-            return success;
-        }
-
-        public String getMessage() {
-            return message;
-        }
-
-        public TAppUser getAppUser() {
-            return appUser;
-        }
-    }
 
     /**
      * 从认证消息中提取用户信息
diff --git a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketController.java b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketController.java
index e98ed3b..04b4fb6 100644
--- a/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketController.java
+++ b/ruoyi-applet/src/main/java/com/ruoyi/web/controller/webSocket/WebSocketController.java
@@ -3,7 +3,7 @@
 import com.alibaba.fastjson.JSONObject;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.system.model.TMissionReassign;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -38,7 +38,7 @@
      * @return 操作结果
      */
     @PostMapping("/user/send/{appUserId}")
-    @ApiOperation(value = "发送信息", response = TMissionReassign.class)
+    @ApiOperation(value = "发送信息")
     public R<String> sendMessageToUser(@PathVariable String appUserId, @RequestBody Map<String, String> request) {
         try {
             String message = JSONObject.toJSONString(request);
@@ -59,7 +59,7 @@
     }
 
     @GetMapping("/user/send1/{appUserId}")
-    @ApiOperation(value = "发送信息", response = TMissionReassign.class)
+    @ApiOperation(value = "发送信息")
     public R<String> sendMessageToUser1(@PathVariable String appUserId) {
         try {
             String message = "{\"type\":\"mission_push\",\"content\":\"{\\\"missionId\\\":\\\"1983875114637811713\\\"}\",\"timestamp\":\"2025-10-27T09:22:45.681\"}";
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 9e5ec91..927b447 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -112,11 +112,11 @@
                 .authorizeRequests()
                 // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                 .antMatchers("/getPrivacyAgreement/{agreementType}",
-                        "/applet/queryProtocolConfigByType","/api/loginApp",
+                        "/applet/queryProtocolConfigByType","/api/loginApp","/common/upload",
                         "/api/login","/api/middle-platform/login","/open/login","/applet/queryProtocolConfigByType",
                         "/register","/applet/getCode","/applet/loginCode",
                         "/applet/changepwd", "/captchaImage","/getCode","/loginCode",
-                        "/operations/getBySingleNum/**",
+                        "/operations/getBySingleNum/**","/api/**","/system/visitor/config/**",
                         "/user/getUserInfoByNumber/**","/open/t-app-user/test",
                         "/wxLogin/**","/cos/get/**","/t-mission/**","/api/t-app-user/**","/open/file/**","/open/t-data-statistics/**","/open/pushMessageSolo/**",
                         "/open/t-mission/sendMission","/open/websocket/**"
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index 980ebe7..9240a01 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -18,10 +18,9 @@
 import com.ruoyi.framework.manager.AsyncManager;
 import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.framework.security.context.AuthenticationContextHolder;
-import com.ruoyi.system.model.TAppUser;
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
-import com.ruoyi.system.service.TAppUserService;
+
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.authentication.AuthenticationManager;
@@ -57,8 +56,6 @@
     private ISysConfigService configService;
     @Autowired
     private SysPermissionService permissionService;
-    @Autowired
-    private TAppUserService appUserService;
 
     public LoginUser loginByTrustedUsername(String username, String loginSource, String middlePlatformToken)
     {
@@ -154,18 +151,7 @@
         }
         // 用户验证
         Authentication authentication = null;
-        // 用户验证
-        TAppUser appUser = appUserService.getOne(Wrappers.<TAppUser>lambdaQuery().eq(TAppUser::getAccount,account));
-        if (StringUtils.isNull(appUser)){
-            log.info("登录用户:{} 不存在.", account);
-            throw new ServiceException(MessageUtils.message("user.not.exists"));
-        } else if (appUser.getDisabled()) {
-            log.info("登录用户:{} 已被删除.", account);
-            throw new ServiceException(MessageUtils.message("user.password.delete"));
-        } else if (2 == appUser.getStatus()) {
-            log.info("登录用户:{} 已被停用.", account);
-            throw new ServiceException(MessageUtils.message("user.blocked"));
-        }
+
         try
         {
             String userName = account + "_2";
@@ -360,8 +346,6 @@
      */
     public void recordAppLoginInfo(String userId)
     {
-        TAppUser appUser = new TAppUser();
-        appUser.setId(userId);
 //        sysUser.setLoginIp(IpUtils.getIpAddr());
 //        sysUser.setLoginDate(DateUtils.getNowDate());
 //        userService.updateUserProfile(sysUser);
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
index 1d22d3f..f036470 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysPasswordService.java
@@ -11,7 +11,6 @@
 import com.ruoyi.framework.manager.AsyncManager;
 import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.framework.security.context.AuthenticationContextHolder;
-import com.ruoyi.system.model.TAppUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.core.Authentication;
@@ -80,45 +79,8 @@
             clearLoginRecordCache(username);
         }
     }
-    public void validateApp(TAppUser user)
-    {
-        Authentication usernamePasswordAuthenticationToken = AuthenticationContextHolder.getContext();
-        String username = usernamePasswordAuthenticationToken.getName();
-        String password = usernamePasswordAuthenticationToken.getCredentials().toString();
-
-        Integer retryCount = redisCache.getCacheObject(getCacheKey(username));
-
-        if (retryCount == null)
-        {
-            retryCount = 0;
-        }
-
-        if (retryCount >= Integer.valueOf(maxRetryCount).intValue())
-        {
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
-                    MessageUtils.message("user.password.retry.limit.exceed", maxRetryCount, lockTime)));
-            throw new UserPasswordRetryLimitExceedException(maxRetryCount, lockTime);
-        }
-
-        if (!matchesApp(user, password))
-        {
-            retryCount = retryCount + 1;
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL,
-                    MessageUtils.message("user.password.retry.limit.count", retryCount)));
-            redisCache.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
-            throw new UserPasswordNotMatchException();
-        }
-        else
-        {
-            clearLoginRecordCache(username);
-        }
-    }
 
     public boolean matches(SysUser user, String rawPassword)
-    {
-        return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
-    }
-    public boolean matchesApp(TAppUser user, String rawPassword)
     {
         return SecurityUtils.matchesPassword(rawPassword, user.getPassword());
     }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
index 60ed72e..a2a906f 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -9,9 +9,7 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.model.TAppUser;
 import com.ruoyi.system.service.ISysUserService;
-import com.ruoyi.system.service.TAppUserService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
@@ -34,9 +32,6 @@
     @Autowired
     private ISysUserService userService;
     @Autowired
-    private TAppUserService appUserService;
-
-    @Autowired
     private SysPasswordService passwordService;
 
     @Autowired
@@ -47,52 +42,27 @@
     {
         String[] split = username.split("_");
         username = split[0];
-        String type = split[1];
-        if("1".equals(type)){
-            SysUser user = userService.selectUserByUserName(username);
-            if (StringUtils.isNull(user))
-            {
-                log.info("登录用户:{} 不存在.", username);
-                throw new ServiceException(MessageUtils.message("user.not.exists"));
-            }
-            else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
-            {
-                log.info("登录用户:{} 已被删除.", username);
-                throw new ServiceException(MessageUtils.message("user.password.delete"));
-            }
-            else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-            {
-                log.info("登录用户:{} 已被停用.", username);
-                throw new ServiceException(MessageUtils.message("user.blocked"));
-            }
 
-            passwordService.validate(user);
-
-            return createLoginUser(user);
-        }else {
-            TAppUser user = appUserService.getOne(Wrappers.<TAppUser>lambdaQuery().eq(TAppUser::getAccount,username));
-            if (StringUtils.isNull(user))
-            {
-                log.info("登录用户:{} 不存在.", username);
-                throw new ServiceException(MessageUtils.message("user.not.exists"));
-            }
-            else if (user.getDisabled())
-            {
-                log.info("登录用户:{} 已被删除.", username);
-                throw new ServiceException(MessageUtils.message("user.password.delete"));
-            }
-            else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
-            {
-                log.info("登录用户:{} 已被停用.", username);
-                throw new ServiceException(MessageUtils.message("user.blocked"));
-            }
-            passwordService.validateApp(user);
-
-            TAppUserResp appUserResp = new TAppUserResp();
-            BeanUtils.copyProperties(user,appUserResp);
-
-            return createLoginUserApp(appUserResp);
+        SysUser user = userService.selectUserByUserName(username);
+        if (StringUtils.isNull(user))
+        {
+            log.info("登录用户:{} 不存在.", username);
+            throw new ServiceException(MessageUtils.message("user.not.exists"));
         }
+        else if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
+        {
+            log.info("登录用户:{} 已被删除.", username);
+            throw new ServiceException(MessageUtils.message("user.password.delete"));
+        }
+        else if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
+        {
+            log.info("登录用户:{} 已被停用.", username);
+            throw new ServiceException(MessageUtils.message("user.blocked"));
+        }
+
+        passwordService.validate(user);
+
+        return createLoginUser(user);
     }
 
     public UserDetails createLoginUser(SysUser user)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/domain/Employee.java b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Employee.java
new file mode 100644
index 0000000..bc909b2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/domain/Employee.java
@@ -0,0 +1,45 @@
+package com.ruoyi.system.domain;
+
+
+import java.time.LocalDateTime;
+import lombok.Data;
+
+/**
+ * 员工实体(对应 t_employee 表)
+ */
+@Data
+public class Employee {
+
+    private Long employeeId;
+
+    private Long deptId;
+
+    private String employeeName;
+
+    private String employeeNo;
+
+    private String contactPhoneCipher;
+
+    private String contactPhoneHash;
+
+    /** EMPLOYEE员工 / DEPT_MANAGER部门负责人 */
+    private String position;
+
+    /** 绑定卡号,可能为空 */
+    private String cardNo;
+
+    private String faceImage;
+
+    private Boolean enabled;
+
+    /** 0正常 1删除 */
+    private String delFlag;
+
+    private String createBy;
+
+    private LocalDateTime createTime;
+
+    private String updateBy;
+
+    private LocalDateTime updateTime;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/CardVerifyRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CardVerifyRequest.java
new file mode 100644
index 0000000..3cf2347
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/CardVerifyRequest.java
@@ -0,0 +1,22 @@
+package com.ruoyi.system.dto;
+
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 刷卡验证请求:
+ * employeeId 为业务上下文中已确定的"接待人"(如访客预约单/登记时选定的被访者);
+ * cardNo 为现场读卡器读取到的卡号原文。
+ */
+@Data
+@ApiModel(value = "CardVerifyRequest", description = "接待人刷卡验证请求")
+public class CardVerifyRequest {
+    @ApiModelProperty(value = "现场读卡器读取到的卡号原文", required = true, example = "0123456789")
+    @NotBlank(message = "卡号不能为空")
+    private String cardNo;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysDoorDeviceDetailRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysDoorDeviceDetailRequest.java
index c458947..99c52b3 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysDoorDeviceDetailRequest.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysDoorDeviceDetailRequest.java
@@ -3,6 +3,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
+
 /**
  * 门禁设备详情请求
  *
@@ -11,7 +13,10 @@
 @Data
 public class SysDoorDeviceDetailRequest
 {
-    /** 门禁设备主键 */
+    /**
+     * 门禁设备主键
+     */
     @ApiModelProperty("门禁设备主键")
+    @NotBlank(message = "设备ID不能为空")
     private Long doorId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorMachineDetailRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorMachineDetailRequest.java
index 8f462b0..3352022 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorMachineDetailRequest.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorMachineDetailRequest.java
@@ -3,6 +3,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * 访客机详情请求
  *
@@ -13,5 +15,6 @@
 {
     /** 访客机主键 */
     @ApiModelProperty("访客机主键")
+    @NotNull(message = "设备ID不能为空")
     private Long machineId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorRecordAddRequest.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorRecordAddRequest.java
new file mode 100644
index 0000000..39d97f3
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/SysVisitorRecordAddRequest.java
@@ -0,0 +1,86 @@
+package com.ruoyi.system.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+
+/**
+ * 访客登记
+ *
+ * @author ruoyi
+ */
+@Data
+@ApiModel(value = "SysVisitorRecordAddRequest", description = "访客登记")
+public class SysVisitorRecordAddRequest
+{
+    /**
+     * 访客姓名
+     */
+    @NotBlank(message = "访客姓名不能为空")
+    @ApiModelProperty(value = "访客姓名")
+    private String visitorName;
+
+    /**
+     * 访客身份证号
+     */
+    @NotBlank(message = "访客身份证号不能为空")
+    @ApiModelProperty(value = "访客身份证号")
+    private String idCard;
+
+    /**
+     * 被访人
+     */
+    @NotBlank(message = "被访人不能为空")
+    @ApiModelProperty(value = "被访人")
+    private String intervieweeName;
+
+    /**
+     * 接待人验证方式
+     */
+    @ApiModelProperty(value = "接待人验证方式")
+    private String receiverVerifyMethod;
+
+    /**
+     * 访问区域ID,英文逗号分隔
+     */
+    @ApiModelProperty(value = "访问区域ID,英文逗号分隔")
+    private String visitAreaIds;
+
+    /**
+     * 车牌号
+     */
+    @ApiModelProperty(value = "车牌号")
+    private String plateNo;
+
+    /**
+     * 来访事由
+     */
+    @ApiModelProperty(value = "来访事由")
+    private String visitReason;
+
+    /**
+     * 有效期开始时间
+     */
+    @ApiModelProperty(value = "有效期开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date validStartTime;
+
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty(value = "有效期结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date validEndTime;
+
+    /**
+     * 访客人像地址
+     */
+    @ApiModelProperty(value = "访客人像地址")
+    private String faceImageUrl;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/enums/VerifyResultEnum.java b/ruoyi-system/src/main/java/com/ruoyi/system/enums/VerifyResultEnum.java
new file mode 100644
index 0000000..7dc98a5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/enums/VerifyResultEnum.java
@@ -0,0 +1,32 @@
+package com.ruoyi.system.enums;
+
+
+/**
+ * 接待人刷卡验证结果码
+ */
+public enum VerifyResultEnum {
+
+    SUCCESS( "验证通过"),
+
+    PARAM_INVALID( "请求参数不合法"),
+
+    /** 不存在 / 已停用 / 已删除统一走这个码,避免向前端泄露具体是哪种情况 */
+    RECEPTIONIST_UNAVAILABLE( "接待人不存在或已停用"),
+
+    CARD_NOT_BOUND( "该接待人尚未绑定卡号,请联系管理员"),
+    CARD_NOT_MATCH( "卡号与接待人不匹配,请核实后重试"),
+
+    VERIFY_LOCKED( "验证失败次数过多,请稍后重试或联系前台"),
+
+    SYSTEM_ERROR( "系统繁忙,请稍后重试");
+
+    private final String message;
+
+    VerifyResultEnum(String message) {
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EmployeeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EmployeeMapper.java
new file mode 100644
index 0000000..90bb619
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/EmployeeMapper.java
@@ -0,0 +1,16 @@
+package com.ruoyi.system.mapper;
+
+
+import com.ruoyi.system.domain.Employee;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface EmployeeMapper {
+
+    /**
+     * 按主键查询启用且未删除的接待人。
+     * 若返回 null,说明该员工不存在 / 已停用 / 已删除中的某一种情况(SQL 层已合并过滤)。
+     */
+    Employee selectEnabledByCardNo(@Param("cardNo") String cardNo);
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysVisitorRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysVisitorRecordMapper.java
index 52ca8a4..6b3f50b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysVisitorRecordMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysVisitorRecordMapper.java
@@ -1,6 +1,8 @@
 package com.ruoyi.system.mapper;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.domain.SysVisitorRecord;
 import com.ruoyi.system.dto.SysVisitorRecordPageRequest;
 import com.ruoyi.system.vo.SysVisitorPassRecordVO;
 import com.ruoyi.system.vo.SysVisitorRecordDetailVO;
@@ -16,7 +18,7 @@
  * @author ruoyi
  */
 @Mapper
-public interface SysVisitorRecordMapper
+public interface SysVisitorRecordMapper extends BaseMapper<SysVisitorRecord>
 {
     public List<SysVisitorRecordVO> pageList(@Param("query") SysVisitorRecordPageRequest query,
                                              @Param("pageInfo") PageInfo<SysVisitorRecordVO> pageInfo);
@@ -26,4 +28,6 @@
     public List<SysVisitorPassRecordVO> selectPassRecordsByRecordId(Long recordId);
 
     public int deleteByIds(@Param("recordIds") List<Long> recordIds, @Param("updateBy") String updateBy);
+
+    public int insert(SysVisitorRecord record);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/EmployeeVerifyService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/EmployeeVerifyService.java
new file mode 100644
index 0000000..7b8be1e
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/EmployeeVerifyService.java
@@ -0,0 +1,13 @@
+package com.ruoyi.system.service;
+
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.dto.CardVerifyRequest;
+
+public interface EmployeeVerifyService {
+
+    /**
+     * 刷卡验证:比对现场读到的卡号与该接待人绑定的卡号是否一致。
+     */
+    AjaxResult verifyByCard(CardVerifyRequest request);
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDoorDeviceService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDoorDeviceService.java
index b8a9a2c..2f4daff 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDoorDeviceService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysDoorDeviceService.java
@@ -30,4 +30,5 @@
     public int logout(SysDoorDeviceLogoutRequest request, String username);
 
     public int delete(SysDoorDeviceDeleteRequest request, String username);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
index 063e8a5..4442789 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
@@ -7,7 +7,6 @@
 import com.ruoyi.common.core.domain.entity.SysMenu;
 import com.ruoyi.common.core.domain.entity.SysRole;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.dto.SysRoleDTO;
 import com.ruoyi.system.query.SysRoleQuery;
 
 /**
@@ -221,17 +220,7 @@
 
     String selectByUserId(Long user_id);
 
-    void saveRole(SysRoleDTO dto);
-
     PageInfo<SysRole> selectPageList(SysRoleQuery query);
-
-    /**
-     * 修改保存角色信息
-     *
-     * @param dto 角色信息
-     * @return 结果
-     */
-    public int editRole(SysRoleDTO dto);
 
     List<SysRole> selectRoleByUserIds(List<String> roleIds);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitAreaService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitAreaService.java
index 4504d33..0e45954 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitAreaService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitAreaService.java
@@ -25,4 +25,5 @@
     public int edit(SysVisitAreaEditRequest request, String username);
 
     public int delete(SysVisitAreaDeleteRequest request, String username);
+
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitorMachineService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitorMachineService.java
index f06f00d..3ad4208 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitorMachineService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/ISysVisitorMachineService.java
@@ -30,4 +30,20 @@
     public int logout(SysVisitorMachineLogoutRequest request, String username);
 
     public int delete(SysVisitorMachineDeleteRequest request, String username);
+
+    /**
+     * 激活设备
+     *
+     * @param deviceId 设备ID
+     * @return 影响行数
+     */
+    int activateDevice(Long deviceId);
+
+    /**
+     * 注销设备
+     *
+     * @param deviceId 设备ID
+     * @return 影响行数
+     */
+    int deactivateDevice(Long deviceId);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmployeeVerifyServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmployeeVerifyServiceImpl.java
new file mode 100644
index 0000000..8566e16
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/EmployeeVerifyServiceImpl.java
@@ -0,0 +1,62 @@
+package com.ruoyi.system.service.impl;
+
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.system.domain.Employee;
+import com.ruoyi.system.dto.CardVerifyRequest;
+import com.ruoyi.system.enums.VerifyResultEnum;
+import com.ruoyi.system.mapper.EmployeeMapper;
+import com.ruoyi.system.service.EmployeeVerifyService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class EmployeeVerifyServiceImpl implements EmployeeVerifyService {
+
+    private static final Logger log = LoggerFactory.getLogger(EmployeeVerifyServiceImpl.class);
+
+    @Resource
+    private EmployeeMapper employeeMapper;
+
+    // TODO: 注入验证日志Mapper / Redis,用于失败次数统计与锁定(见 recordAndReturn 方法说明)
+
+    @Override
+    public AjaxResult verifyByCard(CardVerifyRequest request) {
+        Employee employee = employeeMapper.selectEnabledByCardNo(request.getCardNo());
+
+        if (employee == null) {
+            return recordAndReturn(VerifyResultEnum.RECEPTIONIST_UNAVAILABLE);
+        }
+
+        String boundCardNo = employee.getCardNo();
+        if (boundCardNo == null || boundCardNo.trim().isEmpty()) {
+            return recordAndReturn(VerifyResultEnum.CARD_NOT_BOUND);
+        }
+
+        String inputCardNo = request.getCardNo() == null ? "" : request.getCardNo().trim();
+        if (!boundCardNo.trim().equalsIgnoreCase(inputCardNo)) {
+            return recordAndReturn(VerifyResultEnum.CARD_NOT_MATCH);
+        }
+
+        return recordAndReturn(VerifyResultEnum.SUCCESS);
+    }
+
+    /**
+     * 统一出口:记录验证流水(成功/失败均记录)并返回结果。
+     * TODO: 落库到 t_employee_verify_log(建表脚本见 sql/verify_log.sql),字段建议包含:
+     *       employee_id, result_code, client_ip, device_no, create_time。
+     * TODO: 结合 Redis 按 employeeId + 来源IP/设备号 做滑动窗口计数,连续失败N次后返回
+     *       VERIFY_LOCKED 并锁定一段时间,防止对某个接待人反复试卡的暴力破解/撞库。
+     */
+    private AjaxResult recordAndReturn(VerifyResultEnum result) {
+        if (VerifyResultEnum.SUCCESS.equals(result)) {
+            log.info("接待人刷卡验证成功");
+            return AjaxResult.success();
+        }
+        log.warn("接待人刷卡验证失败,  result={}", result.getMessage());
+        return AjaxResult.error(result.getMessage());
+    }
+}
+
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDoorDeviceServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDoorDeviceServiceImpl.java
index e0649c0..d8d792d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDoorDeviceServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDoorDeviceServiceImpl.java
@@ -18,8 +18,10 @@
 import com.ruoyi.system.vo.SysDoorDeviceVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
 
 /**
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
index c0ffaa0..5fd5682 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -12,7 +12,6 @@
 import com.ruoyi.system.domain.SysRoleDept;
 import com.ruoyi.system.domain.SysRoleMenu;
 import com.ruoyi.system.domain.SysUserRole;
-import com.ruoyi.system.dto.SysRoleDTO;
 import com.ruoyi.system.mapper.*;
 import com.ruoyi.system.query.SysRoleQuery;
 import com.ruoyi.system.service.ISysRoleService;
@@ -557,57 +556,11 @@
     }
 
     @Override
-    public void saveRole(SysRoleDTO dto) {
-        // 添加角色
-        SysRole sysRole = new SysRole();
-        sysRole.setRoleName(dto.getRoleName());
-        sysRole.setPostType(dto.getPostType());
-        sysRole.setRemark(dto.getRemark());
-        roleMapper.insertRole(sysRole);
-
-        // 添加角色权限中间表
-        List<Long> menuIds = dto.getMenuIds();
-        List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
-        for (Long menuId : menuIds) {
-            SysRoleMenu sysRoleMenu = new SysRoleMenu();
-            sysRoleMenu.setRoleId(sysRole.getRoleId());
-            sysRoleMenu.setMenuId(menuId);
-            sysRoleMenus.add(sysRoleMenu);
-        }
-        roleMenuMapper.batchRoleMenu(sysRoleMenus);
-    }
-
-    @Override
     public PageInfo<SysRole> selectPageList(SysRoleQuery query) {
         PageInfo<SysRole> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
         List<SysRole> list = roleMapper.selectPageList(query,pageInfo);
         pageInfo.setRecords(list);
         return pageInfo;
-    }
-
-    @Override
-    public int editRole(SysRoleDTO dto) {
-        // 修改角色信息
-        SysRole sysRole = new SysRole();
-        sysRole.setRoleId(dto.getRoleId());
-        sysRole.setRoleName(dto.getRoleName());
-        sysRole.setPostType(dto.getPostType());
-        sysRole.setRemark(dto.getRemark());
-        roleMapper.updateRole(sysRole);
-        // 删除角色与菜单关联
-        roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId());
-
-        // 添加角色权限中间表
-        List<Long> menuIds = dto.getMenuIds();
-        List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
-        for (Long menuId : menuIds) {
-            SysRoleMenu sysRoleMenu = new SysRoleMenu();
-            sysRoleMenu.setRoleId(dto.getRoleId());
-            sysRoleMenu.setMenuId(menuId);
-            sysRoleMenus.add(sysRoleMenu);
-        }
-
-        return roleMenuMapper.batchRoleMenu(sysRoleMenus);
     }
 
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitAreaServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitAreaServiceImpl.java
index c48da5c..810c3fa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitAreaServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitAreaServiceImpl.java
@@ -13,6 +13,7 @@
 import com.ruoyi.system.vo.SysVisitAreaVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
 import java.util.ArrayList;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorMachineServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorMachineServiceImpl.java
index c8133db..13b95f5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorMachineServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysVisitorMachineServiceImpl.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.domain.SysDoorDevice;
 import com.ruoyi.system.domain.SysVisitArea;
 import com.ruoyi.system.domain.SysVisitorMachine;
 import com.ruoyi.system.dto.SysVisitorMachineAddRequest;
@@ -18,8 +19,10 @@
 import com.ruoyi.system.vo.SysVisitorMachineVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -148,6 +151,57 @@
         return machine;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int activateDevice(Long deviceId) {
+        // 1. 根据deviceId查询设备
+        SysVisitorMachine device = visitorMachineMapper.selectById(deviceId);
+        if (device == null || device.getDelFlag().equals("1")) {
+            throw new ServiceException("设备不存在,请先添加设备");
+        }
+
+        // 2. 检查是否已激活
+        if ("ONLINE".equals(device.getOnlineStatus()) || "ACTIVATED".equals(device.getOnlineStatus())) {
+            throw new ServiceException("设备已激活,无需重复操作");
+        }
+
+        // 3. 检查设备是否启用
+        if (device.getEnabled() == null || !device.getEnabled()) {
+            throw new ServiceException("设备未启用,请先在后台启用设备");
+        }
+
+        // 4. 更新状态为激活/在线
+        SysVisitorMachine update = new SysVisitorMachine();
+        update.setMachineId(device.getMachineId());
+        update.setOnlineStatus("ONLINE");  // 或 "ACTIVATED",根据你的枚举定义
+        update.setUpdateTime(new Date());
+
+        return visitorMachineMapper.updateMachine(update);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deactivateDevice(Long deviceId) {
+        // 1. 根据deviceId查询设备
+        SysVisitorMachine device = visitorMachineMapper.selectById(deviceId);
+        if (device == null || device.getDelFlag().equals("1")) {
+            throw new ServiceException("设备不存在");
+        }
+
+        // 2. 检查是否已注销
+        if ("OFFLINE".equals(device.getOnlineStatus()) || "UNACTIVATED".equals(device.getOnlineStatus())) {
+            throw new ServiceException("设备已注销,无需重复操作");
+        }
+
+        // 3. 更新状态为离线/未激活
+        SysVisitorMachine update = new SysVisitorMachine();
+        update.setMachineId(deviceId);
+        update.setOnlineStatus("OFFLINE");  // 或 "UNACTIVATED"
+        update.setUpdateTime(new Date());
+
+        return visitorMachineMapper.updateMachine(update);
+    }
+
     private Long getRequiredAreaId(Long areaId)
     {
         if (areaId == null || areaId <= 0)
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/IndexLookDataVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/IndexLookDataVo.java
index 2f3ba2c..4c67e50 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/IndexLookDataVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/IndexLookDataVo.java
@@ -1,6 +1,5 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TMission;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -20,10 +19,6 @@
 
     @ApiModelProperty("一般任务数")
     private Integer regularMissionNum=0;
-
-
-    @ApiModelProperty("带指派任务")
-    private List<TMission> missions;
 
     @ApiModelProperty("用户信息")
     private List<IndexLookDataUserVo> userInfos;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/PositioningDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/PositioningDetailVO.java
index ad672c7..19112ea 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/PositioningDetailVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/PositioningDetailVO.java
@@ -1,13 +1,12 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TAppUser;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 @ApiModel(value = "人员分布轨迹详情PositioningDetailVO")
-public class PositioningDetailVO extends TAppUser {
+public class PositioningDetailVO {
 
     @ApiModelProperty(value = "轨迹")
     private String realTimePositioning;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitAreaVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitAreaVO.java
index 30bad35..9763f7f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitAreaVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitAreaVO.java
@@ -1,6 +1,7 @@
 package com.ruoyi.system.vo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -14,6 +15,7 @@
  * @author ruoyi
  */
 @Data
+@ApiModel(value = "SysVisitAreaVO", description = "访问区域")
 public class SysVisitAreaVO
 {
     /** 区域主键 */
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitorConfigVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitorConfigVO.java
index 5fa60af..ed559fa 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitorConfigVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/SysVisitorConfigVO.java
@@ -1,5 +1,7 @@
 package com.ruoyi.system.vo;
 
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.util.List;
@@ -10,35 +12,52 @@
  * @author ruoyi
  */
 @Data
+@ApiModel(value = "访客系统配置返回对象", description = "访客系统的全部配置信息")
 public class SysVisitorConfigVO
 {
+    @ApiModelProperty(value = "配置主键ID", example = "1")
     private Long configId;
 
+    @ApiModelProperty(value = "现场登记开关", example = "true", allowableValues = "true,false")
     private Boolean onsiteRegistrationEnabled;
 
+    @ApiModelProperty(value = "预约登记开关", example = "true", allowableValues = "true,false")
     private Boolean appointmentRegistrationEnabled;
 
+    @ApiModelProperty(value = "登记需接待人确认", example = "true", allowableValues = "true,false")
     private Boolean registerReceiverConfirmEnabled;
 
+    @ApiModelProperty(value = "签离需接待人确认", example = "true", allowableValues = "true,false")
     private Boolean signReceiverConfirmEnabled;
 
+    @ApiModelProperty(value = "人像对比开关", example = "true", allowableValues = "true,false")
     private Boolean faceCompareEnabled;
 
+    @ApiModelProperty(value = "全方位人脸采集开关", example = "true", allowableValues = "true,false")
     private Boolean faceCaptureEnabled;
 
+    @ApiModelProperty(value = "允许手动输入身份证", example = "true", allowableValues = "true,false")
     private Boolean manualIdCardEnabled;
 
+    @ApiModelProperty(value = "凭条打印字段列表(按顺序打印)",
+            example = "visitorName,idCard,appointmentTimeRange,interviewee   '凭条打印字段,英文逗号分隔并按顺序打印‘ ")
     private List<String> printFields;
 
+    @ApiModelProperty(value = "打印字段选项列表(前端展示用)")
     private List<PrintFieldOptionVO> printFieldOptions;
 
+    @ApiModelProperty(value = "系统名称", example = "自主访客登记管理平台")
     private String systemName;
 
+    @ApiModelProperty(value = "Logo图片地址", example = "https://example.com/logo.png")
     private String logoUrl;
 
+    @ApiModelProperty(value = "服务厂家", example = "科世达科技有限公司")
     private String serviceProvider;
 
+    @ApiModelProperty(value = "技术支持电话", example = "400-888-9999")
     private String supportPhone;
 
+    @ApiModelProperty(value = "访客机管理入口开关", example = "true", allowableValues = "true,false")
     private Boolean visitorMachineEntryEnabled;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java
index eeaa32d..77275cf 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserDetailVO.java
@@ -1,8 +1,5 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TAppUser;
-import com.ruoyi.system.model.TAppUserSkill;
-import com.ruoyi.system.model.TUserMajor;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -11,12 +8,6 @@
 
 @Data
 @ApiModel("人员管理详情TAppUserDetailVO")
-public class TAppUserDetailVO extends TAppUser {
-
-    @ApiModelProperty(value = "用户专业")
-    private List<TUserMajor> userMajors;
-
-    @ApiModelProperty(value = "用户职业技能")
-    private TAppUserSkill appUserSkill;
+public class TAppUserDetailVO {
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserPageVo.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserPageVo.java
index e54ad88..47032ea 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserPageVo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TAppUserPageVo.java
@@ -1,13 +1,12 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TAppUser;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 @ApiModel("人员管理Vo")
-public class TAppUserPageVo extends TAppUser {
+public class TAppUserPageVo  {
     @ApiModelProperty(value = "分队名称")
     private String teamName;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionAssignRuleVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionAssignRuleVO.java
index 8da3d3e..ccd9a32 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionAssignRuleVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionAssignRuleVO.java
@@ -1,7 +1,5 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TMissionAssignRule;
-import com.ruoyi.system.model.TMissionAssignRuleIndicator;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -10,9 +8,6 @@
 
 @Data
 @ApiModel(value = "TMissionAssignRuleVO对象", description = "任务指派规则视图对象")
-public class TMissionAssignRuleVO extends TMissionAssignRule {
-
-    @ApiModelProperty(value = "任务指派指标列表")
-    private List<TMissionAssignRuleIndicator> missionAssignRuleIndicators;
+public class TMissionAssignRuleVO {
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionReassignVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionReassignVO.java
index 08d63f5..b1d0828 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionReassignVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionReassignVO.java
@@ -1,13 +1,12 @@
 package com.ruoyi.system.vo;
 
-import com.ruoyi.system.model.TMissionReassign;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 @ApiModel(value = "任务支援、改派TMissionReassignVO")
-public class TMissionReassignVO extends TMissionReassign {
+public class TMissionReassignVO  {
 
     @ApiModelProperty(value = "负责人")
     private String chargePerson;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionVO.java
index 0566a33..38b06cb 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/TMissionVO.java
@@ -1,9 +1,5 @@
 package com.ruoyi.system.vo;
 
-
-import com.ruoyi.system.model.TAppUser;
-import com.ruoyi.system.model.TMission;
-import com.ruoyi.system.model.TMissionOperation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -12,7 +8,7 @@
 
 @Data
 @ApiModel(value = "任务管理对象TMissionVO")
-public class TMissionVO extends TMission {
+public class TMissionVO  {
 
     @ApiModelProperty(value = "负责人")
     private String chargePerson;
@@ -26,10 +22,5 @@
     @ApiModelProperty(value = "完成时间差")
     private Double finishTimePoor;
 
-    @ApiModelProperty(value = "任务人员")
-    private List<TAppUser> appUsers;
-
-    @ApiModelProperty(value = "任务操作记录")
-    private List<TMissionOperation> missionOperations;
 
 }
diff --git a/ruoyi-system/src/main/resources/mapper/system/EmployeeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/EmployeeMapper.xml
new file mode 100644
index 0000000..e113be1
--- /dev/null
+++ b/ruoyi-system/src/main/resources/mapper/system/EmployeeMapper.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.EmployeeMapper">
+
+    <resultMap id="BaseResultMap" type="com.ruoyi.system.domain.Employee">
+        <id column="employee_id" property="employeeId"/>
+        <result column="dept_id" property="deptId"/>
+        <result column="employee_name" property="employeeName"/>
+        <result column="employee_no" property="employeeNo"/>
+        <result column="contact_phone_cipher" property="contactPhoneCipher"/>
+        <result column="contact_phone_hash" property="contactPhoneHash"/>
+        <result column="position" property="position"/>
+        <result column="card_no" property="cardNo"/>
+        <result column="face_image" property="faceImage"/>
+        <result column="enabled" property="enabled"/>
+        <result column="del_flag" property="delFlag"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
+    </resultMap>
+
+    <!-- 人脸图片不参与本接口逻辑,且 longtext 体积较大,列表中排除,减少不必要的数据传输 -->
+    <sql id="Base_Column_List">
+        employee_id, dept_id, employee_name, employee_no, contact_phone_cipher,
+        contact_phone_hash, `position`, card_no, enabled, del_flag,
+        create_by, create_time, update_by, update_time
+    </sql>
+
+    <select id="selectEnabledByCardNo" resultMap="BaseResultMap">
+        SELECT
+        <include refid="Base_Column_List"/>
+        FROM t_employee
+        WHERE card_no = #{cardNo}
+        AND enabled = 1
+        AND del_flag = '0'
+    </select>
+
+</mapper>
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/SysVisitorRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysVisitorRecordMapper.xml
index 567d2be..659754e 100644
--- a/ruoyi-system/src/main/resources/mapper/system/SysVisitorRecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/SysVisitorRecordMapper.xml
@@ -152,4 +152,49 @@
             #{recordId}
         </foreach>
     </update>
+
+    <insert id="insert"
+            parameterType="com.ruoyi.system.domain.SysVisitorRecord"
+            useGeneratedKeys="true"
+            keyProperty="recordId">
+        insert into t_visitor_record
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="registerNo != null">register_no,</if>
+            <if test="visitorName != null">visitor_name,</if>
+            <if test="idCard != null">id_card,</if>
+            <if test="registerType != null">register_type,</if>
+            <if test="intervieweeName != null">interviewee_name,</if>
+            <if test="receiverVerifyMethod != null">receiver_verify_method,</if>
+            <if test="visitAreaIds != null">visit_area_ids,</if>
+            <if test="plateNo != null">plate_no,</if>
+            <if test="visitReason != null">visit_reason,</if>
+            <if test="validStartTime != null">valid_start_time,</if>
+            <if test="validEndTime != null">valid_end_time,</if>
+            <if test="status != null">status,</if>
+            <if test="registerTime != null">register_time,</if>
+            <if test="faceImageUrl != null">face_image_url,</if>
+            <if test="delFlag != null">del_flag,</if>
+            create_time
+        </trim>
+        values
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="registerNo != null">#{registerNo},</if>
+            <if test="visitorName != null">#{visitorName},</if>
+            <if test="idCard != null">#{idCard},</if>
+            <if test="registerType != null">#{registerType},</if>
+            <if test="intervieweeName != null">#{intervieweeName},</if>
+            <if test="receiverVerifyMethod != null">#{receiverVerifyMethod},</if>
+            <if test="visitAreaIds != null">#{visitAreaIds},</if>
+            <if test="plateNo != null">#{plateNo},</if>
+            <if test="visitReason != null">#{visitReason},</if>
+            <if test="validStartTime != null">#{validStartTime},</if>
+            <if test="validEndTime != null">#{validEndTime},</if>
+            <if test="status != null">#{status},</if>
+            <if test="registerTime != null">#{registerTime},</if>
+            <if test="faceImageUrl != null">#{faceImageUrl},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            now()
+        </trim>
+
+    </insert>
 </mapper>

--
Gitblit v1.7.1