diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java new file mode 100644 index 00000000..93daebba --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisElevatorFloorRefController.java @@ -0,0 +1,106 @@ +package org.dromara.sis.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.sis.domain.vo.SisElevatorFloorRefVo; +import org.dromara.sis.domain.bo.SisElevatorFloorRefBo; +import org.dromara.sis.service.ISisElevatorFloorRefService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 电梯⇄楼层关联 + * 前端访问路由地址为:/sis/elevatorFloorRef + * + * @author lsm + * @since 2025-07-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/elevatorFloorRef") +public class SisElevatorFloorRefController extends BaseController { + + private final ISisElevatorFloorRefService sisElevatorFloorRefService; + + /** + * 查询电梯⇄楼层关联列表 + */ + @SaCheckPermission("sis:elevatorFloorRef:list") + @GetMapping("/list") + public TableDataInfo list(SisElevatorFloorRefBo bo, PageQuery pageQuery) { + return sisElevatorFloorRefService.queryPageList(bo, pageQuery); + } + + /** + * 导出电梯⇄楼层关联列表 + */ + @SaCheckPermission("sis:elevatorFloorRef:export") + @Log(title = "电梯⇄楼层关联", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SisElevatorFloorRefBo bo, HttpServletResponse response) { + List list = sisElevatorFloorRefService.queryList(bo); + ExcelUtil.exportExcel(list, "电梯⇄楼层关联", SisElevatorFloorRefVo.class, response); + } + + /** + * 获取电梯⇄楼层关联详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("sis:elevatorFloorRef:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(sisElevatorFloorRefService.queryById(id)); + } + + /** + * 新增电梯⇄楼层关联 + */ + @SaCheckPermission("sis:elevatorFloorRef:add") + @Log(title = "电梯⇄楼层关联", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SisElevatorFloorRefBo bo) { + return toAjax(sisElevatorFloorRefService.insertByBo(bo)); + } + + /** + * 修改电梯⇄楼层关联 + */ + @SaCheckPermission("sis:elevatorFloorRef:edit") + @Log(title = "电梯⇄楼层关联", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SisElevatorFloorRefBo bo) { + return toAjax(sisElevatorFloorRefService.updateByBo(bo)); + } + + /** + * 删除电梯⇄楼层关联 + * + * @param ids 主键串 + */ + @SaCheckPermission("sis:elevatorFloorRef:remove") + @Log(title = "电梯⇄楼层关联", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(sisElevatorFloorRefService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java new file mode 100644 index 00000000..1f749e5d --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisFloorInfoController.java @@ -0,0 +1,106 @@ +package org.dromara.sis.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.sis.domain.vo.SisFloorInfoVo; +import org.dromara.sis.domain.bo.SisFloorInfoBo; +import org.dromara.sis.service.ISisFloorInfoService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 建筑物楼层信息 + * 前端访问路由地址为:/sis/floorInfo + * + * @author lsm + * @since 2025-07-15 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/floorInfo") +public class SisFloorInfoController extends BaseController { + + private final ISisFloorInfoService sisFloorInfoService; + + /** + * 查询建筑物楼层信息列表 + */ + @SaCheckPermission("sis:floorInfo:list") + @GetMapping("/list") + public TableDataInfo list(SisFloorInfoBo bo, PageQuery pageQuery) { + return sisFloorInfoService.queryPageList(bo, pageQuery); + } + + /** + * 导出建筑物楼层信息列表 + */ + @SaCheckPermission("sis:floorInfo:export") + @Log(title = "建筑物楼层信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SisFloorInfoBo bo, HttpServletResponse response) { + List list = sisFloorInfoService.queryList(bo); + ExcelUtil.exportExcel(list, "建筑物楼层信息", SisFloorInfoVo.class, response); + } + + /** + * 获取建筑物楼层信息详细信息 + * + * @param floorId 主键 + */ + @SaCheckPermission("sis:floorInfo:query") + @GetMapping("/{floorId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("floorId") Long floorId) { + return R.ok(sisFloorInfoService.queryById(floorId)); + } + + /** + * 新增建筑物楼层信息 + */ + @SaCheckPermission("sis:floorInfo:add") + @Log(title = "建筑物楼层信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SisFloorInfoBo bo) { + return toAjax(sisFloorInfoService.insertByBo(bo)); + } + + /** + * 修改建筑物楼层信息 + */ + @SaCheckPermission("sis:floorInfo:edit") + @Log(title = "建筑物楼层信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SisFloorInfoBo bo) { + return toAjax(sisFloorInfoService.updateByBo(bo)); + } + + /** + * 删除建筑物楼层信息 + * + * @param floorIds 主键串 + */ + @SaCheckPermission("sis:floorInfo:remove") + @Log(title = "建筑物楼层信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{floorIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("floorIds") Long[] floorIds) { + return toAjax(sisFloorInfoService.deleteWithValidByIds(List.of(floorIds), true)); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java new file mode 100644 index 00000000..59f93ee5 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisElevatorFloorRef.java @@ -0,0 +1,41 @@ +package org.dromara.sis.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 电梯⇄楼层关联对象 sis_elevator_floor_ref + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sis_elevator_floor_ref") +public class SisElevatorFloorRef extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @TableId(value = "id") + private Long id; + + /** + * 电梯id + */ + private Long elevatorId; + + /** + * 楼层层数 + */ + private Long layerNum; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java new file mode 100644 index 00000000..77fdca03 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/SisFloorInfo.java @@ -0,0 +1,50 @@ +package org.dromara.sis.domain; + +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 建筑物楼层信息对象 sis_floor_info + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sis_floor_info") +public class SisFloorInfo extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 楼层唯一标识 + */ + @TableId(value = "floor_id") + private Long floorId; + + /** + * 最低层 + */ + private Long minLayer; + + /** + * 最高层 + */ + private Long maxLayer; + + /** + * 园区id + */ + private Long communityId; + + /** + * 建筑id + */ + private Long buildingId; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java new file mode 100644 index 00000000..3da9c32f --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisElevatorFloorRefBo.java @@ -0,0 +1,42 @@ +package org.dromara.sis.domain.bo; + +import org.dromara.sis.domain.SisElevatorFloorRef; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 电梯⇄楼层关联业务对象 sis_elevator_floor_ref + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SisElevatorFloorRef.class, reverseConvertGenerate = false) +public class SisElevatorFloorRefBo extends BaseEntity { + + /** + * 主键id + */ + @NotNull(message = "主键id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 电梯id + */ + @NotNull(message = "电梯id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long elevatorId; + + /** + * 楼层层数 + */ + @NotNull(message = "楼层层数不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long layerNum; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java new file mode 100644 index 00000000..df59a78b --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/bo/SisFloorInfoBo.java @@ -0,0 +1,53 @@ +package org.dromara.sis.domain.bo; + +import org.dromara.sis.domain.SisFloorInfo; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 建筑物楼层信息业务对象 sis_floor_info + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SisFloorInfo.class, reverseConvertGenerate = false) +public class SisFloorInfoBo extends BaseEntity { + + /** + * 楼层唯一标识 + */ + @NotNull(message = "楼层唯一标识不能为空", groups = { EditGroup.class }) + private Long floorId; + + /** + * 最低层 + */ + @NotNull(message = "最低层不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long minLayer; + + /** + * 最高层 + */ + @NotNull(message = "最高层不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long maxLayer; + + /** + * 园区id + */ + @NotNull(message = "园区id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long communityId; + + /** + * 建筑id + */ + @NotNull(message = "建筑id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long buildingId; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java index 864abcaa..d9d30feb 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAccessControlVo.java @@ -105,6 +105,12 @@ public class SisAccessControlVo implements Serializable { @ExcelProperty(value = "外部编码") private String outCode; + /** + * 外部门编码 + */ + @ExcelProperty(value = "外部编码") + private String outDoorCode; + private String bindDeviceId; private String bindDeviceIp; diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java index 6b9d50ad..4f26c293 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisAuthRecordVo.java @@ -42,7 +42,7 @@ public class SisAuthRecordVo implements Serializable { * 设备id(门禁/电梯) */ @ExcelProperty(value = "设备id", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "门=禁/电梯") + @ExcelDictFormat(readConverterExp = "门禁/电梯") private Long deviceId; /** diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java new file mode 100644 index 00000000..31d5b63a --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisElevatorFloorRefVo.java @@ -0,0 +1,50 @@ +package org.dromara.sis.domain.vo; + +import org.dromara.sis.domain.SisElevatorFloorRef; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 电梯⇄楼层关联视图对象 sis_elevator_floor_ref + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SisElevatorFloorRef.class) +public class SisElevatorFloorRefVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键id + */ + @ExcelProperty(value = "主键id") + private Long id; + + /** + * 电梯id + */ + @ExcelProperty(value = "电梯id") + private Long elevatorId; + + /** + * 楼层层数 + */ + @ExcelProperty(value = "楼层层数") + private Long layerNum; + + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java new file mode 100644 index 00000000..b7ed5471 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisFloorInfoVo.java @@ -0,0 +1,61 @@ +package org.dromara.sis.domain.vo; + +import org.dromara.sis.domain.SisFloorInfo; +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 建筑物楼层信息视图对象 sis_floor_info + * + * @author lsm + * @since 2025-07-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SisFloorInfo.class) +public class SisFloorInfoVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 楼层唯一标识 + */ + @ExcelProperty(value = "楼层唯一标识") + private Long floorId; + + /** + * 最低层 + */ + @ExcelProperty(value = "最低层") + private Long minLayer; + + /** + * 最高层 + */ + @ExcelProperty(value = "最高层") + private Long maxLayer; + + /** + * 园区id + */ + @ExcelProperty(value = "园区id") + private Long communityId; + + /** + * 建筑id + */ + @ExcelProperty(value = "建筑id") + private Long buildingId; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java index 54f18483..da91c0c0 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisAuthRecordMapper.java @@ -4,6 +4,8 @@ import org.dromara.sis.domain.SisAuthRecord; import org.dromara.sis.domain.vo.SisAuthRecordVo; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import java.util.List; + /** * 授权记录Mapper接口 * @@ -11,5 +13,5 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; * @since 2025-07-14 */ public interface SisAuthRecordMapper extends BaseMapperPlus { - + List checkAuth(Long personId); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java new file mode 100644 index 00000000..3381838f --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisElevatorFloorRefMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sis.mapper; + +import org.dromara.sis.domain.SisElevatorFloorRef; +import org.dromara.sis.domain.vo.SisElevatorFloorRefVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 电梯⇄楼层关联Mapper接口 + * + * @author lsm + * @date 2025-07-15 + */ +public interface SisElevatorFloorRefMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java new file mode 100644 index 00000000..75228ca6 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/mapper/SisFloorInfoMapper.java @@ -0,0 +1,15 @@ +package org.dromara.sis.mapper; + +import org.dromara.sis.domain.SisFloorInfo; +import org.dromara.sis.domain.vo.SisFloorInfoVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 建筑物楼层信息Mapper接口 + * + * @author lsm + * @date 2025-07-15 + */ +public interface SisFloorInfoMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java index e0a303b6..142d43e5 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/runner/HikDeviceApplicationRunner.java @@ -4,25 +4,32 @@ import cn.hutool.core.collection.CollUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.SpringUtils; +import org.dromara.sis.domain.bo.SisDeviceManageBo; +import org.dromara.sis.domain.vo.SisDeviceManageVo; import org.dromara.sis.domain.vo.SisElevatorInfoVo; +import org.dromara.sis.domain.vo.SisFloorInfoVo; import org.dromara.sis.sdk.hik.HikApiService; import org.dromara.sis.sdk.hik.calback.HikAlarmCallBack; +import org.dromara.sis.service.ISisDeviceManageService; import org.dromara.sis.service.ISisElevatorInfoService; +import org.dromara.sis.service.ISisFloorInfoService; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; @Slf4j -@RequiredArgsConstructor @Component +@RequiredArgsConstructor public class HikDeviceApplicationRunner implements ApplicationRunner { - private final ISisElevatorInfoService elevatorInfoService; private final HikAlarmCallBack hikAlarmCallBack; + private final ISisFloorInfoService floorInfoService; + private final ISisDeviceManageService deviceManageService; + private final ISisElevatorInfoService elevatorInfoService; @Override public void run(ApplicationArguments args) throws Exception { @@ -38,35 +45,73 @@ public class HikDeviceApplicationRunner implements ApplicationRunner { @Async public void hikElevatorInfoLogin() { - /*List sisElevatorInfoVos = elevatorInfoService.queryAll(); + List sisElevatorInfoVos = elevatorInfoService.queryAll(); if (CollUtil.isNotEmpty(sisElevatorInfoVos)) { sisElevatorInfoVos.forEach(item -> { // 执行设备登录操作 HikApiService.getInstance().login(item.getControlIp(), item.getControlPort().shortValue(), item.getControlAccount(), item.getControlPwd()); + // 根据建筑ID获取楼层信息 + SisFloorInfoVo floorInfo = floorInfoService.queryByBuildingId(item.getBuildingId()); + // 获取楼层数组 + List layerArray = generateFloorArray(floorInfo.getMinLayer().intValue(), floorInfo.getMaxLayer().intValue()); + // 下发权限 + for (int i = 0; i < layerArray.size(); i++) { + HikApiService.getInstance().controlGateway(item.getControlIp(), (i + 1), layerArray.get(i)); + } }); - }*/ - String ip = "192.168.24.188"; - short port = 8000; - String account = "admin"; - String pwd = "qweasd123"; - HikApiService.getInstance().login(ip, port, account, pwd); - List arrs = Arrays.asList(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); - for (int i = 0; i < arrs.size(); i++) { - HikApiService.getInstance().controlGateway(ip, (i + 1), arrs.get(i)); + } +// String ip = "192.168.24.188"; +// short port = 8000; +// String account = "admin"; +// String pwd = "qweasd123"; +// HikApiService.getInstance().login(ip, port, account, pwd); +// List arrs = Arrays.asList(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); +// for (int i = 0; i < arrs.size(); i++) { +// HikApiService.getInstance().controlGateway(ip, (i + 1), arrs.get(i)); +// } + } + + //输入最低层,最高层,返回楼层数组 + public List generateFloorArray(int minLayer, int maxLayer) { + // 验证输入范围 + if (minLayer > maxLayer) { + throw new IllegalArgumentException("最低层不能大于最高层"); } + // 使用List动态收集楼层 + List layerList = new ArrayList<>(); + + // 遍历所有楼层,跳过0层 + for (int layer = minLayer; layer <= maxLayer; layer++) { + if (layer != 0) { + // 初始数组赋值为3,不下发权限 + layerList.add(3); + } + } + + return layerList; } @Async public void hikNetCameraLogin() { - String ip = "192.168.24.19"; - short port = 8000; - String account = "admin"; - String pwd = "xzf13579"; - int handler = HikApiService.getInstance().login(ip, port, account, pwd); - if(handler != -1){ - HikApiService.getInstance().setAlarmChan(handler); + List deviceList = deviceManageService.queryList(new SisDeviceManageBo()); + + if (CollUtil.isEmpty(deviceList)) { + log.info("没有查询到摄像设备信息,不执行登录"); + return; } + + deviceList.forEach(item -> { + int handler = HikApiService.getInstance().login(item.getDeviceIp(), item.getDevicePort().shortValue(), item.getDeviceAccount(), item.getDevicePwd()); + if (handler != -1) { + HikApiService.getInstance().setAlarmChan(handler); + } + }); +// String ip = "192.168.24.19"; +// short port = 8000; +// String account = "admin"; +// String pwd = "xzf13579"; +// int handler = HikApiService.getInstance().login(ip, port, account, pwd); } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index ae400392..460ed0ca 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -1,16 +1,22 @@ package org.dromara.sis.sdk.hik.calback; import cn.hutool.core.codec.Base64Encoder; +import cn.hutool.core.collection.CollUtil; import com.sun.jna.Pointer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.domain.vo.*; +import org.dromara.sis.sdk.e8.AccessControlService; +import org.dromara.sis.sdk.e8.domain.accessControl.req.RemoteOpenDoorReq; import org.dromara.sis.sdk.hik.HCNetSDK; import org.dromara.sis.sdk.hik.HikApiService; import org.dromara.sis.sdk.huawei.HuaWeiBoxApi; +import org.dromara.sis.service.*; import org.springframework.stereotype.Component; import java.nio.ByteBuffer; -import java.util.Arrays; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; @Slf4j @@ -19,6 +25,14 @@ import java.util.List; public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { private final HuaWeiBoxApi huaWeiBoxApi; + private final ISisFloorInfoService floorInfoService; + private final ISisAuthRecordService authRecordService; + private final ISisElevatorInfoService elevatorInfoService; + private final ISisDeviceBindRefService deviceBindRefService; + private final ISisAccessControlService accessControlService; + private final ISisElevatorFloorRefService elevatorFloorRefService; + + private final AccessControlService e8AccessControlService; private static final int COMM_UPLOAD_FACESNAP_RESULT = 0x1112; @@ -32,47 +46,132 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { Pointer pItsPlateInfo = result.getPointer(); pItsPlateInfo.write(0, pAlarmInfo.getByteArray(0, result.size()), 0, result.size()); result.read(); + // 读取人脸小图 ByteBuffer buffers = result.pBuffer1.getByteBuffer(0, result.dwFacePicLen); byte[] smallImg = new byte[result.dwFacePicLen]; buffers.rewind(); buffers.get(smallImg); - String dir = ""; + // 读取人脸大图 -// ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen); -// byte[] bigImg = new byte[result.dwBackgroundPicLen]; -// buffers1.rewind(); -// buffers1.get(bigImg); + /*ByteBuffer buffers1 = result.pBuffer2.getByteBuffer(0, result.dwBackgroundPicLen); + byte[] bigImg = new byte[result.dwBackgroundPicLen]; + buffers1.rewind(); + buffers1.get(bigImg);*/ + + //设备ip + String sAlarmInfo = new String(pAlarmer.sDeviceIP).trim(); + // 设备绑定关系 + List bindRefList = deviceBindRefService.queryByDeviceIp(sAlarmInfo); + if (CollUtil.isEmpty(bindRefList)) { + log.info("当前报警设备未绑定门禁/梯控,不做处理!"); + return true; + } + // todo 进行人脸比对 String smallImgBase64Str = Base64Encoder.encode(smallImg); - long s1 = System.currentTimeMillis(); Long person = huaWeiBoxApi.findPerson(smallImgBase64Str); log.info("人脸比对执行完成,耗时:{}", System.currentTimeMillis() - s1); if (person == null) { log.info("未命中人脸数据,暂不处理。"); - log.info("权限下发执行完成,耗时:{}", System.currentTimeMillis() - s); return true; } log.info("人脸比对完成,personId={}", person); + + // 授权记录 + List authVoList = authRecordService.checkAuth(person); + // 获取门禁id + Collection acIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 1).map(SisAuthRecordVo::getDeviceId).toList(); + if (CollUtil.isNotEmpty(acIds)) { + acIds.forEach(id -> { + Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null); + SisAccessControlVo ac = accessControlService.queryById(deviceId); + if (ac != null) { + log.info("调用门禁服务远程开门"); + RemoteOpenDoorReq req = new RemoteOpenDoorReq(); + req.setType(0); + RemoteOpenDoorReq.ControlData data = new RemoteOpenDoorReq.ControlData(); + data.setDeviceId(Long.parseLong(ac.getOutCode())); + data.setDoorId(Long.parseLong(ac.getOutCode())); + req.setControlList(List.of(data)); + Boolean flag = e8AccessControlService.remoteOpenDoor(req); + log.info("远程开门结果,result={}", flag); + } + }); + } + + + // 获取电梯ids + Collection eleIds = authVoList.stream().filter(vo -> vo.getDeviceType() == 2).map(SisAuthRecordVo::getDeviceId).toList(); + if (CollUtil.isNotEmpty(eleIds)) { + eleIds.forEach(id -> { + Long deviceId = bindRefList.stream().filter(vo -> vo.getBindId().equals(id)).findFirst().map(SisDeviceBindRefVo::getDeviceId).orElse(null); + SisElevatorInfoVo ele = elevatorInfoService.queryById(deviceId); + if (ele != null) { + log.info("下发电梯权限"); + // 根据建筑ID获取楼层信息 + SisFloorInfoVo floorInfo = floorInfoService.queryByBuildingId(ele.getBuildingId()); + // 获取电梯⇄楼层关联信息 + List floorRefList = elevatorFloorRefService.queryByElevatorId(deviceId); + // 获取楼层数组 + List layerArray = generateFloorArray(floorInfo.getMinLayer().intValue(), floorInfo.getMaxLayer().intValue()); + + + layerArray.forEach(layer -> { + SisElevatorFloorRefVo floorRef = floorRefList.stream() + .filter(vo -> vo.getLayerNum().intValue() == layer) // 直接使用 layer + .findFirst() + .orElse(null); + + if (floorRef == null) { + HikApiService.getInstance().controlGateway(ele.getControlIp(), layer, 3); + } else { + HikApiService.getInstance().controlGateway(ele.getControlIp(), layer, 2); + } + }); + } + + }); + } + // List arrs = Arrays.asList(2, 2, 2, 3, 3, 3 ,3, 3, 3, 3, 3, 3, 3, 3, 3, 3); - List arrs = Arrays.asList(3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); - for (int i = 0; i < arrs.size(); i++) { - HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i)); - } - log.info("权限下发执行完成,耗时:{}", System.currentTimeMillis() - s); - try { - Thread.sleep(10000L); - List ass = Arrays.asList(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3); - for (int i = 0; i < arrs.size(); i++) { - HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i)); - } - } catch (InterruptedException e) { - throw new RuntimeException(e); - } +// List arrs = Arrays.asList(3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2); +// for (int i = 0; i < arrs.size(); i++) { +// HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i)); +// } +// log.info("权限下发执行完成,耗时:{}", System.currentTimeMillis() - s); +// try { +// Thread.sleep(10000L); +// List ass = Arrays.asList(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3); +// for (int i = 0; i < arrs.size(); i++) { +// HikApiService.getInstance().controlGateway("192.168.24.188", (i + 1), arrs.get(i)); +// } +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } } else { log.info("未知报警类型,lCommand={}", lCommand); } return true; } + + //输入最低层,最高层,返回楼层数组 + public List generateFloorArray(int minLayer, int maxLayer) { + + // 验证输入范围 + if (minLayer > maxLayer) { + throw new IllegalArgumentException("最低层不能大于最高层"); + } + // 使用List动态收集楼层 + List layerList = new ArrayList<>(); + // 遍历所有楼层,跳过0层 + for (int layer = minLayer; layer <= maxLayer; layer++) { + if (layer != 0) { + layerList.add(layer); + } + } + + return layerList; + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java index 57c24ee3..8858c71c 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisAuthRecordService.java @@ -89,4 +89,11 @@ public interface ISisAuthRecordService { * @return List> */ List> authDeviceTree(); + + /** + * 根据人脸比对ID,返回授权记录 + * + * @param personId 人脸比对ID + */ + List checkAuth(Long personId); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java index d47a2f8f..8b04d92c 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisDeviceBindRefService.java @@ -81,7 +81,7 @@ public interface ISisDeviceBindRefService { * @param ipcAddr 设备ip * @return 返回关联关系表 */ - SisDeviceBindRef queryByDeviceIp(String ipcAddr); + List queryByDeviceIp(String ipcAddr); /** * 批量写入设备绑定关系 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java new file mode 100644 index 00000000..fdca3de7 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisElevatorFloorRefService.java @@ -0,0 +1,75 @@ +package org.dromara.sis.service; + +import org.dromara.sis.domain.vo.SisElevatorFloorRefVo; +import org.dromara.sis.domain.bo.SisElevatorFloorRefBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 电梯⇄楼层关联Service接口 + * + * @author lsm + * @since 2025-07-15 + */ +public interface ISisElevatorFloorRefService { + + /** + * 查询电梯⇄楼层关联 + * + * @param id 主键 + * @return 电梯⇄楼层关联 + */ + SisElevatorFloorRefVo queryById(Long id); + + /** + * 分页查询电梯⇄楼层关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 电梯⇄楼层关联分页列表 + */ + TableDataInfo queryPageList(SisElevatorFloorRefBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的电梯⇄楼层关联列表 + * + * @param bo 查询条件 + * @return 电梯⇄楼层关联列表 + */ + List queryList(SisElevatorFloorRefBo bo); + + /** + * 新增电梯⇄楼层关联 + * + * @param bo 电梯⇄楼层关联 + * @return 是否新增成功 + */ + Boolean insertByBo(SisElevatorFloorRefBo bo); + + /** + * 修改电梯⇄楼层关联 + * + * @param bo 电梯⇄楼层关联 + * @return 是否修改成功 + */ + Boolean updateByBo(SisElevatorFloorRefBo bo); + + /** + * 校验并批量删除电梯⇄楼层关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据电梯id,获取电梯⇄楼层关联信息 + * + * @param elevatorId 电梯id + */ + List queryByElevatorId(Long elevatorId); +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java new file mode 100644 index 00000000..928dca17 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/ISisFloorInfoService.java @@ -0,0 +1,76 @@ +package org.dromara.sis.service; + +import org.dromara.sis.domain.vo.SisFloorInfoVo; +import org.dromara.sis.domain.bo.SisFloorInfoBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 建筑物楼层信息Service接口 + * + * @author lsm + * @since 2025-07-15 + */ +public interface ISisFloorInfoService { + + /** + * 查询建筑物楼层信息 + * + * @param floorId 主键 + * @return 建筑物楼层信息 + */ + SisFloorInfoVo queryById(Long floorId); + + /** + * 分页查询建筑物楼层信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 建筑物楼层信息分页列表 + */ + TableDataInfo queryPageList(SisFloorInfoBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的建筑物楼层信息列表 + * + * @param bo 查询条件 + * @return 建筑物楼层信息列表 + */ + List queryList(SisFloorInfoBo bo); + + /** + * 新增建筑物楼层信息 + * + * @param bo 建筑物楼层信息 + * @return 是否新增成功 + */ + Boolean insertByBo(SisFloorInfoBo bo); + + /** + * 修改建筑物楼层信息 + * + * @param bo 建筑物楼层信息 + * @return 是否修改成功 + */ + Boolean updateByBo(SisFloorInfoBo bo); + + /** + * 校验并批量删除建筑物楼层信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 根据建筑ID返回楼层信息 + * + * @param buildingId 建筑ID + * @return 楼层信息 + */ + SisFloorInfoVo queryByBuildingId(Long buildingId); +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java index f9f49304..e5736ad3 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAuthRecordServiceImpl.java @@ -199,7 +199,7 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { */ @Override @Transactional(rollbackFor = Exception.class) - public Boolean deleteByLibId(Long libId){ + public Boolean deleteByLibId(Long libId) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(SisAuthRecord::getLibId, libId); return baseMapper.delete(lqw) > 0; @@ -208,10 +208,10 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { /** * 查询所有可授权设备树 * - * @return List> + * @return List> */ @Override - public List> authDeviceTree(){ + public List> authDeviceTree() { // 暂时将所有数据放入写死的根节点中 TreeNode root = new TreeNode<>(); root.setLevel(0); @@ -238,7 +238,6 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { List eleVoList = elevatorInfoService.queryList(new SisElevatorInfoBo()); - List> acChildrenList = acVoList.stream().map(item -> { TreeNode node = new TreeNode<>(); node.setLevel(2); @@ -265,4 +264,14 @@ public class SisAuthRecordServiceImpl implements ISisAuthRecordService { root.setChildren(List.of(accessNode, elevatorNode)); return List.of(root); } + + /** + * 根据人脸比对ID,返回授权记录 + * + * @param personId 人脸比对ID + */ + @Override + public List checkAuth(Long personId) { + return baseMapper.checkAuth(personId); + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceBindRefServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceBindRefServiceImpl.java index 6657674f..7c1f6bd5 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceBindRefServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisDeviceBindRefServiceImpl.java @@ -138,10 +138,10 @@ public class SisDeviceBindRefServiceImpl implements ISisDeviceBindRefService { } @Override - public SisDeviceBindRef queryByDeviceIp(String ipcAddr) { + public List queryByDeviceIp(String ipcAddr) { LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(SisDeviceBindRef::getDeviceIp, ipcAddr); - return baseMapper.selectOne(lqw); + return baseMapper.selectVoList(lqw); } @Override diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java new file mode 100644 index 00000000..524fae90 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisElevatorFloorRefServiceImpl.java @@ -0,0 +1,145 @@ +package org.dromara.sis.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.sis.domain.bo.SisElevatorFloorRefBo; +import org.dromara.sis.domain.vo.SisElevatorFloorRefVo; +import org.dromara.sis.domain.SisElevatorFloorRef; +import org.dromara.sis.mapper.SisElevatorFloorRefMapper; +import org.dromara.sis.service.ISisElevatorFloorRefService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 电梯⇄楼层关联Service业务层处理 + * + * @author lsm + * @date 2025-07-15 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SisElevatorFloorRefServiceImpl implements ISisElevatorFloorRefService { + + private final SisElevatorFloorRefMapper baseMapper; + + /** + * 查询电梯⇄楼层关联 + * + * @param id 主键 + * @return 电梯⇄楼层关联 + */ + @Override + public SisElevatorFloorRefVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 分页查询电梯⇄楼层关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 电梯⇄楼层关联分页列表 + */ + @Override + public TableDataInfo queryPageList(SisElevatorFloorRefBo 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(SisElevatorFloorRefBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SisElevatorFloorRefBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SisElevatorFloorRef::getId); + lqw.eq(bo.getElevatorId() != null, SisElevatorFloorRef::getElevatorId, bo.getElevatorId()); + lqw.eq(bo.getLayerNum() != null, SisElevatorFloorRef::getLayerNum, bo.getLayerNum()); + return lqw; + } + + /** + * 新增电梯⇄楼层关联 + * + * @param bo 电梯⇄楼层关联 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SisElevatorFloorRefBo bo) { + SisElevatorFloorRef add = MapstructUtils.convert(bo, SisElevatorFloorRef.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改电梯⇄楼层关联 + * + * @param bo 电梯⇄楼层关联 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SisElevatorFloorRefBo bo) { + SisElevatorFloorRef update = MapstructUtils.convert(bo, SisElevatorFloorRef.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SisElevatorFloorRef entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除电梯⇄楼层关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据电梯id,获取电梯⇄楼层关联信息 + * + * @param elevatorId 电梯id + */ + @Override + public List queryByElevatorId(Long elevatorId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SisElevatorFloorRef::getElevatorId, elevatorId); + return baseMapper.selectVoList(lqw); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisFloorInfoServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisFloorInfoServiceImpl.java new file mode 100644 index 00000000..60ace67c --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisFloorInfoServiceImpl.java @@ -0,0 +1,149 @@ +package org.dromara.sis.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.sis.domain.bo.SisFloorInfoBo; +import org.dromara.sis.domain.vo.SisFloorInfoVo; +import org.dromara.sis.domain.SisFloorInfo; +import org.dromara.sis.mapper.SisFloorInfoMapper; +import org.dromara.sis.service.ISisFloorInfoService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 建筑物楼层信息Service业务层处理 + * + * @author lsm + * @since 2025-07-15 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class SisFloorInfoServiceImpl implements ISisFloorInfoService { + + private final SisFloorInfoMapper baseMapper; + + /** + * 查询建筑物楼层信息 + * + * @param floorId 主键 + * @return 建筑物楼层信息 + */ + @Override + public SisFloorInfoVo queryById(Long floorId){ + return baseMapper.selectVoById(floorId); + } + + /** + * 分页查询建筑物楼层信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 建筑物楼层信息分页列表 + */ + @Override + public TableDataInfo queryPageList(SisFloorInfoBo 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(SisFloorInfoBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SisFloorInfoBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(SisFloorInfo::getFloorId); + lqw.eq(bo.getMinLayer() != null, SisFloorInfo::getMinLayer, bo.getMinLayer()); + lqw.eq(bo.getMaxLayer() != null, SisFloorInfo::getMaxLayer, bo.getMaxLayer()); + lqw.eq(bo.getBuildingId() != null, SisFloorInfo::getBuildingId, bo.getBuildingId()); + lqw.eq(bo.getCommunityId() != null, SisFloorInfo::getCommunityId, bo.getCommunityId()); + return lqw; + } + + /** + * 新增建筑物楼层信息 + * + * @param bo 建筑物楼层信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(SisFloorInfoBo bo) { + SisFloorInfo add = MapstructUtils.convert(bo, SisFloorInfo.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setFloorId(add.getFloorId()); + } + return flag; + } + + /** + * 修改建筑物楼层信息 + * + * @param bo 建筑物楼层信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(SisFloorInfoBo bo) { + SisFloorInfo update = MapstructUtils.convert(bo, SisFloorInfo.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(SisFloorInfo entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除建筑物楼层信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 根据建筑ID返回楼层信息 + * + * @param buildingId 建筑ID + * @return 楼层信息 + */ + @Override + public SisFloorInfoVo queryByBuildingId(Long buildingId){ + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(SisFloorInfo::getBuildingId, buildingId); + return baseMapper.selectVoOne(qw); + } +} diff --git a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAuthRecordMapper.xml b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAuthRecordMapper.xml index 27bad1ae..91142918 100644 --- a/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAuthRecordMapper.xml +++ b/ruoyi-modules/Sis/src/main/resources/mapper/sis/SisAuthRecordMapper.xml @@ -5,10 +5,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"