浏览代码

Merge remote-tracking branch 'origin/master'

zishang 1 天之前
父节点
当前提交
de94f8f50a
共有 47 个文件被更改,包括 743 次插入179 次删除
  1. 11 0
      supervision-admin/src/main/java/com/supervision/web/carGateManage/controller/VehicleAccessRecordController.java
  2. 17 18
      supervision-admin/src/main/java/com/supervision/web/carGateManage/entity/VehicleAccessRecord.java
  3. 2 1
      supervision-admin/src/main/java/com/supervision/web/carGateManage/mapper/VehicleAccessRecordMapper.java
  4. 1 1
      supervision-admin/src/main/java/com/supervision/web/carGateManage/service/Impl/VehicleAccessRecordServiceImpl.java
  5. 1 0
      supervision-admin/src/main/java/com/supervision/web/carGateManage/service/VehicleAccessRecordService.java
  6. 2 2
      supervision-admin/src/main/java/com/supervision/web/controller/combatduty/BdglGrassdutyController.java
  7. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglArmamentController.java
  8. 2 2
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglDiaryController.java
  9. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglEquipController.java
  10. 3 3
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglEvenController.java
  11. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglFileManagementController.java
  12. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglFoodController.java
  13. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglMeetingController.java
  14. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglPartyController.java
  15. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglPublicPropertyController.java
  16. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglSecrecyController.java
  17. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglSoldierController.java
  18. 2 2
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/CommonsController.java
  19. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/PersonnelRosterController.java
  20. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/peopleChuRu/BdglLeaveOneController.java
  21. 67 0
      supervision-admin/src/main/java/com/supervision/web/controller/safety/SafetyController.java
  22. 2 2
      supervision-admin/src/main/java/com/supervision/web/controller/workingArrangements/BdglPlanTaskController.java
  23. 1 1
      supervision-admin/src/main/java/com/supervision/web/controller/workingArrangements/BdglWorkTaskController.java
  24. 1 0
      supervision-admin/src/main/java/com/supervision/web/noticeManage/entity/Notice.java
  25. 122 46
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/controller/DeviceManageController.java
  26. 22 30
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/controller/PersonAccessRecordController.java
  27. 2 2
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/entity/Device.java
  28. 35 2
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/entity/PersonAccessRecord.java
  29. 8 13
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/mapper/PersonAccessRecordMapper.java
  30. 9 5
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/service/PersonAccessRecordService.java
  31. 35 13
      supervision-admin/src/main/java/com/supervision/web/peopleGateManage/service/impl/PersonAccessRecordServiceImpl.java
  32. 7 1
      supervision-admin/src/main/resources/mapper/carGateManage/VehicleAccessRecordMapper.xml
  33. 5 3
      supervision-admin/src/main/resources/mapper/peopleGateManage/DeviceMapper.xml
  34. 20 21
      supervision-admin/src/main/resources/mapper/peopleGateManage/PersonAccessRecordMapper.xml
  35. 2 0
      supervision-system/src/main/java/com/supervision/peopleManage/service/impl/BdglPeopleServiceImpl.java
  36. 14 0
      supervision-system/src/main/java/com/supervision/safety/domain/CreateIssueReq.java
  37. 13 0
      supervision-system/src/main/java/com/supervision/safety/domain/DashboardVo.java
  38. 5 0
      supervision-system/src/main/java/com/supervision/safety/domain/IssueStatus.java
  39. 17 0
      supervision-system/src/main/java/com/supervision/safety/domain/PageResult.java
  40. 5 0
      supervision-system/src/main/java/com/supervision/safety/domain/RiskLevel.java
  41. 17 0
      supervision-system/src/main/java/com/supervision/safety/domain/SafetyIssue.java
  42. 10 0
      supervision-system/src/main/java/com/supervision/safety/domain/UpdateStatusReq.java
  43. 90 0
      supervision-system/src/main/java/com/supervision/safety/mapper/SafetyIssueMapper.java
  44. 49 0
      supervision-system/src/main/java/com/supervision/safety/mapper/SafetyIssueSqlProvider.java
  45. 29 0
      supervision-system/src/main/java/com/supervision/safety/service/SafetyService.java
  46. 102 0
      supervision-system/src/main/java/com/supervision/safety/service/impl/SafetyServiceImpl.java
  47. 2 0
      supervision-system/src/main/resources/mapper/grassrootsregistration/BdglStatisticsMapper.xml

+ 11 - 0
supervision-admin/src/main/java/com/supervision/web/carGateManage/controller/VehicleAccessRecordController.java

@@ -56,4 +56,15 @@ public class VehicleAccessRecordController {
         result.put("msg", success ? "删除成功" : "删除失败");
         return result;
     }
+
+    @PostMapping("/batchDelete")
+    public Map<String, Object> batchDelete(@RequestBody Map<String, Object> params) {
+        @SuppressWarnings("unchecked")
+        List<Long> ids = (List<Long>) params.get("ids");
+        boolean success = vehicleAccessRecordService.batchDelete(ids);
+        Map<String,Object> map = new HashMap<>();
+        map.put("success", success);
+        map.put("msg", success ? "批量删除成功" : "批量删除失败");
+        return map;
+    }
 }

+ 17 - 18
supervision-admin/src/main/java/com/supervision/web/carGateManage/entity/VehicleAccessRecord.java

@@ -1,46 +1,45 @@
 package com.supervision.web.carGateManage.entity;
 
-
 import lombok.Data;
-
 import java.util.Date;
 
 /**
  * 车辆进出记录实体类
- * 用于记录海康威视车牌识别设备上报的车辆进出事件
- * 对应前端“车辆进出记录”表格展示
+ * 用于记录海康威视车牌识别设备上报的车辆进出事件
+ * 对应前端“车辆进出记录”表格展示
  */
 @Data
 public class VehicleAccessRecord {
 
-    /** 主键ID,自增 */
+    /** 主键ID,自增,用于唯一标识一条车辆通行记录 */
     private Long id;
 
-    /** 车牌号,例如 "粤A12345" */
-    private String plateNumber;
-
-    /** 设备ID,对应设备表中的主键,用于区分来源设备 */
+    /** 设备ID,对应设备表中的主键,用于区分来源设备(哪台车牌识别一体机) */
     private Long deviceId;
 
+    /** 车牌号,例如 "粤A12345",用于识别车辆身份 */
+    private String plateNumber;
+
     /**
-     * 事件类型
-     * in:进场(车辆进入)
-     * out:出场(车辆离开)
+     * 事件类型:
+     *  - "in":进场(车辆进入)
+     *  - "out":出场(车辆离开)
+     * 具体值取决于设备上报的事件类型编码。
      */
     private String eventType;
 
-    /** 抓拍时间,表示车辆被识别的具体时间 */
+    /** 抓拍时间,表示车辆被识别的具体时间 */
     private Date captureTime;
 
-    /** 抓拍图片URL,用于展示车辆进出时的照片 */
+    /** 抓拍图片URL,保存车辆进出时的图片路径(用于前端展示) */
     private String photoUrl;
 
-    /** 备注信息,例如识别异常说明或人工补录原因 */
+    /** 备注信息,例如“识别异常”、“人工补录”、“遮挡车牌”等说明 */
     private String remark;
 
-    /** 记录创建时间(系统插入数据库的时间) */
+    /** 记录创建时间(系统插入数据库时自动生成) */
     private Date createTime;
 
-    /** 记录最后更新时间(系统修改记录时自动更新) */
+    /** 记录最后更新时间(系统更新时自动刷新) */
     private Date updateTime;
-}
+}

+ 2 - 1
supervision-admin/src/main/java/com/supervision/web/carGateManage/mapper/VehicleAccessRecordMapper.java

@@ -8,6 +8,7 @@ import java.util.List;
 
 @Mapper
 public interface VehicleAccessRecordMapper {
+
     List<VehicleAccessRecord> getList(@Param("deviceId") Long deviceId,
                                       @Param("plateNumber") String plateNumber,
                                       @Param("eventType") String eventType,
@@ -20,6 +21,6 @@ public interface VehicleAccessRecordMapper {
 
     int deleteById(Long id);
 
-    int deleteBatch(@Param("ids") List<Long> ids);
+    int batchDelete(@Param("ids") List<Long> ids);
 }
 

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/carGateManage/service/Impl/VehicleAccessRecordServiceImpl.java

@@ -58,6 +58,6 @@ public class VehicleAccessRecordServiceImpl implements VehicleAccessRecordServic
 
     @Override
     public boolean batchDelete(List<Long> ids) {
-        return vehicleAccessRecordMapper.deleteBatch(ids) > 0;
+        return vehicleAccessRecordMapper.batchDelete(ids) > 0;
     }
 }

+ 1 - 0
supervision-admin/src/main/java/com/supervision/web/carGateManage/service/VehicleAccessRecordService.java

@@ -7,6 +7,7 @@ import java.util.List;
 import java.util.Map;
 
 public interface VehicleAccessRecordService {
+
     PageInfo<VehicleAccessRecord> getList(Map<String, Object> params);
 
     boolean add(VehicleAccessRecord record);

+ 2 - 2
supervision-admin/src/main/java/com/supervision/web/controller/combatduty/BdglGrassdutyController.java

@@ -71,10 +71,10 @@ public class BdglGrassdutyController extends BaseController {
         boolean falg=false;
         boolean falg1=false;
         for (String string : strings) {
-            if("user_admin".equals(string)){
+            if("admin".equals(string)){
                 falg1=true;
                 break;
-            } else if (!"user_admin".equals(string)) {
+            } else if (!"admin".equals(string)) {
                 if(sysDept!=null&&sysDept.getAncestors()!=null){
                     falg = isFalg(sysDept, loginUser, falg);
                 }

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglArmamentController.java

@@ -50,7 +50,7 @@ public class BdglArmamentController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglArmament.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 2 - 2
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglDiaryController.java

@@ -78,7 +78,7 @@ public class BdglDiaryController extends BaseController {
         String role = "";
         if (sysRoles != null) {
             for (SysRole sysRole : sysRoles) {
-                if (sysRole.getRoleKey().equals("user_admin")||sysRole.getRoleKey().equals("special_registration")) {
+                if (sysRole.getRoleKey().equals("admin")||sysRole.getRoleKey().equals("special_registration")) {
                     role = sysRole.getRoleKey();
                     break;
                 }
@@ -91,7 +91,7 @@ public class BdglDiaryController extends BaseController {
         if (bdglDiary.getDiaryTime() == null && bdglDiary.getUnitId() == null) {
             bdglDiary.setDiaryTime(format);
         }
-        if (!role.equals("user_admin")&&!role.equals("special_registration")) {
+        if (!role.equals("admin")&&!role.equals("special_registration")) {
             bdglDiary.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglEquipController.java

@@ -61,7 +61,7 @@ public class BdglEquipController extends BaseController {
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if (!role.equals("user_admin")) {
+        if (!role.equals("admin")) {
             bdglEquip.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 3 - 3
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglEvenController.java

@@ -69,14 +69,14 @@ public class BdglEvenController extends BaseController
         String role="";
         if(sysRoles!=null){
             for (SysRole sysRole : sysRoles) {
-                if(sysRole.getRoleKey().equals("user_admin")){
+                if(sysRole.getRoleKey().equals("admin")){
                     role=sysRole.getRoleKey();
                     break;
                 }
             }
         }
-        boolean user_admin = role.equals("user_admin");
-        if(sysUser.getUserName().equals("admin")||role.equals("user_admin")){
+        boolean admin = role.equals("admin");
+        if(sysUser.getUserName().equals("admin")||role.equals("admin")){
 
         }else{
             bdglEven.setUnitId(Integer.parseInt(loginUser.getDeptId().toString())  );

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglFileManagementController.java

@@ -53,7 +53,7 @@ public class BdglFileManagementController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglFileManagement.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglFoodController.java

@@ -51,7 +51,7 @@ public class BdglFoodController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglFood.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglMeetingController.java

@@ -58,7 +58,7 @@ public class BdglMeetingController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglMeeting.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglPartyController.java

@@ -60,7 +60,7 @@ public class BdglPartyController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglParty.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglPublicPropertyController.java

@@ -51,7 +51,7 @@ public class BdglPublicPropertyController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglPublicProperty.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglSecrecyController.java

@@ -50,7 +50,7 @@ public class BdglSecrecyController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglSecrecy.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/BdglSoldierController.java

@@ -59,7 +59,7 @@ public class BdglSoldierController extends BaseController
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglSoldier.setUnitId(Integer.parseInt(loginUser.getDeptId().toString()));
         }
         startPage();

+ 2 - 2
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/CommonsController.java

@@ -72,14 +72,14 @@ public class CommonsController extends BaseController {
         String role="";
         if(sysRoles!=null){
             for (SysRole sysRole : sysRoles) {
-                if(sysRole.getRoleKey().equals("user_admin")||sysRole.getRoleKey().equals("baomi")||sysRole.getRoleKey().equals("CLSPR")){
+                if(sysRole.getRoleKey().equals("admin")||sysRole.getRoleKey().equals("baomi")||sysRole.getRoleKey().equals("CLSPR")){
                     role=sysRole.getRoleKey();
                     break;
                 }
             }
         }
         List<SysDept> sysDepts1=new ArrayList<>();
-        if(sysUser.getUserName().equals("admin")||type!=null||role.equals("user_admin")||role.equals("baomi")||role.equals("CLSPR")){
+        if(sysUser.getUserName().equals("admin")||type!=null||role.equals("admin")||role.equals("baomi")||role.equals("CLSPR")){
             SysDept sysDept = new SysDept();
             List<SysDept> sysDepts = sysDeptService.selectDeptLists(sysDept);
 //            for (SysDept dept : sysDepts) {

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/grassrootsregistration/PersonnelRosterController.java

@@ -49,7 +49,7 @@ public class PersonnelRosterController extends BaseController {
         List<SysRole> sysRoles = userMapper.selectRole(loginUser.getUserId());
         String role = CommonsController.getRole(sysRoles);
         //判断当前角色是否是最高权限   不是返回当前部门数据
-        if(!role.equals("user_admin")){
+        if(!role.equals("admin")){
             bdglPeople.setDeptId(loginUser.getDeptId());
         }
         startPage();

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/peopleChuRu/BdglLeaveOneController.java

@@ -60,7 +60,7 @@ public class BdglLeaveOneController extends BaseController
         List<String> roleKeylist = iSysUserService.selectUserRoleKey(getUserId());
         boolean userAdmin = true;
         for (String role : roleKeylist) {
-            if ("user_admin".equals(role)) {
+            if ("admin".equals(role)) {
                 userAdmin = false;
                 break;
             }

+ 67 - 0
supervision-admin/src/main/java/com/supervision/web/controller/safety/SafetyController.java

@@ -0,0 +1,67 @@
+package com.supervision.web.controller.safety;
+
+import com.supervision.safety.domain.*;
+import com.supervision.safety.service.SafetyService;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@RestController
+@RequestMapping("/api/safety")
+public class SafetyController {
+
+    @Resource
+    private SafetyService safetyService;
+
+    // 台账列表(分页 + 条件)
+    @GetMapping("/issues")
+    public PageResult<SafetyIssue> issues(
+            @RequestParam(required = false) String keyword,
+            @RequestParam(required = false) RiskLevel level,
+            @RequestParam(required = false) IssueStatus status,
+            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date from,
+            @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date to,
+            @RequestParam(defaultValue = "1") int pageNum,
+            @RequestParam(defaultValue = "10") int pageSize
+    ) {
+        return safetyService.search(keyword, level, status, from, to, pageNum, pageSize);
+    }
+
+    // 录入问题
+    @PostMapping("/issues")
+    public Map<String, Object> create(@Validated @RequestBody CreateIssueReq req) {
+        Long id = safetyService.createIssue(req);
+        Map<String, Object> ret = new HashMap<>();
+        ret.put("success", true);
+        ret.put("issueId", id);
+        return ret;
+    }
+
+    // 标记状态(已整改/未整改)
+    @PutMapping("/issues/{id}/status")
+    public Map<String, Object> updateStatus(@PathVariable Long id,
+                                            @RequestBody @Validated UpdateStatusReq req) {
+        safetyService.updateIssueStatus(id, req.getStatus());
+        return Collections.singletonMap("success", true);
+    }
+
+    // 删除(逻辑删除)
+    @DeleteMapping("/issues/{id}")
+    public Map<String, Object> delete(@PathVariable Long id) {
+        safetyService.deleteIssue(id);
+        return Collections.singletonMap("success", true);
+    }
+
+    // 仪表盘(数量 + 趋势 + Top5)
+    @GetMapping("/dashboard")
+    public DashboardVo dashboard(@RequestParam(defaultValue = "7") int days) {
+        DashboardVo vo = new DashboardVo();
+        vo.setCounters(safetyService.counters());
+        vo.setWeeklyTrend(safetyService.weeklyTrend(days));
+        vo.setTop5High(safetyService.top5High());
+        return vo;
+    }
+}

+ 2 - 2
supervision-admin/src/main/java/com/supervision/web/controller/workingArrangements/BdglPlanTaskController.java

@@ -124,13 +124,13 @@ public class BdglPlanTaskController extends BaseController {
         String role="";
         if(sysRoles!=null){
             for (SysRole sysRole : sysRoles) {
-                if(sysRole.getRoleKey().equals("user_admin")){
+                if(sysRole.getRoleKey().equals("admin")){
                     role=sysRole.getRoleKey();
                     break;
                 }
             }
         }
-        if(role.equals("user_admin")){
+        if(role.equals("admin")){
             BdglPlanProgress bdglPlanProgress1 = new BdglPlanProgress();
             bdglPlanProgress1.setTaskId(planTask.getId());
             bdglPlanProgresses = planProgressService.selectBdglPlanProgressList(bdglPlanProgress1);

+ 1 - 1
supervision-admin/src/main/java/com/supervision/web/controller/workingArrangements/BdglWorkTaskController.java

@@ -97,7 +97,7 @@ public class BdglWorkTaskController extends BaseController {
         List<SysRole> sysRoles=userMapper.selectRole(loginUser.getUserId());
         if(sysRoles!=null){
             for (SysRole sysRole : sysRoles) {
-                if(sysRole.getRoleKey().equals("user_admin")){
+                if(sysRole.getRoleKey().equals("admin")){
                     BdglWorkProgress bdglPlanProgress1 = new BdglWorkProgress();
                     bdglPlanProgress1.setTaskId(workTask.getId());
                     workProgresses = bdglWorkProgressService.selectBdglWorkProgressList(bdglPlanProgress1);

+ 1 - 0
supervision-admin/src/main/java/com/supervision/web/noticeManage/entity/Notice.java

@@ -11,4 +11,5 @@ public class Notice {
     private String attachment; // 存放前端传过来的文件URL
     private LocalDateTime createTime;
     private LocalDateTime updateTime;
+    private String fileType;
 }

+ 122 - 46
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/controller/DeviceManageController.java

@@ -1,6 +1,7 @@
 package com.supervision.web.peopleGateManage.controller;
 
 
+import com.alibaba.fastjson.JSON;
 import com.github.pagehelper.PageInfo;
 import com.supervision.web.peopleGateManage.service.DeviceService;
 import com.supervision.web.peopleGateManage.service.PeopleDeviceService;
@@ -13,6 +14,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,13 +39,22 @@ public class DeviceManageController {
      */
     @PostMapping("/list")
     public Map<String, Object> listDevices(@RequestBody Map<String, Object> params) {
-        PageInfo<Device> pageInfo = deviceService.searchByCondition(params);
         Map<String, Object> result = new HashMap<>();
-        result.put("total", pageInfo.getTotal());
-        result.put("list", pageInfo.getList());
-        result.put("pageNum", pageInfo.getPageNum());
-        result.put("pageSize", pageInfo.getPageSize());
-        return result;
+        try {
+            PageInfo<Device> pageInfo = deviceService.searchByCondition(params);
+            result.put("total", pageInfo.getTotal());
+            result.put("list", pageInfo.getList());
+            result.put("pageNum", pageInfo.getPageNum());
+            result.put("pageSize", pageInfo.getPageSize());
+            result.put("status", true);
+            result.put("message", "获取所有设备列表成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "获取所有设备列表失败: " + e.getMessage());
+            return result;
+        }
     }
 
     /**
@@ -51,72 +62,137 @@ public class DeviceManageController {
      */
     @GetMapping("/listDeviceName")
     public Map<String, Object> listDeviceName() {
-        List<Device> pageInfo = deviceService.searchAllDeviceNames();
         Map<String, Object> result = new HashMap<>();
-        result.put("total", pageInfo.size());
-        result.put("list", pageInfo);
-        return result;
+        try {
+            List<Device> pageInfo = deviceService.searchAllDeviceNames();
+            result.put("total", pageInfo.size());
+            result.put("list", pageInfo);
+            result.put("status", true);
+            result.put("message", "获取所有设备列表成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "获取所有设备列表失败: " + e.getMessage());
+            return result;
+        }
     }
 
     /**
      * 新增设备(支持从指定设备或所有设备同步人员信息)
      */
     @PostMapping("/add")
-    public String addDevice(@RequestBody DeviceAddRequest request) {
-        // 1. 保存新设备
-        Device device = new Device();
-        device.setType(request.getModel());
-        device.setLocation(request.getLocation());
-        device.setIp(request.getIp());
-        device.setPort(request.getPort());
-        device.setAccount(request.getAccount());
-        device.setPassword(request.getPassword());
-        deviceService.add(device);
-
-        // 2. 同步逻辑
-        if (request.getSyncMode() != null) {
-            if (request.getSyncMode() == 1) {
-                // 同步所有人员
-                List<PeopleInfo> allPeople = peopleInfoService.getAll();
-                for (PeopleInfo p : allPeople) {
-                    peopleDeviceService.bindPersonToDevice(p.getPersonId(), device.getId());
-                }
-            } else if (request.getSyncMode() == 2 && request.getSyncFromDeviceId() != null) {
-                // 从指定设备同步
-                List<String> personIds = peopleDeviceService.getPersonsByDevice(request.getSyncFromDeviceId());
-                for (String personId : personIds) {
-                    peopleDeviceService.bindPersonToDevice(personId, device.getId());
-                }
-            }
+    public Map<String, Object> addDevice(@RequestBody Map<String, Object> params) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            // 1. 保存新设备
+            Device device = new Device();
+            device.setName((String) params.get("name"));
+            device.setSerialNumber((String) params.get("serialNumber"));
+            device.setType((String) params.get("type"));
+            device.setLocation((String) params.get("location"));
+            device.setFirmwareVersion((String) params.get("firmwareVersion"));
+            device.setIp((String) params.get("ip"));
+            device.setPort((Integer) params.get("port"));
+            device.setAccount((String) params.get("account"));
+            device.setPassword((String) params.get("password"));
+            device.setRemark((String) params.get("remarks"));
+
+            // 将前端门体信息和摄像头信息转为 JSON 存储
+            device.setDoors(JSON.toJSONString(params.get("doorInfo")));
+            device.setChannels(JSON.toJSONString(params.get("videoInfo")));
+
+            device.setCreateTime(new Date());
+            device.setUpdateTime(new Date());
+
+            device.setEnable((Boolean) params.get("enable"));
+
+            deviceService.add(device);  // 保存到数据库
+
+//        // 2. 同步逻辑
+//        if (request.getSyncMode() != null) {
+//            if (request.getSyncMode() == 1) {
+//                // 同步所有人员
+//                List<PeopleInfo> allPeople = peopleInfoService.getAll();
+//                for (PeopleInfo p : allPeople) {
+//                    peopleDeviceService.bindPersonToDevice(p.getPersonId(), device.getId());
+//                }
+//            } else if (request.getSyncMode() == 2 && request.getSyncFromDeviceId() != null) {
+//                // 从指定设备同步
+//                List<String> personIds = peopleDeviceService.getPersonsByDevice(request.getSyncFromDeviceId());
+//                for (String personId : personIds) {
+//                    peopleDeviceService.bindPersonToDevice(personId, device.getId());
+//                }
+//            }
+//        }
+
+            result.put("status", true);
+            result.put("message", "添加设备成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "添加设备失败: " + e.getMessage());
+            return result;
         }
-
-        return "success";
     }
 
     /**
      * 修改设备
      */
     @PutMapping("/update")
-    public String updateDevice(@RequestBody Device device) {
-        deviceService.update(device);
-        return "success";
+    public Map<String, Object> updateDevice(@RequestBody Device device) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            deviceService.update(device);
+            result.put("status", true);
+            result.put("message", "修改设备成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "修改设备失败: " + e.getMessage());
+            return result;
+        }
     }
 
     /**
      * 删除设备
      */
     @DeleteMapping("/delete/{id}")
-    public String deleteDevice(@PathVariable Long id) {
-        deviceService.delete(id);
-        return "success";
+    public Map<String, Object> deleteDevice(@PathVariable Long id) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            deviceService.delete(id);
+            result.put("status", true);
+            result.put("message", "删除设备成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "删除设备失败: " + e.getMessage());
+            return result;
+        }
     }
 
     /**
      * 查看单个设备详情
      */
     @GetMapping("/get/{id}")
-    public Device getDevice(@PathVariable Long id) {
-        return deviceService.getById(id);
+    public Map<String, Object> getDevice(@PathVariable Long id) {
+        Map<String, Object> result = new HashMap<>();
+        try {
+            Device device = deviceService.getById(id);
+            result.put("data", device);
+            result.put("status", true);
+            result.put("message", "获取单个设备详情成功");
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace();
+            result.put("status", false);
+            result.put("message", "获取单个设备详情失败: " + e.getMessage());
+            return result;
+        }
     }
 
 }

+ 22 - 30
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/controller/PersonAccessRecordController.java

@@ -1,16 +1,15 @@
 package com.supervision.web.peopleGateManage.controller;
 
+import com.github.pagehelper.PageInfo;
 import com.supervision.web.peopleGateManage.entity.PersonAccessRecord;
 import com.supervision.web.peopleGateManage.service.PersonAccessRecordService;
 import org.springframework.web.bind.annotation.GetMapping;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -20,59 +19,52 @@ import java.util.Map;
 public class PersonAccessRecordController {
 
     @Resource
-    private PersonAccessRecordService service;
+    private PersonAccessRecordService personAccessRecordService;
 
-    @GetMapping("/list")
-    public Map<String, Object> list(Long deviceId, Long personId, String name, String eventType,
-                                    @RequestParam(required=false) Date startTime,
-                                    @RequestParam(required=false) Date endTime,
-                                    @RequestParam(defaultValue="1") int page,
-                                    @RequestParam(defaultValue="10") int pageSize) {
-        List<PersonAccessRecord>
-                list = service.getList(deviceId, personId, name, eventType, startTime, endTime, page, pageSize);
-        int total = service.getTotal(deviceId, personId, name, eventType, startTime, endTime);
-        Map<String, Object> map = new HashMap<>();
-        map.put("records", list);
-        map.put("total", total);
-        map.put("page", page);
-        map.put("pageSize", pageSize);
-        map.put("success", true);
-        return map;
+    @PostMapping("/list")
+    public Map<String, Object> list(@RequestBody Map<String, Object> params) {
+        PageInfo<PersonAccessRecord> pageInfo = personAccessRecordService.getList(params);
+        Map<String, Object> result = new HashMap<>();
+        result.put("total", pageInfo.getTotal());
+        result.put("list", pageInfo.getList());
+        result.put("pageNum", pageInfo.getPageNum());
+        result.put("pageSize", pageInfo.getPageSize());
+        return result;
     }
 
     @PostMapping("/add")
-    public Map<String,Object> add(@RequestBody PersonAccessRecord record){
-        boolean success = service.add(record);
-        Map<String,Object> map = new HashMap<>();
+    public Map<String, Object> add(@RequestBody PersonAccessRecord record) {
+        boolean success = personAccessRecordService.add(record);
+        Map<String, Object> map = new HashMap<>();
         map.put("success", success);
         map.put("msg", success ? "新增成功" : "新增失败");
         return map;
     }
 
     @PostMapping("/update")
-    public Map<String,Object> update(@RequestBody PersonAccessRecord record){
-        boolean success = service.update(record);
-        Map<String,Object> map = new HashMap<>();
+    public Map<String, Object> update(@RequestBody PersonAccessRecord record) {
+        boolean success = personAccessRecordService.update(record);
+        Map<String, Object> map = new HashMap<>();
         map.put("success", success);
         map.put("msg", success ? "修改成功" : "修改失败");
         return map;
     }
 
     @PostMapping("/delete")
-    public Map<String,Object> delete(@RequestBody Map<String,Object> params){
+    public Map<String, Object> delete(@RequestBody Map<String, Object> params) {
         Long id = ((Number)params.get("id")).longValue();
-        boolean success = service.deleteById(id);
-        Map<String,Object> map = new HashMap<>();
+        boolean success = personAccessRecordService.deleteById(id);
+        Map<String, Object> map = new HashMap<>();
         map.put("success", success);
         map.put("msg", success ? "删除成功" : "删除失败");
         return map;
     }
 
     @PostMapping("/batchDelete")
-    public Map<String,Object> batchDelete(@RequestBody Map<String,Object> params){
+    public Map<String, Object> batchDelete(@RequestBody Map<String, Object> params) {
         @SuppressWarnings("unchecked")
         List<Long> ids = (List<Long>) params.get("ids");
-        boolean success = service.deleteBatch(ids);
+        boolean success = personAccessRecordService.batchDelete(ids);
         Map<String,Object> map = new HashMap<>();
         map.put("success", success);
         map.put("msg", success ? "批量删除成功" : "批量删除失败");

+ 2 - 2
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/entity/Device.java

@@ -22,8 +22,8 @@ public class Device {
     private String firmwareVersion;    // 固件版本
     private String doors;              // 门体信息JSON字符串
     private String channels;           // 摄像头信息JSON字符串
-    private String notes;              // 备注信息
+    private String remark;              // 备注信息
     private Date createTime;           // 创建时间
     private Date updateTime;           // 更新时间
-
+    private Boolean enable;         // 是否启用
 }

+ 35 - 2
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/entity/PersonAccessRecord.java

@@ -2,17 +2,50 @@ package com.supervision.web.peopleGateManage.entity;
 
 
 import lombok.Data;
-
 import java.util.Date;
 
+/**
+ * 人员通行记录实体类
+ * 用于记录海康威视人脸识别或门禁设备上传的通行事件。
+ * 对应前端“人员通行记录”表格展示。
+ */
 @Data
 public class PersonAccessRecord {
+
+    /** 主键ID,自增,用于唯一标识一条通行记录 */
     private Long id;
+
+    /** 设备ID,对应设备表的主键,用于区分记录来源设备(例如哪台摆闸或门禁机) */
+    private Long deviceId;
+
+    /** 人员ID,对应人员信息表主键,用于关联通行者身份 */
     private Long personId;
+
+    /** 人员姓名,例如“张三”,便于前端展示和检索 */
     private String name;
-    private Long deviceId;
+
+    /**
+     * 事件类型:
+     *  - "in":进门
+     *  - "out":出门
+     *  - "denied":通行拒绝(可选)
+     * 具体值取决于设备上报的事件编码。
+     */
     private String eventType;
+
+    /** 抓拍时间,表示人员通行被识别或上报的具体时间 */
     private Date captureTime;
+
+    /** 抓拍照片URL,存储人员通行时抓拍的图片路径(用于前端展示) */
     private String photoUrl;
+
+    /** 备注信息,例如“识别失败”、“人工放行”等说明 */
+    private String remark;
+
+    /** 记录创建时间(插入数据库时自动生成) */
     private Date createTime;
+
+    /** 记录最后更新时间(修改记录时自动更新) */
+    private Date updateTime;
 }
+

+ 8 - 13
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/mapper/PersonAccessRecordMapper.java

@@ -4,28 +4,23 @@ package com.supervision.web.peopleGateManage.mapper;
 import com.supervision.web.peopleGateManage.entity.PersonAccessRecord;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-
-import java.util.Date;
 import java.util.List;
 
 @Mapper
 public interface PersonAccessRecordMapper {
+
     List<PersonAccessRecord> getList(@Param("deviceId") Long deviceId,
                                      @Param("personId") Long personId,
                                      @Param("name") String name,
                                      @Param("eventType") String eventType,
-                                     @Param("startTime") Date startTime,
-                                     @Param("endTime") Date endTime,
-                                     @Param("offset") int offset,
-                                     @Param("pageSize") int pageSize);
-    int getTotal(@Param("deviceId") Long deviceId,
-                 @Param("personId") Long personId,
-                 @Param("name") String name,
-                 @Param("eventType") String eventType,
-                 @Param("startTime") Date startTime,
-                 @Param("endTime") Date endTime);
+                                     @Param("startTime") String startTime,
+                                     @Param("endTime") String endTime);
+
     int insert(PersonAccessRecord record);
+
     int update(PersonAccessRecord record);
+
     int deleteById(Long id);
-    int deleteBatch(@Param("ids") List<Long> ids);
+
+    int batchDelete(@Param("ids") List<Long> ids);
 }

+ 9 - 5
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/service/PersonAccessRecordService.java

@@ -1,17 +1,21 @@
 package com.supervision.web.peopleGateManage.service;
 
 
+import com.github.pagehelper.PageInfo;
 import com.supervision.web.peopleGateManage.entity.PersonAccessRecord;
-
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 public interface PersonAccessRecordService {
-    List<PersonAccessRecord> getList(Long deviceId, Long personId, String name, String eventType, Date startTime, Date endTime, int page, int pageSize);
-    int getTotal(Long deviceId, Long personId, String name, String eventType, Date startTime, Date endTime);
+
+    PageInfo<PersonAccessRecord> getList(Map<String, Object> params);
+
     boolean add(PersonAccessRecord record);
+
     boolean update(PersonAccessRecord record);
+
     boolean deleteById(Long id);
-    boolean deleteBatch(List<Long> ids);
+
+    boolean batchDelete(List<Long> ids);
 }
 

+ 35 - 13
supervision-admin/src/main/java/com/supervision/web/peopleGateManage/service/impl/PersonAccessRecordServiceImpl.java

@@ -1,6 +1,9 @@
 package com.supervision.web.peopleGateManage.service.impl;
 
 
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.supervision.web.carGateManage.entity.VehicleAccessRecord;
 import com.supervision.web.peopleGateManage.entity.PersonAccessRecord;
 import com.supervision.web.peopleGateManage.mapper.PersonAccessRecordMapper;
 import com.supervision.web.peopleGateManage.service.PersonAccessRecordService;
@@ -8,42 +11,61 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class PersonAccessRecordServiceImpl implements PersonAccessRecordService {
 
     @Resource
-    private PersonAccessRecordMapper mapper;
+    private PersonAccessRecordMapper personAccessRecordMapper;
 
     @Override
-    public List<PersonAccessRecord> getList(Long deviceId, Long personId, String name, String eventType, Date startTime, Date endTime, int page, int pageSize) {
-        int offset = (page - 1) * pageSize;
-        return mapper.getList(deviceId, personId, name, eventType, startTime, endTime, offset, pageSize);
-    }
+    public PageInfo<PersonAccessRecord> getList(Map<String, Object> params) {
+        int page = (int) params.getOrDefault("page", 1);
+        int size = (int) params.getOrDefault("size", 10);
 
-    @Override
-    public int getTotal(Long deviceId, Long personId, String name, String eventType, Date startTime, Date endTime) {
-        return mapper.getTotal(deviceId, personId, name, eventType, startTime, endTime);
+        Object deviceIdObj = params.get("deviceId");
+        Long deviceId = null;
+        if (deviceIdObj != null) {
+            deviceId = ((Number) deviceIdObj).longValue();
+        }
+
+        Object personIdObj = params.get("personId");
+        Long personId = null;
+        if (personIdObj != null) {
+            personId = ((Number) personIdObj).longValue();
+        }
+
+        String name = (String) params.getOrDefault("name", null);
+        String eventType = (String) params.getOrDefault("eventType", null);
+        String startTime = (String) params.getOrDefault("startTime", null);
+        String endTime = (String) params.getOrDefault("endTime", null);
+
+        PageHelper.startPage(page, size);
+
+        List<PersonAccessRecord> list = personAccessRecordMapper.getList(deviceId, personId, name, eventType, startTime, endTime);
+
+        return new PageInfo<>(list);
     }
 
     @Override
     public boolean add(PersonAccessRecord record) {
-        return mapper.insert(record) > 0;
+        return personAccessRecordMapper.insert(record) > 0;
     }
 
     @Override
     public boolean update(PersonAccessRecord record) {
-        return mapper.update(record) > 0;
+        return personAccessRecordMapper.update(record) > 0;
     }
 
     @Override
     public boolean deleteById(Long id) {
-        return mapper.deleteById(id) > 0;
+        return personAccessRecordMapper.deleteById(id) > 0;
     }
 
     @Override
-    public boolean deleteBatch(List<Long> ids) {
-        return mapper.deleteBatch(ids) > 0;
+    public boolean batchDelete(List<Long> ids) {
+        return personAccessRecordMapper.batchDelete(ids) > 0;
     }
 }
 

+ 7 - 1
supervision-admin/src/main/resources/mapper/carGateManage/VehicleAccessRecordMapper.xml

@@ -4,6 +4,7 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.supervision.web.carGateManage.mapper.VehicleAccessRecordMapper">
 
+    <!-- 结果映射 -->
     <resultMap id="BaseResultMap" type="com.supervision.web.carGateManage.entity.VehicleAccessRecord">
         <id property="id" column="id"/>
         <result property="plateNumber" column="plate_number"/>
@@ -16,6 +17,7 @@
         <result property="updateTime" column="update_time"/>
     </resultMap>
 
+    <!-- 查询列表 -->
     <select id="getList" resultMap="BaseResultMap">
         SELECT *
         FROM new_vehicle_access_record
@@ -38,6 +40,7 @@
         ORDER BY capture_time DESC
     </select>
 
+    <!-- 插入 -->
     <insert id="insert" parameterType="com.supervision.web.carGateManage.entity.VehicleAccessRecord">
         INSERT INTO new_vehicle_access_record
             (plate_number, device_id, event_type, capture_time, photo_url, remark)
@@ -45,6 +48,7 @@
             (#{plateNumber}, #{deviceId}, #{eventType}, #{captureTime}, #{photoUrl}, #{remark})
     </insert>
 
+    <!-- 更新 -->
     <update id="update" parameterType="com.supervision.web.carGateManage.entity.VehicleAccessRecord">
         UPDATE new_vehicle_access_record
         SET plate_number=#{plateNumber},
@@ -57,11 +61,13 @@
         WHERE id=#{id}
     </update>
 
+    <!-- 删除单条 -->
     <delete id="deleteById" parameterType="long">
         DELETE FROM new_vehicle_access_record WHERE id=#{id}
     </delete>
 
-    <delete id="deleteBatch">
+    <!-- 批量删除 -->
+    <delete id="batchDelete">
         DELETE FROM new_vehicle_access_record
         WHERE id IN
         <foreach collection="ids" item="id" open="(" separator="," close=")">

+ 5 - 3
supervision-admin/src/main/resources/mapper/peopleGateManage/DeviceMapper.xml

@@ -23,6 +23,7 @@
         <result property="notes" column="notes"/>
         <result property="createTime" column="create_time"/>
         <result property="updateTime" column="update_time"/>
+        <result property="enable" column="enable"/>
     </resultMap>
 
     <!-- 按条件模糊查询(deviceName 和 deviceCode 均可为空) -->
@@ -63,11 +64,11 @@
     <insert id="insertDevice" parameterType="com.supervision.web.peopleGateManage.entity.Device" useGeneratedKeys="true" keyProperty="id">
         INSERT INTO new_device_info (
             serial_number, name, type, location, ip, port, account, password,
-            is_connect, status, firmware_version, doors, channels, notes, create_time, update_time
+            is_connect, status, firmware_version, doors, channels, remark, create_time, update_time, enable
         )
         VALUES (
                    #{serialNumber}, #{name}, #{type}, #{location}, #{ip}, #{port}, #{account}, #{password},
-                   #{isConnect}, #{status}, #{firmwareVersion}, #{doors}, #{channels}, #{notes}, #{createTime}, #{updateTime}
+                   #{isConnect}, #{status}, #{firmwareVersion}, #{doors}, #{channels}, #{remark}, #{createTime}, #{updateTime}, #{enable}
                )
     </insert>
 
@@ -89,7 +90,8 @@
             doors = #{doors},
             channels = #{channels},
             notes = #{notes},
-            update_time = #{updateTime}
+            update_time = #{updateTime},
+            enable = #{enable}
         WHERE id = #{id}
     </update>
 

+ 20 - 21
supervision-admin/src/main/resources/mapper/peopleGateManage/PersonAccessRecordMapper.xml

@@ -22,32 +22,31 @@
     <select id="getList" resultMap="BaseResultMap">
         SELECT * FROM new_person_access_record
         WHERE 1=1
-        <if test="deviceId != null"> AND device_id = #{deviceId} </if>
-        <if test="personId != null"> AND person_id = #{personId} </if>
-        <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if>
-        <if test="eventType != null and eventType != ''"> AND event_type = #{eventType} </if>
-        <if test="startTime != null"> AND capture_time &gt;= #{startTime} </if>
-        <if test="endTime != null"> AND capture_time &lt;= #{endTime} </if>
+        <if test="deviceId != null and deviceId != ''">
+          AND device_id = #{deviceId}
+        </if>
+        <if test="personId != null and personId != ''">
+          AND person_id = #{personId}
+        </if>
+        <if test="name != null and name != ''">
+          AND name LIKE CONCAT('%', #{name}, '%')
+        </if>
+        <if test="eventType != null and eventType != ''">
+          AND event_type = #{eventType}
+        </if>
+        <if test="startTime != null">
+          AND capture_time &gt;= #{startTime}
+          </if>
+        <if test="endTime != null">
+          AND capture_time &lt;= #{endTime}
+        </if>
         ORDER BY capture_time DESC
-        LIMIT #{offset}, #{pageSize}
-    </select>
-
-    <!-- 查询总数 -->
-    <select id="getTotal" resultType="int">
-        SELECT COUNT(*) FROM new_person_access_record
-        WHERE 1=1
-        <if test="deviceId != null"> AND device_id = #{deviceId} </if>
-        <if test="personId != null"> AND person_id = #{personId} </if>
-        <if test="name != null and name != ''"> AND name LIKE CONCAT('%', #{name}, '%') </if>
-        <if test="eventType != null and eventType != ''"> AND event_type = #{eventType} </if>
-        <if test="startTime != null"> AND capture_time &gt;= #{startTime} </if>
-        <if test="endTime != null"> AND capture_time &lt;= #{endTime} </if>
     </select>
 
     <!-- 插入 -->
     <insert id="insert" parameterType="com.supervision.web.peopleGateManage.entity.PersonAccessRecord">
         INSERT INTO new_person_access_record
-        (person_id, name, device_id, event_type, capture_time, photo_url, remark)
+            (person_id, name, device_id, event_type, capture_time, photo_url, remark)
         VALUES
             (#{personId}, #{name}, #{deviceId}, #{eventType}, #{captureTime}, #{photoUrl}, #{remark})
     </insert>
@@ -72,7 +71,7 @@
     </delete>
 
     <!-- 批量删除 -->
-    <delete id="deleteBatch">
+    <delete id="batchDelete">
         DELETE FROM new_person_access_record
         WHERE id IN
         <foreach collection="ids" item="id" open="(" separator="," close=")">

+ 2 - 0
supervision-system/src/main/java/com/supervision/peopleManage/service/impl/BdglPeopleServiceImpl.java

@@ -56,6 +56,8 @@ public class BdglPeopleServiceImpl implements IBdglPeopleService
         BdglPeople bdglPeople = bdglPeopleMapper.selectBdglPeopleById(id);
         if(familyInformations!=null&&familyInformations.size()>0&&bdglPeople!=null) {
         	bdglPeople.setFamilyInformation(familyInformations);
+        }else{
+            bdglPeople.setFamilyInformation(new ArrayList<>());
         }
         
         return bdglPeople;

+ 14 - 0
supervision-system/src/main/java/com/supervision/safety/domain/CreateIssueReq.java

@@ -0,0 +1,14 @@
+package com.supervision.safety.domain;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+@Data
+public class CreateIssueReq {
+    @NotBlank private String description;
+    @NotNull  private RiskLevel riskLevel;
+    @NotNull  private Date foundAt;
+}

+ 13 - 0
supervision-system/src/main/java/com/supervision/safety/domain/DashboardVo.java

@@ -0,0 +1,13 @@
+package com.supervision.safety.domain;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class DashboardVo {
+    private Map<String, Long> counters;
+    private List<Map<String, Object>> weeklyTrend;
+    private List<SafetyIssue> top5High;
+}

+ 5 - 0
supervision-system/src/main/java/com/supervision/safety/domain/IssueStatus.java

@@ -0,0 +1,5 @@
+package com.supervision.safety.domain;
+
+public enum IssueStatus {
+    PENDING, RECTIFIED
+}

+ 17 - 0
supervision-system/src/main/java/com/supervision/safety/domain/PageResult.java

@@ -0,0 +1,17 @@
+package com.supervision.safety.domain;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PageResult<T> {
+    private long total;
+    private int pageNum;
+    private int pageSize;
+    private List<T> records;
+
+    public PageResult(long total, int pageNum, int pageSize, List<T> records) {
+        this.total = total; this.pageNum = pageNum; this.pageSize = pageSize; this.records = records;
+    }
+}

+ 5 - 0
supervision-system/src/main/java/com/supervision/safety/domain/RiskLevel.java

@@ -0,0 +1,5 @@
+package com.supervision.safety.domain;
+
+public enum RiskLevel {
+    HIGH, MEDIUM, LOW
+}

+ 17 - 0
supervision-system/src/main/java/com/supervision/safety/domain/SafetyIssue.java

@@ -0,0 +1,17 @@
+package com.supervision.safety.domain;
+
+import lombok.Data;
+import java.util.Date;
+
+@Data
+public class SafetyIssue {
+    private Long id;
+    private String description;
+    private RiskLevel riskLevel;
+    private IssueStatus status;
+    private Date foundAt;
+    private Date rectifiedAt;
+    private Boolean deleted;
+    private Date createTime;
+    private Date updateTime;
+}

+ 10 - 0
supervision-system/src/main/java/com/supervision/safety/domain/UpdateStatusReq.java

@@ -0,0 +1,10 @@
+package com.supervision.safety.domain;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class UpdateStatusReq {
+    @NotNull private IssueStatus status;
+}

+ 90 - 0
supervision-system/src/main/java/com/supervision/safety/mapper/SafetyIssueMapper.java

@@ -0,0 +1,90 @@
+package com.supervision.safety.mapper;
+
+import com.supervision.safety.domain.IssueStatus;
+import com.supervision.safety.domain.RiskLevel;
+import com.supervision.safety.domain.SafetyIssue;
+import org.apache.ibatis.annotations.*;
+import org.apache.ibatis.type.EnumTypeHandler;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface SafetyIssueMapper {
+
+    // ========= 基础 =========
+    @Select("SELECT id, description, risk_level, status, found_at, rectified_at, deleted, create_time, update_time " +
+            "FROM safety_issue WHERE id=#{id} AND deleted=0")
+    @Results(id = "IssueMap", value = {
+            // 显式列 -> 属性映射(关键修复)
+            @Result(column = "id",           property = "id"),
+            @Result(column = "description",  property = "description"),
+            @Result(column = "risk_level",   property = "riskLevel",
+                    javaType = RiskLevel.class,  typeHandler = EnumTypeHandler.class),
+            @Result(column = "status",       property = "status",
+                    javaType = IssueStatus.class, typeHandler = EnumTypeHandler.class),
+            @Result(column = "found_at",     property = "foundAt"),
+            @Result(column = "rectified_at", property = "rectifiedAt"),
+            @Result(column = "deleted",      property = "deleted"),
+            @Result(column = "create_time",  property = "createTime"),
+            @Result(column = "update_time",  property = "updateTime")
+    })
+    SafetyIssue findById(@Param("id") Long id);
+
+    @Insert("INSERT INTO safety_issue " +
+            "(description, risk_level, status, found_at, rectified_at, deleted, create_time, update_time) VALUES " +
+            "(#{description}, " +
+            " #{riskLevel, typeHandler=org.apache.ibatis.type.EnumTypeHandler}, " +
+            " #{status,    typeHandler=org.apache.ibatis.type.EnumTypeHandler}, " +
+            " COALESCE(#{foundAt}, NOW()), " +     // 兜底,未传 foundAt 用当前时间
+            " #{rectifiedAt}, 0, NOW(), NOW())")
+    @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
+    int insert(SafetyIssue issue);
+
+    @Update("UPDATE safety_issue SET " +
+            " status = #{status, typeHandler=org.apache.ibatis.type.EnumTypeHandler}, " +
+            " rectified_at = CASE " +
+            "   WHEN #{status, typeHandler=org.apache.ibatis.type.EnumTypeHandler} = 'RECTIFIED' " +
+            "     THEN COALESCE(#{rectifiedAt}, NOW()) " +  // 置为 RECTIFIED 时自动写整改时间
+            "   ELSE rectified_at " +
+            " END, " +
+            " update_time = NOW() " +
+            "WHERE id = #{id} AND deleted = 0")
+    int updateStatus(@Param("id") Long id,
+                     @Param("status") IssueStatus status,
+                     @Param("rectifiedAt") Date rectifiedAt);
+
+    @Update("UPDATE safety_issue SET deleted=1, update_time=NOW() WHERE id=#{id} AND deleted=0")
+    int logicalDelete(@Param("id") Long id);
+
+    // ========= 查询 / 分页 =========
+    @SelectProvider(type = SafetyIssueSqlProvider.class, method = "searchSql")
+    @ResultMap("IssueMap")
+    List<SafetyIssue> search(@Param("keyword") String keyword,
+                             @Param("level") RiskLevel level,
+                             @Param("status") IssueStatus status,
+                             @Param("from") Date from,
+                             @Param("to") Date to,
+                             @Param("limit") int limit,
+                             @Param("offset") int offset);
+
+    @SelectProvider(type = SafetyIssueSqlProvider.class, method = "countSql")
+    long count(@Param("keyword") String keyword,
+               @Param("level") RiskLevel level,
+               @Param("status") IssueStatus status,
+               @Param("from") Date from,
+               @Param("to") Date to);
+
+    // ========= 统计 =========
+    @SelectProvider(type = SafetyIssueSqlProvider.class, method = "countPendingByLevelSql")
+    List<Map<String, Object>> countPendingByLevel();
+
+    @SelectProvider(type = SafetyIssueSqlProvider.class, method = "trendByDaySql")
+    List<Map<String, Object>> trendByDay(@Param("from") Date from,
+                                         @Param("to") Date to);
+
+    @SelectProvider(type = SafetyIssueSqlProvider.class, method = "top5HighSql")
+    @ResultMap("IssueMap")
+    List<SafetyIssue> top5High();
+}

+ 49 - 0
supervision-system/src/main/java/com/supervision/safety/mapper/SafetyIssueSqlProvider.java

@@ -0,0 +1,49 @@
+package com.supervision.safety.mapper;
+
+import java.util.Map;
+
+public class SafetyIssueSqlProvider {
+
+    public String searchSql(Map<String, Object> p) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("SELECT id, description, risk_level, status, found_at, rectified_at, ")
+                .append("deleted, create_time, update_time FROM safety_issue WHERE deleted=0 ");
+        if (p.get("keyword") != null) sb.append("AND description LIKE CONCAT('%', #{keyword}, '%') ");
+        if (p.get("level")   != null) sb.append("AND risk_level = #{level} ");
+        if (p.get("status")  != null) sb.append("AND status = #{status} ");
+        if (p.get("from")    != null) sb.append("AND found_at >= #{from} ");
+        if (p.get("to")      != null) sb.append("AND found_at <  #{to} ");
+        sb.append("ORDER BY found_at DESC ");
+        sb.append("LIMIT #{limit} OFFSET #{offset}");
+        return sb.toString();
+    }
+
+    public String countSql(Map<String, Object> p) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("SELECT COUNT(*) FROM safety_issue WHERE deleted=0 ");
+        if (p.get("keyword") != null) sb.append("AND description LIKE CONCAT('%', #{keyword}, '%') ");
+        if (p.get("level")   != null) sb.append("AND risk_level = #{level} ");
+        if (p.get("status")  != null) sb.append("AND status = #{status} ");
+        if (p.get("from")    != null) sb.append("AND found_at >= #{from} ");
+        if (p.get("to")      != null) sb.append("AND found_at <  #{to} ");
+        return sb.toString();
+    }
+
+    public String countPendingByLevelSql() {
+        return "SELECT risk_level AS lvl, COUNT(*) AS cnt " +
+                "FROM safety_issue WHERE deleted=0 AND status='PENDING' GROUP BY risk_level";
+    }
+
+    public String trendByDaySql(Map<String, Object> p) {
+        return "SELECT DATE_FORMAT(found_at, '%Y-%m-%d') AS d, COUNT(*) AS c " +
+                "FROM safety_issue WHERE deleted=0 AND found_at >= #{from} AND found_at < #{to} " +
+                "GROUP BY d ORDER BY d";
+    }
+
+    public String top5HighSql() {
+        return "SELECT id, description, risk_level, status, found_at, rectified_at, " +
+                "deleted, create_time, update_time " +
+                "FROM safety_issue WHERE deleted=0 AND risk_level='HIGH' AND status='PENDING' " +
+                "ORDER BY found_at DESC LIMIT 5";
+    }
+}

+ 29 - 0
supervision-system/src/main/java/com/supervision/safety/service/SafetyService.java

@@ -0,0 +1,29 @@
+package com.supervision.safety.service;
+
+import java.util.List;
+import java.util.Map;
+
+import com.supervision.safety.domain.*;
+
+import java.util.Date;
+
+public interface SafetyService {
+
+    Long createIssue(CreateIssueReq req);
+
+    void updateIssueStatus(Long id, IssueStatus status);
+
+    void deleteIssue(Long id);
+
+    PageResult<SafetyIssue> search(String keyword,
+                                   RiskLevel level,
+                                   IssueStatus status,
+                                   Date from, Date to,
+                                   int pageNum, int pageSize);
+
+    Map<String, Long> counters();
+
+    List<Map<String, Object>> weeklyTrend(int days);
+
+    List<SafetyIssue> top5High();
+}

+ 102 - 0
supervision-system/src/main/java/com/supervision/safety/service/impl/SafetyServiceImpl.java

@@ -0,0 +1,102 @@
+package com.supervision.safety.service.impl;
+
+import com.supervision.safety.domain.*;
+import com.supervision.safety.mapper.SafetyIssueMapper;
+import com.supervision.safety.service.SafetyService;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class SafetyServiceImpl implements SafetyService {
+
+    @Resource
+    private SafetyIssueMapper mapper;
+
+    @Override
+    public Long createIssue(CreateIssueReq req) {
+        SafetyIssue i = new SafetyIssue();
+        i.setDescription(req.getDescription());
+        i.setRiskLevel(req.getRiskLevel());
+        i.setStatus(IssueStatus.PENDING);
+        i.setFoundAt(req.getFoundAt());
+        i.setRectifiedAt(null);
+        i.setDeleted(false);
+        i.setCreateTime(new Date());
+        i.setUpdateTime(new Date());
+        mapper.insert(i);
+        return i.getId();
+    }
+
+    @Override
+    public void updateIssueStatus(Long id, IssueStatus status) {
+        Date rectifiedAt = (status == IssueStatus.RECTIFIED) ? new Date() : null;
+        int n = mapper.updateStatus(id, status, rectifiedAt);
+        if (n == 0) throw new RuntimeException("Issue not found or deleted");
+    }
+
+    @Override
+    public void deleteIssue(Long id) {
+        mapper.logicalDelete(id);
+    }
+
+    @Override
+    public PageResult<SafetyIssue> search(String keyword, RiskLevel level, IssueStatus status,
+                                          Date from, Date to, int pageNum, int pageSize) {
+        int limit = pageSize;
+        int offset = (Math.max(pageNum, 1) - 1) * pageSize;
+        List<SafetyIssue> list = mapper.search(keyword, level, status, from, to, limit, offset);
+        long total = mapper.count(keyword, level, status, from, to);
+        return new PageResult<>(total, pageNum, pageSize, list);
+    }
+
+    @Override
+    public Map<String, Long> counters() {
+        Map<String, Long> map = new HashMap<>();
+        map.put("HIGH", 0L); map.put("MEDIUM", 0L); map.put("LOW", 0L);
+        List<Map<String, Object>> rows = mapper.countPendingByLevel();
+        if (!CollectionUtils.isEmpty(rows)) {
+            for (Map<String,Object> r : rows) {
+                String lvl = String.valueOf(r.get("lvl"));
+                Long cnt = ((Number) r.get("cnt")).longValue();
+                map.put(lvl, cnt);
+            }
+        }
+        return map;
+    }
+
+    @Override
+    public List<Map<String, Object>> weeklyTrend(int days) {
+        Calendar cal = Calendar.getInstance();
+        Date to = cal.getTime();
+        cal.add(Calendar.DATE, -days + 1);
+        Date from = cal.getTime();
+
+        List<Map<String, Object>> rows = mapper.trendByDay(from, to);
+        Map<String, Long> hit = new HashMap<>();
+        for (Map<String, Object> r : rows) {
+            hit.put(String.valueOf(r.get("d")), ((Number) r.get("c")).longValue());
+        }
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<Map<String, Object>> out = new ArrayList<>();
+        Calendar c = Calendar.getInstance(); c.setTime(from);
+        while (!c.getTime().after(to)) {
+            String key = sdf.format(c.getTime());
+            Map<String,Object> item = new HashMap<>();
+            item.put("date", key);
+            item.put("count", hit.getOrDefault(key, 0L));
+            out.add(item);
+            c.add(Calendar.DATE, 1);
+        }
+        return out;
+    }
+
+    @Override
+    public List<SafetyIssue> top5High() {
+        return mapper.top5High();
+    }
+}

+ 2 - 0
supervision-system/src/main/resources/mapper/grassrootsregistration/BdglStatisticsMapper.xml

@@ -68,7 +68,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="unitName != null">unit_name = #{unitName},</if>
             <if test="title != null">title = #{title},</if>
             <if test="fileName != null">file_name = #{fileName},</if>
+            <if test="fileName == null">file_name = NULL,</if>
             <if test="filePath != null">file_path = #{filePath},</if>
+            <if test="filePath == null">file_path = NULL,</if>
             <if test="time != null">time = #{time},</if>
         </trim>
         where id = #{id}