From 746a3616254a76504de3808b9c437a2453f64a73 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 26 Nov 2025 10:22:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(rfid):=20=E6=96=B0=E5=A2=9ERFID=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E3=80=81=E4=BD=8D=E7=BD=AE=E5=92=8C=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=A8=A1=E5=9D=97=E5=8F=8A=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增RfidDevice、RfidLocation、RfidReadRecord三个子系统的Service接口及实现 - 实现设备信息增删改查及分页查询功能,支持导出Excel操作 - 完善设备唯一性校验及删除前关联读取记录校验,防止孤儿数据产生 - 新增设备相关的数据传输对象(BO,VO)及MyBatis Mapper和XML映射文件支持自定义复杂SQL查询 - 新增RfidDashboardController提供首页设备状态统计接口,统计在线、离线、告警设备数量 - 设备信息支持在线状态、告警状态和标识状态的字典数据转换及导出显示 - 提供设备下拉列表接口,方便前端获取设备简要信息 - 采用注解实现接口权限控制、日志记录、请求有效性校验及防重提交 - 全面符合代码规范及分层设计,提升RFID模块整体功能与稳定性 --- .../controller/RfidDashboardController.java | 65 +++++ .../rfid/controller/RfidDeviceController.java | 116 ++++++++ .../controller/RfidLocationController.java | 116 ++++++++ .../controller/RfidReadRecordController.java | 116 ++++++++ .../org/dromara/rfid/domain/RfidDevice.java | 103 +++++++ .../org/dromara/rfid/domain/RfidLocation.java | 88 ++++++ .../dromara/rfid/domain/RfidReadRecord.java | 73 +++++ .../dromara/rfid/domain/bo/RfidDeviceBo.java | 107 +++++++ .../rfid/domain/bo/RfidLocationBo.java | 85 ++++++ .../rfid/domain/bo/RfidReadRecordBo.java | 77 ++++++ .../rfid/domain/vo/RfidDashboardStatsVo.java | 32 +++ .../dromara/rfid/domain/vo/RfidDeviceVo.java | 133 +++++++++ .../rfid/domain/vo/RfidLocationVo.java | 104 +++++++ .../rfid/domain/vo/RfidReadRecordVo.java | 103 +++++++ .../dromara/rfid/mapper/RfidDeviceMapper.java | 103 +++++++ .../rfid/mapper/RfidLocationMapper.java | 104 +++++++ .../rfid/mapper/RfidReadRecordMapper.java | 103 +++++++ .../rfid/service/IRfidDeviceService.java | 85 ++++++ .../rfid/service/IRfidLocationService.java | 58 ++++ .../rfid/service/IRfidReadRecordService.java | 68 +++++ .../service/impl/RfidDeviceServiceImpl.java | 186 +++++++++++++ .../service/impl/RfidLocationServiceImpl.java | 220 +++++++++++++++ .../impl/RfidReadRecordServiceImpl.java | 141 ++++++++++ .../mapper/rfid/RfidDeviceMapper.xml | 261 ++++++++++++++++++ .../mapper/rfid/RfidLocationMapper.xml | 169 ++++++++++++ .../mapper/rfid/RfidReadRecordMapper.xml | 199 +++++++++++++ 26 files changed, 3015 insertions(+) create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDashboardController.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDeviceController.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidLocationController.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidReadRecordController.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidDevice.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidLocation.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidReadRecord.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidDeviceBo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidLocationBo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidReadRecordBo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDashboardStatsVo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDeviceVo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidLocationVo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidReadRecordVo.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidDeviceMapper.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidLocationMapper.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidReadRecordMapper.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidDeviceService.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidLocationService.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidReadRecordService.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidDeviceServiceImpl.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidLocationServiceImpl.java create mode 100644 ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidReadRecordServiceImpl.java create mode 100644 ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidDeviceMapper.xml create mode 100644 ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidLocationMapper.xml create mode 100644 ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidReadRecordMapper.xml diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDashboardController.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDashboardController.java new file mode 100644 index 0000000..4e80bd4 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDashboardController.java @@ -0,0 +1,65 @@ +package org.dromara.rfid.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.rfid.domain.RfidDevice; +import org.dromara.rfid.domain.vo.RfidDashboardStatsVo; +import org.dromara.rfid.service.IRfidDeviceService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * RFID 首页监控 Controller + * + * @author zch + * @date 2025-11-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/rfid/dashboard") +public class RfidDashboardController { + + private final IRfidDeviceService rfidDeviceService; + + /** 在线状态:在线 */ + private static final String ONLINE_STATUS_ONLINE = "1"; + + /** 在线状态:离线 */ + private static final String ONLINE_STATUS_OFFLINE = "0"; + + /** 告警状态:告警 */ + private static final String ALARM_STATUS_ALARM = "1"; + + /** + * 获取首页统计数据 + */ + @GetMapping("/stats") + public R getStats() { + RfidDashboardStatsVo stats = new RfidDashboardStatsVo(); + + // 设备总数 + stats.setTotalDevices(rfidDeviceService.count()); + + // 在线数量 (online_status = 1) + stats.setOnlineDevices(rfidDeviceService.count( + Wrappers.lambdaQuery().eq(RfidDevice::getOnlineStatus, ONLINE_STATUS_ONLINE)//在线状态(0-离线;1-在线) + )); + + // 离线数量 (online_status = 0) + stats.setOfflineDevices(rfidDeviceService.count( + Wrappers.lambdaQuery().eq(RfidDevice::getOnlineStatus, ONLINE_STATUS_OFFLINE)//在线状态(0-离线;1-在线) + )); + + // 告警数量 (alarm_status = 1) + stats.setAlarmDevices(rfidDeviceService.count( + Wrappers.lambdaQuery().eq(RfidDevice::getAlarmStatus, ALARM_STATUS_ALARM)//告警状态(0-正常;1-告警) + )); + + return R.ok(stats); + } +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDeviceController.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDeviceController.java new file mode 100644 index 0000000..d633b03 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidDeviceController.java @@ -0,0 +1,116 @@ +package org.dromara.rfid.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.rfid.domain.vo.RfidDeviceVo; +import org.dromara.rfid.domain.bo.RfidDeviceBo; +import org.dromara.rfid.service.IRfidDeviceService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 设备信息 + * + * @author zch + * @date 2025-11-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/rfid/rfidDevice") +public class RfidDeviceController extends BaseController { + + private final IRfidDeviceService rfidDeviceService; + + /** + * 查询设备信息列表 + */ + @SaCheckPermission("rfid:rfidDevice:list") + @GetMapping("/list") + public TableDataInfo list(RfidDeviceBo bo, PageQuery pageQuery) { + return rfidDeviceService.queryPageList(bo, pageQuery); + } + + /** + * 导出设备信息列表 + */ + @SaCheckPermission("rfid:rfidDevice:export") + @Log(title = "设备信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(RfidDeviceBo bo, HttpServletResponse response) { + List list = rfidDeviceService.queryList(bo); + ExcelUtil.exportExcel(list, "设备信息", RfidDeviceVo.class, response); + } + + /** + * 获取设备信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("rfid:rfidDevice:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(rfidDeviceService.queryById(id)); + } + + /** + * 新增设备信息 + */ + @SaCheckPermission("rfid:rfidDevice:add") + @Log(title = "设备信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody RfidDeviceBo bo) { + return toAjax(rfidDeviceService.insertByBo(bo)); + } + + /** + * 修改设备信息 + */ + @SaCheckPermission("rfid:rfidDevice:edit") + @Log(title = "设备信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody RfidDeviceBo bo) { + return toAjax(rfidDeviceService.updateByBo(bo)); + } + + /** + * 删除设备信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("rfid:rfidDevice:remove") + @Log(title = "设备信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(rfidDeviceService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 下拉框查询设备信息列表 + */ + @SaCheckPermission("rfid:rfidDevice:list") + @GetMapping("/getRfidDeviceList") + public R> getRfidDeviceList(RfidDeviceBo bo) { + List list = rfidDeviceService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidLocationController.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidLocationController.java new file mode 100644 index 0000000..10d51c4 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidLocationController.java @@ -0,0 +1,116 @@ +package org.dromara.rfid.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.rfid.domain.bo.RfidLocationBo; +import org.dromara.rfid.domain.vo.RfidLocationVo; +import org.dromara.rfid.service.IRfidLocationService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 位置信息 + * + * @author zch + * @date 2025-11-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/rfid/rfidLocation") +public class RfidLocationController extends BaseController { + + private final IRfidLocationService rfidLocationService; + + /** + * 查询位置信息列表 + */ + @SaCheckPermission("rfid:rfidLocation:list") + @GetMapping("/list") + public R> list(RfidLocationBo bo) { + List list = rfidLocationService.queryList(bo); + return R.ok(list); + } + + /** + * 导出位置信息列表 + */ + @SaCheckPermission("rfid:rfidLocation:export") + @Log(title = "位置信息", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(RfidLocationBo bo, HttpServletResponse response) { + List list = rfidLocationService.queryList(bo); + ExcelUtil.exportExcel(list, "位置信息", RfidLocationVo.class, response); + } + + /** + * 获取位置信息详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("rfid:rfidLocation:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(rfidLocationService.queryById(id)); + } + + /** + * 新增位置信息 + */ + @SaCheckPermission("rfid:rfidLocation:add") + @Log(title = "位置信息", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody RfidLocationBo bo) { + return toAjax(rfidLocationService.insertByBo(bo)); + } + + /** + * 修改位置信息 + */ + @SaCheckPermission("rfid:rfidLocation:edit") + @Log(title = "位置信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody RfidLocationBo bo) { + return toAjax(rfidLocationService.updateByBo(bo)); + } + + /** + * 删除位置信息 + * + * @param ids 主键串 + */ + @SaCheckPermission("rfid:rfidLocation:remove") + @Log(title = "位置信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(rfidLocationService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 下拉框查询位置信息列表 + */ + @SaCheckPermission("rfid:rfidLocation:list") + @GetMapping("/getRfidLocationList") + public R> getRfidLocationList(RfidLocationBo bo) { + List list = rfidLocationService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidReadRecordController.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidReadRecordController.java new file mode 100644 index 0000000..085e048 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/controller/RfidReadRecordController.java @@ -0,0 +1,116 @@ +package org.dromara.rfid.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.rfid.domain.vo.RfidReadRecordVo; +import org.dromara.rfid.domain.bo.RfidReadRecordBo; +import org.dromara.rfid.service.IRfidReadRecordService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 读取记录 + * + * @author zch + * @date 2025-11-25 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/rfid/rfidReadRecord") +public class RfidReadRecordController extends BaseController { + + private final IRfidReadRecordService rfidReadRecordService; + + /** + * 查询读取记录列表 + */ + @SaCheckPermission("rfid:rfidReadRecord:list") + @GetMapping("/list") + public TableDataInfo list(RfidReadRecordBo bo, PageQuery pageQuery) { + return rfidReadRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出读取记录列表 + */ + @SaCheckPermission("rfid:rfidReadRecord:export") + @Log(title = "读取记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(RfidReadRecordBo bo, HttpServletResponse response) { + List list = rfidReadRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "读取记录", RfidReadRecordVo.class, response); + } + + /** + * 获取读取记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("rfid:rfidReadRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(rfidReadRecordService.queryById(id)); + } + + /** + * 新增读取记录 + */ + @SaCheckPermission("rfid:rfidReadRecord:add") + @Log(title = "读取记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody RfidReadRecordBo bo) { + return toAjax(rfidReadRecordService.insertByBo(bo)); + } + + /** + * 修改读取记录 + */ + @SaCheckPermission("rfid:rfidReadRecord:edit") + @Log(title = "读取记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody RfidReadRecordBo bo) { + return toAjax(rfidReadRecordService.updateByBo(bo)); + } + + /** + * 删除读取记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("rfid:rfidReadRecord:remove") + @Log(title = "读取记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(rfidReadRecordService.deleteWithValidByIds(List.of(ids), true)); + } + + /** + * 下拉框查询读取记录列表 + */ + @SaCheckPermission("rfid:rfidReadRecord:list") + @GetMapping("/getRfidReadRecordList") + public R> getRfidReadRecordList(RfidReadRecordBo bo) { + List list = rfidReadRecordService.queryList(bo); + return R.ok(list); + } + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidDevice.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidDevice.java new file mode 100644 index 0000000..27d570b --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidDevice.java @@ -0,0 +1,103 @@ +package org.dromara.rfid.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 设备信息对象 rfid_device + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("rfid_device") +public class RfidDevice extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @TableId(value = "id") + private Long id; + + /** + * 设备编号 + */ + private String deviceCode; + + /** + * 设备名称 + */ + private String deviceName; + + /** + * 所在位置,对应rfid_location.id + */ + private Long locationId; + + /** + * 设备地址(IP等) + */ + private String deviceAddress; + + /** + * 设备端口 + */ + private Long devicePort; + + /** + * 读取频率(单位:自定义,如次/秒) + */ + private Long readFrequency; + + /** + * 在线状态(0-离线;1-在线) + */ + private String onlineStatus; + + /** + * 告警状态(0-正常;1-告警) + */ + private String alarmStatus; + + /** + * 是否标识(1-是;0-否) + */ + private String isMarked; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedAt; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidLocation.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidLocation.java new file mode 100644 index 0000000..362aed1 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidLocation.java @@ -0,0 +1,88 @@ +package org.dromara.rfid.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +import java.io.Serial; +import java.util.Date; + +/** + * 位置信息对象 rfid_location + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("rfid_location") +public class RfidLocation extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @TableId(value = "id") + private Long id; + + /** + * 位置编号 + */ + private String locationCode; + + /** + * 位置别名 + */ + private String locationAlias; + + /** + * 位置类型(1-车间;2-工序;3-工位) + */ + private String locationType; + + /** + * 父级编号,对应本表id + */ + private Long parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 是否标识(1-是;0-否) + */ + private String isMarked; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedAt; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidReadRecord.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidReadRecord.java new file mode 100644 index 0000000..cd64449 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/RfidReadRecord.java @@ -0,0 +1,73 @@ +package org.dromara.rfid.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serial; + +/** + * 读取记录对象 rfid_read_record + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("rfid_read_record") +public class RfidReadRecord extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @TableId(value = "id") + private Long id; + + /** + * 设备id,对应rfid_device.id + */ + private Long deviceId; + + /** + * 读取状态(1-成功;0-失败) + */ + private String readStatus; + + /** + * 条码信息 + */ + private String barcode; + + /** + * 记录时间 + */ + private Date recordTime; + + /** + * 是否告警(0-否;1-是) + */ + private String alarmFlag; + + /** + * 告警级别(1-一般;2-严重等) + */ + private String alarmLevel; + + /** + * 告警类型 + */ + private String alarmType; + + /** + * 告警行为 + */ + private String alarmAction; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidDeviceBo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidDeviceBo.java new file mode 100644 index 0000000..e42dc54 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidDeviceBo.java @@ -0,0 +1,107 @@ +package org.dromara.rfid.domain.bo; + +import org.dromara.rfid.domain.RfidDevice; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 设备信息业务对象 rfid_device + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = RfidDevice.class, reverseConvertGenerate = false) +public class RfidDeviceBo extends BaseEntity { + + /** + * 标识 + */ + @NotNull(message = "标识不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 设备编号 + */ + @NotBlank(message = "设备编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deviceCode; + + /** + * 设备名称 + */ + @NotBlank(message = "设备名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String deviceName; + + /** + * 所在位置,对应rfid_location.id + */ + private Long locationId; + + /** + * 设备地址(IP等) + */ + private String deviceAddress; + + /** + * 设备端口 + */ + private Long devicePort; + + /** + * 读取频率(单位:自定义,如次/秒) + */ + private Long readFrequency; + + /** + * 在线状态(0-离线;1-在线) + */ + @NotBlank(message = "在线状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String onlineStatus; + + /** + * 告警状态(0-正常;1-告警) + */ + @NotBlank(message = "告警状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alarmStatus; + + /** + * 是否标识(1-是;0-否) + */ + @NotBlank(message = "是否标识不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isMarked; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedAt; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidLocationBo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidLocationBo.java new file mode 100644 index 0000000..9f88fd2 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidLocationBo.java @@ -0,0 +1,85 @@ +package org.dromara.rfid.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.rfid.domain.RfidLocation; + +import java.util.Date; + +/** + * 位置信息业务对象 rfid_location + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = RfidLocation.class, reverseConvertGenerate = false) +public class RfidLocationBo extends BaseEntity { + + /** + * 标识 + */ + @NotNull(message = "标识不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 位置编号 + */ + @NotBlank(message = "位置编号不能为空", groups = { AddGroup.class, EditGroup.class }) + private String locationCode; + + /** + * 位置别名 + */ + private String locationAlias; + + /** + * 位置类型(1-车间;2-工序;3-工位) + */ + private String locationType; + + /** + * 父级编号,对应本表id + */ + private Long parentId; + + /** + * 是否标识(1-是;0-否) + */ + @NotBlank(message = "是否标识不能为空", groups = { AddGroup.class, EditGroup.class }) + private String isMarked; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人 + */ + private String createdBy; + + /** + * 创建时间 + */ + private Date createdAt; + + /** + * 更新人 + */ + private String updatedBy; + + /** + * 更新时间 + */ + private Date updatedAt; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidReadRecordBo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidReadRecordBo.java new file mode 100644 index 0000000..4742454 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/bo/RfidReadRecordBo.java @@ -0,0 +1,77 @@ +package org.dromara.rfid.domain.bo; + +import org.dromara.rfid.domain.RfidReadRecord; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +/** + * 读取记录业务对象 rfid_read_record + * + * @author zch + * @date 2025-11-25 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = RfidReadRecord.class, reverseConvertGenerate = false) +public class RfidReadRecordBo extends BaseEntity { + + /** + * 标识 + */ + @NotNull(message = "标识不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 设备id,对应rfid_device.id + */ + @NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long deviceId; + + /** + * 读取状态(1-成功;0-失败) + */ + @NotBlank(message = "读取状态不能为空", groups = { AddGroup.class, EditGroup.class }) + private String readStatus; + + /** + * 条码信息 + */ + @NotBlank(message = "条码信息不能为空", groups = { AddGroup.class, EditGroup.class }) + private String barcode; + + /** + * 记录时间 + */ + @NotNull(message = "记录时间不能为空", groups = { AddGroup.class, EditGroup.class }) + private Date recordTime; + + /** + * 是否告警(0-否;1-是) + */ + @NotBlank(message = "是否告警不能为空", groups = { AddGroup.class, EditGroup.class }) + private String alarmFlag; + + /** + * 告警级别(1-一般;2-严重等) + */ + private String alarmLevel; + + /** + * 告警类型 + */ + private String alarmType; + + /** + * 告警行为 + */ + private String alarmAction; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDashboardStatsVo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDashboardStatsVo.java new file mode 100644 index 0000000..cfde000 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDashboardStatsVo.java @@ -0,0 +1,32 @@ +package org.dromara.rfid.domain.vo; + +import lombok.Data; + +/** + * 首页统计 VO + * + * @author zch + * @date 2025-11-25 + */ +@Data +public class RfidDashboardStatsVo { + /** + * 设备总数 + */ + private Long totalDevices; + + /** + * 在线数量 + */ + private Long onlineDevices; + + /** + * 离线数量 + */ + private Long offlineDevices; + + /** + * 告警数量 + */ + private Long alarmDevices; +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDeviceVo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDeviceVo.java new file mode 100644 index 0000000..01512df --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidDeviceVo.java @@ -0,0 +1,133 @@ +package org.dromara.rfid.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.rfid.domain.RfidDevice; +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; + + + +/** + * 设备信息视图对象 rfid_device + * + * @author zch + * @date 2025-11-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = RfidDevice.class) +public class RfidDeviceVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @ExcelProperty(value = "标识") + private Long id; + + /** + * 设备编号 + */ + @ExcelProperty(value = "设备编号") + private String deviceCode; + + /** + * 设备名称 + */ + @ExcelProperty(value = "设备名称") + private String deviceName; + + /** + * 所在位置,对应rfid_location.id + */ + @ExcelProperty(value = "所在位置,对应rfid_location.id") + private Long locationId; + + /** + * 所在位置名称(连表 rfid_location.location_alias) + */ + @ExcelProperty(value = "所在位置") + private String locationAlias; + + /** + * 设备地址(IP等) + */ + @ExcelProperty(value = "设备地址(IP等)") + private String deviceAddress; + + /** + * 设备端口 + */ + @ExcelProperty(value = "设备端口") + private Long devicePort; + + /** + * 读取频率(单位:自定义,如次/秒) + */ + @ExcelProperty(value = "读取频率(单位:自定义,如次/秒)") + private Long readFrequency; + + /** + * 在线状态(0-离线;1-在线) + */ + @ExcelProperty(value = "在线状态(0-离线;1-在线)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "online_status") + private String onlineStatus; + + /** + * 告警状态(0-正常;1-告警) + */ + @ExcelProperty(value = "告警状态(0-正常;1-告警)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "alarm_status") + private String alarmStatus; + + /** + * 是否标识(1-是;0-否) + */ + @ExcelProperty(value = "是否标识(1-是;0-否)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "is_marked") + private String isMarked; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdAt; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updatedBy; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updatedAt; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidLocationVo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidLocationVo.java new file mode 100644 index 0000000..41698e8 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidLocationVo.java @@ -0,0 +1,104 @@ +package org.dromara.rfid.domain.vo; + + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.rfid.domain.RfidLocation; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 位置信息视图对象 rfid_location + * + * @author zch + * @date 2025-11-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = RfidLocation.class) +public class RfidLocationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @ExcelProperty(value = "标识") + private Long id; + + /** + * 位置编号 + */ + @ExcelProperty(value = "位置编号") + private String locationCode; + + /** + * 位置别名 + */ + @ExcelProperty(value = "位置别名") + private String locationAlias; + + /** + * 位置类型(1-车间;2-工序;3-工位) + */ + @ExcelProperty(value = "位置类型(1-车间;2-工序;3-工位)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "location_type") + private String locationType; + + /** + * 父级编号,对应本表id + */ + @ExcelProperty(value = "父级编号,对应本表id") + private Long parentId; + + /** + * 是否标识(1-是;0-否) + */ + @ExcelProperty(value = "是否标识(1-是;0-否)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "is_marked") + private String isMarked; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建人 + */ + @ExcelProperty(value = "创建人") + private String createdBy; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createdAt; + + /** + * 更新人 + */ + @ExcelProperty(value = "更新人") + private String updatedBy; + + /** + * 更新时间 + */ + @ExcelProperty(value = "更新时间") + private Date updatedAt; + + /** + * 子对象 + */ + private List children; + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidReadRecordVo.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidReadRecordVo.java new file mode 100644 index 0000000..d08d976 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/domain/vo/RfidReadRecordVo.java @@ -0,0 +1,103 @@ +package org.dromara.rfid.domain.vo; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.rfid.domain.RfidReadRecord; +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; + + + +/** + * 读取记录视图对象 rfid_read_record + * + * @author zch + * @date 2025-11-25 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = RfidReadRecord.class) +public class RfidReadRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 标识 + */ + @ExcelProperty(value = "标识") + private Long id; + + /** + * 设备id,对应rfid_device.id + */ + @ExcelProperty(value = "设备id,对应rfid_device.id") + private Long deviceId; + + /** + * 设备编号(连表 rfid_device.device_code) + */ + @ExcelProperty(value = "设备编号") + private String deviceCode; + + /** + * 设备名称(连表 rfid_device.device_name) + */ + @ExcelProperty(value = "设备名称") + private String deviceName; + + /** + * 读取状态(1-成功;0-失败) + */ + @ExcelProperty(value = "读取状态(1-成功;0-失败)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "read_status") + private String readStatus; + + /** + * 条码信息 + */ + @ExcelProperty(value = "条码信息") + private String barcode; + + /** + * 记录时间 + */ + @ExcelProperty(value = "记录时间") + private Date recordTime; + + /** + * 是否告警(0-否;1-是) + */ + @ExcelProperty(value = "是否告警(0-否;1-是)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "alarm_flag") + private String alarmFlag; + + /** + * 告警级别(1-一般;2-严重等) + */ + @ExcelProperty(value = "告警级别(1-一般;2-严重等)", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "alarm_level") + private String alarmLevel; + + /** + * 告警类型 + */ + @ExcelProperty(value = "告警类型") + private String alarmType; + + /** + * 告警行为 + */ + @ExcelProperty(value = "告警行为") + private String alarmAction; + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidDeviceMapper.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidDeviceMapper.java new file mode 100644 index 0000000..c61ce52 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidDeviceMapper.java @@ -0,0 +1,103 @@ +package org.dromara.rfid.mapper; + +import org.dromara.rfid.domain.RfidDevice; +import org.dromara.rfid.domain.vo.RfidDeviceVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Collection; + +/** + * 设备信息Mapper接口 + * + * @author zch + * @date 2025-11-25 + */ +public interface RfidDeviceMapper extends BaseMapperPlus { + + /** + * 查询设备信息列表(自定义条件) + * + * @param queryWrapper 条件 + * @return 设备信息集合 + */ + List selectCustomRfidDeviceVoList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID查询设备信息详情 + * + * @param id 主键ID + * @return 设备信息对象 + */ + RfidDeviceVo selectCustomRfidDeviceVoById(@Param("id") Long id); + + /** + * 根据ID列表批量查询设备信息 + * + * @param ids ID集合 + * @return 设备信息集合 + */ + List selectCustomRfidDeviceVoByIds(@Param("ids") Collection ids); + + /** + * 统计设备信息记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomRfidDevice(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询设备信息(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + Page selectCustomRfidDeviceVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入设备信息 + * + * @param list 设备信息对象集合 + * @return 影响行数 + */ + int batchInsertRfidDevice(@Param("list") List list); + + /** + * 批量更新设备信息 + * + * @param list 设备信息对象集合 + * @return 影响行数 + */ + int batchUpdateRfidDevice(@Param("list") List list); + + /** + * 根据自定义条件删除设备信息 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomRfidDevice(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除设备信息 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomRfidDeviceByIds(@Param("ids") Collection ids); + + /** + * 检查设备信息是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsRfidDevice(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidLocationMapper.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidLocationMapper.java new file mode 100644 index 0000000..47a498b --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidLocationMapper.java @@ -0,0 +1,104 @@ +package org.dromara.rfid.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.rfid.domain.RfidLocation; +import org.dromara.rfid.domain.vo.RfidLocationVo; + +import java.util.Collection; +import java.util.List; + +/** + * 位置信息Mapper接口 + * + * @author zch + * @date 2025-11-25 + */ +public interface RfidLocationMapper extends BaseMapperPlus { + + /** + * 查询位置信息列表(自定义条件) + * + * @param queryWrapper 条件 + * @return 位置信息集合 + */ + List selectCustomRfidLocationVoList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID查询位置信息详情 + * + * @param id 主键ID + * @return 位置信息对象 + */ + RfidLocationVo selectCustomRfidLocationVoById(@Param("id") Long id); + + /** + * 根据ID列表批量查询位置信息 + * + * @param ids ID集合 + * @return 位置信息集合 + */ + List selectCustomRfidLocationVoByIds(@Param("ids") Collection ids); + + /** + * 统计位置信息记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomRfidLocation(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询位置信息(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + Page selectCustomRfidLocationVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入位置信息 + * + * @param list 位置信息对象集合 + * @return 影响行数 + */ + int batchInsertRfidLocation(@Param("list") List list); + + /** + * 批量更新位置信息 + * + * @param list 位置信息对象集合 + * @return 影响行数 + */ + int batchUpdateRfidLocation(@Param("list") List list); + + /** + * 根据自定义条件删除位置信息 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomRfidLocation(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除位置信息 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomRfidLocationByIds(@Param("ids") Collection ids); + + /** + * 检查位置信息是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsRfidLocation(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidReadRecordMapper.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidReadRecordMapper.java new file mode 100644 index 0000000..d063c25 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/mapper/RfidReadRecordMapper.java @@ -0,0 +1,103 @@ +package org.dromara.rfid.mapper; + +import org.dromara.rfid.domain.RfidReadRecord; +import org.dromara.rfid.domain.vo.RfidReadRecordVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Param; +import java.util.List; +import java.util.Collection; + +/** + * 读取记录Mapper接口 + * + * @author zch + * @date 2025-11-25 + */ +public interface RfidReadRecordMapper extends BaseMapperPlus { + + /** + * 查询读取记录列表(自定义条件) + * + * @param queryWrapper 条件 + * @return 读取记录集合 + */ + List selectCustomRfidReadRecordVoList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID查询读取记录详情 + * + * @param id 主键ID + * @return 读取记录对象 + */ + RfidReadRecordVo selectCustomRfidReadRecordVoById(@Param("id") Long id); + + /** + * 根据ID列表批量查询读取记录 + * + * @param ids ID集合 + * @return 读取记录集合 + */ + List selectCustomRfidReadRecordVoByIds(@Param("ids") Collection ids); + + /** + * 统计读取记录记录数 + * + * @param queryWrapper 查询条件 + * @return 记录总数 + */ + Long countCustomRfidReadRecord(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 分页查询读取记录(自定义条件) + * + * @param page 分页对象 + * @param queryWrapper 查询条件 + * @return 分页结果 + */ + Page selectCustomRfidReadRecordVoPage(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 批量插入读取记录 + * + * @param list 读取记录对象集合 + * @return 影响行数 + */ + int batchInsertRfidReadRecord(@Param("list") List list); + + /** + * 批量更新读取记录 + * + * @param list 读取记录对象集合 + * @return 影响行数 + */ + int batchUpdateRfidReadRecord(@Param("list") List list); + + /** + * 根据自定义条件删除读取记录 + * + * @param queryWrapper 删除条件 + * @return 影响行数 + */ + int deleteCustomRfidReadRecord(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据ID列表批量删除读取记录 + * + * @param ids ID集合 + * @return 影响行数 + */ + int deleteCustomRfidReadRecordByIds(@Param("ids") Collection ids); + + /** + * 检查读取记录是否存在 + * + * @param queryWrapper 查询条件 + * @return 是否存在 + */ + Boolean existsRfidReadRecord(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidDeviceService.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidDeviceService.java new file mode 100644 index 0000000..594eff6 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidDeviceService.java @@ -0,0 +1,85 @@ +package org.dromara.rfid.service; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.rfid.domain.RfidDevice; +import org.dromara.rfid.domain.bo.RfidDeviceBo; +import org.dromara.rfid.domain.vo.RfidDeviceVo; + +import java.util.Collection; +import java.util.List; + +/** + * 设备信息Service接口 + * + * @author zch + * @date 2025-11-25 + */ +public interface IRfidDeviceService { + + /** + * 查询设备信息 + * + * @param id 主键 + * @return 设备信息 + */ + RfidDeviceVo queryById(Long id); + + /** + * 分页查询设备信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备信息分页列表 + */ + TableDataInfo queryPageList(RfidDeviceBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的设备信息列表 + * + * @param bo 查询条件 + * @return 设备信息列表 + */ + List queryList(RfidDeviceBo bo); + + /** + * 新增设备信息 + * + * @param bo 设备信息 + * @return 是否新增成功 + */ + Boolean insertByBo(RfidDeviceBo bo); + + /** + * 修改设备信息 + * + * @param bo 设备信息 + * @return 是否修改成功 + */ + Boolean updateByBo(RfidDeviceBo bo); + + /** + * 校验并批量删除设备信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 统计设备数量(全部) + * + * @return 设备总数 + */ + long count(); + + /** + * 按条件统计设备数量 + * + * @param queryWrapper 查询条件 + * @return 设备数量 + */ + long count(LambdaQueryWrapper queryWrapper); +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidLocationService.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidLocationService.java new file mode 100644 index 0000000..11210e8 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidLocationService.java @@ -0,0 +1,58 @@ +package org.dromara.rfid.service; + +import org.dromara.rfid.domain.bo.RfidLocationBo; +import org.dromara.rfid.domain.vo.RfidLocationVo; + +import java.util.Collection; +import java.util.List; + +/** + * 位置信息Service接口 + * + * @author zch + * @date 2025-11-25 + */ +public interface IRfidLocationService { + + /** + * 查询位置信息 + * + * @param id 主键 + * @return 位置信息 + */ + RfidLocationVo queryById(Long id); + + + /** + * 查询符合条件的位置信息列表 + * + * @param bo 查询条件 + * @return 位置信息列表 + */ + List queryList(RfidLocationBo bo); + + /** + * 新增位置信息 + * + * @param bo 位置信息 + * @return 是否新增成功 + */ + Boolean insertByBo(RfidLocationBo bo); + + /** + * 修改位置信息 + * + * @param bo 位置信息 + * @return 是否修改成功 + */ + Boolean updateByBo(RfidLocationBo bo); + + /** + * 校验并批量删除位置信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidReadRecordService.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidReadRecordService.java new file mode 100644 index 0000000..ace2a80 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/IRfidReadRecordService.java @@ -0,0 +1,68 @@ +package org.dromara.rfid.service; + +import org.dromara.rfid.domain.vo.RfidReadRecordVo; +import org.dromara.rfid.domain.bo.RfidReadRecordBo; +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 zch + * @date 2025-11-25 + */ +public interface IRfidReadRecordService { + + /** + * 查询读取记录 + * + * @param id 主键 + * @return 读取记录 + */ + RfidReadRecordVo queryById(Long id); + + /** + * 分页查询读取记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 读取记录分页列表 + */ + TableDataInfo queryPageList(RfidReadRecordBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的读取记录列表 + * + * @param bo 查询条件 + * @return 读取记录列表 + */ + List queryList(RfidReadRecordBo bo); + + /** + * 新增读取记录 + * + * @param bo 读取记录 + * @return 是否新增成功 + */ + Boolean insertByBo(RfidReadRecordBo bo); + + /** + * 修改读取记录 + * + * @param bo 读取记录 + * @return 是否修改成功 + */ + Boolean updateByBo(RfidReadRecordBo bo); + + /** + * 校验并批量删除读取记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidDeviceServiceImpl.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidDeviceServiceImpl.java new file mode 100644 index 0000000..4f8fec8 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidDeviceServiceImpl.java @@ -0,0 +1,186 @@ +package org.dromara.rfid.service.impl; + +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.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.rfid.domain.bo.RfidDeviceBo; +import org.dromara.rfid.domain.vo.RfidDeviceVo; +import org.dromara.rfid.domain.RfidDevice; +import org.dromara.rfid.domain.RfidReadRecord; +import org.dromara.rfid.mapper.RfidDeviceMapper; +import org.dromara.rfid.mapper.RfidReadRecordMapper; +import org.dromara.rfid.service.IRfidDeviceService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 设备信息Service业务层处理 + * + * @author zch + * @date 2025-11-25 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class RfidDeviceServiceImpl implements IRfidDeviceService { + + private final RfidDeviceMapper baseMapper; + + private final RfidReadRecordMapper rfidReadRecordMapper; + + /** + * 查询设备信息 + * + * @param id 主键 + * @return 设备信息 + */ + @Override + public RfidDeviceVo queryById(Long id){ + return baseMapper.selectCustomRfidDeviceVoById(id); + } + + /** + * 分页查询设备信息列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 设备信息分页列表 + */ + @Override + public TableDataInfo queryPageList(RfidDeviceBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 使用自定义 Mapper XML + MyBatis-Plus Wrapper 进行分页查询 + Page result = baseMapper.selectCustomRfidDeviceVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的设备信息列表 + * + * @param bo 查询条件 + * @return 设备信息列表 + */ + @Override + public List queryList(RfidDeviceBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表 + return baseMapper.selectCustomRfidDeviceVoList(lqw); + } + + @Override + public long count() { + return baseMapper.countCustomRfidDevice(Wrappers.lambdaQuery()); + } + + @Override + public long count(LambdaQueryWrapper queryWrapper) { + LambdaQueryWrapper wrapper = queryWrapper; + if (wrapper == null) { + wrapper = Wrappers.lambdaQuery(); + } + return baseMapper.countCustomRfidDevice(wrapper); + } + + private LambdaQueryWrapper buildQueryWrapper(RfidDeviceBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(RfidDevice::getId); + lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), RfidDevice::getDeviceCode, bo.getDeviceCode()); + lqw.like(StringUtils.isNotBlank(bo.getDeviceName()), RfidDevice::getDeviceName, bo.getDeviceName()); + lqw.eq(bo.getLocationId() != null, RfidDevice::getLocationId, bo.getLocationId()); + lqw.eq(StringUtils.isNotBlank(bo.getDeviceAddress()), RfidDevice::getDeviceAddress, bo.getDeviceAddress()); + lqw.eq(bo.getDevicePort() != null, RfidDevice::getDevicePort, bo.getDevicePort()); + lqw.eq(bo.getReadFrequency() != null, RfidDevice::getReadFrequency, bo.getReadFrequency()); + lqw.eq(StringUtils.isNotBlank(bo.getOnlineStatus()), RfidDevice::getOnlineStatus, bo.getOnlineStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getAlarmStatus()), RfidDevice::getAlarmStatus, bo.getAlarmStatus()); + if (StringUtils.isNotBlank(bo.getIsMarked())) { + lqw.apply("t.is_marked = {0}", bo.getIsMarked()); + } + lqw.eq(StringUtils.isNotBlank(bo.getCreatedBy()), RfidDevice::getCreatedBy, bo.getCreatedBy()); + lqw.eq(bo.getCreatedAt() != null, RfidDevice::getCreatedAt, bo.getCreatedAt()); + lqw.eq(StringUtils.isNotBlank(bo.getUpdatedBy()), RfidDevice::getUpdatedBy, bo.getUpdatedBy()); + lqw.eq(bo.getUpdatedAt() != null, RfidDevice::getUpdatedAt, bo.getUpdatedAt()); + return lqw; + } + + /** + * 新增设备信息 + * + * @param bo 设备信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(RfidDeviceBo bo) { + RfidDevice add = MapstructUtils.convert(bo, RfidDevice.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改设备信息 + * + * @param bo 设备信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(RfidDeviceBo bo) { + RfidDevice update = MapstructUtils.convert(bo, RfidDevice.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(RfidDevice entity){ + // 业务编号 deviceCode 唯一校验 + if (StringUtils.isNotBlank(entity.getDeviceCode())) { + boolean exists = baseMapper.existsRfidDevice(Wrappers.lambdaQuery() + .eq(RfidDevice::getDeviceCode, entity.getDeviceCode()) + .ne(entity.getId() != null, RfidDevice::getId, entity.getId())); + if (exists) { + throw new ServiceException("设备编号已存在"); + } + } + + // isMarked 默认值处理 + if (StringUtils.isBlank(entity.getIsMarked())) { + entity.setIsMarked("1"); + } + } + + /** + * 校验并批量删除设备信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid && ids != null && !ids.isEmpty()) { + // 校验是否存在关联的读取记录,防止产生孤儿记录 + boolean existsRecord = rfidReadRecordMapper.existsRfidReadRecord( + Wrappers.lambdaQuery().in(RfidReadRecord::getDeviceId, ids) + ); + if (existsRecord) { + throw new ServiceException("存在关联读取记录的设备,无法删除"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidLocationServiceImpl.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidLocationServiceImpl.java new file mode 100644 index 0000000..e486e91 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidLocationServiceImpl.java @@ -0,0 +1,220 @@ +package org.dromara.rfid.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.rfid.domain.RfidLocation; +import org.dromara.rfid.domain.bo.RfidLocationBo; +import org.dromara.rfid.domain.vo.RfidLocationVo; +import org.dromara.rfid.mapper.RfidLocationMapper; +import org.dromara.rfid.service.IRfidLocationService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 位置信息Service业务层处理 + * + * @author zch + * @date 2025-11-25 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class RfidLocationServiceImpl implements IRfidLocationService { + + private final RfidLocationMapper baseMapper; + + /** + * 查询位置信息 + * + * @param id 主键 + * @return 位置信息 + */ + @Override + public RfidLocationVo queryById(Long id){ + return baseMapper.selectCustomRfidLocationVoById(id); + } + + + /** + * 查询符合条件的位置信息列表 + * + * @param bo 查询条件 + * @return 位置信息列表 + */ + @Override + public List queryList(RfidLocationBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表 + return baseMapper.selectCustomRfidLocationVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(RfidLocationBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(RfidLocation::getId); + lqw.eq(StringUtils.isNotBlank(bo.getLocationCode()), RfidLocation::getLocationCode, bo.getLocationCode()); + lqw.eq(StringUtils.isNotBlank(bo.getLocationAlias()), RfidLocation::getLocationAlias, bo.getLocationAlias()); + lqw.eq(StringUtils.isNotBlank(bo.getLocationType()), RfidLocation::getLocationType, bo.getLocationType()); + lqw.eq(bo.getParentId() != null, RfidLocation::getParentId, bo.getParentId()); + lqw.eq(StringUtils.isNotBlank(bo.getIsMarked()), RfidLocation::getIsMarked, bo.getIsMarked()); + lqw.eq(StringUtils.isNotBlank(bo.getCreatedBy()), RfidLocation::getCreatedBy, bo.getCreatedBy()); + lqw.eq(bo.getCreatedAt() != null, RfidLocation::getCreatedAt, bo.getCreatedAt()); + lqw.eq(StringUtils.isNotBlank(bo.getUpdatedBy()), RfidLocation::getUpdatedBy, bo.getUpdatedBy()); + lqw.eq(bo.getUpdatedAt() != null, RfidLocation::getUpdatedAt, bo.getUpdatedAt()); + return lqw; + } + + /** + * 新增位置信息 + * + * @param bo 位置信息 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(RfidLocationBo bo) { + RfidLocation add = MapstructUtils.convert(bo, RfidLocation.class); + validEntityBeforeSave(add); + if (add.getParentId() == null || add.getParentId() == 0) { + add.setParentId(0L); + add.setAncestors("0"); + } else { + RfidLocation parent = baseMapper.selectById(add.getParentId()); + if (parent == null) { + throw new ServiceException("父位置不存在"); + } + String ancestors = parent.getAncestors(); + if (StringUtils.isBlank(ancestors)) { + ancestors = "0"; + } + add.setAncestors(ancestors + "," + add.getParentId()); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改位置信息 + * + * @param bo 位置信息 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(RfidLocationBo bo) { + RfidLocation update = MapstructUtils.convert(bo, RfidLocation.class); + validEntityBeforeSave(update); + + RfidLocation oldLocation = baseMapper.selectById(update.getId()); + if (oldLocation == null) { + return false; + } + + if (update.getParentId() == null) { + update.setParentId(0L); + } + + // 父节点发生变化 + if (!update.getParentId().equals(oldLocation.getParentId())) { + if (update.getParentId().equals(update.getId())) { + throw new ServiceException("不能设置自己为父节点"); + } + String newAncestors; + if (update.getParentId() == 0) { + newAncestors = "0"; + } else { + RfidLocation parent = baseMapper.selectById(update.getParentId()); + if (parent == null) { + throw new ServiceException("父位置不存在"); + } + String ancestors = parent.getAncestors(); + if (StringUtils.isBlank(ancestors)) { + ancestors = "0"; + } + + // 校验是否设置自己的子节点为父节点(即新父节点在当前节点子树中) + String[] ancestorArr = ancestors.split(","); + String currentIdStr = update.getId() == null ? null : update.getId().toString(); + if (currentIdStr != null) { + for (String ancestorId : ancestorArr) { + if (currentIdStr.equals(ancestorId)) { + throw new ServiceException("不能设置自己的子节点为父节点"); + } + } + } + + newAncestors = ancestors + "," + update.getParentId(); + } + update.setAncestors(newAncestors); + + // 更新所有子节点的ancestors + updateChildrenAncestors(update.getId(), newAncestors, oldLocation.getAncestors()); + } else { + // 父节点未变化,保持原ancestors (防止前端传空) + update.setAncestors(oldLocation.getAncestors()); + } + + return baseMapper.updateById(update) > 0; + } + + /** + * 递归更新所有子节点的ancestors + */ + private void updateChildrenAncestors(Long currentId, String newAncestors, String oldAncestors) { + // 查出所有以旧ancestors开头且包含当前id的子节点 (简单起见,这里仅演示逻辑,实际海量数据需优化) + // RuoYi标准做法通常是查出所有children,然后替换前缀 + // 这里使用数据库函数或全量更新 + // 也可以查出所有直属子节点递归更新 + + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply("find_in_set({0}, ancestors)", currentId)); + + for (RfidLocation child : children) { + child.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + baseMapper.updateById(child); + } + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(RfidLocation entity){ + // 校验位置编号唯一 + if (StringUtils.isNotBlank(entity.getLocationCode())) { + boolean exists = baseMapper.exists(new LambdaQueryWrapper() + .eq(RfidLocation::getLocationCode, entity.getLocationCode()) + .ne(entity.getId() != null, RfidLocation::getId, entity.getId())); + if (exists) { + throw new ServiceException("位置编号已存在"); + } + } + } + + /** + * 校验并批量删除位置信息信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + for (Long id : ids) { + if (baseMapper.exists(new LambdaQueryWrapper().eq(RfidLocation::getParentId, id))) { + throw new ServiceException("存在子节点,无法删除"); + } + } + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidReadRecordServiceImpl.java b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidReadRecordServiceImpl.java new file mode 100644 index 0000000..debe036 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/java/org/dromara/rfid/service/impl/RfidReadRecordServiceImpl.java @@ -0,0 +1,141 @@ +package org.dromara.rfid.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.rfid.domain.bo.RfidReadRecordBo; +import org.dromara.rfid.domain.vo.RfidReadRecordVo; +import org.dromara.rfid.domain.RfidReadRecord; +import org.dromara.rfid.mapper.RfidReadRecordMapper; +import org.dromara.rfid.service.IRfidReadRecordService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 读取记录Service业务层处理 + * + * @author zch + * @date 2025-11-25 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class RfidReadRecordServiceImpl implements IRfidReadRecordService { + + private final RfidReadRecordMapper baseMapper; + + /** + * 查询读取记录 + * + * @param id 主键 + * @return 读取记录 + */ + @Override + public RfidReadRecordVo queryById(Long id){ + return baseMapper.selectCustomRfidReadRecordVoById(id); + } + + /** + * 分页查询读取记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 读取记录分页列表 + */ + @Override + public TableDataInfo queryPageList(RfidReadRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 使用自定义 Mapper XML + MyBatis-Plus Wrapper 进行分页查询 + Page result = baseMapper.selectCustomRfidReadRecordVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的读取记录列表 + * + * @param bo 查询条件 + * @return 读取记录列表 + */ + @Override + public List queryList(RfidReadRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + // 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表 + return baseMapper.selectCustomRfidReadRecordVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(RfidReadRecordBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(RfidReadRecord::getId); + lqw.eq(bo.getDeviceId() != null, RfidReadRecord::getDeviceId, bo.getDeviceId()); + lqw.eq(StringUtils.isNotBlank(bo.getReadStatus()), RfidReadRecord::getReadStatus, bo.getReadStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getBarcode()), RfidReadRecord::getBarcode, bo.getBarcode()); + lqw.eq(bo.getRecordTime() != null, RfidReadRecord::getRecordTime, bo.getRecordTime()); + lqw.eq(StringUtils.isNotBlank(bo.getAlarmFlag()), RfidReadRecord::getAlarmFlag, bo.getAlarmFlag()); + lqw.eq(StringUtils.isNotBlank(bo.getAlarmLevel()), RfidReadRecord::getAlarmLevel, bo.getAlarmLevel()); + lqw.eq(StringUtils.isNotBlank(bo.getAlarmType()), RfidReadRecord::getAlarmType, bo.getAlarmType()); + lqw.eq(StringUtils.isNotBlank(bo.getAlarmAction()), RfidReadRecord::getAlarmAction, bo.getAlarmAction()); + return lqw; + } + + /** + * 新增读取记录 + * + * @param bo 读取记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(RfidReadRecordBo bo) { + RfidReadRecord add = MapstructUtils.convert(bo, RfidReadRecord.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改读取记录 + * + * @param bo 读取记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(RfidReadRecordBo bo) { + RfidReadRecord update = MapstructUtils.convert(bo, RfidReadRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(RfidReadRecord 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/hw-rfid/src/main/resources/mapper/rfid/RfidDeviceMapper.xml b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidDeviceMapper.xml new file mode 100644 index 0000000..421b16a --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidDeviceMapper.xml @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into rfid_device( + device_code, + + device_name, + + location_id, + + device_address, + + device_port, + + read_frequency, + + online_status, + + alarm_status, + + is_marked, + + remark, + + created_by, + + created_at, + + updated_by, + + updated_at + + ) + values + + ( + #{item.deviceCode}, + + #{item.deviceName}, + + #{item.locationId}, + + #{item.deviceAddress}, + + #{item.devicePort}, + + #{item.readFrequency}, + + #{item.onlineStatus}, + + #{item.alarmStatus}, + + #{item.isMarked}, + + #{item.remark}, + + #{item.createdBy}, + + #{item.createdAt}, + + #{item.updatedBy}, + + #{item.updatedAt} + + ) + + + + + + + update rfid_device + + + device_code = #{item.deviceCode}, + + + device_name = #{item.deviceName}, + + + location_id = #{item.locationId}, + + + device_address = #{item.deviceAddress}, + + + device_port = #{item.devicePort}, + + + read_frequency = #{item.readFrequency}, + + + online_status = #{item.onlineStatus}, + + + alarm_status = #{item.alarmStatus}, + + + is_marked = #{item.isMarked}, + + + remark = #{item.remark}, + + + created_by = #{item.createdBy}, + + + created_at = #{item.createdAt}, + + + updated_by = #{item.updatedBy}, + + + updated_at = #{item.updatedAt} + + + where id = #{item.id} + + + + + + delete from rfid_device + + ${ew.customSqlSegment} + + + + + + delete from rfid_device + where id in + + #{id} + + + + + + + + diff --git a/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidLocationMapper.xml b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidLocationMapper.xml new file mode 100644 index 0000000..4e69cf6 --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidLocationMapper.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into rfid_location( + location_code, + + location_alias, + + location_type, + + parent_id, + + is_marked, + + remark, + + created_by, + + created_at, + + updated_by, + + updated_at + + ) + values + + ( + #{item.locationCode}, + + #{item.locationAlias}, + + #{item.locationType}, + + #{item.parentId}, + + #{item.isMarked}, + + #{item.remark}, + + #{item.createdBy}, + + #{item.createdAt}, + + #{item.updatedBy}, + + #{item.updatedAt} + + ) + + + + + + + update rfid_location + + + location_code = #{item.locationCode}, + + + location_alias = #{item.locationAlias}, + + + location_type = #{item.locationType}, + + + parent_id = #{item.parentId}, + + + is_marked = #{item.isMarked}, + + + remark = #{item.remark}, + + + created_by = #{item.createdBy}, + + + created_at = #{item.createdAt}, + + + updated_by = #{item.updatedBy}, + + + updated_at = #{item.updatedAt} + + + where id = #{item.id} + + + + + + delete from rfid_location + + ${ew.customSqlSegment} + + + + + + delete from rfid_location + where id in + + #{id} + + + + + + + + diff --git a/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidReadRecordMapper.xml b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidReadRecordMapper.xml new file mode 100644 index 0000000..6f73ded --- /dev/null +++ b/ruoyi-modules/hw-rfid/src/main/resources/mapper/rfid/RfidReadRecordMapper.xml @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into rfid_read_record( + device_id, + + read_status, + + barcode, + + record_time, + + alarm_flag, + + alarm_level, + + alarm_type, + + alarm_action + + ) + values + + ( + #{item.deviceId}, + + #{item.readStatus}, + + #{item.barcode}, + + #{item.recordTime}, + + #{item.alarmFlag}, + + #{item.alarmLevel}, + + #{item.alarmType}, + + #{item.alarmAction} + + ) + + + + + + + update rfid_read_record + + + device_id = #{item.deviceId}, + + + read_status = #{item.readStatus}, + + + barcode = #{item.barcode}, + + + record_time = #{item.recordTime}, + + + alarm_flag = #{item.alarmFlag}, + + + alarm_level = #{item.alarmLevel}, + + + alarm_type = #{item.alarmType}, + + + alarm_action = #{item.alarmAction} + + + where id = #{item.id} + + + + + + delete from rfid_read_record + + ${ew.customSqlSegment} + + + + + + delete from rfid_read_record + where id in + + #{id} + + + + + + + +