diff --git a/pom.xml b/pom.xml
index 121b2d4c..5331daaf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,13 +91,12 @@
dev
- 192.168.110.207:8848
- 192.168.110.207:4560
+ 192.168.24.101:8848
+ 192.168.24.101:4560
DEFAULT_GROUP
DEFAULT_GROUP
nacos
nacos
-
@@ -105,8 +104,6 @@
prod
prod
-
-
47.109.37.87:8848
47.109.37.87:4560
DEFAULT_GROUP
diff --git a/ruoyi-common/ruoyi-common-mybatis/pom.xml b/ruoyi-common/ruoyi-common-mybatis/pom.xml
index 77a88301..e7f23b1b 100644
--- a/ruoyi-common/ruoyi-common-mybatis/pom.xml
+++ b/ruoyi-common/ruoyi-common-mybatis/pom.xml
@@ -49,6 +49,11 @@
dynamic-datasource-spring-boot3-starter
${dynamic-ds.version}
+
+ com.github.yulichang
+ mybatis-plus-join
+ 1.2.4
+
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionItemController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionItemController.java
new file mode 100644
index 00000000..5bf5a833
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionItemController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.bo.InspectionItemBo;
+import org.dromara.property.domain.vo.InspectionItemVo;
+import org.dromara.property.service.IInspectionItemService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 巡检项目
+ * 前端访问路由地址为:/property/item
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/item")
+public class InspectionItemController extends BaseController {
+
+ private final IInspectionItemService inspectionItemService;
+
+ /**
+ * 查询巡检项目列表
+ */
+ @SaCheckPermission("system:item:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionItemBo bo, PageQuery pageQuery) {
+ return inspectionItemService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出巡检项目列表
+ */
+ @SaCheckPermission("system:item:export")
+ @Log(title = "巡检项目", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionItemBo bo, HttpServletResponse response) {
+ List list = inspectionItemService.queryList(bo);
+ ExcelUtil.exportExcel(list, "巡检项目", InspectionItemVo.class, response);
+ }
+
+ /**
+ * 获取巡检项目详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:item:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionItemService.queryById(id));
+ }
+
+ /**
+ * 新增巡检项目
+ */
+ @SaCheckPermission("system:item:add")
+ @Log(title = "巡检项目", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionItemBo bo) {
+ return toAjax(inspectionItemService.insertByBo(bo));
+ }
+
+ /**
+ * 修改巡检项目
+ */
+ @SaCheckPermission("system:item:edit")
+ @Log(title = "巡检项目", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionItemBo bo) {
+ return toAjax(inspectionItemService.updateByBo(bo));
+ }
+
+ /**
+ * 删除巡检项目
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:item:remove")
+ @Log(title = "巡检项目", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionItemService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanController.java
new file mode 100644
index 00000000..5c1ffd38
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanController.java
@@ -0,0 +1,107 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.vo.InspectionPlanDetailVo;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+import org.dromara.property.domain.bo.InspectionPlanBo;
+import org.dromara.property.service.IInspectionPlanService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 巡检计划
+ * 前端访问路由地址为:/property/inspectionPlan
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/inspectionPlan")
+public class InspectionPlanController extends BaseController {
+
+ private final IInspectionPlanService inspectionPlanService;
+
+ /**
+ * 查询巡检计划列表
+ */
+ //@SaCheckPermission("property:inspectionPlan:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionPlanBo bo, PageQuery pageQuery) {
+ return inspectionPlanService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出巡检计划列表
+ */
+ //@SaCheckPermission("property:inspectionPlan:export")
+ @Log(title = "巡检计划", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionPlanBo bo, HttpServletResponse response) {
+ List list = inspectionPlanService.queryList(bo);
+ ExcelUtil.exportExcel(list, "巡检计划", InspectionPlanVo.class, response);
+ }
+
+ /**
+ * 获取巡检计划详细信息
+ *
+ * @param id 主键
+ */
+ // @SaCheckPermission("property:inspectionPlan:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionPlanService.queryById(id));
+ }
+
+ /**
+ * 新增巡检计划
+ */
+ @SaCheckPermission("property:inspectionPlan:add")
+ @Log(title = "巡检计划", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionPlanBo bo) {
+ return toAjax(inspectionPlanService.insertByBo(bo));
+ }
+
+ /**
+ * 修改巡检计划
+ */
+ @SaCheckPermission("property:inspectionPlan:edit")
+ @Log(title = "巡检计划", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionPlanBo bo) {
+ return toAjax(inspectionPlanService.updateByBo(bo));
+ }
+
+ /**
+ * 删除巡检计划
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:inspectionPlan:remove")
+ @Log(title = "巡检计划", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionPlanService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanStaffController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanStaffController.java
new file mode 100644
index 00000000..fba3435b
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPlanStaffController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.bo.InspectionPlanStaffBo;
+import org.dromara.property.domain.vo.InspectionPlanStaffVo;
+import org.dromara.property.service.IInspectionPlanStaffService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 执行计划人信息
+ * 前端访问路由地址为:/system/planStaff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/planStaff")
+public class InspectionPlanStaffController extends BaseController {
+
+ private final IInspectionPlanStaffService inspectionPlanStaffService;
+
+ /**
+ * 查询执行计划人信息列表
+ */
+ @SaCheckPermission("system:planStaff:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionPlanStaffBo bo, PageQuery pageQuery) {
+ return inspectionPlanStaffService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出执行计划人信息列表
+ */
+ @SaCheckPermission("system:planStaff:export")
+ @Log(title = "执行计划人信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionPlanStaffBo bo, HttpServletResponse response) {
+ List list = inspectionPlanStaffService.queryList(bo);
+ ExcelUtil.exportExcel(list, "执行计划人信息", InspectionPlanStaffVo.class, response);
+ }
+
+ /**
+ * 获取执行计划人信息详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:planStaff:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionPlanStaffService.queryById(id));
+ }
+
+ /**
+ * 新增执行计划人信息
+ */
+ @SaCheckPermission("system:planStaff:add")
+ @Log(title = "执行计划人信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionPlanStaffBo bo) {
+ return toAjax(inspectionPlanStaffService.insertByBo(bo));
+ }
+
+ /**
+ * 修改执行计划人信息
+ */
+ @SaCheckPermission("system:planStaff:edit")
+ @Log(title = "执行计划人信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionPlanStaffBo bo) {
+ return toAjax(inspectionPlanStaffService.updateByBo(bo));
+ }
+
+ /**
+ * 删除执行计划人信息
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:planStaff:remove")
+ @Log(title = "执行计划人信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionPlanStaffService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPointController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPointController.java
new file mode 100644
index 00000000..586b4eb1
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionPointController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.bo.InspectionPointBo;
+import org.dromara.property.domain.vo.InspectionPointVo;
+import org.dromara.property.service.IInspectionPointService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 巡检点
+ * 前端访问路由地址为:/property/point
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/point")
+public class InspectionPointController extends BaseController {
+
+ private final IInspectionPointService inspectionPointService;
+
+ /**
+ * 查询巡检点列表
+ */
+ @SaCheckPermission("system:point:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionPointBo bo, PageQuery pageQuery) {
+ return inspectionPointService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出巡检点列表
+ */
+ @SaCheckPermission("system:point:export")
+ @Log(title = "巡检点", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionPointBo bo, HttpServletResponse response) {
+ List list = inspectionPointService.queryList(bo);
+ ExcelUtil.exportExcel(list, "巡检点", InspectionPointVo.class, response);
+ }
+
+ /**
+ * 获取巡检点详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:point:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionPointService.queryById(id));
+ }
+
+ /**
+ * 新增巡检点
+ */
+ @SaCheckPermission("system:point:add")
+ @Log(title = "巡检点", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionPointBo bo) {
+ return toAjax(inspectionPointService.insertByBo(bo));
+ }
+
+ /**
+ * 修改巡检点
+ */
+ @SaCheckPermission("system:point:edit")
+ @Log(title = "巡检点", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionPointBo bo) {
+ return toAjax(inspectionPointService.updateByBo(bo));
+ }
+
+ /**
+ * 删除巡检点
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:point:remove")
+ @Log(title = "巡检点", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionPointService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionRouteController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionRouteController.java
new file mode 100644
index 00000000..49a64be6
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionRouteController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.bo.InspectionRouteBo;
+import org.dromara.property.domain.vo.InspectionRouteVo;
+import org.dromara.property.service.IInspectionRouteService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 巡检路线
+ * 前端访问路由地址为:/property/route
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/route")
+public class InspectionRouteController extends BaseController {
+
+ private final IInspectionRouteService inspectionRouteService;
+
+ /**
+ * 查询巡检路线列表
+ */
+ //@SaCheckPermission("system:route:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionRouteBo bo, PageQuery pageQuery) {
+ return inspectionRouteService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出巡检路线列表
+ */
+ @SaCheckPermission("system:route:export")
+ @Log(title = "巡检路线", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionRouteBo bo, HttpServletResponse response) {
+ List list = inspectionRouteService.queryList(bo);
+ ExcelUtil.exportExcel(list, "巡检路线", InspectionRouteVo.class, response);
+ }
+
+ /**
+ * 获取巡检路线详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:route:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionRouteService.queryById(id));
+ }
+
+ /**
+ * 新增巡检路线
+ */
+ @SaCheckPermission("system:route:add")
+ @Log(title = "巡检路线", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionRouteBo bo) {
+ return toAjax(inspectionRouteService.insertByBo(bo));
+ }
+
+ /**
+ * 修改巡检路线
+ */
+ @SaCheckPermission("system:route:edit")
+ @Log(title = "巡检路线", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionRouteBo bo) {
+ return toAjax(inspectionRouteService.updateByBo(bo));
+ }
+
+ /**
+ * 删除巡检路线
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:route:remove")
+ @Log(title = "巡检路线", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionRouteService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionStaffController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionStaffController.java
new file mode 100644
index 00000000..58cb31c0
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionStaffController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.property.domain.bo.InspectionStaffBo;
+import org.dromara.property.domain.vo.InspectionStaffVo;
+import org.dromara.property.service.IInspectionStaffService;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 执行计划人信息
+ * 前端访问路由地址为:/system/staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/staff")
+public class InspectionStaffController extends BaseController {
+
+ private final IInspectionStaffService inspectionStaffService;
+
+ /**
+ * 查询执行计划人信息列表
+ */
+ @SaCheckPermission("system:staff:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionStaffBo bo, PageQuery pageQuery) {
+ return inspectionStaffService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出执行计划人信息列表
+ */
+ @SaCheckPermission("system:staff:export")
+ @Log(title = "执行计划人信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionStaffBo bo, HttpServletResponse response) {
+ List list = inspectionStaffService.queryList(bo);
+ ExcelUtil.exportExcel(list, "执行计划人信息", InspectionStaffVo.class, response);
+ }
+
+ /**
+ * 获取执行计划人信息详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:staff:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionStaffService.queryById(id));
+ }
+
+ /**
+ * 新增执行计划人信息
+ */
+ @SaCheckPermission("system:staff:add")
+ @Log(title = "执行计划人信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionStaffBo bo) {
+ return toAjax(inspectionStaffService.insertByBo(bo));
+ }
+
+ /**
+ * 修改执行计划人信息
+ */
+ @SaCheckPermission("system:staff:edit")
+ @Log(title = "执行计划人信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionStaffBo bo) {
+ return toAjax(inspectionStaffService.updateByBo(bo));
+ }
+
+ /**
+ * 删除执行计划人信息
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:staff:remove")
+ @Log(title = "执行计划人信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionStaffService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskController.java
new file mode 100644
index 00000000..c289cf2c
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskController.java
@@ -0,0 +1,106 @@
+package org.dromara.property.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.property.domain.vo.InspectionTaskVo;
+import org.dromara.property.domain.bo.InspectionTaskBo;
+import org.dromara.property.service.IInspectionTaskService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 巡检任务
+ * 前端访问路由地址为:/property/inspectionTask
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/inspectionTask")
+public class InspectionTaskController extends BaseController {
+
+ private final IInspectionTaskService inspectionTaskService;
+
+ /**
+ * 查询巡检任务列表
+ */
+ // @SaCheckPermission("property:inspectionTask:list")
+ @GetMapping("/list")
+ public TableDataInfo list(InspectionTaskBo bo, PageQuery pageQuery) {
+ return inspectionTaskService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出巡检任务列表
+ */
+ @SaCheckPermission("property:inspectionTask:export")
+ @Log(title = "巡检任务", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(InspectionTaskBo bo, HttpServletResponse response) {
+ List list = inspectionTaskService.queryList(bo);
+ ExcelUtil.exportExcel(list, "巡检任务", InspectionTaskVo.class, response);
+ }
+
+ /**
+ * 获取巡检任务详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:inspectionTask:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(inspectionTaskService.queryById(id));
+ }
+
+ /**
+ * 新增巡检任务
+ */
+ @SaCheckPermission("property:inspectionTask:add")
+ @Log(title = "巡检任务", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody InspectionTaskBo bo) {
+ return toAjax(inspectionTaskService.insertByBo(bo));
+ }
+
+ /**
+ * 修改巡检任务
+ */
+ @SaCheckPermission("property:inspectionTask:edit")
+ @Log(title = "巡检任务", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody InspectionTaskBo bo) {
+ return toAjax(inspectionTaskService.updateByBo(bo));
+ }
+
+ /**
+ * 删除巡检任务
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:inspectionTask:remove")
+ @Log(title = "巡检任务", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(inspectionTaskService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrder.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrder.java
index f0801ca5..88a2afae 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrder.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrder.java
@@ -98,7 +98,7 @@ public class CleanOrder extends TenantEntity {
/**
* 状态
*/
- private int state;
+ private Integer state;
/**
* 联系电话
@@ -113,7 +113,7 @@ public class CleanOrder extends TenantEntity {
/**
* 是否退订(0:否,1:是)
*/
- private int isUnbooking;
+ private Integer isUnbooking;
/**
* 更新人id
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionItem.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionItem.java
new file mode 100644
index 00000000..58daf036
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionItem.java
@@ -0,0 +1,40 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 巡检项目对象 inspection_item
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_item")
+public class InspectionItem extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 项目名称
+ */
+ private String itemName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlan.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlan.java
new file mode 100644
index 00000000..dff314c3
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlan.java
@@ -0,0 +1,102 @@
+package org.dromara.property.domain;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+
+import java.io.Serial;
+
+/**
+ * 巡检计划对象 inspection_plan
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_plan")
+public class InspectionPlan extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 巡检计划名称
+ */
+ private String planName;
+
+ /**
+ * 巡检路线id
+ */
+ private Long inspectionRouteId;
+
+ /**
+ * 巡检周期
+ */
+ private String inspectionPlanPeriod;
+ /**
+ * 任务提前分组
+ */
+ private Integer beforeTime;
+
+ /**
+ * 巡检月
+ */
+ private String inspectionMonth;
+ /**
+ * 巡检日
+ */
+ private String inspectionDay;
+ /**
+ * 巡检周
+ */
+ private String inspectionWorkday;
+
+ /**
+ * 开始日期
+ */
+ private Date startDate;
+
+ /**
+ * 结束日期
+ */
+ private Date endDate;
+ /**
+ * 开始时间
+ */
+ private String startTime;
+
+ /**
+ * 结束时间
+ */
+ private String endTime;
+
+ /**
+ * 签到方式(0现场拍照(默认定位),1现场定位)
+ */
+ private String signType;
+
+ /**
+ * 允许补检(0允许1不允许)
+ */
+ private String canReexamine;
+
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 状态(0启用1停用)
+ */
+ private String state;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlanStaff.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlanStaff.java
new file mode 100644
index 00000000..0ae1cf2a
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPlanStaff.java
@@ -0,0 +1,58 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 执行计划人信息对象 inspection_plan_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_plan_staff")
+public class InspectionPlanStaff extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 执行计划人id
+ */
+ private Long userId;
+
+ /**
+ * 计划id
+ */
+ private Long inspectionPlanId;
+
+ /**
+ * 开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ private Date endTime;
+
+ /**
+ * 搜索值
+ */
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPoint.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPoint.java
new file mode 100644
index 00000000..f7df1d5a
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionPoint.java
@@ -0,0 +1,56 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 巡检点对象 inspection_point
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_point")
+public class InspectionPoint extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 巡检项目id
+ */
+ private Long itemId;
+
+ /**
+ * 巡检点名称
+ */
+ private String pointName;
+
+ /**
+ * 巡检点类型
+ */
+ private String pointType;
+
+ /**
+ * nfc编码
+ */
+ private String nfcCode;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionRoute.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionRoute.java
new file mode 100644
index 00000000..59df9a31
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionRoute.java
@@ -0,0 +1,44 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 巡检路线对象 inspection_route
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_route")
+public class InspectionRoute extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 路线名称
+ */
+ private String routeName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 排序
+ */
+ private Integer sort;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionStaff.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionStaff.java
new file mode 100644
index 00000000..b879ff63
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionStaff.java
@@ -0,0 +1,58 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 执行计划人信息对象 inspection_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_staff")
+public class InspectionStaff extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 实际巡检人id
+ */
+ private Long userId;
+
+ /**
+ * 计划id
+ */
+ private Long inspectionPlanId;
+
+ /**
+ * 实际巡检开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 实际巡检结束时间
+ */
+ private Date endTime;
+
+ /**
+ * 搜索值
+ */
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTask.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTask.java
new file mode 100644
index 00000000..34e94089
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTask.java
@@ -0,0 +1,77 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 巡检任务对象 inspection_task
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("inspection_task")
+public class InspectionTask extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 巡检计划id
+ */
+ private Long inspectionPlanId;
+
+ /**
+ * 实际巡检时间
+ */
+ private Date actInsTime;
+
+ /**
+ * 当前巡检人
+ */
+ private Long actUserId;
+
+ /**
+ * 巡检方式
+ */
+ private String taskType;
+
+ /**
+ * 转移描述
+ */
+ private String transferDesc;
+
+ /**
+ * 巡检状态
+ */
+ private String status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 计划巡检时间范围
+ */
+ private String planInsTime;
+
+ /**
+ * 搜索值
+ */
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttach.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttach.java
index cfa00ba3..64e8c5dd 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttach.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttach.java
@@ -62,20 +62,5 @@ public class MeetAttach extends TenantEntity {
*/
private String picture;
- /**
- * 创建人id
- */
- private Long createById;
-
- /**
- * 更新人id
- */
- private Long updateById;
-
- /**
- * 搜索值
- */
- private String searchValue;
-
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttachOrder.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttachOrder.java
index 33a54514..2a9984bb 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttachOrder.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetAttachOrder.java
@@ -42,20 +42,5 @@ public class MeetAttachOrder extends TenantEntity {
*/
private Long quantity;
- /**
- * 创建人id
- */
- private Long createById;
-
- /**
- * 更新人id
- */
- private Long updateById;
-
- /**
- * 搜索值
- */
- private String searchValue;
-
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetBooking.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetBooking.java
index af834b5c..aebbef33 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetBooking.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/MeetBooking.java
@@ -105,20 +105,4 @@ public class MeetBooking extends TenantEntity {
*/
private String descs;
- /**
- * 创建人id
- */
- private Long createById;
-
- /**
- * 更新人id
- */
- private Long updateById;
-
- /**
- * 搜索值
- */
- private String searchValue;
-
-
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanBo.java
index 5c063c3b..3ae4180b 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanBo.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanBo.java
@@ -86,7 +86,7 @@ public class CleanBo extends BaseEntity {
/**
* 备注
*/
- @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+// @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderBo.java
index 8601487b..a7f43f2e 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderBo.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderBo.java
@@ -114,12 +114,12 @@ public class CleanOrderBo extends BaseEntity {
/**
* 是否退订(0:否,1:是)
*/
- private int isUnbooking;
+ private Integer isUnbooking;
/**
* 状态
*/
- private int state;
+ private Integer state;
@NotEmpty(message = "订单详情不能为空", groups = {AddGroup.class})
private List cleanList;
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionItemBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionItemBo.java
new file mode 100644
index 00000000..47a0819a
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionItemBo.java
@@ -0,0 +1,40 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.property.domain.InspectionItem;
+
+/**
+ * 巡检项目业务对象 inspection_item
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionItem.class, reverseConvertGenerate = false)
+public class InspectionItemBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 项目名称
+ */
+ @NotBlank(message = "项目名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String itemName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanBo.java
new file mode 100644
index 00000000..fecd5663
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanBo.java
@@ -0,0 +1,116 @@
+package org.dromara.property.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.property.domain.InspectionPlan;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 巡检计划业务对象 inspection_plan
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionPlan.class, reverseConvertGenerate = false)
+public class InspectionPlanBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 巡检计划名称
+ */
+ @NotBlank(message = "巡检计划名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String planName;
+
+ /**
+ * 巡检路线id
+ */
+ @NotNull(message = "巡检路线id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long inspectionRouteId;
+
+ /**
+ * 巡检周期
+ */
+ @NotBlank(message = "巡检周期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String inspectionPlanPeriod;
+
+ /**
+ * 任务提前分组
+ */
+ @NotNull(message = "任务提前分组不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Integer beforeTime;
+
+ /**
+ * 开始日期
+ */
+ @NotNull(message = "开始日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date startDate;
+
+ /**
+ * 结束日期
+ */
+ @NotNull(message = "结束日期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date endDate;
+ /**
+ * 开始时间
+ */
+ @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String startTime;
+
+ /**
+ * 结束时间
+ */
+ @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String endTime;
+
+ /**
+ * 签到方式(0现场拍照(默认定位),1现场定位)
+ */
+ @NotBlank(message = "签到方式(0现场拍照(默认定位),1现场定位)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String signType;
+
+ /**
+ * 允许补检(0允许1不允许)
+ */
+ @NotBlank(message = "允许补检(0允许1不允许)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String canReexamine;
+
+ /**
+ * 巡检月
+ */
+ private String inspectionMonth;
+ /**
+ * 巡检日
+ */
+ private String inspectionDay;
+ /**
+ * 巡检周
+ */
+ private String inspectionWorkday;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 状态(0启用1停用)
+ */
+ private String state;
+
+ private List inspectionPlanStaffBoList;
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanStaffBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanStaffBo.java
new file mode 100644
index 00000000..4a358dca
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPlanStaffBo.java
@@ -0,0 +1,56 @@
+package org.dromara.property.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.property.domain.InspectionPlanStaff;
+
+import java.util.Date;
+
+/**
+ * 执行计划人信息业务对象 inspection_plan_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionPlanStaff.class, reverseConvertGenerate = false)
+public class InspectionPlanStaffBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 执行计划人id
+ */
+ @NotNull(message = "执行计划人id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 计划id
+ */
+ @NotNull(message = "计划id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long inspectionPlanId;
+
+ /**
+ * 开始时间
+ */
+ @NotNull(message = "开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ @NotNull(message = "结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date endTime;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPointBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPointBo.java
new file mode 100644
index 00000000..174c74a8
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionPointBo.java
@@ -0,0 +1,58 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.property.domain.InspectionPoint;
+
+/**
+ * 巡检点业务对象 inspection_point
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionPoint.class, reverseConvertGenerate = false)
+public class InspectionPointBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 巡检项目id
+ */
+ @NotNull(message = "巡检项目id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long itemId;
+
+ /**
+ * 巡检点名称
+ */
+ @NotBlank(message = "巡检点名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String pointName;
+
+ /**
+ * 巡检点类型
+ */
+ @NotBlank(message = "巡检点类型不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String pointType;
+
+ /**
+ * nfc编码
+ */
+ private String nfcCode;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionRouteBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionRouteBo.java
new file mode 100644
index 00000000..14aefc3f
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionRouteBo.java
@@ -0,0 +1,44 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.property.domain.InspectionRoute;
+
+/**
+ * 巡检路线业务对象 inspection_route
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionRoute.class, reverseConvertGenerate = false)
+public class InspectionRouteBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 路线名称
+ */
+ @NotBlank(message = "路线名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String routeName;
+
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 排序
+ */
+ @NotNull(message = "排序不能为空", groups = { EditGroup.class })
+ private Integer sort;
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionStaffBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionStaffBo.java
new file mode 100644
index 00000000..58ec57f1
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionStaffBo.java
@@ -0,0 +1,57 @@
+package org.dromara.property.domain.bo;
+
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.property.domain.InspectionStaff;
+
+import java.util.Date;
+
+/**
+ * 执行计划人信息业务对象 inspection_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionStaff.class, reverseConvertGenerate = false)
+public class InspectionStaffBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 实际巡检人id
+ */
+ @NotNull(message = "实际巡检人id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 计划id
+ */
+ @NotNull(message = "计划id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long inspectionPlanId;
+
+ /**
+ * 实际巡检开始时间
+ */
+ @NotNull(message = "实际巡检开始时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date startTime;
+
+ /**
+ * 实际巡检结束时间
+ */
+ @NotNull(message = "实际巡检结束时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date endTime;
+
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskBo.java
new file mode 100644
index 00000000..08f7c2c4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskBo.java
@@ -0,0 +1,69 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.InspectionTask;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 巡检任务业务对象 inspection_task
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = InspectionTask.class, reverseConvertGenerate = false)
+public class InspectionTaskBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 巡检计划id
+ */
+ private Long inspectionPlanId;
+
+ /**
+ * 实际巡检时间
+ */
+ private Date actInsTime;
+
+ /**
+ * 当前巡检人
+ */
+ private Long actUserId;
+
+ /**
+ * 巡检方式
+ */
+ private String taskType;
+
+ /**
+ * 转移描述
+ */
+ private String transferDesc;
+
+ /**
+ * 巡检状态
+ */
+ private String status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 计划巡检时间范围
+ */
+ private String planInsTime;
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/MeetAttachOrderBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/MeetAttachOrderBo.java
index a7d95dc4..b7c58475 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/MeetAttachOrderBo.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/MeetAttachOrderBo.java
@@ -34,20 +34,5 @@ public class MeetAttachOrderBo extends BaseEntity {
*/
private Integer quantity;
- /**
- * 创建人id
- */
- private Long createById;
-
- /**
- * 更新人id
- */
- private Long updateById;
-
- /**
- * 搜索值
- */
- private String searchValue;
-
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentUnitBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentUnitBo.java
index c85f3f75..211534ec 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentUnitBo.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ResidentUnitBo.java
@@ -74,7 +74,7 @@ public class ResidentUnitBo extends BaseEntity {
* 状态
*/
// @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
- private Long state=1l;
+ private Long state;
/**
* 员工人数
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/InspectionPlanPeriodEnum.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/InspectionPlanPeriodEnum.java
new file mode 100644
index 00000000..cebf8312
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/enums/InspectionPlanPeriodEnum.java
@@ -0,0 +1,38 @@
+package org.dromara.property.domain.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Author:yuyongle
+ * @Date:2025/7/4 10:35
+ * @Description:巡检周期枚举
+ **/
+@Getter
+public enum InspectionPlanPeriodEnum {
+ /**
+ * 月/天
+ */
+ MONTHANDDAY("月/天", "1"),
+ /**
+ * 月/天
+ */
+ WEEK("周", "2");
+
+
+ private final String name;
+ private final String value;
+
+ InspectionPlanPeriodEnum(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getValue() {
+ return this.value;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderVo.java
index 6c75b0cf..2017848a 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderVo.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderVo.java
@@ -116,7 +116,7 @@ public class CleanOrderVo implements Serializable {
/**
* 是否退订(0:否,1:是)
*/
- private int isUnbooking;
+ private Integer isUnbooking;
/**
* 联系电话
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionItemVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionItemVo.java
new file mode 100644
index 00000000..f9e88517
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionItemVo.java
@@ -0,0 +1,60 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.property.domain.InspectionItem;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 巡检项目视图对象 inspection_item
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionItem.class)
+public class InspectionItemVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 项目名称
+ */
+ @ExcelProperty(value = "项目名称")
+ private String itemName;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+
+
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanDetailVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanDetailVo.java
new file mode 100644
index 00000000..6b5910b7
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanDetailVo.java
@@ -0,0 +1,113 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import org.dromara.property.domain.InspectionPlan;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Author:yuyongle
+ * @Date:2025/7/11 17:10
+ * @Description:
+ **/
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionPlan.class)
+public class InspectionPlanDetailVo implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 巡检计划名称
+ */
+ @ExcelProperty(value = "巡检计划名称")
+ private String planName;
+
+ /**
+ * 巡检路线id
+ */
+ @ExcelProperty(value = "巡检路线id")
+ private Long inspectionRouteId;
+
+ /**
+ * 巡检周期
+ */
+ @ExcelProperty(value = "巡检周期")
+ private String inspectionPlanPeriod;
+
+ /**
+ * 任务提前分组
+ */
+ @ExcelProperty(value = "任务提前分组")
+ private Integer beforeTime;
+
+ /**
+ * 开始日期
+ */
+ @ExcelProperty(value = "开始日期")
+ private Date startDate;
+
+ /**
+ * 结束日期
+ */
+ @ExcelProperty(value = "结束日期")
+ private Date endDate;
+
+ /**
+ * 签到方式(0现场拍照(默认定位),1现场定位)
+ */
+ @ExcelProperty(value = "签到方式(0现场拍照", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "默=认定位")
+ private String signType;
+
+ /**
+ * 允许补检(0允许1不允许)
+ */
+ @ExcelProperty(value = "允许补检(0允许1不允许)")
+ private String canReexamine;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+ /**
+ * 巡检月
+ */
+ private String inspectionMonth;
+ /**
+ * 巡检日
+ */
+ private String inspectionDay;
+ /**
+ * 巡检周
+ */
+ private String inspectionWorkday;
+ /**
+ * 巡检人员
+ */
+ private List inspectionPlanStaffVoList;
+ /**
+ * 状态(0启用1停用)
+ */
+ private String state;
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanStaffVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanStaffVo.java
new file mode 100644
index 00000000..92dddbb9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanStaffVo.java
@@ -0,0 +1,71 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.property.domain.InspectionPlanStaff;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 执行计划人信息视图对象 inspection_plan_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionPlanStaff.class)
+public class InspectionPlanStaffVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 执行计划人id
+ */
+ @ExcelProperty(value = "执行计划人id")
+ private Long userId;
+ /**
+ * 执行计划人姓名
+ */
+ @ExcelProperty(value = "执行计划人姓名")
+ private String userName;
+
+ /**
+ * 计划id
+ */
+ @ExcelProperty(value = "计划id")
+ private Long inspectionPlanId;
+
+ /**
+ * 开始时间
+ */
+ @ExcelProperty(value = "开始时间")
+ private Date startTime;
+
+ /**
+ * 结束时间
+ */
+ @ExcelProperty(value = "结束时间")
+ private Date endTime;
+
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanVo.java
new file mode 100644
index 00000000..d84cd112
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPlanVo.java
@@ -0,0 +1,127 @@
+package org.dromara.property.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.NotNull;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.property.domain.InspectionPlan;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 巡检计划视图对象 inspection_plan
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionPlan.class)
+public class InspectionPlanVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 巡检计划名称
+ */
+ @ExcelProperty(value = "巡检计划名称")
+ private String planName;
+
+ /**
+ * 巡检路线id
+ */
+ @ExcelProperty(value = "巡检路线id")
+ private Long inspectionRouteId;
+
+ /**
+ * 巡检周期
+ */
+ @ExcelProperty(value = "巡检周期")
+ private String inspectionPlanPeriod;
+
+ /**
+ * 任务提前分组
+ */
+ @ExcelProperty(value = "任务提前分组")
+ private Integer beforeTime;
+
+ /**
+ * 开始日期
+ */
+ @ExcelProperty(value = "开始日期")
+ private Date startDate;
+
+ /**
+ * 结束日期
+ */
+ @ExcelProperty(value = "结束日期")
+ private Date endDate;
+ /**
+ * 开始时间
+ */
+ private String startTime;
+
+ /**
+ * 结束时间
+ */
+ private String endTime;
+
+ /**
+ * 签到方式(0现场拍照(默认定位),1现场定位)
+ */
+ @ExcelProperty(value = "签到方式(0现场拍照", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "默=认定位")
+ private String signType;
+
+ /**
+ * 允许补检(0允许1不允许)
+ */
+ @ExcelProperty(value = "允许补检(0允许1不允许)")
+ private String canReexamine;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+ /**
+ * 巡检月
+ */
+ private String inspectionMonth;
+ /**
+ * 巡检日
+ */
+ private String inspectionDay;
+ /**
+ * 巡检周
+ */
+ private String inspectionWorkday;
+ /**
+ * 状态(0启用1停用)
+ */
+ private String state;
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPointVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPointVo.java
new file mode 100644
index 00000000..1ed2899e
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionPointVo.java
@@ -0,0 +1,83 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.property.domain.InspectionPoint;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 巡检点视图对象 inspection_point
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionPoint.class)
+public class InspectionPointVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 巡检项目id
+ */
+ @ExcelProperty(value = "巡检项目id")
+ private Long itemId;
+
+ /**
+ * 巡检项目id
+ */
+ @ExcelProperty(value = "巡检项目id")
+ private Long itemName;
+
+ /**
+ * 巡检点名称
+ */
+ @ExcelProperty(value = "巡检点名称")
+ private String pointName;
+
+ /**
+ * 巡检点类型
+ */
+ @ExcelProperty(value = "巡检点类型")
+ private String pointType;
+
+ /**
+ * nfc编码
+ */
+ @ExcelProperty(value = "nfc编码")
+ private String nfcCode;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionRouteVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionRouteVo.java
new file mode 100644
index 00000000..d533d1a1
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionRouteVo.java
@@ -0,0 +1,62 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.property.domain.InspectionRoute;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 巡检路线视图对象 inspection_route
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionRoute.class)
+public class InspectionRouteVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 路线名称
+ */
+ @ExcelProperty(value = "路线名称")
+ private String routeName;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+ /**
+ * 排序
+ */
+ @ExcelProperty(value = "排序")
+ private Integer sort;
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionStaffVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionStaffVo.java
new file mode 100644
index 00000000..c93e65f6
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionStaffVo.java
@@ -0,0 +1,66 @@
+package org.dromara.property.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.property.domain.InspectionStaff;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 执行计划人信息视图对象 inspection_staff
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionStaff.class)
+public class InspectionStaffVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 实际巡检人id
+ */
+ @ExcelProperty(value = "实际巡检人id")
+ private Long userId;
+
+ /**
+ * 计划id
+ */
+ @ExcelProperty(value = "计划id")
+ private Long inspectionPlanId;
+
+ /**
+ * 实际巡检开始时间
+ */
+ @ExcelProperty(value = "实际巡检开始时间")
+ private Date startTime;
+
+ /**
+ * 实际巡检结束时间
+ */
+ @ExcelProperty(value = "实际巡检结束时间")
+ private Date endTime;
+
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskVo.java
new file mode 100644
index 00000000..442448f7
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskVo.java
@@ -0,0 +1,102 @@
+package org.dromara.property.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.property.domain.InspectionTask;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 巡检任务视图对象 inspection_task
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = InspectionTask.class)
+public class InspectionTaskVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 巡检计划id
+ */
+ @ExcelProperty(value = "巡检计划id")
+ private Long inspectionPlanId;
+
+ /**
+ * 巡检计划名称
+ */
+ private String planName;
+
+ /**
+ * 实际巡检时间
+ */
+ @ExcelProperty(value = "实际巡检时间")
+ private Date actInsTime;
+
+ /**
+ * 当前巡检人
+ */
+ @ExcelProperty(value = "当前巡检人")
+ private Long actUserId;
+
+ /**
+ * 巡检人名称
+ */
+ @ExcelProperty(value = "巡检人名称")
+ private Long actUserName;
+
+ /**
+ * 巡检方式
+ */
+ @ExcelProperty(value = "巡检方式")
+ private String taskType;
+
+ /**
+ * 转移描述
+ */
+ @ExcelProperty(value = "转移描述")
+ private String transferDesc;
+
+ /**
+ * 巡检状态
+ */
+ @ExcelProperty(value = "巡检状态")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+ /**
+ * 计划巡检时间范围
+ */
+ private String planInsTime;
+ /**
+ * 搜索值
+ */
+ @ExcelProperty(value = "搜索值")
+ private String searchValue;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionItemMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionItemMapper.java
new file mode 100644
index 00000000..e6e55d48
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionItemMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionItem;
+import org.dromara.property.domain.vo.InspectionItemVo;
+
+/**
+ * 巡检项目Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionItemMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanMapper.java
new file mode 100644
index 00000000..cb381507
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.property.domain.InspectionPlan;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 巡检计划Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionPlanMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanStaffMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanStaffMapper.java
new file mode 100644
index 00000000..39834a16
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPlanStaffMapper.java
@@ -0,0 +1,16 @@
+package org.dromara.property.mapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionPlanStaff;
+import org.dromara.property.domain.vo.InspectionPlanStaffVo;
+
+/**
+ * 执行计划人信息Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Mapper
+public interface InspectionPlanStaffMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPointMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPointMapper.java
new file mode 100644
index 00000000..4d10b44e
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionPointMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionPoint;
+import org.dromara.property.domain.vo.InspectionPointVo;
+
+/**
+ * 巡检点Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionPointMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionRouteMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionRouteMapper.java
new file mode 100644
index 00000000..88ea1d8b
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionRouteMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionRoute;
+import org.dromara.property.domain.vo.InspectionRouteVo;
+
+/**
+ * 巡检路线Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionRouteMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionStaffMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionStaffMapper.java
new file mode 100644
index 00000000..145d95d2
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionStaffMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionStaff;
+import org.dromara.property.domain.vo.InspectionStaffVo;
+
+/**
+ * 执行计划人信息Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Mapper
+public interface InspectionStaffMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskMapper.java
new file mode 100644
index 00000000..70c3421b
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskMapper.java
@@ -0,0 +1,17 @@
+package org.dromara.property.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.property.domain.InspectionTask;
+import org.dromara.property.domain.vo.InspectionTaskVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 巡检任务Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionTaskMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapperMPJ/InspectionTaskMPJMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapperMPJ/InspectionTaskMPJMapper.java
new file mode 100644
index 00000000..0fdb163c
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapperMPJ/InspectionTaskMPJMapper.java
@@ -0,0 +1,18 @@
+package org.dromara.property.mapperMPJ;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.property.domain.InspectionTask;
+import org.dromara.property.domain.vo.InspectionTaskVo;
+
+/**
+ * 巡检任务Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Mapper
+public interface InspectionTaskMPJMapper extends MPJBaseMapper {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionItemService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionItemService.java
new file mode 100644
index 00000000..a734abe8
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionItemService.java
@@ -0,0 +1,68 @@
+package org.dromara.property.service;
+
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.property.domain.bo.InspectionItemBo;
+import org.dromara.property.domain.vo.InspectionItemVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 巡检项目Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+public interface IInspectionItemService {
+
+ /**
+ * 查询巡检项目
+ *
+ * @param id 主键
+ * @return 巡检项目
+ */
+ InspectionItemVo queryById(Long id);
+
+ /**
+ * 分页查询巡检项目列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检项目分页列表
+ */
+ TableDataInfo queryPageList(InspectionItemBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的巡检项目列表
+ *
+ * @param bo 查询条件
+ * @return 巡检项目列表
+ */
+ List queryList(InspectionItemBo bo);
+
+ /**
+ * 新增巡检项目
+ *
+ * @param bo 巡检项目
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionItemBo bo);
+
+ /**
+ * 修改巡检项目
+ *
+ * @param bo 巡检项目
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionItemBo bo);
+
+ /**
+ * 校验并批量删除巡检项目信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanService.java
new file mode 100644
index 00000000..4fb556ac
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.property.domain.bo.InspectionPlanBo;
+import org.dromara.property.domain.vo.InspectionPlanDetailVo;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 巡检计划Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+public interface IInspectionPlanService {
+
+ /**
+ * 查询巡检计划
+ *
+ * @param id 主键
+ * @return 巡检计划
+ */
+ InspectionPlanDetailVo queryById(Long id);
+
+ /**
+ * 分页查询巡检计划列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检计划分页列表
+ */
+ TableDataInfo queryPageList(InspectionPlanBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的巡检计划列表
+ *
+ * @param bo 查询条件
+ * @return 巡检计划列表
+ */
+ List queryList(InspectionPlanBo bo);
+
+ /**
+ * 新增巡检计划
+ *
+ * @param bo 巡检计划
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionPlanBo bo);
+
+ /**
+ * 修改巡检计划
+ *
+ * @param bo 巡检计划
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionPlanBo bo);
+
+ /**
+ * 校验并批量删除巡检计划信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanStaffService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanStaffService.java
new file mode 100644
index 00000000..4c7e37a3
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPlanStaffService.java
@@ -0,0 +1,68 @@
+package org.dromara.property.service;
+
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.property.domain.bo.InspectionPlanStaffBo;
+import org.dromara.property.domain.vo.InspectionPlanStaffVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 执行计划人信息Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+public interface IInspectionPlanStaffService {
+
+ /**
+ * 查询执行计划人信息
+ *
+ * @param id 主键
+ * @return 执行计划人信息
+ */
+ InspectionPlanStaffVo queryById(Long id);
+
+ /**
+ * 分页查询执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 执行计划人信息分页列表
+ */
+ TableDataInfo queryPageList(InspectionPlanStaffBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @return 执行计划人信息列表
+ */
+ List queryList(InspectionPlanStaffBo bo);
+
+ /**
+ * 新增执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionPlanStaffBo bo);
+
+ /**
+ * 修改执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionPlanStaffBo bo);
+
+ /**
+ * 校验并批量删除执行计划人信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPointService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPointService.java
new file mode 100644
index 00000000..95beaa24
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionPointService.java
@@ -0,0 +1,67 @@
+package org.dromara.property.service;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.property.domain.bo.InspectionPointBo;
+import org.dromara.property.domain.vo.InspectionPointVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 巡检点Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+public interface IInspectionPointService {
+
+ /**
+ * 查询巡检点
+ *
+ * @param id 主键
+ * @return 巡检点
+ */
+ InspectionPointVo queryById(Long id);
+
+ /**
+ * 分页查询巡检点列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检点分页列表
+ */
+ TableDataInfo queryPageList(InspectionPointBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的巡检点列表
+ *
+ * @param bo 查询条件
+ * @return 巡检点列表
+ */
+ List queryList(InspectionPointBo bo);
+
+ /**
+ * 新增巡检点
+ *
+ * @param bo 巡检点
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionPointBo bo);
+
+ /**
+ * 修改巡检点
+ *
+ * @param bo 巡检点
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionPointBo bo);
+
+ /**
+ * 校验并批量删除巡检点信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionRouteService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionRouteService.java
new file mode 100644
index 00000000..10a5fea6
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionRouteService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.property.domain.bo.InspectionRouteBo;
+import org.dromara.property.domain.vo.InspectionRouteVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 巡检路线Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+public interface IInspectionRouteService {
+
+ /**
+ * 查询巡检路线
+ *
+ * @param id 主键
+ * @return 巡检路线
+ */
+ InspectionRouteVo queryById(Long id);
+
+ /**
+ * 分页查询巡检路线列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检路线分页列表
+ */
+ TableDataInfo queryPageList(InspectionRouteBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的巡检路线列表
+ *
+ * @param bo 查询条件
+ * @return 巡检路线列表
+ */
+ List queryList(InspectionRouteBo bo);
+
+ /**
+ * 新增巡检路线
+ *
+ * @param bo 巡检路线
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionRouteBo bo);
+
+ /**
+ * 修改巡检路线
+ *
+ * @param bo 巡检路线
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionRouteBo bo);
+
+ /**
+ * 校验并批量删除巡检路线信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionStaffService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionStaffService.java
new file mode 100644
index 00000000..23d1b1ec
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionStaffService.java
@@ -0,0 +1,68 @@
+package org.dromara.property.service;
+
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.property.domain.bo.InspectionStaffBo;
+import org.dromara.property.domain.vo.InspectionStaffVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 执行计划人信息Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+public interface IInspectionStaffService {
+
+ /**
+ * 查询执行计划人信息
+ *
+ * @param id 主键
+ * @return 执行计划人信息
+ */
+ InspectionStaffVo queryById(Long id);
+
+ /**
+ * 分页查询执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 执行计划人信息分页列表
+ */
+ TableDataInfo queryPageList(InspectionStaffBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @return 执行计划人信息列表
+ */
+ List queryList(InspectionStaffBo bo);
+
+ /**
+ * 新增执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionStaffBo bo);
+
+ /**
+ * 修改执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionStaffBo bo);
+
+ /**
+ * 校验并批量删除执行计划人信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskService.java
new file mode 100644
index 00000000..a0906f27
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskService.java
@@ -0,0 +1,68 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.vo.InspectionTaskVo;
+import org.dromara.property.domain.bo.InspectionTaskBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 巡检任务Service接口
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+public interface IInspectionTaskService {
+
+ /**
+ * 查询巡检任务
+ *
+ * @param id 主键
+ * @return 巡检任务
+ */
+ InspectionTaskVo queryById(Long id);
+
+ /**
+ * 分页查询巡检任务列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检任务分页列表
+ */
+ TableDataInfo queryPageList(InspectionTaskBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的巡检任务列表
+ *
+ * @param bo 查询条件
+ * @return 巡检任务列表
+ */
+ List queryList(InspectionTaskBo bo);
+
+ /**
+ * 新增巡检任务
+ *
+ * @param bo 巡检任务
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(InspectionTaskBo bo);
+
+ /**
+ * 修改巡检任务
+ *
+ * @param bo 巡检任务
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(InspectionTaskBo bo);
+
+ /**
+ * 校验并批量删除巡检任务信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java
index 4c530be4..37cad524 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderServiceImpl.java
@@ -102,7 +102,8 @@ public class CleanOrderServiceImpl implements ICleanOrderService {
public TableDataInfo queryPageList(CleanOrderBo bo, PageQuery pageQuery) {
// 构造条件查询器,返回的是一个集合
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- Page result = baseMapper.selectForPage(pageQuery.build(), lqw);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw,CleanOrderVo.class);
+// Page result = baseMapper.selectForPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@@ -133,10 +134,12 @@ public class CleanOrderServiceImpl implements ICleanOrderService {
lqw.eq(bo.getStarTime() != null, CleanOrder::getStarTime, bo.getStarTime());
lqw.eq(bo.getEndTime() != null, CleanOrder::getEndTime, bo.getEndTime());
lqw.eq(bo.getUnitId() != null, CleanOrder::getUnitId, bo.getUnitId());
-// lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CleanOrder::getState, bo.getState());
+ lqw.eq(bo.getState() != null, CleanOrder::getState, bo.getState());
// lqw.eq(StringUtils.isNotBlank(bo.getUnit()), CleanOrder::getUnit, bo.getUnit());
lqw.eq(StringUtils.isNotBlank(bo.getPersion()), CleanOrder::getPersion, bo.getPersion());
lqw.eq(StringUtils.isNotBlank(bo.getPhone()), CleanOrder::getPhone, bo.getPhone());
+ //将lqw中的所有条件都封装到一个params对象中集合中
+
return lqw;
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionItemServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionItemServiceImpl.java
new file mode 100644
index 00000000..f897b352
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionItemServiceImpl.java
@@ -0,0 +1,133 @@
+package org.dromara.property.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.property.domain.InspectionItem;
+import org.dromara.property.domain.bo.InspectionItemBo;
+import org.dromara.property.domain.vo.InspectionItemVo;
+import org.dromara.property.mapper.InspectionItemMapper;
+import org.dromara.property.service.IInspectionItemService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 巡检项目Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionItemServiceImpl implements IInspectionItemService {
+
+ private final InspectionItemMapper baseMapper;
+
+ /**
+ * 查询巡检项目
+ *
+ * @param id 主键
+ * @return 巡检项目
+ */
+ @Override
+ public InspectionItemVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询巡检项目列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检项目分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionItemBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的巡检项目列表
+ *
+ * @param bo 查询条件
+ * @return 巡检项目列表
+ */
+ @Override
+ public List queryList(InspectionItemBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionItemBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionItem::getId);
+ lqw.like(StringUtils.isNotBlank(bo.getItemName()), InspectionItem::getItemName, bo.getItemName());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionItem::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增巡检项目
+ *
+ * @param bo 巡检项目
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionItemBo bo) {
+ InspectionItem add = MapstructUtils.convert(bo, InspectionItem.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改巡检项目
+ *
+ * @param bo 巡检项目
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionItemBo bo) {
+ InspectionItem update = MapstructUtils.convert(bo, InspectionItem.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionItem entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除巡检项目信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java
new file mode 100644
index 00000000..02c8aa4a
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanServiceImpl.java
@@ -0,0 +1,184 @@
+package org.dromara.property.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.property.domain.InspectionPlan;
+import org.dromara.property.domain.InspectionPlanStaff;
+import org.dromara.property.domain.bo.InspectionPlanBo;
+import org.dromara.property.domain.bo.InspectionPlanStaffBo;
+import org.dromara.property.domain.vo.InspectionPlanDetailVo;
+import org.dromara.property.domain.vo.InspectionPlanStaffVo;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+import org.dromara.property.domain.vo.ResidentPersonVo;
+import org.dromara.property.mapper.InspectionPlanMapper;
+import org.dromara.property.mapper.InspectionPlanStaffMapper;
+import org.dromara.property.mapper.ResidentPersonMapper;
+import org.dromara.property.service.IInspectionPlanService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 巡检计划Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionPlanServiceImpl implements IInspectionPlanService {
+
+ private final InspectionPlanMapper baseMapper;
+ private final ResidentPersonMapper residentPersonMapper;
+ private final InspectionPlanStaffMapper inspectionPlanStaffMapper;
+
+ /**
+ * 查询巡检计划
+ *
+ * @param id 主键
+ * @return 巡检计划
+ */
+ @Override
+ public InspectionPlanDetailVo queryById(Long id){
+ InspectionPlanVo inspectionPlanVo = baseMapper.selectVoById(id);
+ InspectionPlanDetailVo inspectionPlanDetailVo = BeanUtil.copyProperties(inspectionPlanVo, InspectionPlanDetailVo.class);
+ LambdaQueryWrapper staffQueryWrapper= new LambdaQueryWrapper<>();
+ staffQueryWrapper.eq(InspectionPlanStaff::getInspectionPlanId, id);
+ List inspectionPlanStaffVos =inspectionPlanStaffMapper.selectVoList(staffQueryWrapper);
+ List userIdlist = inspectionPlanStaffVos.stream()
+ .map(vo -> vo.getUserId())
+ .distinct()
+ .collect(Collectors.toList());
+ if(CollectionUtil.isNotEmpty(userIdlist)){
+ new ServiceException("执行计划人不存在");
+ }
+ List residentPersonVolist = residentPersonMapper.selectVoByIds(userIdlist);
+ if(CollectionUtil.isNotEmpty(residentPersonVolist)){
+ inspectionPlanStaffVos.stream().forEach(s->{
+ ResidentPersonVo residentPersonVo = residentPersonVolist.stream()
+ .filter(vo -> vo.getId() != null && vo.getId().equals(s.getUserId())).findFirst().orElse(null);
+ s.setUserName(residentPersonVo.getUserName());
+ });
+ inspectionPlanDetailVo.setInspectionPlanStaffVoList(inspectionPlanStaffVos);
+ }
+
+ return inspectionPlanDetailVo;
+ }
+
+ /**
+ * 分页查询巡检计划列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检计划分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionPlanBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的巡检计划列表
+ *
+ * @param bo 查询条件
+ * @return 巡检计划列表
+ */
+ @Override
+ public List queryList(InspectionPlanBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionPlanBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionPlan::getId);
+ lqw.like(StringUtils.isNotBlank(bo.getPlanName()), InspectionPlan::getPlanName, bo.getPlanName());
+ lqw.eq(bo.getInspectionRouteId() != null, InspectionPlan::getInspectionRouteId, bo.getInspectionRouteId());
+ lqw.eq(StringUtils.isNotBlank(bo.getInspectionPlanPeriod()), InspectionPlan::getInspectionPlanPeriod, bo.getInspectionPlanPeriod());
+ lqw.eq(bo.getStartDate() != null, InspectionPlan::getStartDate, bo.getStartDate());
+ lqw.eq(bo.getEndDate() != null, InspectionPlan::getEndDate, bo.getEndDate());
+ lqw.eq(StringUtils.isNotBlank(bo.getSignType()), InspectionPlan::getSignType, bo.getSignType());
+ lqw.eq(StringUtils.isNotBlank(bo.getCanReexamine()), InspectionPlan::getCanReexamine, bo.getCanReexamine());
+ lqw.like(StringUtils.isNotBlank(bo.getState()), InspectionPlan::getState, bo.getState());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionPlan::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增巡检计划
+ *
+ * @param bo 巡检计划
+ * @return 是否新增成功
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean insertByBo(InspectionPlanBo bo) {
+ InspectionPlan add = MapstructUtils.convert(bo, InspectionPlan.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ List inspectionPlanStaffBoList = bo.getInspectionPlanStaffBoList();
+ if(CollectionUtil.isNotEmpty(inspectionPlanStaffBoList)){
+ for (InspectionPlanStaffBo staffBo : inspectionPlanStaffBoList) {
+ staffBo.setInspectionPlanId(add.getId());
+ }
+ inspectionPlanStaffMapper.insertBatch(BeanUtil.copyToList(inspectionPlanStaffBoList, InspectionPlanStaff.class ));
+ }
+ }
+ return flag;
+ }
+
+ /**
+ * 修改巡检计划
+ *
+ * @param bo 巡检计划
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionPlanBo bo) {
+ InspectionPlan update = MapstructUtils.convert(bo, InspectionPlan.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionPlan entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除巡检计划信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanStaffServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanStaffServiceImpl.java
new file mode 100644
index 00000000..9a3e4a68
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPlanStaffServiceImpl.java
@@ -0,0 +1,136 @@
+package org.dromara.property.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.property.domain.InspectionPlanStaff;
+import org.dromara.property.domain.bo.InspectionPlanStaffBo;
+import org.dromara.property.domain.vo.InspectionPlanStaffVo;
+import org.dromara.property.mapper.InspectionPlanStaffMapper;
+import org.dromara.property.service.IInspectionPlanStaffService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 执行计划人信息Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionPlanStaffServiceImpl implements IInspectionPlanStaffService {
+
+ private final InspectionPlanStaffMapper baseMapper;
+
+ /**
+ * 查询执行计划人信息
+ *
+ * @param id 主键
+ * @return 执行计划人信息
+ */
+ @Override
+ public InspectionPlanStaffVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 执行计划人信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionPlanStaffBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @return 执行计划人信息列表
+ */
+ @Override
+ public List queryList(InspectionPlanStaffBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionPlanStaffBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionPlanStaff::getId);
+ lqw.eq(bo.getUserId() != null, InspectionPlanStaff::getUserId, bo.getUserId());
+ lqw.eq(bo.getInspectionPlanId() != null, InspectionPlanStaff::getInspectionPlanId, bo.getInspectionPlanId());
+ lqw.eq(bo.getStartTime() != null, InspectionPlanStaff::getStartTime, bo.getStartTime());
+ lqw.eq(bo.getEndTime() != null, InspectionPlanStaff::getEndTime, bo.getEndTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionPlanStaff::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionPlanStaffBo bo) {
+ InspectionPlanStaff add = MapstructUtils.convert(bo, InspectionPlanStaff.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionPlanStaffBo bo) {
+ InspectionPlanStaff update = MapstructUtils.convert(bo, InspectionPlanStaff.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionPlanStaff entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除执行计划人信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPointServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPointServiceImpl.java
new file mode 100644
index 00000000..1bed47e4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionPointServiceImpl.java
@@ -0,0 +1,151 @@
+package org.dromara.property.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.property.domain.InspectionPoint;
+import org.dromara.property.domain.bo.InspectionPointBo;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+import org.dromara.property.domain.vo.InspectionPointVo;
+import org.dromara.property.mapper.InspectionPlanMapper;
+import org.dromara.property.mapper.InspectionPointMapper;
+import org.dromara.property.service.IInspectionPointService;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/**
+ * 巡检点Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionPointServiceImpl implements IInspectionPointService {
+
+ private final InspectionPointMapper baseMapper;
+ private final InspectionPlanMapper inspectionPlanMapper;
+
+ /**
+ * 查询巡检点
+ *
+ * @param id 主键
+ * @return 巡检点
+ */
+ @Override
+ public InspectionPointVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询巡检点列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检点分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionPointBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ if (CollectionUtil.isEmpty(result.getRecords())) {
+ return TableDataInfo.build(result);
+ }
+ List itemIdList = result.getRecords().stream()
+ .map(vo -> vo.getItemId())
+ .distinct()
+ .collect(Collectors.toList());
+ List inspectionPlanVos = inspectionPlanMapper.selectVoByIds(itemIdList);
+
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的巡检点列表
+ *
+ * @param bo 查询条件
+ * @return 巡检点列表
+ */
+ @Override
+ public List queryList(InspectionPointBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionPointBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionPoint::getId);
+ lqw.eq(bo.getItemId() != null, InspectionPoint::getItemId, bo.getItemId());
+ lqw.like(StringUtils.isNotBlank(bo.getPointName()), InspectionPoint::getPointName, bo.getPointName());
+ lqw.eq(StringUtils.isNotBlank(bo.getPointType()), InspectionPoint::getPointType, bo.getPointType());
+ lqw.eq(StringUtils.isNotBlank(bo.getNfcCode()), InspectionPoint::getNfcCode, bo.getNfcCode());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionPoint::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增巡检点
+ *
+ * @param bo 巡检点
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionPointBo bo) {
+ InspectionPoint add = MapstructUtils.convert(bo, InspectionPoint.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改巡检点
+ *
+ * @param bo 巡检点
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionPointBo bo) {
+ InspectionPoint update = MapstructUtils.convert(bo, InspectionPoint.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionPoint entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除巡检点信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionRouteServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionRouteServiceImpl.java
new file mode 100644
index 00000000..e3fae498
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionRouteServiceImpl.java
@@ -0,0 +1,133 @@
+package org.dromara.property.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.property.domain.InspectionRoute;
+import org.dromara.property.domain.bo.InspectionRouteBo;
+import org.dromara.property.domain.vo.InspectionRouteVo;
+import org.dromara.property.mapper.InspectionRouteMapper;
+import org.dromara.property.service.IInspectionRouteService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 巡检路线Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionRouteServiceImpl implements IInspectionRouteService {
+
+ private final InspectionRouteMapper baseMapper;
+
+ /**
+ * 查询巡检路线
+ *
+ * @param id 主键
+ * @return 巡检路线
+ */
+ @Override
+ public InspectionRouteVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询巡检路线列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检路线分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionRouteBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的巡检路线列表
+ *
+ * @param bo 查询条件
+ * @return 巡检路线列表
+ */
+ @Override
+ public List queryList(InspectionRouteBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionRouteBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionRoute::getId);
+ lqw.like(StringUtils.isNotBlank(bo.getRouteName()), InspectionRoute::getRouteName, bo.getRouteName());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionRoute::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增巡检路线
+ *
+ * @param bo 巡检路线
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionRouteBo bo) {
+ InspectionRoute add = MapstructUtils.convert(bo, InspectionRoute.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改巡检路线
+ *
+ * @param bo 巡检路线
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionRouteBo bo) {
+ InspectionRoute update = MapstructUtils.convert(bo, InspectionRoute.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionRoute entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除巡检路线信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionStaffServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionStaffServiceImpl.java
new file mode 100644
index 00000000..1631223e
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionStaffServiceImpl.java
@@ -0,0 +1,136 @@
+package org.dromara.property.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.property.domain.InspectionStaff;
+import org.dromara.property.domain.bo.InspectionStaffBo;
+import org.dromara.property.domain.vo.InspectionStaffVo;
+import org.dromara.property.mapper.InspectionStaffMapper;
+import org.dromara.property.service.IInspectionStaffService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 执行计划人信息Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-14
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionStaffServiceImpl implements IInspectionStaffService {
+
+ private final InspectionStaffMapper baseMapper;
+
+ /**
+ * 查询执行计划人信息
+ *
+ * @param id 主键
+ * @return 执行计划人信息
+ */
+ @Override
+ public InspectionStaffVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 执行计划人信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionStaffBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的执行计划人信息列表
+ *
+ * @param bo 查询条件
+ * @return 执行计划人信息列表
+ */
+ @Override
+ public List queryList(InspectionStaffBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionStaffBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionStaff::getId);
+ lqw.eq(bo.getUserId() != null, InspectionStaff::getUserId, bo.getUserId());
+ lqw.eq(bo.getInspectionPlanId() != null, InspectionStaff::getInspectionPlanId, bo.getInspectionPlanId());
+ lqw.eq(bo.getStartTime() != null, InspectionStaff::getStartTime, bo.getStartTime());
+ lqw.eq(bo.getEndTime() != null, InspectionStaff::getEndTime, bo.getEndTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionStaff::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionStaffBo bo) {
+ InspectionStaff add = MapstructUtils.convert(bo, InspectionStaff.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改执行计划人信息
+ *
+ * @param bo 执行计划人信息
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionStaffBo bo) {
+ InspectionStaff update = MapstructUtils.convert(bo, InspectionStaff.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionStaff entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除执行计划人信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskServiceImpl.java
new file mode 100644
index 00000000..8c0d026f
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskServiceImpl.java
@@ -0,0 +1,159 @@
+package org.dromara.property.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.property.domain.InspectionPlan;
+import org.dromara.property.domain.InspectionTask;
+import org.dromara.property.domain.bo.InspectionTaskBo;
+import org.dromara.property.domain.vo.InspectionTaskVo;
+import org.dromara.property.mapper.InspectionPlanMapper;
+import org.dromara.property.mapper.InspectionTaskMapper;
+import org.dromara.property.service.IInspectionTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
+
+/**
+ * 巡检任务Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-07-11
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class InspectionTaskServiceImpl implements IInspectionTaskService {
+
+ private final InspectionTaskMapper baseMapper;
+ @Autowired
+ private final InspectionPlanMapper inspectionPlanMapper;
+
+ /**
+ * 查询巡检任务
+ *
+ * @param id 主键
+ * @return 巡检任务
+ */
+ @Override
+ public InspectionTaskVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询巡检任务列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 巡检任务分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(InspectionTaskBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ if (result.getRecords().size() > 0) {
+ addPlanNameInfo(result);
+ }
+ return TableDataInfo.build(result);
+ }
+ private void addPlanNameInfo(Page inspectionTaskVoPage) {
+ // 提取用户userId,方便批量查询
+ Set planIds = inspectionTaskVoPage.getRecords().stream().map(InspectionTaskVo::getInspectionPlanId).collect(toSet());
+ // 根据planId查询planName
+ List inspectionPlanList = inspectionPlanMapper.selectList(Wrappers.lambdaQuery(InspectionPlan.class).in(InspectionPlan::getId, planIds));
+ // 构造映射关系,方便匹配planId与planName
+ Map hashMap = inspectionPlanList.stream().collect(toMap(InspectionPlan::getId, InspectionPlan::getPlanName));
+ // 将查询补充的信息添加到Vo中
+ inspectionTaskVoPage.getRecords().forEach(e -> e.setPlanName(hashMap.get(e.getInspectionPlanId())));
+ }
+ /**
+ * 查询符合条件的巡检任务列表
+ *
+ * @param bo 查询条件
+ * @return 巡检任务列表
+ */
+ @Override
+ public List queryList(InspectionTaskBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(InspectionTaskBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(InspectionTask::getId);
+ lqw.eq(bo.getInspectionPlanId() != null, InspectionTask::getInspectionPlanId, bo.getInspectionPlanId());
+ lqw.eq(bo.getActInsTime() != null, InspectionTask::getActInsTime, bo.getActInsTime());
+ lqw.eq(bo.getActUserId() != null, InspectionTask::getActUserId, bo.getActUserId());
+ lqw.eq(StringUtils.isNotBlank(bo.getTaskType()), InspectionTask::getTaskType, bo.getTaskType());
+ lqw.eq(StringUtils.isNotBlank(bo.getTransferDesc()), InspectionTask::getTransferDesc, bo.getTransferDesc());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), InspectionTask::getStatus, bo.getStatus());
+ lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), InspectionTask::getSearchValue, bo.getSearchValue());
+ return lqw;
+ }
+
+ /**
+ * 新增巡检任务
+ *
+ * @param bo 巡检任务
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(InspectionTaskBo bo) {
+ InspectionTask add = MapstructUtils.convert(bo, InspectionTask.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改巡检任务
+ *
+ * @param bo 巡检任务
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(InspectionTaskBo bo) {
+ InspectionTask update = MapstructUtils.convert(bo, InspectionTask.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(InspectionTask entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除巡检任务信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetServiceImpl.java
index ddc9fc83..5cafdb2f 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetServiceImpl.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetServiceImpl.java
@@ -141,11 +141,12 @@ public class MeetServiceImpl implements IMeetService {
LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(Meet::getId);
lqw.like(StringUtils.isNotBlank(bo.getName()), Meet::getName, bo.getName());
- lqw.eq(StringUtils.isNotBlank(bo.getLocation()), Meet::getLocation, bo.getLocation());
- lqw.eq(bo.getPersonNumber() != null, Meet::getPersonNumber, bo.getPersonNumber());
- lqw.eq(bo.getBaseService() != null, Meet::getBaseService, bo.getBaseService());
- lqw.eq(bo.getBasePrice() != null, Meet::getBasePrice, bo.getBasePrice());
- lqw.eq(bo.getAttach() != null, Meet::getAttach, bo.getAttach());
+// lqw.eq(StringUtils.isNotBlank(bo.getLocation()), Meet::getLocation, bo.getLocation());
+// lqw.eq(bo.getPersonNumber() != null, Meet::getPersonNumber, bo.getPersonNumber());
+// lqw.eq(bo.getBaseService() != null, Meet::getBaseService, bo.getBaseService());
+// lqw.eq(bo.getBasePrice() != null, Meet::getBasePrice, bo.getBasePrice());
+ lqw.eq(bo.getPrincipals() != null, Meet::getPrincipals, bo.getPrincipals());
+ lqw.eq(bo.getStatus() != null, Meet::getStatus, bo.getStatus());
return lqw;
}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java
index e7a9269d..adf8c123 100644
--- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java
@@ -74,7 +74,7 @@ public class ServiceWorkOrdersTypeServiceImpl implements IServiceWorkOrdersTypeS
private LambdaQueryWrapper buildQueryWrapper(ServiceWorkOrdersTypeBo bo) {
Map params = bo.getParams();
LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
- lqw.orderByAsc(ServiceWorkOrdersType::getId);
+ lqw.orderByAsc(ServiceWorkOrdersType::getSort);
lqw.eq(StringUtils.isNotBlank(bo.getOrderTypeNo()), ServiceWorkOrdersType::getOrderTypeNo, bo.getOrderTypeNo());
lqw.like(StringUtils.isNotBlank(bo.getOrderTypeName()), ServiceWorkOrdersType::getOrderTypeName, bo.getOrderTypeName());
lqw.eq(StringUtils.isNotBlank(bo.getOperationMode()), ServiceWorkOrdersType::getOperationMode, bo.getOperationMode());
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java
new file mode 100644
index 00000000..8801e231
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/tasks/InspectionTasks.java
@@ -0,0 +1,139 @@
+
+package org.dromara.property.tasks;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.RequiredArgsConstructor;
+import org.dromara.property.domain.InspectionTask;
+import org.dromara.property.domain.bo.InspectionPlanBo;
+import org.dromara.property.domain.vo.InspectionPlanVo;
+import org.dromara.property.mapper.InspectionTaskMapper;
+import org.dromara.property.service.IInspectionPlanService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.PostConstruct;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+import static org.dromara.common.mybatis.core.mapper.BaseMapperPlus.log;
+import static org.dromara.property.domain.enums.InspectionPlanPeriodEnum.MONTHANDDAY;
+import static org.dromara.property.domain.enums.InspectionPlanPeriodEnum.WEEK;
+
+/**
+ * @Author:yuyongle
+ * @Date:2025/7/11 15:28
+ * @Description: 巡检任务定时处理器
+ **/
+@Component
+@RequiredArgsConstructor
+//@Validated
+//@RequiredArgsConstructor
+//@RestController
+//@RequestMapping("/task")
+public class InspectionTasks {
+
+ private final IInspectionPlanService inspectionPlanService;
+ private final InspectionTaskMapper inspectionTaskMapper;
+
+ // 通过巡检计划定时生成巡检任务
+ @Scheduled(cron = "0 0 2 * * ?")
+ @PostConstruct
+ //@GetMapping("/taskId")
+ @Transactional(rollbackFor = Exception.class)
+ public void doInspectionPianTask() {
+ // 查询所有启用状态的巡检计划
+ InspectionPlanBo inspectionPlanBo = new InspectionPlanBo();
+ inspectionPlanBo.setState("0");
+ List inspectionPlanVoList = inspectionPlanService.queryList(inspectionPlanBo);
+ // 如果没有有效计划,直接返回
+ if (ObjectUtil.isEmpty(inspectionPlanVoList)) {
+ return;
+ }
+ // 处理每个巡检计划
+ inspectionPlanVoList.forEach(plan -> {
+ LambdaQueryWrapperinspectionTaskWrapper = new LambdaQueryWrapper<>();
+ inspectionTaskWrapper.eq(InspectionTask::getInspectionPlanId,plan.getId());
+ inspectionTaskWrapper.eq(InspectionTask::getInspectionPlanId,plan.getId());
+ boolean exists = inspectionTaskMapper.exists(inspectionTaskWrapper);
+ if(!exists){
+ // 根据不同的巡检周期执行相应处理
+ switch (plan.getInspectionPlanPeriod()) {
+ case "1":
+ // 处理按月/天的巡检计划
+ handleMonthlyDailyPlan(plan);
+ break;
+
+ case "2":
+ // 处理按周的巡检计划
+ handleWeeklyDailyPlan(plan);
+ break;
+ default:
+ // 对于未知的巡检周期类型,记录警告日志
+ log.warn("未知类型");
+ break;
+ }
+ }
+
+ });
+ }
+
+ /**
+ * 处理按月/天的巡检计划
+ * @param plan 巡检计划信息
+ */
+ private void handleMonthlyDailyPlan(InspectionPlanVo plan) {
+
+ // 使用Optional安全处理可能为null的对象
+ Optional.ofNullable(plan).ifPresent(p -> {
+ DateTime today = DateUtil.date();
+ DateTime startDate = DateUtil.date(plan.getStartDate());
+ DateTime endDate = DateUtil.date(plan.getEndDate());
+ String day = DateUtil.today().split("-")[2];
+ List inspectionDayList = Arrays.asList(p.getInspectionDay().split(","));
+ if(DateUtil.isIn(today, startDate, endDate)&&inspectionDayList.contains(day)){
+ InspectionTask task = new InspectionTask();
+ task.setInspectionPlanId(p.getId());
+ task.setInspectionPlanId(p.getId());
+ task.setTaskType(plan.getSignType());
+ task.setPlanInsTime(startDate+"~"+p.getEndTime());
+ task.setStatus("0");
+ inspectionTaskMapper.insert(task);
+ }
+ });
+ }
+ /**
+ * 处理按周的巡检计划
+ * @param plan 巡检计划信息
+ */
+ private void handleWeeklyDailyPlan(InspectionPlanVo plan) {
+
+ // 使用Optional安全处理可能为null的对象
+ Optional.ofNullable(plan).ifPresent(p -> {
+ DateTime today = DateUtil.date();
+ DateTime startDate = DateUtil.date(plan.getStartDate());
+ DateTime endDate = DateUtil.date(plan.getEndDate());
+ String week = String.valueOf(DateUtil.dayOfWeek(DateUtil.date()));
+ List inspectionWorkdayList = Arrays.asList(p.getInspectionWorkday().split(","));
+ if(DateUtil.isIn(today, startDate, endDate)&&inspectionWorkdayList.contains(week)) {
+ InspectionTask task = new InspectionTask();
+ task.setInspectionPlanId(p.getId());
+ task.setInspectionPlanId(p.getId());
+ task.setTaskType(plan.getSignType());
+ task.setPlanInsTime(startDate+"~"+p.getEndTime());
+ task.setStatus("0");
+ inspectionTaskMapper.insert(task);
+
+ }
+ });
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/CleanOrderMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/CleanOrderMapper.xml
index 248b7fac..e4951ffe 100644
--- a/ruoyi-modules/Property/src/main/resources/mapper/Property/CleanOrderMapper.xml
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/CleanOrderMapper.xml
@@ -6,14 +6,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/InspectionTaskMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/InspectionTaskMapper.xml
new file mode 100644
index 00000000..d4975921
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/InspectionTaskMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
index 41950254..c0c34452 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAccessControlController.java
@@ -116,5 +116,14 @@ public class SisAccessControlController extends BaseController {
return R.ok(sisAccessControlService.queryAcTree());
}
+ /**
+ * 同步门禁设备
+ *
+ * @return boolean
+ */
+ @GetMapping("/sync")
+ public R sync() {
+ return R.ok(sisAccessControlService.syncE8());
+ }
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java
index 11884c91..3caf3a45 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisAuthRecordController.java
@@ -1,37 +1,35 @@
package org.dromara.sis.controller;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import java.util.List;
+
import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.domain.TreeNode;
+import org.dromara.sis.domain.SisAuthRecord;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.sis.domain.SisAuthRecord;
-import org.dromara.sis.domain.bo.AuthLibBo;
-import org.dromara.sis.domain.bo.SingleAuthRecordBo;
-import org.dromara.sis.domain.bo.SisAuthRecordBo;
+import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.sis.domain.vo.SisAuthRecordVo;
+import org.dromara.sis.domain.bo.SisAuthRecordBo;
import org.dromara.sis.service.ISisAuthRecordService;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 授权记录
* 前端访问路由地址为:/sis/authRecord
*
* @author lsm
- * @since 2025-06-28
+ * @since 2025-07-14
*/
@Validated
@RequiredArgsConstructor
@@ -77,25 +75,13 @@ public class SisAuthRecordController extends BaseController {
* 新增授权记录
*/
@SaCheckPermission("sis:authRecord:add")
- @Log(title = "授权记录", businessType = BusinessType.INSERT)
+ @Log(title = "人员库授权", businessType = BusinessType.INSERT)
@RepeatSubmit()
- @PostMapping("/add")
+ @PostMapping()
public R add(@Validated(AddGroup.class) @RequestBody SisAuthRecordBo bo) {
return toAjax(sisAuthRecordService.insertByBo(bo));
}
- /**
- * 新增授权记录
- */
- @SaCheckPermission("sis:authRecord:add")
- @Log(title = "单个人像授权", businessType = BusinessType.INSERT)
- @RepeatSubmit()
- @PostMapping("/auth/single")
- public R singleAuth(@Validated(AddGroup.class) @RequestBody SingleAuthRecordBo bo) {
- return toAjax(sisAuthRecordService.singleAuth(bo));
- }
-
-
/**
* 修改授权记录
*/
@@ -121,19 +107,22 @@ public class SisAuthRecordController extends BaseController {
}
/**
- * 删除授权记录
+ * 查询库id授权的设备
*
- * @param bo 授权信息
+ * @param libId 人像库id
*/
- @SaCheckPermission("sis:authRecord:authLib")
- @Log(title = "人员库授权", businessType = BusinessType.INSERT)
- @PostMapping("/authLib")
- public R authLib(@Validated @RequestBody AuthLibBo bo) {
- return toAjax(sisAuthRecordService.authLib(bo));
- }
-
@GetMapping("/authDevice/{libId}")
public R> queryAuthDevice(@PathVariable("libId") String libId) {
return R.ok(sisAuthRecordService.queryAuthDevice(libId));
}
+
+ /**
+ * 查询所有可授权设备
+ *
+ * @return List>
+ */
+ @GetMapping("/authDevice/tree")
+ public R>> tree() {
+ return R.ok(sisAuthRecordService.authDeviceTree());
+ }
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java
new file mode 100644
index 00000000..93daebba
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java
@@ -0,0 +1,106 @@
+package org.dromara.sis.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.sis.domain.vo.SisElevatorFloorRefVo;
+import org.dromara.sis.domain.bo.SisElevatorFloorRefBo;
+import org.dromara.sis.service.ISisElevatorFloorRefService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 电梯⇄楼层关联
+ * 前端访问路由地址为:/sis/elevatorFloorRef
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/elevatorFloorRef")
+public class SisElevatorFloorRefController extends BaseController {
+
+ private final ISisElevatorFloorRefService sisElevatorFloorRefService;
+
+ /**
+ * 查询电梯⇄楼层关联列表
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SisElevatorFloorRefBo bo, PageQuery pageQuery) {
+ return sisElevatorFloorRefService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出电梯⇄楼层关联列表
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:export")
+ @Log(title = "电梯⇄楼层关联", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SisElevatorFloorRefBo bo, HttpServletResponse response) {
+ List list = sisElevatorFloorRefService.queryList(bo);
+ ExcelUtil.exportExcel(list, "电梯⇄楼层关联", SisElevatorFloorRefVo.class, response);
+ }
+
+ /**
+ * 获取电梯⇄楼层关联详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(sisElevatorFloorRefService.queryById(id));
+ }
+
+ /**
+ * 新增电梯⇄楼层关联
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:add")
+ @Log(title = "电梯⇄楼层关联", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SisElevatorFloorRefBo bo) {
+ return toAjax(sisElevatorFloorRefService.insertByBo(bo));
+ }
+
+ /**
+ * 修改电梯⇄楼层关联
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:edit")
+ @Log(title = "电梯⇄楼层关联", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SisElevatorFloorRefBo bo) {
+ return toAjax(sisElevatorFloorRefService.updateByBo(bo));
+ }
+
+ /**
+ * 删除电梯⇄楼层关联
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("sis:elevatorFloorRef:remove")
+ @Log(title = "电梯⇄楼层关联", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(sisElevatorFloorRefService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java
new file mode 100644
index 00000000..1f749e5d
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java
@@ -0,0 +1,106 @@
+package org.dromara.sis.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.sis.domain.vo.SisFloorInfoVo;
+import org.dromara.sis.domain.bo.SisFloorInfoBo;
+import org.dromara.sis.service.ISisFloorInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 建筑物楼层信息
+ * 前端访问路由地址为:/sis/floorInfo
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/floorInfo")
+public class SisFloorInfoController extends BaseController {
+
+ private final ISisFloorInfoService sisFloorInfoService;
+
+ /**
+ * 查询建筑物楼层信息列表
+ */
+ @SaCheckPermission("sis:floorInfo:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SisFloorInfoBo bo, PageQuery pageQuery) {
+ return sisFloorInfoService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出建筑物楼层信息列表
+ */
+ @SaCheckPermission("sis:floorInfo:export")
+ @Log(title = "建筑物楼层信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SisFloorInfoBo bo, HttpServletResponse response) {
+ List list = sisFloorInfoService.queryList(bo);
+ ExcelUtil.exportExcel(list, "建筑物楼层信息", SisFloorInfoVo.class, response);
+ }
+
+ /**
+ * 获取建筑物楼层信息详细信息
+ *
+ * @param floorId 主键
+ */
+ @SaCheckPermission("sis:floorInfo:query")
+ @GetMapping("/{floorId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("floorId") Long floorId) {
+ return R.ok(sisFloorInfoService.queryById(floorId));
+ }
+
+ /**
+ * 新增建筑物楼层信息
+ */
+ @SaCheckPermission("sis:floorInfo:add")
+ @Log(title = "建筑物楼层信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SisFloorInfoBo bo) {
+ return toAjax(sisFloorInfoService.insertByBo(bo));
+ }
+
+ /**
+ * 修改建筑物楼层信息
+ */
+ @SaCheckPermission("sis:floorInfo:edit")
+ @Log(title = "建筑物楼层信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SisFloorInfoBo bo) {
+ return toAjax(sisFloorInfoService.updateByBo(bo));
+ }
+
+ /**
+ * 删除建筑物楼层信息
+ *
+ * @param floorIds 主键串
+ */
+ @SaCheckPermission("sis:floorInfo:remove")
+ @Log(title = "建筑物楼层信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{floorIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("floorIds") Long[] floorIds) {
+ return toAjax(sisFloorInfoService.deleteWithValidByIds(List.of(floorIds), true));
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisPersonLibController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisPersonLibController.java
index a7adc2ba..ffafbe4f 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisPersonLibController.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisPersonLibController.java
@@ -98,7 +98,7 @@ public class SisPersonLibController extends BaseController {
*/
@SaCheckPermission("sis:personLib:remove")
@Log(title = "人像库", businessType = BusinessType.DELETE)
- @DeleteMapping("del/{ids}")
+ @DeleteMapping("/{ids}")
public R remove(@NotEmpty(message = "主键不能为空")
@PathVariable("ids") Long[] ids) {
return toAjax(tbPersonLibService.deleteWithValidByIds(List.of(ids), true));
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/AccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/AccessControlController.java
deleted file mode 100644
index de96e188..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/AccessControlController.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.dromara.sis.controller.e8;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.sis.sdk.e8.AccessControlService;
-import org.dromara.sis.sdk.e8.domain.QueryDto;
-import org.dromara.sis.sdk.e8.domain.accessControl.req.CustomerAuthAddReq;
-import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
-import org.dromara.sis.sdk.e8.domain.accessControl.res.AccessRecordFindRes;
-import org.dromara.sis.sdk.e8.domain.accessControl.res.CustomerAuthFindRes;
-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;
-
-/**
- * @author lsm
- * @apiNote AccessControlController
- * @since 2025/6/24
- */
-@Slf4j
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/e8AccessControl")
-public class AccessControlController {
-
- private final AccessControlService accessControlService;
-
- /**
- * 远程开门
- *
- * @param req 传参
- * @return Boolean
- */
- @PostMapping("/remoteOpenDoor")
- public R remoteOpenDoor(@RequestBody RemoteOpenDoorReq req) {
- log.info("E8远程开门 入参:{}", req);
-
- Boolean flag = accessControlService.remoteOpenDoor(req);
-
- if (flag) {
- return R.ok();
- } else {
- return R.fail("E8远程开门,调用失败!");
- }
- }
-
- /**
- * 获取门禁记录列表
- *
- * @param dto 查询参数
- * @return IPage
- * @apiNote 获取参数示例 {"maxResultCount":10,"pageIndex":1,"queryDto":{"isViewFullData":false}}
- */
- @PostMapping("/getPageAccessRecordList")
- public R> getPageAccessRecordList(@RequestBody QueryDto dto) {
- log.info("E8获取门禁记录列表 入参:{}", dto);
- TableDataInfo page = accessControlService.getPageAccessRecordList(dto);
- if (page == null) {
- return R.fail("E8获取门禁记录列表,调用失败!");
- } else {
- return R.ok(page);
- }
- }
-
- /**
- * 人员授权
- *
- * @param req 传参
- * @return Boolean
- * @apiNote 参数示例 {"accessAuthModel":0,"authData":[{"floors":[],"gatewayType":1,"id":528705580163141,"type":0}],"authType":0,"elevatorAuthModel":1,"endTime":"2025-07-2511: 23: 39","personIds":[539696740646981],"scheduleId":1,"startTime":"2025-06-2511: 23: 39"}
- */
- @PostMapping("/addCustomerAuth")
- public R addCustomerAuth(@RequestBody CustomerAuthAddReq req) {
- log.info("E8人员授权 入参:{}", req);
-
- Boolean flag = accessControlService.addCustomerAuth(req);
-
- if (flag) {
- return R.ok();
- } else {
- return R.fail("E8人员授权,调用失败!");
- }
- }
-
- /**
- * 获取人员权限分页列表
- *
- * @param dto 获取参数
- * @return TableDataInfo
- * @apiNote 获取参数示例 {"maxResultCount":10,"pageIndex":1,"queryDto":{"isViewFullData":false}}
- */
- @PostMapping("getPageCustomerAuth")
- public R> getPageCustomerAuth(@RequestBody QueryDto dto) {
- log.info("E8获取人员权限分页列表 入参:{}", dto);
-
- TableDataInfo page = accessControlService.getPageCustomerAuth(dto);
-
- if (page == null) {
- return R.fail("E8获取人员权限分页列表,调用失败!");
- } else {
- return R.ok(page);
- }
- }
-
-}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java
deleted file mode 100644
index 6e351d50..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.dromara.sis.controller.e8;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.sis.sdk.e8.DoorDeviceService;
-import org.dromara.sis.sdk.e8.domain.door.req.DoorDeviceAddReq;
-import org.dromara.sis.sdk.e8.domain.door.req.DoorDeviceUpdateReq;
-import org.dromara.sis.sdk.e8.domain.door.res.DoorDeviceAddRes;
-import org.dromara.sis.sdk.e8.domain.door.res.DoorDeviceFindRes;
-import org.dromara.sis.sdk.e8.domain.QueryDto;
-import org.springframework.util.ObjectUtils;
-import org.springframework.web.bind.annotation.*;
-
-/**
- * @author lsm
- * @apiNote DoorDeviceController
- * @since 2025/6/23
- */
-@Slf4j
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/e8DoorDevice")
-public class DoorDeviceController {
-
- private final DoorDeviceService doorDeviceService;
-
- /**
- * 查询门禁信息
- *
- * @param id 入参
- * @return Result
- */
- @PostMapping("/findDoorDevice/{id}")
- public R findDoorDevice(@PathVariable Long id) {
- log.info("E8接口 查询门禁信息 入参={}", id);
- DoorDeviceFindRes doorDeviceInfo = doorDeviceService.findDoorDevice(id);
- if (doorDeviceInfo == null) {
- return R.fail("E8接口查询门禁信息,调用失败!");
- } else {
- return R.ok(doorDeviceInfo);
- }
- }
-
- /**
- * 新增门禁信息
- *
- * @param addReq 入参
- * @return Boolean
- */
- @PostMapping("/addDoorDevice")
- public R addDoorDevice(@RequestBody DoorDeviceAddReq addReq) {
- log.info("E8接口新增门禁信息 入参={}", addReq);
-
- DoorDeviceAddRes doorDevice = doorDeviceService.addDoorDevice(addReq);
-
- if (doorDevice == null) {
- return R.fail("E8接口新增门禁信息,调用失败!");
- } else {
- return R.ok(doorDevice);
- }
- }
-
- /**
- * 门禁信息修改
- *
- * @param updateReq 入参
- * @return Boolean
- */
- @PostMapping("/updateDoorDevice")
- public R updateDoorDevice(@RequestBody DoorDeviceUpdateReq updateReq) {
- log.info("E8接口门禁信息修改 入参={}", updateReq);
-
- Boolean flag = doorDeviceService.updateDoorDevice(updateReq);
-
- if (flag) {
- return R.ok();
- } else {
- return R.fail("E8接口门禁信息修改,调用失败!");
- }
- }
-
- /**
- * 删除门禁信息
- *
- * @param id 入参
- * @return Boolean
- */
- @PostMapping("/deleteDoorDevice/{id}")
- public R deleteDoorDevice(@PathVariable Long id) {
- log.info("E8接口删除门禁信息 入参={}", id);
-
- Boolean flag = doorDeviceService.deleteDoorDevice(id);
-
- return flag ? R.ok() : R.fail("E8接口删除门禁信息,调用失败!");
- }
-
- /**
- * 查询门禁信息列表
- *
- * @param dto 入参
- * @return IPage
- */
- @PostMapping("/findDoorDeviceList")
- public R> findDoorDeviceList(@RequestBody QueryDto dto) {
- log.info("E8接口查询门禁信息列表 入参={}", dto);
- TableDataInfo doorDeviceList = doorDeviceService.findDoorDeviceList(dto);
- if (ObjectUtils.isEmpty(doorDeviceList)) {
- return R.fail("E8接口查询门禁信息列表,调用失败!");
- } else {
- return R.ok(doorDeviceList);
- }
- }
-}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/VoucherControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/VoucherControlController.java
deleted file mode 100644
index dc12c600..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/VoucherControlController.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.dromara.sis.controller.e8;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.core.domain.R;
-import org.dromara.sis.sdk.e8.VoucherControlService;
-import org.dromara.sis.sdk.e8.domain.voucher.req.ChangeCardReq;
-import org.dromara.sis.sdk.e8.domain.voucher.req.IssueVoucherReq;
-import org.dromara.sis.sdk.e8.domain.voucher.req.OperateVoucherReq;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-
-/**
- * @author lsm
- * @apiNote VoucherControlController
- * @since 2025/6/25
- */
-@Slf4j
-@RestController
-@RequiredArgsConstructor
-@RequestMapping("/e8VoucherControl")
-public class VoucherControlController {
-
- private final VoucherControlService voucherControlService;
-
- /**
- * 发行凭证
- *
- * @param req 入参
- * @return 是否成功
- */
- @PostMapping("/issueVoucher")
- public R issueVoucher(@RequestBody IssueVoucherReq req) {
- log.info("E8发行凭证入参:{}", req);
-
- Long flag = voucherControlService.issueVoucher(req);
-
- if (flag != null) {
- return R.ok();
- } else {
- return R.fail("E8发行凭证,调用失败!");
- }
- }
-
- /**
- * 操作凭证
- *
- * @param req 入参
- * @return Boolean
- */
- @PostMapping("/operateVoucher")
- public R operateVoucher(@RequestBody OperateVoucherReq req) {
- log.info("E8操作凭证入参:{}", req);
-
- Boolean flag = voucherControlService.operateVoucher(req);
-
- if (flag) {
- return R.ok();
- } else {
- return R.fail("E8操作凭证,调用失败!");
- }
- }
-
- /**
- * 换卡补卡
- *
- * @param req 入参
- * @return Boolean
- */
- @PostMapping("/changeCard")
- public R changeCard(@RequestBody ChangeCardReq req) {
- log.info("E8换卡补卡入参:{}", req);
-
- Boolean flag = voucherControlService.changeCard(req);
-
- if (flag) {
- return R.ok();
- } else {
- return R.fail("E8换卡补卡,调用失败!");
- }
- }
-
- /**
- * 上传人脸
- *
- * @param file 入参
- * @return imageUrl 人脸图片地址
- */
- @PostMapping("/uploadFace")
- public R uploadFace(@RequestParam("file") MultipartFile file) {
- log.info("E8上传人脸入参:{}", file.getOriginalFilename());
-
- // 获取文件字节数组
- byte[] imageByte;
- try {
- imageByte = file.getBytes();
- } catch (IOException e) {
- log.error("获取上传文件字节失败:{}", e.getMessage());
- return R.fail("E8上传人脸,获取文件字节失败!");
- }
-
- String imageUrl = voucherControlService.uploadFace(imageByte);
-
- if (imageUrl != null) {
- return R.ok(imageUrl);
- } else {
- return R.fail("E8上传人脸,调用失败!");
- }
- }
-
-}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java
index f36747a6..3445a59f 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAccessControl.java
@@ -93,4 +93,9 @@ public class SisAccessControl extends TenantEntity {
*/
private String outCode;
+ /**
+ * 外部门编码
+ */
+ private String outDoorCode;
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java
index 729b027d..9588f9af 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisAuthRecord.java
@@ -11,7 +11,7 @@ import java.io.Serial;
* 授权记录对象 sis_auth_record
*
* @author lsm
- * @since 2025-06-28
+ * @since 2025-07-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@@ -33,29 +33,14 @@ public class SisAuthRecord extends TenantEntity {
private Long libId;
/**
- * 图片id
- */
- private Long imgId;
-
- /**
- * 门禁id
- */
- private Long acId;
-
- /**
- * 设备id
- */
- private Long eqbId;
-
- /*
- 门id
- */
- private Long doorId;
-
- /**
- * 设备id
+ * 设备id(门禁/电梯)
*/
private Long deviceId;
+ /**
+ * 设备类型:1-门禁 2-电梯
+ */
+ private Integer deviceType;
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java
new file mode 100644
index 00000000..59f93ee5
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java
@@ -0,0 +1,41 @@
+package org.dromara.sis.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 电梯⇄楼层关联对象 sis_elevator_floor_ref
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sis_elevator_floor_ref")
+public class SisElevatorFloorRef extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 电梯id
+ */
+ private Long elevatorId;
+
+ /**
+ * 楼层层数
+ */
+ private Long layerNum;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java
new file mode 100644
index 00000000..77fdca03
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java
@@ -0,0 +1,50 @@
+package org.dromara.sis.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 建筑物楼层信息对象 sis_floor_info
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sis_floor_info")
+public class SisFloorInfo extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 楼层唯一标识
+ */
+ @TableId(value = "floor_id")
+ private Long floorId;
+
+ /**
+ * 最低层
+ */
+ private Long minLayer;
+
+ /**
+ * 最高层
+ */
+ private Long maxLayer;
+
+ /**
+ * 园区id
+ */
+ private Long communityId;
+
+ /**
+ * 建筑id
+ */
+ private Long buildingId;
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisLibImgRef.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisLibImgRef.java
new file mode 100644
index 00000000..474bbeda
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisLibImgRef.java
@@ -0,0 +1,42 @@
+package org.dromara.sis.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 人像库-人像图片关联对象 sis_lib_img_ref
+ *
+ * @author lsm
+ * @since 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sis_lib_img_ref")
+public class SisLibImgRef extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+
+ /**
+ * id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 人像库id
+ */
+ private Long libId;
+
+ /**
+ * 人像id
+ */
+ private Long imgId;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
index 64bc16db..d59a9742 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisPersonLibImg.java
@@ -28,11 +28,6 @@ public class SisPersonLibImg extends TenantEntity {
@TableId(value = "id")
private Long id;
- /**
- * 人员库编码
- */
- private Long libId;
-
/**
* 人像名称
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/AuthLibBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/AuthLibBo.java
deleted file mode 100644
index a8373f3b..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/AuthLibBo.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.dromara.sis.domain.bo;
-
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-import java.util.List;
-
-/**
- * 人像库授权
- *
- * @author lxj
- */
-@Data
-public class AuthLibBo {
-
- @NotNull(message = "人像库id不能为空")
- private Long libId;
-
- @NotNull(message = "设备列表不能为空")
- private List deviceIds;
-
-}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SingleAuthRecordBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SingleAuthRecordBo.java
deleted file mode 100644
index 9c71ee8b..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SingleAuthRecordBo.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.dromara.sis.domain.bo;
-
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.sis.domain.SisAuthRecord;
-
-import java.util.List;
-
-/**
- * 授权记录业务对象 sis_auth_record
- *
- * @author lxj
- * @since 2025-06-28
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@AutoMapper(target = SisAuthRecord.class, reverseConvertGenerate = false)
-public class SingleAuthRecordBo extends BaseEntity {
-
-
- /**
- * 图像库Id
- */
- @NotNull(message = "图像库Id不能为空", groups = {AddGroup.class, EditGroup.class})
- private Long libId;
-
- /**
- * 图像id列表
- */
- @NotNull(message = "图像id列表不能为空", groups = {AddGroup.class, EditGroup.class})
- private Long imgId;
-
- /**
- * 门禁id列表
- */
- @NotNull(message = "门禁id列表能为空", groups = {AddGroup.class, EditGroup.class})
- private List acIds;
-
-}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java
index cb683c05..555c120f 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisAuthRecordBo.java
@@ -1,21 +1,21 @@
package org.dromara.sis.domain.bo;
-import io.github.linpeilie.annotations.AutoMapper;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
+import org.dromara.sis.domain.SisAuthRecord;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.mybatis.core.domain.BaseEntity;
-import org.dromara.sis.domain.SisAuthRecord;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
-import java.util.List;
+import java.util.Collection;
/**
* 授权记录业务对象 sis_auth_record
*
* @author lsm
- * @since 2025-06-28
+ * @since 2025-07-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@@ -23,26 +23,20 @@ import java.util.List;
public class SisAuthRecordBo extends BaseEntity {
/**
- * 图像库Id
+ * 主键id
*/
- @NotNull(message = "图像库Id不能为空", groups = {AddGroup.class, EditGroup.class})
+ @NotNull(message = "主键id不能为空", groups = {EditGroup.class})
+ private Long id;
+
+ /**
+ * 图像库id
+ */
+ @NotNull(message = "图像库id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long libId;
/**
- * 图像id列表
+ * 授权设备idList
*/
- @NotNull(message = "图像id列表不能为空", groups = {AddGroup.class, EditGroup.class})
- private List imgIds;
-
- /**
- * 门禁id列表
- */
- @NotNull(message = "门禁id列表能为空", groups = {AddGroup.class, EditGroup.class})
- private List acIds;
-
- /**
- * 是否将图片下发到宇视盒子
- */
- private Boolean issue = false;
-
+ @NotEmpty(message = "授权设备idList不能为空", groups = {AddGroup.class, EditGroup.class})
+ private Collection deviceIds;
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java
new file mode 100644
index 00000000..3da9c32f
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java
@@ -0,0 +1,42 @@
+package org.dromara.sis.domain.bo;
+
+import org.dromara.sis.domain.SisElevatorFloorRef;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 电梯⇄楼层关联业务对象 sis_elevator_floor_ref
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SisElevatorFloorRef.class, reverseConvertGenerate = false)
+public class SisElevatorFloorRefBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 电梯id
+ */
+ @NotNull(message = "电梯id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long elevatorId;
+
+ /**
+ * 楼层层数
+ */
+ @NotNull(message = "楼层层数不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long layerNum;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java
new file mode 100644
index 00000000..df59a78b
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java
@@ -0,0 +1,53 @@
+package org.dromara.sis.domain.bo;
+
+import org.dromara.sis.domain.SisFloorInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 建筑物楼层信息业务对象 sis_floor_info
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SisFloorInfo.class, reverseConvertGenerate = false)
+public class SisFloorInfoBo extends BaseEntity {
+
+ /**
+ * 楼层唯一标识
+ */
+ @NotNull(message = "楼层唯一标识不能为空", groups = { EditGroup.class })
+ private Long floorId;
+
+ /**
+ * 最低层
+ */
+ @NotNull(message = "最低层不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long minLayer;
+
+ /**
+ * 最高层
+ */
+ @NotNull(message = "最高层不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long maxLayer;
+
+ /**
+ * 园区id
+ */
+ @NotNull(message = "园区id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long communityId;
+
+ /**
+ * 建筑id
+ */
+ @NotNull(message = "建筑id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long buildingId;
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisLibImgRefBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisLibImgRefBo.java
new file mode 100644
index 00000000..6340fa5e
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisLibImgRefBo.java
@@ -0,0 +1,42 @@
+package org.dromara.sis.domain.bo;
+
+import org.dromara.sis.domain.SisLibImgRef;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 人像库-人像图片关联业务对象 sis_lib_img_ref
+ *
+ * @author lsm
+ * @since 2025-07-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SisLibImgRef.class, reverseConvertGenerate = false)
+public class SisLibImgRefBo extends BaseEntity {
+
+ /**
+ * 主键id
+ */
+ @NotNull(message = "主键id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 人像库id
+ */
+ @NotNull(message = "人像库id不能为空", groups = {EditGroup.class, AddGroup.class})
+ private Long libId;
+
+ /**
+ * 人像id
+ */
+ @NotNull(message = "人像id不能为空", groups = {EditGroup.class, AddGroup.class})
+ private Long imgId;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
index c83c985c..cd92835e 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisPersonLibImgBo.java
@@ -9,6 +9,8 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
+import java.util.Collection;
+
/**
* 人像信息业务对象 tb_person_lib_img
*
@@ -29,8 +31,8 @@ public class SisPersonLibImgBo extends BaseEntity {
/**
* 人员库编码
*/
- @NotNull(message = "人像库id不能为空", groups = {AddGroup.class, EditGroup.class})
- private Long libId;
+ @NotEmpty(message = "人像库id不能为空", groups = {AddGroup.class, EditGroup.class})
+ private Collection libIds;
/**
* 人像名称
@@ -74,14 +76,14 @@ public class SisPersonLibImgBo extends BaseEntity {
*/
private String birthDate;
- /**
- * 同步E8
- */
- private Boolean isSyncE8;
-
/**
* 远程库图像ID
*/
private Long remoteImgId;
+ /**
+ * 同步E8
+ */
+ private Boolean isSyncE8;
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java
index 864abcaa..d9d30feb 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java
@@ -105,6 +105,12 @@ public class SisAccessControlVo implements Serializable {
@ExcelProperty(value = "外部编码")
private String outCode;
+ /**
+ * 外部门编码
+ */
+ @ExcelProperty(value = "外部编码")
+ private String outDoorCode;
+
private String bindDeviceId;
private String bindDeviceIp;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java
index 07a231a9..4f26c293 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java
@@ -3,19 +3,20 @@ package org.dromara.sis.domain.vo;
import org.dromara.sis.domain.SisAuthRecord;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
-import java.util.List;
/**
* 授权记录视图对象 sis_auth_record
*
* @author lsm
- * @since 2025-06-28
+ * @since 2025-07-14
*/
@Data
@ExcelIgnoreUnannotated
@@ -32,41 +33,23 @@ public class SisAuthRecordVo implements Serializable {
private Long id;
/**
- * 图像库Id
+ * 图像库id
*/
- @ExcelProperty(value = "图像库Id")
+ @ExcelProperty(value = "图像库id")
private Long libId;
/**
- * 人像id
- */
- @ExcelProperty(value = "人像id")
- private Long imgId;
-
- /**
- * 门禁id
- */
- @ExcelProperty(value = "门禁id")
- private Long acId;
-
- /**
- * 设备id
- */
- @ExcelProperty(value = "设备id")
- private Long eqbId;
-
- /**
- * E8权限ID
- */
- private Long remoteAuthId;
-
- /*
- 门id
- */
- private Long doorId;
-
- /**
- * 设备id
+ * 设备id(门禁/电梯)
*/
+ @ExcelProperty(value = "设备id", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "门禁/电梯")
private Long deviceId;
+
+ /**
+ * 设备类型:1-门禁 2-电梯
+ */
+ @ExcelProperty(value = "设备类型:1-门禁 2-电梯")
+ private Integer deviceType;
+
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java
new file mode 100644
index 00000000..31d5b63a
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java
@@ -0,0 +1,50 @@
+package org.dromara.sis.domain.vo;
+
+import org.dromara.sis.domain.SisElevatorFloorRef;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 电梯⇄楼层关联视图对象 sis_elevator_floor_ref
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SisElevatorFloorRef.class)
+public class SisElevatorFloorRefVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 电梯id
+ */
+ @ExcelProperty(value = "电梯id")
+ private Long elevatorId;
+
+ /**
+ * 楼层层数
+ */
+ @ExcelProperty(value = "楼层层数")
+ private Long layerNum;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java
new file mode 100644
index 00000000..b7ed5471
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java
@@ -0,0 +1,61 @@
+package org.dromara.sis.domain.vo;
+
+import org.dromara.sis.domain.SisFloorInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 建筑物楼层信息视图对象 sis_floor_info
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SisFloorInfo.class)
+public class SisFloorInfoVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 楼层唯一标识
+ */
+ @ExcelProperty(value = "楼层唯一标识")
+ private Long floorId;
+
+ /**
+ * 最低层
+ */
+ @ExcelProperty(value = "最低层")
+ private Long minLayer;
+
+ /**
+ * 最高层
+ */
+ @ExcelProperty(value = "最高层")
+ private Long maxLayer;
+
+ /**
+ * 园区id
+ */
+ @ExcelProperty(value = "园区id")
+ private Long communityId;
+
+ /**
+ * 建筑id
+ */
+ @ExcelProperty(value = "建筑id")
+ private Long buildingId;
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisLibImgRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisLibImgRefVo.java
new file mode 100644
index 00000000..f209f62b
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisLibImgRefVo.java
@@ -0,0 +1,47 @@
+package org.dromara.sis.domain.vo;
+
+import org.dromara.sis.domain.SisLibImgRef;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+
+/**
+ * 人像库-人像图片关联视图对象 sis_lib_img_ref
+ *
+ * @author lsm
+ * @since 2025-07-14
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SisLibImgRef.class)
+public class SisLibImgRefVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键id
+ */
+ @ExcelProperty(value = "主键id")
+ private Long id;
+
+ /**
+ * 人像库id
+ */
+ @ExcelProperty(value = "人像库id")
+ private Long libId;
+
+ /**
+ * 人像id
+ */
+ @ExcelProperty(value = "人像id")
+ private Long imgId;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
index 7a36ff66..3d9ffe17 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisPersonLibImgVo.java
@@ -8,7 +8,7 @@ import org.dromara.sis.domain.SisPersonLibImg;
import java.io.Serial;
import java.io.Serializable;
-
+import java.util.Collection;
/**
@@ -31,12 +31,6 @@ public class SisPersonLibImgVo implements Serializable {
@ExcelProperty(value = "主键id")
private Long id;
- /**
- * 人员库编码
- */
- @ExcelProperty(value = "人员库Id")
- private Long libId;
-
/**
* 人像名称
*/
@@ -50,8 +44,7 @@ public class SisPersonLibImgVo implements Serializable {
private Long imgOssId;
/**
- * 性别 1:男
-2:女 99:未说明
+ * 性别 1:男 2:女 99:未说明
*/
@ExcelProperty(value = "性别")
private Integer sex;
@@ -69,9 +62,7 @@ public class SisPersonLibImgVo implements Serializable {
private String tel;
/**
- * 证件类型
-1:身份证 2:护照
-3:行驶证 99:其它
+ * 证件类型 1:身份证 2:护照 3:行驶证 99:其它
*/
@ExcelProperty(value = "证件类型")
private Integer certificateType;
@@ -93,4 +84,10 @@ public class SisPersonLibImgVo implements Serializable {
*/
@ExcelProperty(value = "远程库图像ID")
private Long remoteImgId;
+
+ /**
+ * 人像库id
+ */
+ @ExcelProperty(value = "人像库id")
+ private Collection libIds;
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java
index abfef87a..da91c0c0 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java
@@ -1,17 +1,17 @@
package org.dromara.sis.mapper;
-import org.apache.ibatis.annotations.Param;
import org.dromara.sis.domain.SisAuthRecord;
import org.dromara.sis.domain.vo.SisAuthRecordVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import java.util.List;
+
/**
* 授权记录Mapper接口
*
* @author lsm
- * @date 2025-06-28
+ * @since 2025-07-14
*/
public interface SisAuthRecordMapper extends BaseMapperPlus {
-
- SisAuthRecordVo checkAuth(@Param("personId") Integer personId,@Param("accessControlId") Long accessControlId);
+ List checkAuth(Long personId);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java
new file mode 100644
index 00000000..3381838f
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.sis.mapper;
+
+import org.dromara.sis.domain.SisElevatorFloorRef;
+import org.dromara.sis.domain.vo.SisElevatorFloorRefVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 电梯⇄楼层关联Mapper接口
+ *
+ * @author lsm
+ * @date 2025-07-15
+ */
+public interface SisElevatorFloorRefMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java
new file mode 100644
index 00000000..75228ca6
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.sis.mapper;
+
+import org.dromara.sis.domain.SisFloorInfo;
+import org.dromara.sis.domain.vo.SisFloorInfoVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 建筑物楼层信息Mapper接口
+ *
+ * @author lsm
+ * @date 2025-07-15
+ */
+public interface SisFloorInfoMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisLibImgRefMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisLibImgRefMapper.java
new file mode 100644
index 00000000..1fd6e0e3
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisLibImgRefMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.sis.mapper;
+
+import org.dromara.sis.domain.SisLibImgRef;
+import org.dromara.sis.domain.vo.SisLibImgRefVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 人像库-人像图片关联Mapper接口
+ *
+ * @author lsm
+ * @since 2025-07-14
+ */
+public interface SisLibImgRefMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java
index 5adfabef..142d43e5 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java
@@ -3,34 +3,115 @@ package org.dromara.sis.runner;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.sis.domain.bo.SisDeviceManageBo;
+import org.dromara.sis.domain.vo.SisDeviceManageVo;
import org.dromara.sis.domain.vo.SisElevatorInfoVo;
+import org.dromara.sis.domain.vo.SisFloorInfoVo;
import org.dromara.sis.sdk.hik.HikApiService;
+import org.dromara.sis.sdk.hik.calback.HikAlarmCallBack;
+import org.dromara.sis.service.ISisDeviceManageService;
import org.dromara.sis.service.ISisElevatorInfoService;
+import org.dromara.sis.service.ISisFloorInfoService;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
+import java.util.ArrayList;
import java.util.List;
@Slf4j
-@RequiredArgsConstructor
@Component
+@RequiredArgsConstructor
public class HikDeviceApplicationRunner implements ApplicationRunner {
+ private final HikAlarmCallBack hikAlarmCallBack;
+ private final ISisFloorInfoService floorInfoService;
+ private final ISisDeviceManageService deviceManageService;
private final ISisElevatorInfoService elevatorInfoService;
-
@Override
public void run(ApplicationArguments args) throws Exception {
+ // 先布放,在登录
+ HikApiService.getInstance().setAlarmCallBack(0, hikAlarmCallBack);
// 现在查询全部,后面要更具需要查询指定厂商的设备
+ HikDeviceApplicationRunner runner = SpringUtils.getAopProxy(this);
+ // 梯控登录
+ runner.hikElevatorInfoLogin();
+ // 网络摄像头登录
+ hikNetCameraLogin();
+ }
+
+ @Async
+ public void hikElevatorInfoLogin() {
List sisElevatorInfoVos = elevatorInfoService.queryAll();
if (CollUtil.isNotEmpty(sisElevatorInfoVos)) {
sisElevatorInfoVos.forEach(item -> {
// 执行设备登录操作
HikApiService.getInstance().login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd());
- // todo 更新设备心跳信息
+ // 根据建筑ID获取楼层信息
+ SisFloorInfoVo floorInfo = floorInfoService.queryByBuildingId(item.getBuildingId());
+ // 获取楼层数组
+ List layerArray = generateFloorArray(floorInfo.getMinLayer().intValue(), floorInfo.getMaxLayer().intValue());
+ // 下发权限
+ for (int i = 0; i < layerArray.size(); i++) {
+ HikApiService.getInstance().controlGateway(item.getControlIp(), (i + 1), layerArray.get(i));
+ }
});
}
-
+// String ip = "192.168.24.188";
+// short port = 8000;
+// String account = "admin";
+// String pwd = "qweasd123";
+// HikApiService.getInstance().login(ip, port, account, pwd);
+// List arrs = Arrays.asList(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
+// for (int i = 0; i < arrs.size(); i++) {
+// HikApiService.getInstance().controlGateway(ip, (i + 1), arrs.get(i));
+// }
}
+
+ //输入最低层,最高层,返回楼层数组
+ public List generateFloorArray(int minLayer, int maxLayer) {
+ // 验证输入范围
+ if (minLayer > maxLayer) {
+ throw new IllegalArgumentException("最低层不能大于最高层");
+ }
+
+ // 使用List动态收集楼层
+ List layerList = new ArrayList<>();
+
+ // 遍历所有楼层,跳过0层
+ for (int layer = minLayer; layer <= maxLayer; layer++) {
+ if (layer != 0) {
+ // 初始数组赋值为3,不下发权限
+ layerList.add(3);
+ }
+ }
+
+ return layerList;
+ }
+
+ @Async
+ public void hikNetCameraLogin() {
+ List deviceList = deviceManageService.queryList(new SisDeviceManageBo());
+
+ if (CollUtil.isEmpty(deviceList)) {
+ log.info("没有查询到摄像设备信息,不执行登录");
+ return;
+ }
+
+ deviceList.forEach(item -> {
+ int handler = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd());
+ if (handler != -1) {
+ HikApiService.getInstance().setAlarmChan(handler);
+ }
+ });
+// String ip = "192.168.24.19";
+// short port = 8000;
+// String account = "admin";
+// String pwd = "xzf13579";
+// int handler = HikApiService.getInstance().login(ip, port, account, pwd);
+ }
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java
index 79520312..0f58f525 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java
@@ -15,6 +15,16 @@ public class AuthDoorDeviceFindRes {
*/
private Long id;
+ /**
+ * 门名称
+ */
+ private String name;
+
+ /**
+ * 设备code
+ */
+ private String deviceNo;
+
/**
* 门禁Id
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/DoorDeviceServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/DoorDeviceServiceImpl.java
index aabf65d2..e44a0114 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/DoorDeviceServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/DoorDeviceServiceImpl.java
@@ -176,7 +176,7 @@ public class DoorDeviceServiceImpl implements DoorDeviceService {
/**
* 分页获取授权门信息
*
- * @return TableDataInfo
+ * @return List
*/
public List getPageAuthDoorDeviceList() {
Map queryDto = new HashMap<>();
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java
index f4003e9d..4280851a 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java
@@ -25,6 +25,7 @@ public class HikApiService {
}
private static volatile HikApiService instance;
+
public static HikApiService getInstance() {
if (instance == null) {
synchronized (HikApiService.class) {
@@ -36,6 +37,9 @@ public class HikApiService {
return instance;
}
+ public static void init() {
+ SdkBaseServer.initSdk();
+ }
/**
@@ -47,13 +51,22 @@ public class HikApiService {
* @param psw 设备密码
* @return 返回会否登录成功
*/
- public Boolean login(String ip, short port, String user, String psw) {
+ public int login(String ip, short port, String user, String psw) {
int i = LoginService.loginDevice(ip, port, user, psw);
boolean result = (i != SdkBaseServer.LOGIN_FAIL_CODE);
if (result) {
CACHE.put(ip, i);
}
- return result;
+ return i;
+ }
+
+ /**
+ * 注册报警信息回调函数。
+ *
+ * @param callBack 报警信回调
+ */
+ public boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
+ return SdkBaseServer.setAlarmCallBack(iIndex, callBack);
}
/**
@@ -107,4 +120,8 @@ public class HikApiService {
}
return logout;
}
+
+ public void setAlarmChan(int handler) {
+ SdkBaseServer.setAlarmChan(handler);
+ }
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java
new file mode 100644
index 00000000..460ed0ca
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java
@@ -0,0 +1,177 @@
+package org.dromara.sis.sdk.hik.calback;
+
+import cn.hutool.core.codec.Base64Encoder;
+import cn.hutool.core.collection.CollUtil;
+import com.sun.jna.Pointer;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sis.domain.vo.*;
+import org.dromara.sis.sdk.e8.AccessControlService;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
+import org.dromara.sis.sdk.hik.HCNetSDK;
+import org.dromara.sis.sdk.hik.HikApiService;
+import org.dromara.sis.sdk.huawei.HuaWeiBoxApi;
+import org.dromara.sis.service.*;
+import org.springframework.stereotype.Component;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 {
+
+ private final HuaWeiBoxApi huaWeiBoxApi;
+ private final ISisFloorInfoService floorInfoService;
+ private final ISisAuthRecordService authRecordService;
+ private final ISisElevatorInfoService elevatorInfoService;
+ private final ISisDeviceBindRefService deviceBindRefService;
+ private final ISisAccessControlService accessControlService;
+ private final ISisElevatorFloorRefService elevatorFloorRefService;
+
+ private final AccessControlService e8AccessControlService;
+
+ private static final int COMM_UPLOAD_FACESNAP_RESULT = 0x1112;
+
+ @Override
+ public boolean invoke(int lCommand, HCNetSDK.NET_DVR_ALARMER pAlarmer, Pointer pAlarmInfo, int dwBufLen, Pointer pUser) {
+ if (lCommand == COMM_UPLOAD_FACESNAP_RESULT) {// 读取抓拍人脸数据
+ long s = System.currentTimeMillis();
+ log.info("hik 抓拍信息上报完成,lCommand={}", lCommand);
+ HCNetSDK.NET_VCA_FACESNAP_RESULT result = new HCNetSDK.NET_VCA_FACESNAP_RESULT();
+ result.write();
+ Pointer pItsPlateInfo = result.getPointer();
+ pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, result.size()), 0, result.size());
+ result.read();
+
+ // 读取人脸小图
+ ByteBuffer buffers = result.pBuffer1.getByteBuffer(0, result.dwFacePicLen);
+ byte[] smallImg = new byte[result.dwFacePicLen];
+ buffers.rewind();
+ buffers.get(smallImg);
+
+ // 读取人脸大图
+ /*ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen);
+ byte[] bigImg = new byte[result.dwBackgroundPicLen];
+ buffers1.rewind();
+ buffers1.get(bigImg);*/
+
+ //设备ip
+ String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim();
+ // 设备绑定关系
+ List bindRefList = deviceBindRefService.queryByDeviceIp(sAlarmInfo);
+ if (CollUtil.isEmpty(bindRefList)) {
+ log.info("当前报警设备未绑定门禁/梯控,不做处理!");
+ return true;
+ }
+
+ // todo 进行人脸比对
+ String smallImgBase64Str = Base64Encoder.encode(smallImg);
+ long s1 = System.currentTimeMillis();
+ Long person = huaWeiBoxApi.findPerson(smallImgBase64Str);
+ log.info("人脸比对执行完成,耗时:{}", System.currentTimeMillis() - s1);
+ if (person == null) {
+ log.info("未命中人脸数据,暂不处理。");
+ return true;
+ }
+ log.info("人脸比对完成,personId={}", person);
+
+ // 授权记录
+ List authVoList = authRecordService.checkAuth(person);
+ // 获取门禁id
+ Collection acIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 1).map(SisAuthRecordVo::getDeviceId).toList();
+ if (CollUtil.isNotEmpty(acIds)) {
+ acIds.forEach(id -> {
+ Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null);
+ SisAccessControlVo ac = accessControlService.queryById(deviceId);
+ if (ac != null) {
+ log.info("调用门禁服务远程开门");
+ RemoteOpenDoorReq req = new RemoteOpenDoorReq();
+ req.setType(0);
+ RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData();
+ data.setDeviceId(Long.parseLong(ac.getOutCode()));
+ data.setDoorId(Long.parseLong(ac.getOutCode()));
+ req.setControlList(List.of(data));
+ Boolean flag = e8AccessControlService.remoteOpenDoor(req);
+ log.info("远程开门结果,result={}", flag);
+ }
+ });
+ }
+
+
+ // 获取电梯ids
+ Collection eleIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 2).map(SisAuthRecordVo::getDeviceId).toList();
+ if (CollUtil.isNotEmpty(eleIds)) {
+ eleIds.forEach(id -> {
+ Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null);
+ SisElevatorInfoVo ele = elevatorInfoService.queryById(deviceId);
+ if (ele != null) {
+ log.info("下发电梯权限");
+ // 根据建筑ID获取楼层信息
+ SisFloorInfoVo floorInfo = floorInfoService.queryByBuildingId(ele.getBuildingId());
+ // 获取电梯⇄楼层关联信息
+ List floorRefList = elevatorFloorRefService.queryByElevatorId(deviceId);
+ // 获取楼层数组
+ List layerArray = generateFloorArray(floorInfo.getMinLayer().intValue(), floorInfo.getMaxLayer().intValue());
+
+
+ layerArray.forEach(layer -> {
+ SisElevatorFloorRefVo floorRef = floorRefList.stream()
+ .filter(vo -> vo.getLayerNum().intValue() == layer) // 直接使用 layer
+ .findFirst()
+ .orElse(null);
+
+ if (floorRef == null) {
+ HikApiService.getInstance().controlGateway(ele.getControlIp(), layer, 3);
+ } else {
+ HikApiService.getInstance().controlGateway(ele.getControlIp(), layer, 2);
+ }
+ });
+ }
+
+ });
+ }
+
+// List arrs = Arrays.asList(2, 2, 2, 3, 3, 3 ,3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
+// List arrs = Arrays.asList(3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
+// for (int i = 0; i < arrs.size(); i++) {
+// HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i));
+// }
+// log.info("权限下发执行完成,耗时:{}", System.currentTimeMillis() - s);
+// try {
+// Thread.sleep(10000L);
+// List ass = Arrays.asList(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
+// for (int i = 0; i < arrs.size(); i++) {
+// HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i));
+// }
+// } catch (InterruptedException e) {
+// throw new RuntimeException(e);
+// }
+ } else {
+ log.info("未知报警类型,lCommand={}", lCommand);
+ }
+ return true;
+ }
+
+ //输入最低层,最高层,返回楼层数组
+ public List generateFloorArray(int minLayer, int maxLayer) {
+
+ // 验证输入范围
+ if (minLayer > maxLayer) {
+ throw new IllegalArgumentException("最低层不能大于最高层");
+ }
+ // 使用List动态收集楼层
+ List layerList = new ArrayList<>();
+ // 遍历所有楼层,跳过0层
+ for (int layer = minLayer; layer <= maxLayer; layer++) {
+ if (layer != 0) {
+ layerList.add(layer);
+ }
+ }
+
+ return layerList;
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/DoorService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/DoorService.java
index 59c55242..1f218a92 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/DoorService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/DoorService.java
@@ -182,6 +182,7 @@ public class DoorService extends SdkBaseServer {
public static boolean controlGateway(int lUserID, int lGatewayIndex, int dwStaic) {
boolean b = getHcNetSDK().NET_DVR_ControlGateway(lUserID, lGatewayIndex, dwStaic);
+ log.info("楼层数据下发结果,楼层={},result={}", lGatewayIndex, b);
if (!b) {
int i = getHcNetSDK().NET_DVR_GetLastError();
log.error("梯控控制失败, errCode={}", i);
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java
index 9353671e..cad9ba8e 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java
@@ -1,6 +1,7 @@
package org.dromara.sis.sdk.hik.service;
import com.sun.jna.Native;
+import com.sun.jna.Pointer;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sis.sdk.hik.HCNetSDK;
import org.springframework.util.Assert;
@@ -18,7 +19,6 @@ public class SdkBaseServer {
*/
public static final int LOGIN_FAIL_CODE = -1;
-
public static HCNetSDK getHcNetSDK() {
if (hcNetSDK == null) {
throw new RuntimeException("HIK sdk 初始化失败!");
@@ -83,6 +83,41 @@ public class SdkBaseServer {
return state;
}
+ /**
+ * 开启hik 设备报警
+ *
+ * @param iIndex 回调函数索引,取值范围:[0,15]
+ * @param callBack 回调函数
+ * @return
+ */
+ public static boolean setAlarmCallBack(int iIndex, HCNetSDK.FMSGCallBack_V31 callBack) {
+ boolean b = hcNetSDK.NET_DVR_SetDVRMessageCallBack_V50(iIndex, callBack, null);
+ if (b) {
+ log.info("hik 报警回调函数设置完成,iIndex={}", iIndex);
+ }
+ return b;
+ }
+
+ public static boolean setAlarmChan(int lUserID){
+ //报警布防参数设置
+ HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50 m_strAlarmInfoV50 = new HCNetSDK.NET_DVR_SETUPALARM_PARAM_V50();
+ m_strAlarmInfoV50.dwSize = m_strAlarmInfoV50.size();
+ m_strAlarmInfoV50.byLevel = 0; //布防等级
+ m_strAlarmInfoV50.byAlarmInfoType = 1; // 智能交通报警信息上传类型:0- 老报警信息(NET_DVR_PLATE_RESULT),1- 新报警信息(NET_ITS_PLATE_RESULT)
+ m_strAlarmInfoV50.byRetAlarmTypeV40 = 1; //0- 移动侦测、视频丢失、遮挡、IO信号量等报警信息以普通方式上传(报警类型:COMM_ALARM_V30,报警信息结构体:NET_DVR_ALARMINFO_V30),
+ // 1- 报警信息以数据可变长方式上传(报警类型:COMM_ALARM_V40,报警信息结构体:NET_DVR_ALARMINFO_V40,设备若不支持则仍以普通方式上传)
+ m_strAlarmInfoV50.byDeployType = 0; //布防类型:0-客户端布防,1-实时布防
+ m_strAlarmInfoV50.write();
+ int lAlarmHandle = hcNetSDK.NET_DVR_SetupAlarmChan_V50(lUserID, m_strAlarmInfoV50, Pointer.NULL, 0);
+ if (lAlarmHandle == -1) {
+ System.err.println("布防失败,错误码为" + hcNetSDK.NET_DVR_GetLastError());
+ return false;
+ } else {
+ System.out.println("布防成功");
+ return true;
+ }
+ }
+
/**
* 登出操作
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java
index a1bec530..397c5e7d 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/HuaWeiBoxApi.java
@@ -1,7 +1,6 @@
package org.dromara.sis.sdk.huawei;
import org.dromara.sis.sdk.huawei.domain.AddHWPersonReq;
-import org.dromara.sis.sdk.huawei.domain.FinaHWPersonReq;
import java.util.Collection;
import java.util.List;
@@ -32,8 +31,8 @@ public interface HuaWeiBoxApi {
/**
* 根据抓拍图片比对,返回人员ID
*
- * @param req 入参
+ * @param base64Img 入参
* @return Long
*/
- Long findPerson(FinaHWPersonReq req);
+ Long findPerson(String base64Img);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/FinaHWPersonReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/FinaHWPersonReq.java
index 31520f94..2073291f 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/FinaHWPersonReq.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/domain/FinaHWPersonReq.java
@@ -8,7 +8,6 @@ import lombok.NoArgsConstructor;
* @apiNote FinaHWPersonReq
* @since 2025/7/10
*/
-@NoArgsConstructor
@Data
public class FinaHWPersonReq {
/**
@@ -23,6 +22,11 @@ public class FinaHWPersonReq {
* page
*/
private PageDTO page;
+
+ public FinaHWPersonReq() {
+ this.page = new PageDTO(); // 显式初始化 page
+ }
+
/**
* picture
*/
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java
index d123f085..b89ce154 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/service/HuaWeiBoxApiService.java
@@ -82,25 +82,35 @@ public class HuaWeiBoxApiService implements HuaWeiBoxApi {
/**
* 根据抓拍图片比对,返回人员ID
*
- * @param req 入参
+ * @param base64Img 入参
* @return Long
*/
@Override
- public Long findPerson(FinaHWPersonReq req){
+ public Long findPerson(String base64Img) {
String url = "/sdk_service/rest/facerepositories/peoples";
+ FinaHWPersonReq req = new FinaHWPersonReq();
+ FinaHWPersonReq.PictureDTO picture = new FinaHWPersonReq.PictureDTO();
+ picture.setBase64(base64Img);
+ req.setPicture(picture);
+
String jsonReq = JSONUtil.toJsonStr(req);
String jsonStrRes = huaWeiHttp.doPost(url, jsonReq);
JSONObject jsonRes = JSONUtil.parseObj(jsonStrRes);
if (jsonRes.getInt("resultCode") != 0) {
- log.error("华为盒子人脸比对败,msg:{}", jsonRes.getStr("resultMsg"));
+ log.error("调用华为盒子人脸比对接口失败,code:{},msg:{}", jsonRes.getInt("resultCode"), jsonRes.getStr("resultMsg"));
return null;
}
- JSONArray jsonArr = jsonRes.getJSONArray("algorithmCode");
+ JSONArray jsonArr = jsonRes.getJSONArray("algorithmResults");
JSONObject obj = jsonArr.getJSONObject(0);
+ if (Integer.parseInt(obj.getStr("number")) == 0) {
+ log.error("无人脸比对数据");
+ return null;
+ }
+
JSONArray peopleList = obj.getJSONArray("peopleList");
JSONObject people = peopleList.getJSONObject(0);
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java
index eaf48a38..60c58ff0 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/huawei/utils/HuaWeiHttp.java
@@ -11,6 +11,10 @@ import org.dromara.common.redis.utils.RedisUtils;
import org.springframework.stereotype.Component;
import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
/**
* @author lsm
@@ -21,7 +25,7 @@ import java.util.Map;
@Component
public class HuaWeiHttp {
- private static final String BASE_URL = "https://192.168.110.195:18531";
+ private static final String BASE_URL = "https://47.109.37.87:18000";
private static final String USERNAME = "huawei";
private static final String PASSWORD = "qweasd123";
@@ -37,13 +41,14 @@ public class HuaWeiHttp {
// 发送请求获取响应
// 使用 try-with-resources 确保资源释放
try (HttpResponse response = HttpRequest.post(url)
- .header("Content-Type", "application/json")
- .header("Cache-Control", "no-cache")
- .body(jsonStr)
- .execute()) {
+ .header("Content-Type", "application/json")
+ .header("Cache-Control", "no-cache")
+ .body(jsonStr)
+ .execute()) {
if (response.getStatus() == 200 && response.getCookie("JSESSIONID") != null) {
RedisUtils.setCacheObject("JSESSIONID", response.getCookie("JSESSIONID").toString());
RedisUtils.expire("JSESSIONID", 1800);
+ this.keepAlive();
return true;
} else {
log.error("华为盒子登录失败,msg:{}", response.body());
@@ -52,6 +57,66 @@ public class HuaWeiHttp {
return false;
}
+ // 保活
+ public void keepAlive() {
+ // 创建单线程调度器
+ ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
+ String url = BASE_URL + "/common/keepAlive";
+
+ // 保存任务引用,用于后续取消
+ final ScheduledFuture>[] heartbeatFuture = new ScheduledFuture>[1];
+
+ // 心跳任务
+ Runnable heartbeatTask = () -> {
+ log.info("开始心跳执行华为盒子Session保活");
+ // 发送请求获取响应
+ // 使用 try-with-resources 确保资源释放
+ try (HttpResponse response = HttpRequest.post(url)
+ .header("Content-Type", "application/json")
+ .header("Cache-Control", "no-cache")
+ .header("Cookie", RedisUtils.getCacheObject("JSESSIONID"))
+ .execute()) {
+ if (response.getStatus() == 200 && JSONUtil.parseObj(response.body()).getInt("resultCode") == 0) {
+ RedisUtils.expire("JSESSIONID", 1800);
+ log.info("保活成功");
+ }else {
+ log.info("保活失败");
+ shutdownHeartbeat(scheduler, heartbeatFuture[0]);
+ }
+ } catch (Exception e) {
+ // 异常:立即关闭心跳
+ log.error("保活请求异常: {}", e.getMessage());
+ shutdownHeartbeat(scheduler, heartbeatFuture[0]);
+ }
+ };
+
+ // 初始延迟0秒,之后每20分钟执行一次
+ heartbeatFuture[0] = scheduler.scheduleAtFixedRate(heartbeatTask, 20, 20, TimeUnit.MINUTES);
+ log.info("心跳任务已启动,首次执行将在20分钟后");
+
+ // 添加关闭钩子确保程序退出时关闭调度器
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (!scheduler.isShutdown()) {
+ scheduler.shutdown();
+ log.info("程序退出,心跳调度器已关闭");
+ }
+ }));
+ }
+
+ private static void shutdownHeartbeat(ScheduledExecutorService scheduler, ScheduledFuture> future) {
+ // 取消心跳任务
+ if (future != null && !future.isCancelled()) {
+ future.cancel(false);
+ log.error("保活失败,心跳任务已取消");
+ }
+
+ // 关闭调度器
+ if (!scheduler.isShutdown()) {
+ scheduler.shutdown();
+ log.info("心跳调度器已关闭");
+ }
+ }
+
/**
* 发起Post请求
*
@@ -70,11 +135,11 @@ public class HuaWeiHttp {
String api = BASE_URL + url;
try (HttpResponse response = HttpRequest.post(api)
- .header("Content-Type", "application/json")
- .header("Cache-Control", "no-cache")
- .header("Cookie", RedisUtils.getCacheObject("JSESSIONID"))
- .body(jsonStr)
- .execute()) {
+ .header("Content-Type", "application/json")
+ .header("Cache-Control", "no-cache")
+ .header("Cookie", RedisUtils.getCacheObject("JSESSIONID"))
+ .body(jsonStr)
+ .execute()) {
if (response.isOk()) {
return response.body();
} else {
@@ -109,10 +174,10 @@ public class HuaWeiHttp {
String fullUrl = HttpUtil.urlWithForm(api, map, null, false);
try (HttpResponse response = HttpRequest.delete(fullUrl)
- .header("Content-Type", "application/json")
- .header("Cache-Control", "no-cache")
- .header("Cookie", RedisUtils.getCacheObject("JSESSIONID"))
- .execute()) {
+ .header("Content-Type", "application/json")
+ .header("Cache-Control", "no-cache")
+ .header("Cookie", RedisUtils.getCacheObject("JSESSIONID"))
+ .execute()) {
return response.body();
}
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/unview/service/VideoAlarmService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/unview/service/VideoAlarmService.java
index a3b3f2dd..4f02b8f4 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/unview/service/VideoAlarmService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/unview/service/VideoAlarmService.java
@@ -3,11 +3,8 @@ package org.dromara.sis.sdk.unview.service;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.dromara.sis.domain.SisDeviceBindRef;
-import org.dromara.sis.domain.enums.ControlTypeEnum;
-import org.dromara.sis.domain.vo.SisAuthRecordVo;
import org.dromara.sis.sdk.e8.AccessControlService;
-import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq;
+import org.dromara.sis.sdk.hik.HikApiService;
import org.dromara.sis.sdk.unview.model.UvModel;
import org.dromara.sis.sdk.unview.model.enums.AlarmTypeEnum;
import org.dromara.sis.service.ISisAccessControlService;
@@ -16,8 +13,8 @@ import org.dromara.sis.service.ISisDeviceBindRefService;
import org.dromara.sis.service.ISisDeviceManageService;
import org.springframework.stereotype.Service;
+import java.util.Arrays;
import java.util.List;
-import java.util.Objects;
/**
* 宇视人体设备告警数据处理
@@ -111,6 +108,7 @@ public class VideoAlarmService {
*/
private void handleFacialCapture(UvModel.AlarmReportInfo alarmReportData) {
+
}
/**
@@ -130,54 +128,57 @@ public class VideoAlarmService {
log.info("上报设备信息不存在,不处理词条数据。");
return;
}
+ log.info("开始电梯权限下发。。。。。。。。。。。。。。。。。。。。。。");
compareResults.forEach(result -> {
- // 查询设备绑定关联关系表
- SisDeviceBindRef ref = deviceBindRefService.queryByDeviceIp(channelInfo.getIpc_addr());
- if (ref == null) {
- return;
- }
- // 门禁
- if (Objects.equals(ref.getControlType(), ControlTypeEnum.ACCESS_CONTROL.getCode())) {
-// SisAccessControlVo controlVo = sisAccessControlService.queryById(ref.getBindId());
-// if (controlVo == null) {
-// log.info("设备[{}]未和门禁绑定,不处理此条数据。", channelInfo.getIpc_addr());
-// return;
-// }
- // 人像库id
-// Integer libId = result.getLib_id();
- // 宇视人员id
- Integer personId = result.getPerson_id();
- // 门禁id
- Long accessControlId = ref.getBindId();
- // 校验人脸是偶有同行此门禁的权限
- SisAuthRecordVo recordVo = authRecordService.checkAuth(personId, accessControlId);
- // 如果有通行权限,则打开门禁
- if (recordVo == null) {
- log.info("此人像[{}]没有门禁[{}]的通行权限。", personId, accessControlId);
- }
- // 打开门禁
- RemoteOpenDoorReq remoteOpenDoorReq = new RemoteOpenDoorReq();
- remoteOpenDoorReq.setType(0);
- remoteOpenDoorReq.setReason("宇视人像识别,人像id=" + recordVo.getImgId());
- remoteOpenDoorReq.setOperatorId(0L);
- RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData();
- data.setDoorId(recordVo.getDoorId());
- data.setDeviceId(recordVo.getDeviceId());
- remoteOpenDoorReq.setControlList(List.of(data));
- log.info("远程开门参数,params={}", JSONObject.toJSONString(remoteOpenDoorReq));
- Boolean b = accessControlService.remoteOpenDoor(remoteOpenDoorReq);
- log.info("远程开门完成, result={}", b);
- }
- // 远程呼梯
- if (Objects.equals(ref.getControlType(), ControlTypeEnum.REMOTE_CALL_ELEVATOR.getCode())) {
- // TODO 待实现
+ // 下发梯控权限数据
+// List arrs = Arrays.asList(2, 2, 2, 3, 3, 3 ,3, 3, 3, 3, 3, 3, 3, 3, 3, 3);
+ List arrs = Arrays.asList(3, 3, 3, 2, 2, 2 ,2, 2, 2, 2, 2, 2, 2, 2, 2, 2);
+ for (int i = 0; i < arrs.size(); i++) {
+ HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i));
}
- // 梯控
- if (Objects.equals(ref.getControlType(), ControlTypeEnum.ELEVATOR_CONTROL.getCode())) {
- // TODO 待实现
- }
});
+// compareResults.forEach(result -> {
+// // 查询设备绑定关联关系表
+// SisDeviceBindRef ref = deviceBindRefService.queryByDeviceIp(channelInfo.getIpc_addr());
+// if (ref == null) {
+// return;
+// }
+// // 门禁
+// if (Objects.equals(ref.getControlType(), ControlTypeEnum.ACCESS_CONTROL.getCode())) {
+// // 宇视人员id
+// Integer personId = result.getPerson_id();
+// // 门禁id
+// Long accessControlId = ref.getBindId();
+// // 校验人脸是偶有同行此门禁的权限
+// SisAuthRecordVo recordVo = authRecordService.checkAuth(personId, accessControlId);
+// // 如果有通行权限,则打开门禁
+// if (recordVo == null) {
+// log.info("此人像[{}]没有门禁[{}]的通行权限。", personId, accessControlId);
+// }
+// // 打开门禁
+// RemoteOpenDoorReq remoteOpenDoorReq = new RemoteOpenDoorReq();
+// remoteOpenDoorReq.setType(0);
+// remoteOpenDoorReq.setReason("宇视人像识别,人像id=" + recordVo.getImgId());
+// remoteOpenDoorReq.setOperatorId(0L);
+// RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData();
+// data.setDoorId(recordVo.getDoorId());
+// data.setDeviceId(recordVo.getDeviceId());
+// remoteOpenDoorReq.setControlList(List.of(data));
+// log.info("远程开门参数,params={}", JSONObject.toJSONString(remoteOpenDoorReq));
+// Boolean b = accessControlService.remoteOpenDoor(remoteOpenDoorReq);
+// log.info("远程开门完成, result={}", b);
+// }
+// // 远程呼梯
+// if (Objects.equals(ref.getControlType(), ControlTypeEnum.REMOTE_CALL_ELEVATOR.getCode())) {
+// // TODO 待实现
+// }
+//
+// // 梯控
+// if (Objects.equals(ref.getControlType(), ControlTypeEnum.ELEVATOR_CONTROL.getCode())) {
+// // TODO 待实现
+// }
+// });
}
/**
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
index fa6b77c3..d9bdb48b 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAccessControlService.java
@@ -82,4 +82,11 @@ public interface ISisAccessControlService {
*/
List> queryAcTree();
+ /**
+ * 同步门禁设备
+ *
+ * @return Boolean
+ */
+ Boolean syncE8();
+
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java
index c38079d5..8858c71c 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java
@@ -1,12 +1,11 @@
package org.dromara.sis.service;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.core.domain.TreeNode;
import org.dromara.sis.domain.SisAuthRecord;
-import org.dromara.sis.domain.bo.AuthLibBo;
-import org.dromara.sis.domain.bo.SingleAuthRecordBo;
-import org.dromara.sis.domain.bo.SisAuthRecordBo;
import org.dromara.sis.domain.vo.SisAuthRecordVo;
+import org.dromara.sis.domain.bo.SisAuthRecordBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
@@ -15,7 +14,7 @@ import java.util.List;
* 授权记录Service接口
*
* @author lsm
- * @date 2025-06-28
+ * @since 2025-07-14
*/
public interface ISisAuthRecordService {
@@ -70,30 +69,31 @@ public interface ISisAuthRecordService {
Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
/**
- * 通过宇视图片id和门禁id校验此图像是否有通行权限
+ * 查询库id授权的设备
*
- * @param personId 人像id
- * @param accessControlId 门禁id
- * @return 返回授权记录
- */
- SisAuthRecordVo checkAuth(Integer personId, Long accessControlId);
-
- /**
- * 单个人像授权
- *
- * @param bo 授权信息
- * @return 是否授权成功
- */
- Boolean singleAuth(SingleAuthRecordBo bo);
-
- Boolean deleteByLibId(Long libId);
-
- Boolean authLib(AuthLibBo bo);
-
- /**
- * 插叙库id授权的设备
* @param libId 人像库id
- * @return
+ * @return List
*/
List queryAuthDevice(String libId);
+
+ /**
+ * 根据人像库id删除授权记录
+ *
+ * @param libId 人像库id
+ */
+ Boolean deleteByLibId(Long libId);
+
+ /**
+ * 查询所有可授权设备树
+ *
+ * @return List>
+ */
+ List> authDeviceTree();
+
+ /**
+ * 根据人脸比对ID,返回授权记录
+ *
+ * @param personId 人脸比对ID
+ */
+ List checkAuth(Long personId);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java
index d47a2f8f..8b04d92c 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java
@@ -81,7 +81,7 @@ public interface ISisDeviceBindRefService {
* @param ipcAddr 设备ip
* @return 返回关联关系表
*/
- SisDeviceBindRef queryByDeviceIp(String ipcAddr);
+ List queryByDeviceIp(String ipcAddr);
/**
* 批量写入设备绑定关系
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java
new file mode 100644
index 00000000..fdca3de7
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java
@@ -0,0 +1,75 @@
+package org.dromara.sis.service;
+
+import org.dromara.sis.domain.vo.SisElevatorFloorRefVo;
+import org.dromara.sis.domain.bo.SisElevatorFloorRefBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 电梯⇄楼层关联Service接口
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+public interface ISisElevatorFloorRefService {
+
+ /**
+ * 查询电梯⇄楼层关联
+ *
+ * @param id 主键
+ * @return 电梯⇄楼层关联
+ */
+ SisElevatorFloorRefVo queryById(Long id);
+
+ /**
+ * 分页查询电梯⇄楼层关联列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 电梯⇄楼层关联分页列表
+ */
+ TableDataInfo queryPageList(SisElevatorFloorRefBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的电梯⇄楼层关联列表
+ *
+ * @param bo 查询条件
+ * @return 电梯⇄楼层关联列表
+ */
+ List queryList(SisElevatorFloorRefBo bo);
+
+ /**
+ * 新增电梯⇄楼层关联
+ *
+ * @param bo 电梯⇄楼层关联
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(SisElevatorFloorRefBo bo);
+
+ /**
+ * 修改电梯⇄楼层关联
+ *
+ * @param bo 电梯⇄楼层关联
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(SisElevatorFloorRefBo bo);
+
+ /**
+ * 校验并批量删除电梯⇄楼层关联信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 根据电梯id,获取电梯⇄楼层关联信息
+ *
+ * @param elevatorId 电梯id
+ */
+ List queryByElevatorId(Long elevatorId);
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorInfoService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorInfoService.java
index 657bc1df..c1ab87f9 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorInfoService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorInfoService.java
@@ -71,4 +71,12 @@ public interface ISisElevatorInfoService {
* @return 返回电梯列表
*/
List queryAll();
+
+ /**
+ * 根据查询列表
+ *
+ * @param ids 电梯id
+ * @return 列表
+ */
+ List queryListByIds(Collection ids);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java
new file mode 100644
index 00000000..928dca17
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java
@@ -0,0 +1,76 @@
+package org.dromara.sis.service;
+
+import org.dromara.sis.domain.vo.SisFloorInfoVo;
+import org.dromara.sis.domain.bo.SisFloorInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 建筑物楼层信息Service接口
+ *
+ * @author lsm
+ * @since 2025-07-15
+ */
+public interface ISisFloorInfoService {
+
+ /**
+ * 查询建筑物楼层信息
+ *
+ * @param floorId 主键
+ * @return 建筑物楼层信息
+ */
+ SisFloorInfoVo queryById(Long floorId);
+
+ /**
+ * 分页查询建筑物楼层信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 建筑物楼层信息分页列表
+ */
+ TableDataInfo queryPageList(SisFloorInfoBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的建筑物楼层信息列表
+ *
+ * @param bo 查询条件
+ * @return 建筑物楼层信息列表
+ */
+ List queryList(SisFloorInfoBo bo);
+
+ /**
+ * 新增建筑物楼层信息
+ *
+ * @param bo 建筑物楼层信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(SisFloorInfoBo bo);
+
+ /**
+ * 修改建筑物楼层信息
+ *
+ * @param bo 建筑物楼层信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(SisFloorInfoBo bo);
+
+ /**
+ * 校验并批量删除建筑物楼层信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection