diff --git a/.gitea/workflows/dev.yml b/.gitea/workflows/dev.yml
index b510040d..55734296 100644
--- a/.gitea/workflows/dev.yml
+++ b/.gitea/workflows/dev.yml
@@ -18,14 +18,14 @@ jobs:
- name: cp
run: copy ./ruoyi-modules/Property/target/Property.jar C:\devtool\server
- name: kill
- run: cmd /c for /f "tokens=5" %a in ('netstat -ano ^| findstr ":10001" ^| findstr "LISTENING"') do @taskkill /F /PID %a >nul 2>nul
+ run: Get-NetTCPConnection -LocalPort 10001 -State Listening -ErrorAction SilentlyContinue | ForEach-Object -Process { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }
- name: run
run: java -jar C:\devtool\server\Property.jar
-
+
# - copy ./ruoyi-modules/Property/target/Property.jar C:\devtool\server
# - pwd
# - java -jar ./docker/jar/Property.jar
-
+
# - name: cd
# run: cd ruoyi-modules/Property
# - name: Build with Maven
@@ -41,7 +41,7 @@ jobs:
# # 等待注册中心启动
# sleep 30
-
+
# done
# 保持工作流运行,避免服务被终止
diff --git a/pom.xml b/pom.xml
index 1d8506ee..8a211f15 100644
--- a/pom.xml
+++ b/pom.xml
@@ -98,6 +98,8 @@
nacos
nacos
127.0.0.1:4560
+
+
diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml
index 86bf0b99..a4bdd55f 100644
--- a/ruoyi-auth/pom.xml
+++ b/ruoyi-auth/pom.xml
@@ -10,6 +10,7 @@
ruoyi-auth
+
ruoyi-auth 认证授权中心
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsPlanProductController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsPlanProductController.java
new file mode 100644
index 00000000..06d93c68
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsPlanProductController.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.PlantsPlanProductVo;
+import org.dromara.property.domain.bo.PlantsPlanProductBo;
+import org.dromara.property.service.IPlantsPlanProductService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 绿植租赁-租赁方案-绿植
+ * 前端访问路由地址为:/property/planProduct
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/planProduct")
+public class PlantsPlanProductController extends BaseController {
+
+ private final IPlantsPlanProductService plantsPlanProductService;
+
+ /**
+ * 查询绿植租赁-租赁方案-绿植列表
+ */
+ @SaCheckPermission("property:planProduct:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PlantsPlanProductBo bo, PageQuery pageQuery) {
+ return plantsPlanProductService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出绿植租赁-租赁方案-绿植列表
+ */
+ @SaCheckPermission("property:planProduct:export")
+ @Log(title = "绿植租赁-租赁方案-绿植", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PlantsPlanProductBo bo, HttpServletResponse response) {
+ List list = plantsPlanProductService.queryList(bo);
+ ExcelUtil.exportExcel(list, "绿植租赁-租赁方案-绿植", PlantsPlanProductVo.class, response);
+ }
+
+ /**
+ * 获取绿植租赁-租赁方案-绿植详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:planProduct:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(plantsPlanProductService.queryById(id));
+ }
+
+ /**
+ * 新增绿植租赁-租赁方案-绿植
+ */
+ @SaCheckPermission("property:planProduct:add")
+ @Log(title = "绿植租赁-租赁方案-绿植", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PlantsPlanProductBo bo) {
+ return toAjax(plantsPlanProductService.insertByBo(bo));
+ }
+
+ /**
+ * 修改绿植租赁-租赁方案-绿植
+ */
+ @SaCheckPermission("property:planProduct:edit")
+ @Log(title = "绿植租赁-租赁方案-绿植", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PlantsPlanProductBo bo) {
+ return toAjax(plantsPlanProductService.updateByBo(bo));
+ }
+
+ /**
+ * 删除绿植租赁-租赁方案-绿植
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:planProduct:remove")
+ @Log(title = "绿植租赁-租赁方案-绿植", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(plantsPlanProductService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsProductController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsProductController.java
new file mode 100644
index 00000000..1f89917d
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsProductController.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.PlantsProductVo;
+import org.dromara.property.domain.bo.PlantsProductBo;
+import org.dromara.property.service.IPlantsProductService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 绿植租赁-绿植产品
+ * 前端访问路由地址为:/property/property
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/plantsProduct")
+public class PlantsProductController extends BaseController {
+
+ private final IPlantsProductService plantsProductService;
+
+ /**
+ * 查询绿植租赁-绿植产品列表
+ */
+ @SaCheckPermission("property:plantsProduct:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PlantsProductBo bo, PageQuery pageQuery) {
+ return plantsProductService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出绿植租赁-绿植产品列表
+ */
+ @SaCheckPermission("property:plantsProduct:export")
+ @Log(title = "绿植租赁-绿植产品", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PlantsProductBo bo, HttpServletResponse response) {
+ List list = plantsProductService.queryList(bo);
+ ExcelUtil.exportExcel(list, "绿植租赁-绿植产品", PlantsProductVo.class, response);
+ }
+
+ /**
+ * 获取绿植租赁-绿植产品详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:plantsProduct:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(plantsProductService.queryById(id));
+ }
+
+ /**
+ * 新增绿植租赁-绿植产品
+ */
+ @SaCheckPermission("property:plantsProduct:add")
+ @Log(title = "绿植租赁-绿植产品", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PlantsProductBo bo) {
+ return toAjax(plantsProductService.insertByBo(bo));
+ }
+
+ /**
+ * 修改绿植租赁-绿植产品
+ */
+ @SaCheckPermission("property:plantsProduct:edit")
+ @Log(title = "绿植租赁-绿植产品", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PlantsProductBo bo) {
+ return toAjax(plantsProductService.updateByBo(bo));
+ }
+
+ /**
+ * 删除绿植租赁-绿植产品
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:plantsProduct:remove")
+ @Log(title = "绿植租赁-绿植产品", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(plantsProductService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsRentalPlanController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsRentalPlanController.java
new file mode 100644
index 00000000..c014d2b9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/PlantsRentalPlanController.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.PlantsRentalPlanVo;
+import org.dromara.property.domain.bo.PlantsRentalPlanBo;
+import org.dromara.property.service.IPlantsRentalPlanService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 绿植租赁-租赁方案
+ * 前端访问路由地址为:/property/rentalPlan
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/rentalPlan")
+public class PlantsRentalPlanController extends BaseController {
+
+ private final IPlantsRentalPlanService plantsRentalPlanService;
+
+ /**
+ * 查询绿植租赁-租赁方案列表
+ */
+ @SaCheckPermission("property:rentalPlan:list")
+ @GetMapping("/list")
+ public TableDataInfo list(PlantsRentalPlanBo bo, PageQuery pageQuery) {
+ return plantsRentalPlanService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出绿植租赁-租赁方案列表
+ */
+ @SaCheckPermission("property:rentalPlan:export")
+ @Log(title = "绿植租赁-租赁方案", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PlantsRentalPlanBo bo, HttpServletResponse response) {
+ List list = plantsRentalPlanService.queryList(bo);
+ ExcelUtil.exportExcel(list, "绿植租赁-租赁方案", PlantsRentalPlanVo.class, response);
+ }
+
+ /**
+ * 获取绿植租赁-租赁方案详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:rentalPlan:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(plantsRentalPlanService.queryById(id));
+ }
+
+ /**
+ * 新增绿植租赁-租赁方案
+ */
+ @SaCheckPermission("property:rentalPlan:add")
+ @Log(title = "绿植租赁-租赁方案", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PlantsRentalPlanBo bo) {
+ return toAjax(plantsRentalPlanService.insertByBo(bo));
+ }
+
+ /**
+ * 修改绿植租赁-租赁方案
+ */
+ @SaCheckPermission("property:rentalPlan:edit")
+ @Log(title = "绿植租赁-租赁方案", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PlantsRentalPlanBo bo) {
+ return toAjax(plantsRentalPlanService.updateByBo(bo));
+ }
+
+ /**
+ * 删除绿植租赁-租赁方案
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:rentalPlan:remove")
+ @Log(title = "绿植租赁-租赁方案", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(plantsRentalPlanService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbAreaGroupController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbAreaGroupController.java
new file mode 100644
index 00000000..47a33c92
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbAreaGroupController.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.TbAreaGroupVo;
+import org.dromara.property.domain.bo.TbAreaGroupBo;
+import org.dromara.property.service.ITbAreaGroupService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 区域组信息
+ * 前端访问路由地址为:/property/areaGroup
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/areaGroup")
+public class TbAreaGroupController extends BaseController {
+
+ private final ITbAreaGroupService tbAreaGroupService;
+
+ /**
+ * 查询区域组信息列表
+ */
+ @SaCheckPermission("property:areaGroup:list")
+ @GetMapping("/list")
+ public TableDataInfo list(TbAreaGroupBo bo, PageQuery pageQuery) {
+ return tbAreaGroupService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出区域组信息列表
+ */
+ @SaCheckPermission("property:areaGroup:export")
+ @Log(title = "区域组信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(TbAreaGroupBo bo, HttpServletResponse response) {
+ List list = tbAreaGroupService.queryList(bo);
+ ExcelUtil.exportExcel(list, "区域组信息", TbAreaGroupVo.class, response);
+ }
+
+ /**
+ * 获取区域组信息详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:areaGroup:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(tbAreaGroupService.queryById(id));
+ }
+
+ /**
+ * 新增区域组信息
+ */
+ @SaCheckPermission("property:areaGroup:add")
+ @Log(title = "区域组信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody TbAreaGroupBo bo) {
+ return toAjax(tbAreaGroupService.insertByBo(bo));
+ }
+
+ /**
+ * 修改区域组信息
+ */
+ @SaCheckPermission("property:areaGroup:edit")
+ @Log(title = "区域组信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody TbAreaGroupBo bo) {
+ return toAjax(tbAreaGroupService.updateByBo(bo));
+ }
+
+ /**
+ * 删除区域组信息
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:areaGroup:remove")
+ @Log(title = "区域组信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(tbAreaGroupService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbUserGroupController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbUserGroupController.java
new file mode 100644
index 00000000..bfdc90c3
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/TbUserGroupController.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.TbUserGroupVo;
+import org.dromara.property.domain.bo.TbUserGroupBo;
+import org.dromara.property.service.ITbUserGroupService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 人员组管理
+ * 前端访问路由地址为:/property/userGroup
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/userGroup")
+public class TbUserGroupController extends BaseController {
+
+ private final ITbUserGroupService tbUserGroupService;
+
+ /**
+ * 查询人员组管理列表
+ */
+ @SaCheckPermission("property:userGroup:list")
+ @GetMapping("/list")
+ public TableDataInfo list(TbUserGroupBo bo, PageQuery pageQuery) {
+ return tbUserGroupService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出人员组管理列表
+ */
+ @SaCheckPermission("property:userGroup:export")
+ @Log(title = "人员组管理", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(TbUserGroupBo bo, HttpServletResponse response) {
+ List list = tbUserGroupService.queryList(bo);
+ ExcelUtil.exportExcel(list, "人员组管理", TbUserGroupVo.class, response);
+ }
+
+ /**
+ * 获取人员组管理详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("property:userGroup:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable("id") Long id) {
+ return R.ok(tbUserGroupService.queryById(id));
+ }
+
+ /**
+ * 新增人员组管理
+ */
+ @SaCheckPermission("property:userGroup:add")
+ @Log(title = "人员组管理", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody TbUserGroupBo bo) {
+ return toAjax(tbUserGroupService.insertByBo(bo));
+ }
+
+ /**
+ * 修改人员组管理
+ */
+ @SaCheckPermission("property:userGroup:edit")
+ @Log(title = "人员组管理", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody TbUserGroupBo bo) {
+ return toAjax(tbUserGroupService.updateByBo(bo));
+ }
+
+ /**
+ * 删除人员组管理
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("property:userGroup:remove")
+ @Log(title = "人员组管理", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable("ids") Long[] ids) {
+ return toAjax(tbUserGroupService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsPlanProduct.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsPlanProduct.java
new file mode 100644
index 00000000..6a76f247
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsPlanProduct.java
@@ -0,0 +1,41 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 绿植租赁-租赁方案-绿植对象 plants_plan_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("plants_plan_product")
+public class PlantsPlanProduct extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 租赁方案id
+ */
+ private Long planId;
+
+ /**
+ * 绿植产品id
+ */
+ private Long productId;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsProduct.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsProduct.java
new file mode 100644
index 00000000..e2e21f71
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsProduct.java
@@ -0,0 +1,76 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 绿植租赁-绿植产品对象 plants_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("plants_product")
+public class PlantsProduct extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 产品编号
+ */
+ private String plantCode;
+
+ /**
+ * 产品名称
+ */
+ private String plantName;
+
+ /**
+ * 产品分类
+ */
+ private Long plantType;
+
+ /**
+ * 产品图片
+ */
+ private String imgPath;
+
+ /**
+ * 规格
+ */
+ private String specification;
+
+ /**
+ * 租金
+ */
+ private Long rent;
+
+ /**
+ * 库存数量
+ */
+ private Long inventory;
+
+ /**
+ * 状态(0下架 1上架 )
+ */
+ private Long state;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsRentalPlan.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsRentalPlan.java
new file mode 100644
index 00000000..21a18b21
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/PlantsRentalPlan.java
@@ -0,0 +1,61 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 绿植租赁-租赁方案对象 plants_rental_plan
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("plants_rental_plan")
+public class PlantsRentalPlan extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 方案名称
+ */
+ private String planName;
+
+ /**
+ * 租赁周期
+ */
+ private Long rentalPeriod;
+
+ /**
+ * 适用场景
+ */
+ private String scene;
+
+ /**
+ * 价格
+ */
+ private Long price;
+
+ /**
+ * 状态
+ */
+ private Long state;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbAreaGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbAreaGroup.java
new file mode 100644
index 00000000..66722a96
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbAreaGroup.java
@@ -0,0 +1,41 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 区域组信息对象 tb_area_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tb_area_group")
+public class TbAreaGroup extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 区域组ID
+ */
+ private Long areaGroupId;
+
+ /**
+ * 区域组名称
+ */
+ private String areaGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbUserGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbUserGroup.java
new file mode 100644
index 00000000..6c558f66
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/TbUserGroup.java
@@ -0,0 +1,41 @@
+package org.dromara.property.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 人员组管理对象 tb_user_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("tb_user_group")
+public class TbUserGroup extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 人员组id
+ */
+ private Long userGroupId;
+
+ /**
+ * 人员组名称
+ */
+ private String userGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsPlanProductBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsPlanProductBo.java
new file mode 100644
index 00000000..bfc3236c
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsPlanProductBo.java
@@ -0,0 +1,42 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.PlantsPlanProduct;
+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.*;
+
+/**
+ * 绿植租赁-租赁方案-绿植业务对象 plants_plan_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PlantsPlanProduct.class, reverseConvertGenerate = false)
+public class PlantsPlanProductBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 租赁方案id
+ */
+ @NotNull(message = "租赁方案id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long planId;
+
+ /**
+ * 绿植产品id
+ */
+ @NotNull(message = "绿植产品id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long productId;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsProductBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsProductBo.java
new file mode 100644
index 00000000..016a43f8
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsProductBo.java
@@ -0,0 +1,82 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.PlantsProduct;
+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.*;
+
+/**
+ * 绿植租赁-绿植产品业务对象 plants_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PlantsProduct.class, reverseConvertGenerate = false)
+public class PlantsProductBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 产品编号
+ */
+ @NotBlank(message = "产品编号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String plantCode;
+
+ /**
+ * 产品名称
+ */
+ @NotBlank(message = "产品名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String plantName;
+
+ /**
+ * 产品分类
+ */
+ @NotNull(message = "产品分类不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long plantType;
+
+ /**
+ * 产品图片
+ */
+ private String imgPath;
+
+ /**
+ * 规格
+ */
+ @NotBlank(message = "规格不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String specification;
+
+ /**
+ * 租金
+ */
+ @NotNull(message = "租金不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long rent;
+
+ /**
+ * 库存数量
+ */
+ @NotNull(message = "库存数量不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long inventory;
+
+ /**
+ * 状态(0下架 1上架 )
+ */
+ @NotNull(message = "状态(0下架 1上架 )不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long state;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsRentalPlanBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsRentalPlanBo.java
new file mode 100644
index 00000000..f64c20c6
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/PlantsRentalPlanBo.java
@@ -0,0 +1,64 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.PlantsRentalPlan;
+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.*;
+
+/**
+ * 绿植租赁-租赁方案业务对象 plants_rental_plan
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PlantsRentalPlan.class, reverseConvertGenerate = false)
+public class PlantsRentalPlanBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 方案名称
+ */
+ @NotBlank(message = "方案名称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String planName;
+
+ /**
+ * 租赁周期
+ */
+ @NotNull(message = "租赁周期不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long rentalPeriod;
+
+ /**
+ * 适用场景
+ */
+ @NotBlank(message = "适用场景不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String scene;
+
+ /**
+ * 价格
+ */
+ private Long price;
+
+ /**
+ * 状态
+ */
+ @NotNull(message = "状态不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long state;
+
+ /**
+ * 备注
+ */
+ private String remarks;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbAreaGroupBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbAreaGroupBo.java
new file mode 100644
index 00000000..0bc9fcb8
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbAreaGroupBo.java
@@ -0,0 +1,40 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.TbAreaGroup;
+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.*;
+
+/**
+ * 区域组信息业务对象 tb_area_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TbAreaGroup.class, reverseConvertGenerate = false)
+public class TbAreaGroupBo extends BaseEntity {
+
+ /**
+ * id
+ */
+ @NotNull(message = "id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 区域组ID
+ */
+ private Long areaGroupId;
+
+ /**
+ * 区域组名称
+ */
+ private String areaGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbUserGroupBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbUserGroupBo.java
new file mode 100644
index 00000000..5a86d2d0
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/TbUserGroupBo.java
@@ -0,0 +1,40 @@
+package org.dromara.property.domain.bo;
+
+import org.dromara.property.domain.TbUserGroup;
+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.*;
+
+/**
+ * 人员组管理业务对象 tb_user_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = TbUserGroup.class, reverseConvertGenerate = false)
+public class TbUserGroupBo extends BaseEntity {
+
+ /**
+ * id
+ */
+ @NotNull(message = "id不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 人员组id
+ */
+ private Long userGroupId;
+
+ /**
+ * 人员组名称
+ */
+ private String userGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsPlanProductVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsPlanProductVo.java
new file mode 100644
index 00000000..bd6af3f4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsPlanProductVo.java
@@ -0,0 +1,56 @@
+package org.dromara.property.domain.vo;
+
+import org.dromara.property.domain.PlantsPlanProduct;
+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;
+
+
+
+/**
+ * 绿植租赁-租赁方案-绿植视图对象 plants_plan_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PlantsPlanProduct.class)
+public class PlantsPlanProductVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 租赁方案id
+ */
+ @ExcelProperty(value = "租赁方案id")
+ private Long planId;
+
+ /**
+ * 绿植产品id
+ */
+ @ExcelProperty(value = "绿植产品id")
+ private Long productId;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsProductVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsProductVo.java
new file mode 100644
index 00000000..43fca3f0
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsProductVo.java
@@ -0,0 +1,99 @@
+package org.dromara.property.domain.vo;
+
+import org.dromara.property.domain.PlantsProduct;
+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;
+
+
+
+/**
+ * 绿植租赁-绿植产品视图对象 plants_product
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PlantsProduct.class)
+public class PlantsProductVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 产品编号
+ */
+ @ExcelProperty(value = "产品编号")
+ private String plantCode;
+
+ /**
+ * 产品名称
+ */
+ @ExcelProperty(value = "产品名称")
+ private String plantName;
+
+ /**
+ * 产品分类
+ */
+ @ExcelProperty(value = "产品分类")
+ private Long plantType;
+
+ /**
+ * 产品图片
+ */
+ @ExcelProperty(value = "产品图片")
+ private String imgPath;
+
+ /**
+ * 规格
+ */
+ @ExcelProperty(value = "规格")
+ private String specification;
+
+ /**
+ * 租金
+ */
+ @ExcelProperty(value = "租金")
+ private Long rent;
+
+ /**
+ * 库存数量
+ */
+ @ExcelProperty(value = "库存数量")
+ private Long inventory;
+
+ /**
+ * 状态(0下架 1上架 )
+ */
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "product_management_status")
+ private Long state;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsRentalPlanVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsRentalPlanVo.java
new file mode 100644
index 00000000..30251677
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/PlantsRentalPlanVo.java
@@ -0,0 +1,80 @@
+package org.dromara.property.domain.vo;
+
+import org.dromara.property.domain.PlantsRentalPlan;
+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;
+
+
+
+/**
+ * 绿植租赁-租赁方案视图对象 plants_rental_plan
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PlantsRentalPlan.class)
+public class PlantsRentalPlanVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 方案名称
+ */
+ @ExcelProperty(value = "方案名称")
+ private String planName;
+
+ /**
+ * 租赁周期
+ */
+ @ExcelProperty(value = "租赁周期")
+ private Long rentalPeriod;
+
+ /**
+ * 适用场景
+ */
+ @ExcelProperty(value = "适用场景")
+ private String scene;
+
+ /**
+ * 价格
+ */
+ @ExcelProperty(value = "价格")
+ private Long price;
+
+ /**
+ * 状态
+ */
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(dictType = "wy_kg")
+ private Long state;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remarks;
+
+ /**
+ * 创建时间
+ */
+ @ExcelProperty(value = "创建时间")
+ private Date createTime;
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbAreaGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbAreaGroupVo.java
new file mode 100644
index 00000000..15c4ab4d
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbAreaGroupVo.java
@@ -0,0 +1,50 @@
+package org.dromara.property.domain.vo;
+
+import org.dromara.property.domain.TbAreaGroup;
+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;
+
+
+
+/**
+ * 区域组信息视图对象 tb_area_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = TbAreaGroup.class)
+public class TbAreaGroupVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @ExcelProperty(value = "id")
+ private Long id;
+
+ /**
+ * 区域组ID
+ */
+ @ExcelProperty(value = "区域组ID")
+ private Long areaGroupId;
+
+ /**
+ * 区域组名称
+ */
+ @ExcelProperty(value = "区域组名称")
+ private String areaGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbUserGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbUserGroupVo.java
new file mode 100644
index 00000000..e9466aa4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/TbUserGroupVo.java
@@ -0,0 +1,50 @@
+package org.dromara.property.domain.vo;
+
+import org.dromara.property.domain.TbUserGroup;
+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;
+
+
+
+/**
+ * 人员组管理视图对象 tb_user_group
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = TbUserGroup.class)
+public class TbUserGroupVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * id
+ */
+ @ExcelProperty(value = "id")
+ private Long id;
+
+ /**
+ * 人员组id
+ */
+ @ExcelProperty(value = "人员组id")
+ private Long userGroupId;
+
+ /**
+ * 人员组名称
+ */
+ @ExcelProperty(value = " 人员组名称")
+ private String userGroupName;
+
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsPlanProductMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsPlanProductMapper.java
new file mode 100644
index 00000000..16dcf5e2
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsPlanProductMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.property.mapper;
+
+import org.dromara.property.domain.PlantsPlanProduct;
+import org.dromara.property.domain.vo.PlantsPlanProductVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 绿植租赁-租赁方案-绿植Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+public interface PlantsPlanProductMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsProductMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsProductMapper.java
new file mode 100644
index 00000000..986c712b
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsProductMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.property.mapper;
+
+import org.dromara.property.domain.PlantsProduct;
+import org.dromara.property.domain.vo.PlantsProductVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 绿植租赁-绿植产品Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+public interface PlantsProductMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsRentalPlanMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsRentalPlanMapper.java
new file mode 100644
index 00000000..dd9e4b9f
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/PlantsRentalPlanMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.property.mapper;
+
+import org.dromara.property.domain.PlantsRentalPlan;
+import org.dromara.property.domain.vo.PlantsRentalPlanVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 绿植租赁-租赁方案Mapper接口
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+public interface PlantsRentalPlanMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbAreaGroupMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbAreaGroupMapper.java
new file mode 100644
index 00000000..64aa3a16
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbAreaGroupMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.property.mapper;
+
+import org.dromara.property.domain.TbAreaGroup;
+import org.dromara.property.domain.vo.TbAreaGroupVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 区域组信息Mapper接口
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+public interface TbAreaGroupMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbUserGroupMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbUserGroupMapper.java
new file mode 100644
index 00000000..67dafe0e
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/TbUserGroupMapper.java
@@ -0,0 +1,15 @@
+package org.dromara.property.mapper;
+
+import org.dromara.property.domain.TbUserGroup;
+import org.dromara.property.domain.vo.TbUserGroupVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 人员组管理Mapper接口
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+public interface TbUserGroupMapper extends BaseMapperPlus {
+
+}
diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsPlanProductService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsPlanProductService.java
new file mode 100644
index 00000000..195c83f7
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsPlanProductService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.PlantsPlanProduct;
+import org.dromara.property.domain.vo.PlantsPlanProductVo;
+import org.dromara.property.domain.bo.PlantsPlanProductBo;
+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-06-25
+ */
+public interface IPlantsPlanProductService {
+
+ /**
+ * 查询绿植租赁-租赁方案-绿植
+ *
+ * @param id 主键
+ * @return 绿植租赁-租赁方案-绿植
+ */
+ PlantsPlanProductVo queryById(Long id);
+
+ /**
+ * 分页查询绿植租赁-租赁方案-绿植列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-租赁方案-绿植分页列表
+ */
+ TableDataInfo queryPageList(PlantsPlanProductBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的绿植租赁-租赁方案-绿植列表
+ *
+ * @param bo 查询条件
+ * @return 绿植租赁-租赁方案-绿植列表
+ */
+ List queryList(PlantsPlanProductBo bo);
+
+ /**
+ * 新增绿植租赁-租赁方案-绿植
+ *
+ * @param bo 绿植租赁-租赁方案-绿植
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(PlantsPlanProductBo bo);
+
+ /**
+ * 修改绿植租赁-租赁方案-绿植
+ *
+ * @param bo 绿植租赁-租赁方案-绿植
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(PlantsPlanProductBo 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/IPlantsProductService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsProductService.java
new file mode 100644
index 00000000..7a750304
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsProductService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.PlantsProduct;
+import org.dromara.property.domain.vo.PlantsProductVo;
+import org.dromara.property.domain.bo.PlantsProductBo;
+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-06-25
+ */
+public interface IPlantsProductService {
+
+ /**
+ * 查询绿植租赁-绿植产品
+ *
+ * @param id 主键
+ * @return 绿植租赁-绿植产品
+ */
+ PlantsProductVo queryById(Long id);
+
+ /**
+ * 分页查询绿植租赁-绿植产品列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-绿植产品分页列表
+ */
+ TableDataInfo queryPageList(PlantsProductBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的绿植租赁-绿植产品列表
+ *
+ * @param bo 查询条件
+ * @return 绿植租赁-绿植产品列表
+ */
+ List queryList(PlantsProductBo bo);
+
+ /**
+ * 新增绿植租赁-绿植产品
+ *
+ * @param bo 绿植租赁-绿植产品
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(PlantsProductBo bo);
+
+ /**
+ * 修改绿植租赁-绿植产品
+ *
+ * @param bo 绿植租赁-绿植产品
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(PlantsProductBo 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/IPlantsRentalPlanService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsRentalPlanService.java
new file mode 100644
index 00000000..4e760ea3
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IPlantsRentalPlanService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.PlantsRentalPlan;
+import org.dromara.property.domain.vo.PlantsRentalPlanVo;
+import org.dromara.property.domain.bo.PlantsRentalPlanBo;
+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-06-25
+ */
+public interface IPlantsRentalPlanService {
+
+ /**
+ * 查询绿植租赁-租赁方案
+ *
+ * @param id 主键
+ * @return 绿植租赁-租赁方案
+ */
+ PlantsRentalPlanVo queryById(Long id);
+
+ /**
+ * 分页查询绿植租赁-租赁方案列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-租赁方案分页列表
+ */
+ TableDataInfo queryPageList(PlantsRentalPlanBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的绿植租赁-租赁方案列表
+ *
+ * @param bo 查询条件
+ * @return 绿植租赁-租赁方案列表
+ */
+ List queryList(PlantsRentalPlanBo bo);
+
+ /**
+ * 新增绿植租赁-租赁方案
+ *
+ * @param bo 绿植租赁-租赁方案
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(PlantsRentalPlanBo bo);
+
+ /**
+ * 修改绿植租赁-租赁方案
+ *
+ * @param bo 绿植租赁-租赁方案
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(PlantsRentalPlanBo 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/ITbAreaGroupService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbAreaGroupService.java
new file mode 100644
index 00000000..3f551104
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbAreaGroupService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.TbAreaGroup;
+import org.dromara.property.domain.vo.TbAreaGroupVo;
+import org.dromara.property.domain.bo.TbAreaGroupBo;
+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 dy
+ * @date 2025-06-25
+ */
+public interface ITbAreaGroupService {
+
+ /**
+ * 查询区域组信息
+ *
+ * @param id 主键
+ * @return 区域组信息
+ */
+ TbAreaGroupVo queryById(Long id);
+
+ /**
+ * 分页查询区域组信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 区域组信息分页列表
+ */
+ TableDataInfo queryPageList(TbAreaGroupBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的区域组信息列表
+ *
+ * @param bo 查询条件
+ * @return 区域组信息列表
+ */
+ List queryList(TbAreaGroupBo bo);
+
+ /**
+ * 新增区域组信息
+ *
+ * @param bo 区域组信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(TbAreaGroupBo bo);
+
+ /**
+ * 修改区域组信息
+ *
+ * @param bo 区域组信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(TbAreaGroupBo 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/ITbUserGroupService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbUserGroupService.java
new file mode 100644
index 00000000..c6ea1906
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ITbUserGroupService.java
@@ -0,0 +1,69 @@
+package org.dromara.property.service;
+
+import org.dromara.property.domain.TbUserGroup;
+import org.dromara.property.domain.vo.TbUserGroupVo;
+import org.dromara.property.domain.bo.TbUserGroupBo;
+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 dy
+ * @date 2025-06-25
+ */
+public interface ITbUserGroupService {
+
+ /**
+ * 查询人员组管理
+ *
+ * @param id 主键
+ * @return 人员组管理
+ */
+ TbUserGroupVo queryById(Long id);
+
+ /**
+ * 分页查询人员组管理列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 人员组管理分页列表
+ */
+ TableDataInfo queryPageList(TbUserGroupBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的人员组管理列表
+ *
+ * @param bo 查询条件
+ * @return 人员组管理列表
+ */
+ List queryList(TbUserGroupBo bo);
+
+ /**
+ * 新增人员组管理
+ *
+ * @param bo 人员组管理
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(TbUserGroupBo bo);
+
+ /**
+ * 修改人员组管理
+ *
+ * @param bo 人员组管理
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(TbUserGroupBo 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/PlantsPlanProductServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsPlanProductServiceImpl.java
new file mode 100644
index 00000000..8fb5f8a9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsPlanProductServiceImpl.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.springframework.stereotype.Service;
+import org.dromara.property.domain.bo.PlantsPlanProductBo;
+import org.dromara.property.domain.vo.PlantsPlanProductVo;
+import org.dromara.property.domain.PlantsPlanProduct;
+import org.dromara.property.mapper.PlantsPlanProductMapper;
+import org.dromara.property.service.IPlantsPlanProductService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 绿植租赁-租赁方案-绿植Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PlantsPlanProductServiceImpl implements IPlantsPlanProductService {
+
+ private final PlantsPlanProductMapper baseMapper;
+
+ /**
+ * 查询绿植租赁-租赁方案-绿植
+ *
+ * @param id 主键
+ * @return 绿植租赁-租赁方案-绿植
+ */
+ @Override
+ public PlantsPlanProductVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询绿植租赁-租赁方案-绿植列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-租赁方案-绿植分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PlantsPlanProductBo 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(PlantsPlanProductBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PlantsPlanProductBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(PlantsPlanProduct::getId);
+ lqw.eq(bo.getPlanId() != null, PlantsPlanProduct::getPlanId, bo.getPlanId());
+ lqw.eq(bo.getProductId() != null, PlantsPlanProduct::getProductId, bo.getProductId());
+ return lqw;
+ }
+
+ /**
+ * 新增绿植租赁-租赁方案-绿植
+ *
+ * @param bo 绿植租赁-租赁方案-绿植
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(PlantsPlanProductBo bo) {
+ PlantsPlanProduct add = MapstructUtils.convert(bo, PlantsPlanProduct.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改绿植租赁-租赁方案-绿植
+ *
+ * @param bo 绿植租赁-租赁方案-绿植
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(PlantsPlanProductBo bo) {
+ PlantsPlanProduct update = MapstructUtils.convert(bo, PlantsPlanProduct.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PlantsPlanProduct 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/PlantsProductServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsProductServiceImpl.java
new file mode 100644
index 00000000..4396bc80
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsProductServiceImpl.java
@@ -0,0 +1,139 @@
+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.springframework.stereotype.Service;
+import org.dromara.property.domain.bo.PlantsProductBo;
+import org.dromara.property.domain.vo.PlantsProductVo;
+import org.dromara.property.domain.PlantsProduct;
+import org.dromara.property.mapper.PlantsProductMapper;
+import org.dromara.property.service.IPlantsProductService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 绿植租赁-绿植产品Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PlantsProductServiceImpl implements IPlantsProductService {
+
+ private final PlantsProductMapper baseMapper;
+
+ /**
+ * 查询绿植租赁-绿植产品
+ *
+ * @param id 主键
+ * @return 绿植租赁-绿植产品
+ */
+ @Override
+ public PlantsProductVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询绿植租赁-绿植产品列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-绿植产品分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PlantsProductBo 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(PlantsProductBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PlantsProductBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(PlantsProduct::getId);
+ lqw.eq(StringUtils.isNotBlank(bo.getPlantCode()), PlantsProduct::getPlantCode, bo.getPlantCode());
+ lqw.like(StringUtils.isNotBlank(bo.getPlantName()), PlantsProduct::getPlantName, bo.getPlantName());
+ lqw.eq(bo.getPlantType() != null, PlantsProduct::getPlantType, bo.getPlantType());
+ lqw.eq(StringUtils.isNotBlank(bo.getImgPath()), PlantsProduct::getImgPath, bo.getImgPath());
+ lqw.eq(StringUtils.isNotBlank(bo.getSpecification()), PlantsProduct::getSpecification, bo.getSpecification());
+ lqw.eq(bo.getRent() != null, PlantsProduct::getRent, bo.getRent());
+ lqw.eq(bo.getInventory() != null, PlantsProduct::getInventory, bo.getInventory());
+ lqw.eq(bo.getState() != null, PlantsProduct::getState, bo.getState());
+ return lqw;
+ }
+
+ /**
+ * 新增绿植租赁-绿植产品
+ *
+ * @param bo 绿植租赁-绿植产品
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(PlantsProductBo bo) {
+ PlantsProduct add = MapstructUtils.convert(bo, PlantsProduct.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改绿植租赁-绿植产品
+ *
+ * @param bo 绿植租赁-绿植产品
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(PlantsProductBo bo) {
+ PlantsProduct update = MapstructUtils.convert(bo, PlantsProduct.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PlantsProduct 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/PlantsRentalPlanServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsRentalPlanServiceImpl.java
new file mode 100644
index 00000000..1499c0c9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/PlantsRentalPlanServiceImpl.java
@@ -0,0 +1,137 @@
+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.springframework.stereotype.Service;
+import org.dromara.property.domain.bo.PlantsRentalPlanBo;
+import org.dromara.property.domain.vo.PlantsRentalPlanVo;
+import org.dromara.property.domain.PlantsRentalPlan;
+import org.dromara.property.mapper.PlantsRentalPlanMapper;
+import org.dromara.property.service.IPlantsRentalPlanService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 绿植租赁-租赁方案Service业务层处理
+ *
+ * @author mocheng
+ * @date 2025-06-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PlantsRentalPlanServiceImpl implements IPlantsRentalPlanService {
+
+ private final PlantsRentalPlanMapper baseMapper;
+
+ /**
+ * 查询绿植租赁-租赁方案
+ *
+ * @param id 主键
+ * @return 绿植租赁-租赁方案
+ */
+ @Override
+ public PlantsRentalPlanVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询绿植租赁-租赁方案列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 绿植租赁-租赁方案分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PlantsRentalPlanBo 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(PlantsRentalPlanBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PlantsRentalPlanBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(PlantsRentalPlan::getId);
+ lqw.like(StringUtils.isNotBlank(bo.getPlanName()), PlantsRentalPlan::getPlanName, bo.getPlanName());
+ lqw.eq(bo.getRentalPeriod() != null, PlantsRentalPlan::getRentalPeriod, bo.getRentalPeriod());
+ lqw.eq(StringUtils.isNotBlank(bo.getScene()), PlantsRentalPlan::getScene, bo.getScene());
+ lqw.eq(bo.getPrice() != null, PlantsRentalPlan::getPrice, bo.getPrice());
+ lqw.eq(bo.getState() != null, PlantsRentalPlan::getState, bo.getState());
+ lqw.eq(StringUtils.isNotBlank(bo.getRemarks()), PlantsRentalPlan::getRemarks, bo.getRemarks());
+ return lqw;
+ }
+
+ /**
+ * 新增绿植租赁-租赁方案
+ *
+ * @param bo 绿植租赁-租赁方案
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(PlantsRentalPlanBo bo) {
+ PlantsRentalPlan add = MapstructUtils.convert(bo, PlantsRentalPlan.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改绿植租赁-租赁方案
+ *
+ * @param bo 绿植租赁-租赁方案
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(PlantsRentalPlanBo bo) {
+ PlantsRentalPlan update = MapstructUtils.convert(bo, PlantsRentalPlan.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PlantsRentalPlan 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/TbAreaGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbAreaGroupServiceImpl.java
new file mode 100644
index 00000000..1cbe9cd6
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbAreaGroupServiceImpl.java
@@ -0,0 +1,134 @@
+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.springframework.stereotype.Service;
+import org.dromara.property.domain.bo.TbAreaGroupBo;
+import org.dromara.property.domain.vo.TbAreaGroupVo;
+import org.dromara.property.domain.TbAreaGroup;
+import org.dromara.property.mapper.TbAreaGroupMapper;
+import org.dromara.property.service.ITbAreaGroupService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 区域组信息Service业务层处理
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbAreaGroupServiceImpl implements ITbAreaGroupService {
+
+ private final TbAreaGroupMapper baseMapper;
+
+ /**
+ * 查询区域组信息
+ *
+ * @param id 主键
+ * @return 区域组信息
+ */
+ @Override
+ public TbAreaGroupVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询区域组信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 区域组信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(TbAreaGroupBo 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(TbAreaGroupBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(TbAreaGroupBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(TbAreaGroup::getId);
+ lqw.eq(bo.getAreaGroupId() != null, TbAreaGroup::getAreaGroupId, bo.getAreaGroupId());
+ lqw.like(StringUtils.isNotBlank(bo.getAreaGroupName()), TbAreaGroup::getAreaGroupName, bo.getAreaGroupName());
+ return lqw;
+ }
+
+ /**
+ * 新增区域组信息
+ *
+ * @param bo 区域组信息
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(TbAreaGroupBo bo) {
+ TbAreaGroup add = MapstructUtils.convert(bo, TbAreaGroup.class);
+ validEntityBeforeSave(add);
+ //todo: 新增区域组时需要新增区域信息
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改区域组信息
+ *
+ * @param bo 区域组信息
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(TbAreaGroupBo bo) {
+ TbAreaGroup update = MapstructUtils.convert(bo, TbAreaGroup.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(TbAreaGroup 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/TbUserGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbUserGroupServiceImpl.java
new file mode 100644
index 00000000..e2f298d9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/TbUserGroupServiceImpl.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.springframework.stereotype.Service;
+import org.dromara.property.domain.bo.TbUserGroupBo;
+import org.dromara.property.domain.vo.TbUserGroupVo;
+import org.dromara.property.domain.TbUserGroup;
+import org.dromara.property.mapper.TbUserGroupMapper;
+import org.dromara.property.service.ITbUserGroupService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 人员组管理Service业务层处理
+ *
+ * @author dy
+ * @date 2025-06-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbUserGroupServiceImpl implements ITbUserGroupService {
+
+ private final TbUserGroupMapper baseMapper;
+
+ /**
+ * 查询人员组管理
+ *
+ * @param id 主键
+ * @return 人员组管理
+ */
+ @Override
+ public TbUserGroupVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询人员组管理列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 人员组管理分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(TbUserGroupBo 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(TbUserGroupBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(TbUserGroupBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.orderByAsc(TbUserGroup::getId);
+ lqw.like(bo.getUserGroupId() != null, TbUserGroup::getUserGroupId, bo.getUserGroupId());
+ lqw.like(StringUtils.isNotBlank(bo.getUserGroupName()), TbUserGroup::getUserGroupName, bo.getUserGroupName());
+ return lqw;
+ }
+
+ /**
+ * 新增人员组管理
+ *
+ * @param bo 人员组管理
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(TbUserGroupBo bo) {
+ TbUserGroup add = MapstructUtils.convert(bo, TbUserGroup.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改人员组管理
+ *
+ * @param bo 人员组管理
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(TbUserGroupBo bo) {
+ TbUserGroup update = MapstructUtils.convert(bo, TbUserGroup.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(TbUserGroup 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/resources/mapper/Property/PlantsPlanProductMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsPlanProductMapper.xml
new file mode 100644
index 00000000..10114422
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsPlanProductMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsProductMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsProductMapper.xml
new file mode 100644
index 00000000..8ec3d3c9
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsProductMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsRentalPlanMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsRentalPlanMapper.xml
new file mode 100644
index 00000000..a14377f4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/PlantsRentalPlanMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/TbAreaGroupMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/TbAreaGroupMapper.xml
new file mode 100644
index 00000000..a385c3f4
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/TbAreaGroupMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Property/src/main/resources/mapper/Property/TbUserGroupMapper.xml b/ruoyi-modules/Property/src/main/resources/mapper/Property/TbUserGroupMapper.xml
new file mode 100644
index 00000000..4f7f9850
--- /dev/null
+++ b/ruoyi-modules/Property/src/main/resources/mapper/Property/TbUserGroupMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AccessControlController.java
deleted file mode 100644
index c26d76b1..00000000
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AccessControlController.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.dromara.sis.controller;
-
-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.accesscontrol.req.RemoteOpenDoorReq;
-import org.dromara.sis.sdk.e8.domain.accesscontrol.res.AccessRecordFindRes;
-import org.dromara.sis.sdk.e8.domain.QueryDto;
-import org.springframework.web.bind.annotation.PostMapping;
-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(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
- */
- @PostMapping("/getPageAccessRecordList")
- public R> getPageAccessRecordList(QueryDto dto) {
- log.info("E8获取门禁记录列表 入参:{}", dto);
- TableDataInfo page = accessControlService.getPageAccessRecordList(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/AccessControlController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/AccessControlController.java
new file mode 100644
index 00000000..1b35a4b7
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/AccessControlController.java
@@ -0,0 +1,108 @@
+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.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.QueryDto;
+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/DoorDeviceController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java
similarity index 89%
rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/DoorDeviceController.java
rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java
index d202e950..a6499168 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/DoorDeviceController.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/DoorDeviceController.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.controller;
+package org.dromara.sis.controller.e8;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -9,7 +9,6 @@ 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.door.res.DoorDeviceUpdateRes;
import org.dromara.sis.sdk.e8.domain.QueryDto;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
@@ -22,7 +21,7 @@ import org.springframework.web.bind.annotation.*;
@Slf4j
@RestController
@RequiredArgsConstructor
-@RequestMapping("/e8doorDevice")
+@RequestMapping("/e8DoorDevice")
public class DoorDeviceController {
private final DoorDeviceService doorDeviceService;
@@ -70,15 +69,15 @@ public class DoorDeviceController {
* @return Boolean
*/
@PostMapping("/updateDoorDevice")
- public R updateDoorDevice(@RequestBody DoorDeviceUpdateReq updateReq) {
+ public R updateDoorDevice(@RequestBody DoorDeviceUpdateReq updateReq) {
log.info("E8接口门禁信息修改 入参={}", updateReq);
- DoorDeviceUpdateRes doorDevice = doorDeviceService.updateDoorDevice(updateReq);
+ Boolean flag = doorDeviceService.updateDoorDevice(updateReq);
- if (doorDevice == null) {
- return R.fail("E8接口门禁信息修改,调用失败!");
+ if (flag) {
+ return R.ok();
} else {
- return R.ok(doorDevice);
+ return R.fail("E8接口门禁信息修改,调用失败!");
}
}
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
new file mode 100644
index 00000000..bb6c3b63
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/e8/VoucherControlController.java
@@ -0,0 +1,153 @@
+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.CancelVoucherReq;
+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;
+import java.util.List;
+
+/**
+ * @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);
+
+ Boolean flag = voucherControlService.issueVoucher(req);
+
+ if (flag) {
+ return R.ok();
+ } else {
+ return R.fail("E8发行凭证,调用失败!");
+ }
+ }
+
+ /**
+ * 批量发行凭证
+ *
+ * @param req 凭证数据
+ * @return Boolean
+ */
+ @PostMapping("/issueVoucherMany")
+ public R issueVoucherMany(@RequestBody List req) {
+ log.info("E8批量发行凭证入参:{}", req);
+
+ Boolean flag = voucherControlService.issueVoucherMany(req);
+
+ if (flag) {
+ 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 req 入参
+ * @return Boolean
+ */
+ @PostMapping("/cancelVoucher")
+ public R cancelVoucher(@RequestBody CancelVoucherReq req) {
+ log.info("E8注销人员凭证入参:{}", req);
+
+ Boolean flag = voucherControlService.cancelVoucher(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/sdk/e8/AccessControlService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/AccessControlService.java
index 00d39f21..60979379 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/AccessControlService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/AccessControlService.java
@@ -1,9 +1,11 @@
package org.dromara.sis.sdk.e8;
import org.dromara.common.mybatis.core.page.TableDataInfo;
-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.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.QueryDto;
+import org.dromara.sis.sdk.e8.domain.accessControl.res.CustomerAuthFindRes;
/**
* @author lsm
@@ -29,19 +31,19 @@ public interface AccessControlService {
*/
TableDataInfo getPageAccessRecordList(QueryDto dto);
-// /**
-// * 人员授权
-// *
-// * @param imageFile 传参
-// * @return Boolean
-// */
-// Boolean addCustomerAuth(Byte[] imageFile);
+ /**
+ * 人员授权
+ *
+ * @param req 传参
+ * @return Boolean
+ */
+ Boolean addCustomerAuth(CustomerAuthAddReq req);
-// /**
-// * 获取人员权限分页列表
-// *
-// * @param dto 传参
-// * @return
-// */
-// IPage getPageAccessControl(QueryDto dto);
+ /**
+ * 获取人员权限分页列表
+ *
+ * @param dto 传参
+ * @return TableDataInfo
+ */
+ TableDataInfo getPageCustomerAuth(QueryDto dto);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/DoorDeviceService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/DoorDeviceService.java
index a0f8603e..aa70d856 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/DoorDeviceService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/DoorDeviceService.java
@@ -5,7 +5,6 @@ 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.door.res.DoorDeviceUpdateRes;
import org.dromara.sis.sdk.e8.domain.QueryDto;
/**
@@ -45,7 +44,7 @@ public interface DoorDeviceService {
* @param updateReq 入参
* @return DoorDeviceUpdateRes
*/
- DoorDeviceUpdateRes updateDoorDevice(DoorDeviceUpdateReq updateReq);
+ Boolean updateDoorDevice(DoorDeviceUpdateReq updateReq);
/**
* 删除门禁信息
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/VoucherControlService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/VoucherControlService.java
index 9ee7d3fd..0bb9f0e5 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/VoucherControlService.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/VoucherControlService.java
@@ -1,5 +1,12 @@
package org.dromara.sis.sdk.e8;
+import org.dromara.sis.sdk.e8.domain.voucher.req.CancelVoucherReq;
+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 java.util.List;
+
/**
* @author lsm
* @apiNote VoucherControlService
@@ -7,10 +14,51 @@ package org.dromara.sis.sdk.e8;
*/
public interface VoucherControlService {
+ /**
+ * 发行凭证
+ *
+ * @param req 凭证数据
+ * @return Boolean
+ */
+ Boolean issueVoucher(IssueVoucherReq req);
+
+ /**
+ * 批量发行凭证
+ *
+ * @param req 凭证数据
+ * @return Boolean
+ */
+ Boolean issueVoucherMany(List req);
+
+ /**
+ * 操作凭证
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ Boolean operateVoucher(OperateVoucherReq req);
+
+ /**
+ * 换卡补卡
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ Boolean changeCard(ChangeCardReq req);
+
+ /**
+ * 注销人员凭证
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ Boolean cancelVoucher(CancelVoucherReq req);
+
/**
* 上传人脸
*
- * @param queryDto 查询参数
- * @return 凭证控制列表
+ * @param imageByte 入参
+ * @return imageUrl 人脸图片地址
*/
+ String uploadFace(byte[] imageByte);
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/AccessRecordFindReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/AccessRecordFindReq.java
index dbe63238..3cabd92c 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/AccessRecordFindReq.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/AccessRecordFindReq.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.sdk.e8.domain.accesscontrol.req;
+package org.dromara.sis.sdk.e8.domain.accessControl.req;
import lombok.Data;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthAddReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthAddReq.java
new file mode 100644
index 00000000..9d7c66cb
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthAddReq.java
@@ -0,0 +1,112 @@
+package org.dromara.sis.sdk.e8.domain.accessControl.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CustomerAuthAddReq
+ * @since 2025/6/25
+ */
+@Data
+public class CustomerAuthAddReq {
+
+ /**
+ * 门禁授权类型 0:人员
+ */
+ private Integer authType;
+
+ /**
+ * 时区ID
+ */
+ private Long scheduleId;
+
+ /**
+ * 人员ID集合
+ */
+ private List personIds;
+
+ /**
+ * 授权数据
+ */
+ private List authData;
+
+ /**
+ * 开始时间
+ */
+ private String startTime;
+
+ /**
+ * 结束时间
+ */
+ private String endTime;
+
+ /**
+ * 授权日期类型 0:默认 1:一月 2:半年 3:一年 4:三年 5:永久
+ */
+ private Integer dateType;
+
+ @Data
+ public static class AuthGroupData {
+
+ /**
+ * 门/电梯ID
+ */
+ private Long id;
+
+ /**
+ * 类型 0:门 1:电梯
+ */
+ private Integer type;
+
+ /**
+ * 出入口类型 0:未知 1:入口 2:出口
+ */
+ private Integer gatewayType;
+
+ /**
+ * 楼层
+ */
+ private List floors;
+ }
+
+ @Data
+ public static class Floor {
+
+ /**
+ * 楼层权限标识
+ */
+ private Long floorId;
+
+ /**
+ * 楼层名称
+ */
+ private String floorName;
+
+ /**
+ * 是否前门可用
+ */
+ private Boolean isFrontDoor;
+
+ /**
+ * 是否后门可用
+ */
+ private Boolean isBackDoor;
+
+ /**
+ * 是否选择前门
+ */
+ private Boolean isSelectFrontDoor;
+
+ /**
+ * 是否选择后门
+ */
+ private Boolean isSelectBackDoor;
+
+ /**
+ * 是否公共门
+ */
+ private Boolean isCommonFloor;
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthFindReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthFindReq.java
new file mode 100644
index 00000000..637f16a5
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/CustomerAuthFindReq.java
@@ -0,0 +1,52 @@
+package org.dromara.sis.sdk.e8.domain.accessControl.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote CustomerAuthFindReq
+ * @since 2025/6/25
+ */
+@Data
+public class CustomerAuthFindReq {
+
+ /**
+ * 是否脱敏 true脱敏,敏感信息加***隐藏;false完整显示;
+ */
+ private Boolean isViewFullData;
+
+ /**
+ * 客户编号
+ */
+ private String customerNo;
+
+ /**
+ * 客户姓名
+ */
+ private String customerName;
+
+ /**
+ * 客户手机号码
+ */
+ private String customerMobile;
+
+ /**
+ * 组织ID
+ */
+ private Long organId;
+
+ /**
+ * 门/电梯ID
+ */
+ private Long itemId;
+
+ /**
+ * 授权开始时间
+ */
+ private String authStartTime;
+
+ /**
+ * 授权结束时间
+ */
+ private String authEndTime;
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/RemoteOpenDoorReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/RemoteOpenDoorReq.java
index 3322910d..c4b98512 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/RemoteOpenDoorReq.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/req/RemoteOpenDoorReq.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.sdk.e8.domain.accesscontrol.req;
+package org.dromara.sis.sdk.e8.domain.accessControl.req;
import lombok.Data;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/AccessRecordFindRes.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/AccessRecordFindRes.java
index dcd3cb5e..4d92ba1f 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/AccessRecordFindRes.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/AccessRecordFindRes.java
@@ -1,4 +1,4 @@
-package org.dromara.sis.sdk.e8.domain.accesscontrol.res;
+package org.dromara.sis.sdk.e8.domain.accessControl.res;
import lombok.Data;
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/CustomerAuthFindRes.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/CustomerAuthFindRes.java
new file mode 100644
index 00000000..0828a586
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/accesscontrol/res/CustomerAuthFindRes.java
@@ -0,0 +1,210 @@
+package org.dromara.sis.sdk.e8.domain.accessControl.res;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CustomerAuthFindRes
+ * @since 2025/6/25
+ */
+@Data
+public class CustomerAuthFindRes {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 创建时间
+ */
+ private Date creationTime;
+
+ /**
+ * 创建人
+ */
+ private String creatorId;
+
+ /**
+ * 最后修改时间
+ */
+ private Date lastModificationTime;
+
+ /**
+ * 最后修改人
+ */
+ private String lastModifierId;
+
+ /**
+ * 是否删除
+ */
+ private Boolean isDeleted;
+
+ /**
+ * 删除人
+ */
+ private String deleterId;
+
+ /**
+ * 删除时间
+ */
+ private Date deletionTime;
+
+ /**
+ * 客户ID
+ */
+ private Long personId;
+
+ /**
+ * 主设备ID
+ */
+ private Long mainDeviceId;
+
+ /**
+ * 读头ID
+ */
+ private Long readerId;
+
+ /**
+ * 组织ID
+ */
+ private Long organId;
+
+ /**
+ * 组织名称
+ */
+ private String orgName;
+
+ /**
+ * 区域ID
+ */
+ private Long areaId;
+
+ /**
+ * 区域名称
+ */
+ private String areaName;
+
+ /**
+ * 客户姓名
+ */
+ private String customerName;
+
+ /**
+ * 客户编号
+ */
+ private String customerNo;
+
+ /**
+ * 客户手机号码
+ */
+ private String mobile;
+
+ /**
+ * 门/电梯名称
+ */
+ private String itemName;
+
+ /**
+ * 是否显示敏感信息 true隐藏 false显示
+ */
+ private Boolean isViewFullData;
+
+ /**
+ * 授权楼层字符串
+ */
+ private String content;
+
+ /**
+ * 授权开始时间
+ */
+ private Date startTime;
+
+ /**
+ * 授权结束时间
+ */
+ private Date endTime;
+
+ /**
+ * 设施类型 0:门禁 1:电梯
+ */
+ private Integer facilityType;
+
+ /**
+ * 时区ID
+ */
+ private Long scheduleId;
+
+ /**
+ * 时区名称
+ */
+ private String scheduleName;
+
+ /**
+ * 授权人
+ */
+ private String authName;
+
+ /**
+ * 授权时间段
+ */
+ private String duration;
+
+ /**
+ * 出入口类型 0:未知 1:入口 2:出口
+ */
+ private Integer gatewayType;
+
+ /**
+ * 出入口类型描述
+ */
+ private String gatewayTypeDesc;
+
+ /**
+ * 授权楼层
+ */
+ private List floors;
+
+ @Data
+ public static class Floor {
+
+ /**
+ * 楼层权限标识
+ */
+ private Long floorId;
+
+ /**
+ * 楼层名称
+ */
+ private String floorName;
+
+ /**
+ * 是否前门可用
+ */
+ private Boolean isFrontDoor;
+
+ /**
+ * 是否后门可用
+ */
+ private Boolean isBackDoor;
+
+ /**
+ * 是否选择前门
+ */
+ private Boolean isSelectFrontDoor;
+
+ /**
+ * 是否选择后门
+ */
+ private Boolean isSelectBackDoor;
+
+ /**
+ * 是否公共门
+ */
+ private Boolean isCommonFloor;
+ }
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/CancelVoucherReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/CancelVoucherReq.java
new file mode 100644
index 00000000..cbf178eb
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/CancelVoucherReq.java
@@ -0,0 +1,16 @@
+package org.dromara.sis.sdk.e8.domain.voucher.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote CancelVoucherReq
+ * @since 2025/6/25
+ */
+@Data
+public class CancelVoucherReq {
+
+ private List ids;
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/ChangeCardReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/ChangeCardReq.java
new file mode 100644
index 00000000..b3ca17ab
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/ChangeCardReq.java
@@ -0,0 +1,33 @@
+package org.dromara.sis.sdk.e8.domain.voucher.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote ChangeCardReq
+ * @since 2025/6/25
+ */
+@Data
+public class ChangeCardReq {
+
+ /**
+ * 原凭证ID
+ */
+ private Long origVoucherId;
+
+ /**
+ * 物理卡号
+ */
+ private String idno;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * 人员ID
+ */
+ private Long personID;
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/IssueVoucherReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/IssueVoucherReq.java
new file mode 100644
index 00000000..9bd444a6
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/IssueVoucherReq.java
@@ -0,0 +1,69 @@
+package org.dromara.sis.sdk.e8.domain.voucher.req;
+
+import lombok.Data;
+
+/**
+ * @author lsm
+ * @apiNote IssueVoucher
+ * @since 2025/6/25
+ */
+@Data
+public class IssueVoucherReq {
+
+ /**
+ * 物理卡号
+ */
+ private String idno;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 凭证类型 10:MF1-A卡 11:MF1-B卡 12:MF1卡(ID) 20:个人密码 40:条码、纸票 50:指纹 60:身份证号码 70:人脸 80:虚拟卡 110:蓝牙卡 21:管理密码 22:胁迫密码
+ */
+ private Integer voucherType;
+
+ /**
+ * 客户ID
+ */
+ private Long personID;
+
+ /**
+ * 开始日期
+ */
+ private String startTime;
+
+ /**
+ * 结束日期
+ */
+ private String endTime;
+
+ /**
+ * 图片地址
+ */
+ private String txtData;
+
+ /**
+ * 指纹数据
+ */
+ private String blobData;
+
+ /**
+ * 指纹编号
+ */
+ private String fingerNo;
+
+ /**
+ * 卡类别 34:普通用户卡 35:胁迫卡 36:保安卡 40:临时卡 41:中级用户卡 48:高级用户卡 49:高级管理卡(注:41、48、49仅适用于分体式门禁)
+ */
+ private Integer cardType;
+
+ /**
+ * 凭证模式 0:ID卡模式 1:IC卡模式 3:CPU卡模式
+ */
+ private Integer voucherMode;
+
+
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/OperateVoucherReq.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/OperateVoucherReq.java
new file mode 100644
index 00000000..8acd2284
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/voucher/req/OperateVoucherReq.java
@@ -0,0 +1,29 @@
+package org.dromara.sis.sdk.e8.domain.voucher.req;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author lsm
+ * @apiNote OperateVoucherReq
+ * @since 2025/6/25
+ */
+@Data
+public class OperateVoucherReq {
+
+ /**
+ * 凭证ID集合
+ */
+ private List ids;
+
+ /**
+ * 凭证操作类型 4:冻结 5:解冻 6:注销 7:挂失 8:解挂
+ */
+ private Integer type;
+
+ /**
+ * 原因 (必填)
+ */
+ private String reason;
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/AccessControlServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/AccessControlServiceImpl.java
index 0d578506..ff58738e 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/AccessControlServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/AccessControlServiceImpl.java
@@ -3,19 +3,21 @@ package org.dromara.sis.sdk.e8.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.sis.sdk.e8.AccessControlService;
-import org.dromara.sis.sdk.e8.domain.accesscontrol.req.AccessRecordFindReq;
-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.req.AccessRecordFindReq;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.CustomerAuthAddReq;
+import org.dromara.sis.sdk.e8.domain.accessControl.req.CustomerAuthFindReq;
+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.ApiResp;
import org.dromara.sis.sdk.e8.domain.QueryDto;
+import org.dromara.sis.sdk.e8.domain.accessControl.res.CustomerAuthFindRes;
import org.dromara.sis.sdk.e8.utils.E8ApiUtil;
import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@@ -26,7 +28,7 @@ import java.util.Map;
*/
@Slf4j
@Service
-@DubboService
+@RequiredArgsConstructor
public class AccessControlServiceImpl implements AccessControlService {
// 远程开门
@@ -41,8 +43,8 @@ public class AccessControlServiceImpl implements AccessControlService {
// 获取人员权限分页列表
private static final String GET_PAGE_PERSON_AUTHORIZATION_PAGE_LIST = "/api/E8Door/man-person-device-finally/get-page-list";
- @Resource
- private E8ApiUtil e8ApiUtil;
+
+ private final E8ApiUtil e8ApiUtil;
/**
* 远程开门
@@ -58,6 +60,8 @@ public class AccessControlServiceImpl implements AccessControlService {
// 调用第三方API进行开门操作,传入处理后的参数和指定的API端点
ApiResp apiResp = e8ApiUtil.doPost(params, REMOTE_OPEN_DOOR);
+ if (!apiResp.getSuccess()) log.error("调用E8远程开门失败,errorMsg:{}", apiResp);
+
// 返回API调用是否成功的结果
return apiResp.getSuccess();
}
@@ -82,6 +86,7 @@ public class AccessControlServiceImpl implements AccessControlService {
ApiResp apiResp = e8ApiUtil.doPost(params, GET_PAGE_ACCESS_RECORD_PAGE_LIST);
// 如果API响应不成功,则返回null
if (!apiResp.getSuccess()) {
+ log.error("调用E8获取通行记录分页列表失败,errorMsg:{}", apiResp);
return null;
}
// 将API响应的结果转换为JSON字符串,再转换为Map对象
@@ -100,8 +105,58 @@ public class AccessControlServiceImpl implements AccessControlService {
/**
* 人员授权
*
- * @param imageFile 传参
+ * @param req 传参
* @return Boolean
*/
+ @Override
+ public Boolean addCustomerAuth(CustomerAuthAddReq req) {
+ // 创建一个参数映射,用于存储API请求的参数
+ Map params = BeanUtil.beanToMap(req);
+
+ // 调用API工具类的POST方法,传入参数和API路径,获取API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, PERSON_AUTHORIZATION);
+
+ if (!apiResp.getSuccess()) log.error("调用E8人员授权失败,errorMsg:{}", apiResp);
+
+ // 返回API调用是否成功
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 获取人员权限分页列表
+ *
+ * @param dto 传参
+ * @return TableDataInfo
+ */
+ @Override
+ public TableDataInfo getPageCustomerAuth(QueryDto dto) {
+ // 创建一个参数映射,用于存储API请求的参数
+ Map params = new HashMap<>();
+ // 将分页索引和最大结果数放入参数映射中
+ params.put("pageIndex", dto.getPageIndex());
+ params.put("maxResultCount", dto.getMaxResultCount());
+ // 将查询DTO转换为JSON字符串,再转换为Map对象,然后放入参数映射中
+ params.put("queryDto", JSONUtil.toBean(JSONUtil.toJsonStr(dto.getQueryDto()), CustomerAuthFindReq.class));
+
+ // 调用API工具类的POST方法,传入参数和API路径,获取API响应对象
+ ApiResp apiResp = e8ApiUtil.doPost(params, GET_PAGE_PERSON_AUTHORIZATION_PAGE_LIST);
+ // 如果API响应不成功,则返回null
+ if (!apiResp.getSuccess()) {
+ log.error("调用E8获取人员权限分页列表失败,errorMsg:{}", apiResp);
+ return null;
+ }
+
+ // 将API响应的结果转换为JSON字符串,再转换为Map对象
+ Map result = JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), new TypeReference<>() {
+ }, false);
+ // 创建一个分页对象,传入分页索引和最大结果数
+ TableDataInfo tableData = new TableDataInfo<>();
+ // 从结果映射中获取总记录数,转换为长整型后设置到分页对象中
+ tableData.setTotal(Long.parseLong(result.get("total").toString()));
+ // 从结果映射中获取项目列表,转换为访问记录信息列表后设置到分页对象中
+ tableData.setRows(JSONUtil.toList(JSONUtil.toJsonStr(result.get("item")), CustomerAuthFindRes.class));
+ // 返回填充了数据的分页对象
+ return tableData;
+ }
}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/CustomerServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/CustomerServiceImpl.java
index f9645210..37e0053b 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/CustomerServiceImpl.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/CustomerServiceImpl.java
@@ -5,8 +5,8 @@ import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.sis.sdk.e8.CustomerService;
import org.dromara.sis.sdk.e8.domain.ApiResp;
import org.dromara.sis.sdk.e8.domain.QueryDto;
@@ -18,7 +18,6 @@ import org.dromara.sis.sdk.e8.domain.custom.res.CustomFindRes;
import org.dromara.sis.sdk.e8.utils.E8ApiUtil;
import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@@ -29,7 +28,7 @@ import java.util.Map;
*/
@Slf4j
@Service
-@DubboService
+@RequiredArgsConstructor
public class CustomerServiceImpl implements CustomerService {
private final static String CUSTOMER_GET_PAGE_LIST = "/api/E8/customer/get-page-list";
private final static String CUSTOMER_GET_FIRST_OR_DEFAULT = "/api/E8/customer/get-first-or-default";
@@ -37,8 +36,8 @@ public class CustomerServiceImpl implements CustomerService {
private final static String CUSTOMER_UPDATE = "/api/E8/customer/{id}/update";
private final static String CUSTOMER_DELETE = "/api/E8/customer/{id}";
- @Resource
- private E8ApiUtil e8ApiUtil;
+
+ private final E8ApiUtil e8ApiUtil;
/**
* 查询单个人员信息
@@ -56,7 +55,7 @@ public class CustomerServiceImpl implements CustomerService {
// 检查API调用是否成功
if (!apiResp.getSuccess()) {
- log.info("E8查询人员信息失败 errorMsg:{}", apiResp);
+ log.error("E8查询人员信息失败 errorMsg:{}", apiResp);
// 如果API调用失败,返回null
return null;
}
@@ -86,7 +85,7 @@ public class CustomerServiceImpl implements CustomerService {
if (!apiResp.getSuccess()) {
- log.info("E8人员信息分页查询 errorMsg:{}", apiResp);
+ log.error("E8人员信息分页查询 errorMsg:{}", apiResp);
// 如果API响应不成功,返回null
return null;
}
@@ -121,7 +120,7 @@ public class CustomerServiceImpl implements CustomerService {
// 检查API调用是否成功
if (!apiResp.getSuccess()) {
- log.info("E8新增人员信息失败 errorMsg:{}", apiResp);
+ log.error("E8新增人员信息失败 errorMsg:{}", apiResp);
// 如果API调用失败,返回null
return null;
}
@@ -147,6 +146,8 @@ public class CustomerServiceImpl implements CustomerService {
// 调用API工具类发送POST请求,并获取API响应对象
ApiResp apiResp = e8ApiUtil.doPost(params, api);
+ if (!apiResp.getSuccess()) log.error("E8人员信息修改失败 errorMsg:{}", apiResp);
+
// 返回API调用是否成功的标志
return apiResp.getSuccess();
}
@@ -165,6 +166,8 @@ public class CustomerServiceImpl implements CustomerService {
// 调用API工具类的 doGetOrDel 方法发送GET或DELETE请求,并获取响应结果
ApiResp apiResp = e8ApiUtil.doGetOrDel(api, null, true);
+ if (!apiResp.getSuccess()) log.error("E8删除人员信息失败 errorMsg:{}", apiResp);
+
// 返回API请求是否成功的标志
return apiResp.getSuccess();
}
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 b5c2e4c6..060151cb 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
@@ -3,8 +3,8 @@ package org.dromara.sis.sdk.e8.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.sis.sdk.e8.DoorDeviceService;
import org.dromara.sis.sdk.e8.domain.ApiResp;
@@ -13,12 +13,10 @@ import org.dromara.sis.sdk.e8.domain.door.req.DoorDeviceFindReq;
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.door.res.DoorDeviceUpdateRes;
import org.dromara.sis.sdk.e8.domain.QueryDto;
import org.dromara.sis.sdk.e8.utils.E8ApiUtil;
import org.springframework.stereotype.Service;
-import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@@ -29,7 +27,7 @@ import java.util.Map;
*/
@Slf4j
@Service
-@DubboService
+@RequiredArgsConstructor
public class DoorDeviceServiceImpl implements DoorDeviceService {
private final static String DOOR_DEVICE_GET_PAGE_LIST = "/api/e8door/man-device-info/get-page-list";
@@ -38,8 +36,8 @@ public class DoorDeviceServiceImpl implements DoorDeviceService {
private final static String DOOR_DEVICE_UPDATE = "/api/E8Door/man-device-info/{id}/update";
private final static String DOOR_DEVICE_DELETE = "/api/E8Door/man-device-info/{id}";
- @Resource
- private E8ApiUtil e8ApiUtil;
+
+ private final E8ApiUtil e8ApiUtil;
/**
* 查询门禁信息
@@ -135,7 +133,7 @@ public class DoorDeviceServiceImpl implements DoorDeviceService {
* @return DoorDeviceUpdateRes
*/
@Override
- public DoorDeviceUpdateRes updateDoorDevice(DoorDeviceUpdateReq updateReq) {
+ public Boolean updateDoorDevice(DoorDeviceUpdateReq updateReq) {
// 构造门设备更新API的URL
String api = DOOR_DEVICE_UPDATE.replace("{id}", updateReq.getId().toString());
@@ -146,13 +144,9 @@ public class DoorDeviceServiceImpl implements DoorDeviceService {
// 调用API进行门设备信息更新
ApiResp apiResp = e8ApiUtil.doPost(params, api);
- if (!apiResp.getSuccess()) {
- log.error("修改E8门禁信息,errorMsg:{}", apiResp);
- // 如果响应不成功,则返回null
- return null;
- }
+ if (!apiResp.getSuccess()) log.error("修改E8门禁信息,errorMsg:{}", apiResp);
- return JSONUtil.toBean(JSONUtil.toJsonStr(apiResp.getResult()), DoorDeviceUpdateRes.class);
+ return apiResp.getSuccess();
}
/**
@@ -170,9 +164,7 @@ public class DoorDeviceServiceImpl implements DoorDeviceService {
// 调用E8 API工具类进行HTTP DELETE请求,参数为构造的API路径和null(因为DELETE请求通常不需要请求体)
ApiResp apiResp = e8ApiUtil.doGetOrDel(api, null, true);
- if (!apiResp.getSuccess()) {
- log.error("删除E8门禁信息,errorMsg:{}", apiResp);
- }
+ if (!apiResp.getSuccess()) log.error("删除E8门禁信息,errorMsg:{}", apiResp);
// 返回API响应的成功标志
return apiResp.getSuccess();
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/VoucherControlServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/VoucherControlServiceImpl.java
new file mode 100644
index 00000000..fa87143a
--- /dev/null
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/impl/VoucherControlServiceImpl.java
@@ -0,0 +1,151 @@
+package org.dromara.sis.sdk.e8.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.sis.sdk.e8.VoucherControlService;
+import org.dromara.sis.sdk.e8.domain.ApiResp;
+import org.dromara.sis.sdk.e8.domain.voucher.req.CancelVoucherReq;
+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.dromara.sis.sdk.e8.utils.E8ApiUtil;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author lsm
+ * @apiNote VoucherControlServiceImpl
+ * @since 2025/6/25
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class VoucherControlServiceImpl implements VoucherControlService {
+
+ private static final String ISSUANCE_VOUCHER = "/api/E8/voucher/issue-voucher";
+ private static final String ISSUANCE_VOUCHER_MANY = "/api/E8/voucher/issue-voucher-many";
+ private static final String OPERATE_VOUCHER = "/api/E8/voucher/operate-many";
+ private static final String CHANGE_CARD = "/api/E8/voucher/change-card";
+ private static final String CANCEL_VOUCHER = "/api/E8/voucher/cancel-voucher";
+
+ private final E8ApiUtil e8ApiUtil;
+
+ /**
+ * 发行凭证
+ *
+ * @param req 入参
+ * @return 是否成功
+ */
+ @Override
+ public Boolean issueVoucher(IssueVoucherReq req) {
+ // 封装入参
+ Map params = BeanUtil.beanToMap(req);
+
+ // 调用API
+ ApiResp apiResp = e8ApiUtil.doPost(params, ISSUANCE_VOUCHER);
+
+ if (!apiResp.getSuccess()) log.error("E8发行凭证失败,errorMsg:{}", apiResp);
+
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 批量发行凭证
+ *
+ * @param req 凭证数据
+ * @return Boolean
+ */
+ public Boolean issueVoucherMany(List req) {
+ // 封装入参
+ Map params = new HashMap<>();
+ params.put("many", true);
+ params.put("list", req);
+
+ // 调用API
+ ApiResp apiResp = e8ApiUtil.doPost(params, ISSUANCE_VOUCHER_MANY);
+
+ if (!apiResp.getSuccess()) log.error("E8批量发行凭证失败,errorMsg:{}", apiResp);
+
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 操作凭证
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ @Override
+ public Boolean operateVoucher(OperateVoucherReq req) {
+ // 封装入参
+ Map params = BeanUtil.beanToMap(req);
+
+ // 调用API
+ ApiResp apiResp = e8ApiUtil.doPost(params, OPERATE_VOUCHER);
+
+ if (!apiResp.getSuccess()) log.error("E8操作凭证失败,errorMsg:{}", apiResp);
+
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 换卡补卡
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ @Override
+ public Boolean changeCard(ChangeCardReq req) {
+ // 封装入参
+ Map params = BeanUtil.beanToMap(req);
+
+ // 调用API
+ ApiResp apiResp = e8ApiUtil.doPost(params, CHANGE_CARD);
+
+ if (!apiResp.getSuccess()) log.error("E8换卡补卡失败,errorMsg:{}", apiResp);
+
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 注销人员凭证
+ *
+ * @param req 入参
+ * @return Boolean
+ */
+ @Override
+ public Boolean cancelVoucher(CancelVoucherReq req) {
+ Map params = new HashMap<>();
+ params.put("many", true);
+ params.put("list", req.getIds());
+
+ ApiResp apiResp = e8ApiUtil.doPost(params, CANCEL_VOUCHER);
+
+ if (!apiResp.getSuccess()) log.error("E8注销人员凭证失败,errorMsg:{}", apiResp);
+
+ return apiResp.getSuccess();
+ }
+
+ /**
+ * 上传人脸
+ *
+ * @param imageByte 入参
+ * @return imageUrl 人脸图片地址
+ */
+ @Override
+ public String uploadFace(byte[] imageByte) {
+
+ ApiResp apiResp = e8ApiUtil.doFaceImgUpload(imageByte);
+
+ if (!apiResp.getSuccess()) {
+ log.error("上传人脸图片失败,errorMsg:{}", apiResp);
+ return null;
+ }
+
+ return apiResp.getMessage();
+ }
+}
diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/E8ApiUtil.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/E8ApiUtil.java
index 84fd0e74..3cc1df41 100644
--- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/E8ApiUtil.java
+++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/utils/E8ApiUtil.java
@@ -1,5 +1,6 @@
package org.dromara.sis.sdk.e8.utils;
+import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
@@ -10,10 +11,7 @@ import org.springframework.util.ObjectUtils;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
-import java.util.Base64;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -38,13 +36,30 @@ public class E8ApiUtil {
public ApiResp doPost(Map params, String api) {
// 时间戳
String timestamp = Long.toString(System.currentTimeMillis());
- // sign签名
- String sign = getPostSign(params, api, timestamp);
+
+ String sign;
+ String jsonBody;
+ // 判断是否执行批量接口
+ if (params.get("many") != null) {
+ Object list = params.get("list");
+ List