From edccaca25b8b6bdb582c60cbd2983bc05a4e1ff3 Mon Sep 17 00:00:00 2001
From: liujie <1793218484@qq.com>
Date: 星期一, 13 七月 2026 09:42:57 +0800
Subject: [PATCH] update

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysEmployeeController.java |  148 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 147 insertions(+), 1 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysEmployeeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysEmployeeController.java
index a96b684..5581d0c 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysEmployeeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/SysEmployeeController.java
@@ -17,6 +17,7 @@
 import com.ruoyi.system.dto.SysEmployeeUnbindRequest;
 import com.ruoyi.system.mapper.SysDoorDeviceMapper;
 import com.ruoyi.system.service.ISysEmployeeService;
+import com.ruoyi.system.vo.SysEmployeeVO;
 import com.ruoyi.web.controller.tool.HikvisionAccessControlApi;
 import com.ruoyi.web.controller.tool.MiddlePlatformDataQuery;
 import org.apache.poi.ss.usermodel.Cell;
@@ -40,9 +41,11 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 员工管理接口
@@ -177,7 +180,11 @@
     @PostMapping("/delete")
     public AjaxResult delete(@RequestBody SysEmployeeDeleteRequest request)
     {
-        return toAjax(employeeService.delete(request, getUsername()));
+        List<SysEmployeeVO> employees = loadDeleteEmployees(request);
+        Map<String, Object> hikvisionDelete = deleteEmployeesFromHikvision(employees);
+        AjaxResult ajax = toAjax(employeeService.delete(request, getUsername()));
+        ajax.put("hikvisionDelete", hikvisionDelete);
+        return ajax;
     }
 
     /**
@@ -232,6 +239,133 @@
     /**
      * 目的:中台查询异常时返回统一业务错误,避免异常栈直接暴露给前端。
      */
+    private List<SysEmployeeVO> loadDeleteEmployees(SysEmployeeDeleteRequest request)
+    {
+        if (request == null || request.getEmployeeIds() == null || request.getEmployeeIds().isEmpty())
+        {
+            throw new ServiceException("请选择员工");
+        }
+
+        List<SysEmployeeVO> employees = new ArrayList<SysEmployeeVO>();
+        Set<Long> uniqueEmployeeIds = new HashSet<Long>();
+        for (Long employeeId : request.getEmployeeIds())
+        {
+            if (employeeId == null || employeeId <= 0)
+            {
+                throw new ServiceException("员工主键不能为空");
+            }
+            if (!uniqueEmployeeIds.add(employeeId))
+            {
+                continue;
+            }
+            SysEmployeeDetailRequest detailRequest = new SysEmployeeDetailRequest();
+            detailRequest.setEmployeeId(employeeId);
+            employees.add(employeeService.detail(detailRequest));
+        }
+        return employees;
+    }
+
+    private Map<String, Object> deleteEmployeesFromHikvision(List<SysEmployeeVO> employees)
+    {
+        Map<String, Object> result = new LinkedHashMap<String, Object>();
+        result.put("employees", employees.size());
+
+        List<SysDoorDevice> devices = doorDeviceMapper.selectEnabledHikvisionDevices();
+        result.put("total", devices.size());
+        if (devices.isEmpty())
+        {
+            result.put("status", "skipped");
+            result.put("message", "未配置启用的海康门禁设备");
+            return result;
+        }
+
+        String username = readHikvisionConfig("hikvision.access.username", "HIKVISION_ACCESS_USERNAME", "admin");
+        String password = readHikvisionConfig("hikvision.access.password", "HIKVISION_ACCESS_PASSWORD", "");
+        if (StringUtils.isEmpty(password))
+        {
+            result.put("status", "skipped");
+            result.put("message", "未配置海康门禁设备密码");
+            handleHikvisionDeleteFailure(result);
+            return result;
+        }
+
+        List<Map<String, Object>> records = new ArrayList<Map<String, Object>>();
+        int successCount = 0;
+        int totalCount = devices.size() * employees.size();
+        for (SysDoorDevice device : devices)
+        {
+            for (SysEmployeeVO employee : employees)
+            {
+                Map<String, Object> record = deleteEmployeeFromHikvisionDevice(device, employee, username, password);
+                records.add(record);
+                if (Boolean.TRUE.equals(record.get("success")))
+                {
+                    successCount++;
+                }
+            }
+        }
+        result.put("success", successCount);
+        result.put("failed", totalCount - successCount);
+        result.put("records", records);
+        result.put("status", successCount == totalCount ? "success" : (successCount == 0 ? "failed" : "partial"));
+        handleHikvisionDeleteFailure(result);
+        return result;
+    }
+
+    private Map<String, Object> deleteEmployeeFromHikvisionDevice(SysDoorDevice device, SysEmployeeVO employee,
+                                                                  String username, String password)
+    {
+        Map<String, Object> record = new LinkedHashMap<String, Object>();
+        record.put("doorId", device.getDoorId());
+        record.put("deviceName", device.getDeviceName());
+        record.put("deviceId", device.getDeviceId());
+        record.put("employeeId", employee.getEmployeeId());
+        record.put("employeeNo", employee.getEmployeeNo());
+        record.put("cardNo", employee.getCardNo());
+        try
+        {
+            HikvisionAccessControlApi.DeviceConfig deviceConfig = HikvisionAccessControlApi.DeviceConfig
+                    .http(device.getDeviceId(), username, password);
+            deviceConfig.setPort(readHikvisionIntConfig("hikvision.access.port", "HIKVISION_ACCESS_PORT", 80));
+            deviceConfig.setHttps(readHikvisionBooleanConfig("hikvision.access.https", "HIKVISION_ACCESS_HTTPS", false));
+
+            HikvisionAccessControlApi.DeleteResult deleteResult = HikvisionAccessControlApi.deleteEmployee(
+                    deviceConfig, buildHikvisionDeleteEmployee(employee));
+            boolean success = isHikvisionDeleteSuccess(deleteResult);
+            record.put("success", success);
+            record.put("result", deleteResult);
+            if (!success)
+            {
+                record.put("message", "海康门禁员工删除部分失败");
+            }
+        }
+        catch (Exception e)
+        {
+            record.put("success", false);
+            record.put("message", e.getMessage());
+        }
+        return record;
+    }
+
+    private HikvisionAccessControlApi.EmployeeCredential buildHikvisionDeleteEmployee(SysEmployeeVO employee)
+    {
+        return HikvisionAccessControlApi.EmployeeCredential.of(
+                employee.getEmployeeNo(), employee.getEmployeeName(), employee.getCardNo());
+    }
+
+    private boolean isHikvisionDeleteSuccess(HikvisionAccessControlApi.DeleteResult result)
+    {
+        return result != null
+                && isHikvisionResultSuccess(result.getUserInfo())
+                && isHikvisionResultSuccess(result.getCard())
+                && isHikvisionResultSuccess(result.getFace());
+    }
+
+    private boolean isHikvisionResultSuccess(HikvisionAccessControlApi.HikvisionResult result)
+    {
+        return result == null || result.isSuccess();
+    }
+
     private Map<String, Object> issueEmployeeToHikvision(SysEmployeeAddRequest request)
     {
         Map<String, Object> result = new LinkedHashMap<String, Object>();
@@ -428,6 +562,18 @@
         }
     }
 
+    private void handleHikvisionDeleteFailure(Map<String, Object> result)
+    {
+        if (!readHikvisionBooleanConfig("hikvision.access.fail-on-error", "HIKVISION_ACCESS_FAIL_ON_ERROR", false))
+        {
+            return;
+        }
+        if ("failed".equals(result.get("status")) || "partial".equals(result.get("status")))
+        {
+            throw new ServiceException("海康门禁员工删除失败");
+        }
+    }
+
     private AjaxResult middlePlatformError(IOException e)
     {
         return error("中台数据查询失败:" + e.getMessage());

--
Gitblit v1.7.1