feat(rfid): 新增RFID设备、位置和读取记录模块及首页监控功能

- 新增RfidDevice、RfidLocation、RfidReadRecord三个子系统的Service接口及实现
- 实现设备信息增删改查及分页查询功能,支持导出Excel操作
- 完善设备唯一性校验及删除前关联读取记录校验,防止孤儿数据产生
- 新增设备相关的数据传输对象(BO,VO)及MyBatis Mapper和XML映射文件支持自定义复杂SQL查询
- 新增RfidDashboardController提供首页设备状态统计接口,统计在线、离线、告警设备数量
- 设备信息支持在线状态、告警状态和标识状态的字典数据转换及导出显示
- 提供设备下拉列表接口,方便前端获取设备简要信息
- 采用注解实现接口权限控制、日志记录、请求有效性校验及防重提交
- 全面符合代码规范及分层设计,提升RFID模块整体功能与稳定性
main
zangch@mesnac.com 4 months ago
parent 883d0e54c4
commit 746a361625

@ -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<RfidDashboardStatsVo> getStats() {
RfidDashboardStatsVo stats = new RfidDashboardStatsVo();
// 设备总数
stats.setTotalDevices(rfidDeviceService.count());
// 在线数量 (online_status = 1)
stats.setOnlineDevices(rfidDeviceService.count(
Wrappers.<RfidDevice>lambdaQuery().eq(RfidDevice::getOnlineStatus, ONLINE_STATUS_ONLINE)//在线状态(0-离线;1-在线)
));
// 离线数量 (online_status = 0)
stats.setOfflineDevices(rfidDeviceService.count(
Wrappers.<RfidDevice>lambdaQuery().eq(RfidDevice::getOnlineStatus, ONLINE_STATUS_OFFLINE)//在线状态(0-离线;1-在线)
));
// 告警数量 (alarm_status = 1)
stats.setAlarmDevices(rfidDeviceService.count(
Wrappers.<RfidDevice>lambdaQuery().eq(RfidDevice::getAlarmStatus, ALARM_STATUS_ALARM)//告警状态(0-正常;1-告警)
));
return R.ok(stats);
}
}

@ -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<RfidDeviceVo> 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<RfidDeviceVo> list = rfidDeviceService.queryList(bo);
ExcelUtil.exportExcel(list, "设备信息", RfidDeviceVo.class, response);
}
/**
*
*
* @param id
*/
@SaCheckPermission("rfid:rfidDevice:query")
@GetMapping("/{id}")
public R<RfidDeviceVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(rfidDeviceService.deleteWithValidByIds(List.of(ids), true));
}
/**
*
*/
@SaCheckPermission("rfid:rfidDevice:list")
@GetMapping("/getRfidDeviceList")
public R<List<RfidDeviceVo>> getRfidDeviceList(RfidDeviceBo bo) {
List<RfidDeviceVo> list = rfidDeviceService.queryList(bo);
return R.ok(list);
}
}

@ -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<RfidLocationVo>> list(RfidLocationBo bo) {
List<RfidLocationVo> 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<RfidLocationVo> list = rfidLocationService.queryList(bo);
ExcelUtil.exportExcel(list, "位置信息", RfidLocationVo.class, response);
}
/**
*
*
* @param id
*/
@SaCheckPermission("rfid:rfidLocation:query")
@GetMapping("/{id}")
public R<RfidLocationVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(rfidLocationService.deleteWithValidByIds(List.of(ids), true));
}
/**
*
*/
@SaCheckPermission("rfid:rfidLocation:list")
@GetMapping("/getRfidLocationList")
public R<List<RfidLocationVo>> getRfidLocationList(RfidLocationBo bo) {
List<RfidLocationVo> list = rfidLocationService.queryList(bo);
return R.ok(list);
}
}

@ -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<RfidReadRecordVo> 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<RfidReadRecordVo> list = rfidReadRecordService.queryList(bo);
ExcelUtil.exportExcel(list, "读取记录", RfidReadRecordVo.class, response);
}
/**
*
*
* @param id
*/
@SaCheckPermission("rfid:rfidReadRecord:query")
@GetMapping("/{id}")
public R<RfidReadRecordVo> 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<Void> 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<Void> 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<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(rfidReadRecordService.deleteWithValidByIds(List.of(ids), true));
}
/**
*
*/
@SaCheckPermission("rfid:rfidReadRecord:list")
@GetMapping("/getRfidReadRecordList")
public R<List<RfidReadRecordVo>> getRfidReadRecordList(RfidReadRecordBo bo) {
List<RfidReadRecordVo> list = rfidReadRecordService.queryList(bo);
return R.ok(list);
}
}

@ -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;
}

@ -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;
}

@ -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;
/**
* idrfid_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;
}

@ -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;
}

@ -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;
}

@ -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;
/**
* idrfid_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;
}

@ -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;
}

@ -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;
}

@ -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<RfidLocationVo> children;
}

@ -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;
/**
* idrfid_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;
}

@ -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<RfidDevice, RfidDeviceVo> {
/**
*
*
* @param queryWrapper
* @return
*/
List<RfidDeviceVo> selectCustomRfidDeviceVoList(@Param(Constants.WRAPPER) Wrapper<RfidDevice> queryWrapper);
/**
* ID
*
* @param id ID
* @return
*/
RfidDeviceVo selectCustomRfidDeviceVoById(@Param("id") Long id);
/**
* ID
*
* @param ids ID
* @return
*/
List<RfidDeviceVo> selectCustomRfidDeviceVoByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Long countCustomRfidDevice(@Param(Constants.WRAPPER) Wrapper<RfidDevice> queryWrapper);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
Page<RfidDeviceVo> selectCustomRfidDeviceVoPage(@Param("page") Page<RfidDevice> page, @Param(Constants.WRAPPER) Wrapper<RfidDevice> queryWrapper);
/**
*
*
* @param list
* @return
*/
int batchInsertRfidDevice(@Param("list") List<RfidDevice> list);
/**
*
*
* @param list
* @return
*/
int batchUpdateRfidDevice(@Param("list") List<RfidDevice> list);
/**
*
*
* @param queryWrapper
* @return
*/
int deleteCustomRfidDevice(@Param(Constants.WRAPPER) Wrapper<RfidDevice> queryWrapper);
/**
* ID
*
* @param ids ID
* @return
*/
int deleteCustomRfidDeviceByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Boolean existsRfidDevice(@Param(Constants.WRAPPER) Wrapper<RfidDevice> queryWrapper);
}

@ -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<RfidLocation, RfidLocationVo> {
/**
*
*
* @param queryWrapper
* @return
*/
List<RfidLocationVo> selectCustomRfidLocationVoList(@Param(Constants.WRAPPER) Wrapper<RfidLocation> queryWrapper);
/**
* ID
*
* @param id ID
* @return
*/
RfidLocationVo selectCustomRfidLocationVoById(@Param("id") Long id);
/**
* ID
*
* @param ids ID
* @return
*/
List<RfidLocationVo> selectCustomRfidLocationVoByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Long countCustomRfidLocation(@Param(Constants.WRAPPER) Wrapper<RfidLocation> queryWrapper);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
Page<RfidLocationVo> selectCustomRfidLocationVoPage(@Param("page") Page<RfidLocation> page, @Param(Constants.WRAPPER) Wrapper<RfidLocation> queryWrapper);
/**
*
*
* @param list
* @return
*/
int batchInsertRfidLocation(@Param("list") List<RfidLocation> list);
/**
*
*
* @param list
* @return
*/
int batchUpdateRfidLocation(@Param("list") List<RfidLocation> list);
/**
*
*
* @param queryWrapper
* @return
*/
int deleteCustomRfidLocation(@Param(Constants.WRAPPER) Wrapper<RfidLocation> queryWrapper);
/**
* ID
*
* @param ids ID
* @return
*/
int deleteCustomRfidLocationByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Boolean existsRfidLocation(@Param(Constants.WRAPPER) Wrapper<RfidLocation> queryWrapper);
}

@ -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<RfidReadRecord, RfidReadRecordVo> {
/**
*
*
* @param queryWrapper
* @return
*/
List<RfidReadRecordVo> selectCustomRfidReadRecordVoList(@Param(Constants.WRAPPER) Wrapper<RfidReadRecord> queryWrapper);
/**
* ID
*
* @param id ID
* @return
*/
RfidReadRecordVo selectCustomRfidReadRecordVoById(@Param("id") Long id);
/**
* ID
*
* @param ids ID
* @return
*/
List<RfidReadRecordVo> selectCustomRfidReadRecordVoByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Long countCustomRfidReadRecord(@Param(Constants.WRAPPER) Wrapper<RfidReadRecord> queryWrapper);
/**
*
*
* @param page
* @param queryWrapper
* @return
*/
Page<RfidReadRecordVo> selectCustomRfidReadRecordVoPage(@Param("page") Page<RfidReadRecord> page, @Param(Constants.WRAPPER) Wrapper<RfidReadRecord> queryWrapper);
/**
*
*
* @param list
* @return
*/
int batchInsertRfidReadRecord(@Param("list") List<RfidReadRecord> list);
/**
*
*
* @param list
* @return
*/
int batchUpdateRfidReadRecord(@Param("list") List<RfidReadRecord> list);
/**
*
*
* @param queryWrapper
* @return
*/
int deleteCustomRfidReadRecord(@Param(Constants.WRAPPER) Wrapper<RfidReadRecord> queryWrapper);
/**
* ID
*
* @param ids ID
* @return
*/
int deleteCustomRfidReadRecordByIds(@Param("ids") Collection<Long> ids);
/**
*
*
* @param queryWrapper
* @return
*/
Boolean existsRfidReadRecord(@Param(Constants.WRAPPER) Wrapper<RfidReadRecord> queryWrapper);
}

@ -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<RfidDeviceVo> queryPageList(RfidDeviceBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<RfidDeviceVo> 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<Long> ids, Boolean isValid);
/**
*
*
* @return
*/
long count();
/**
*
*
* @param queryWrapper
* @return
*/
long count(LambdaQueryWrapper<RfidDevice> queryWrapper);
}

@ -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<RfidLocationVo> 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<Long> ids, Boolean isValid);
}

@ -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<RfidReadRecordVo> queryPageList(RfidReadRecordBo bo, PageQuery pageQuery);
/**
*
*
* @param bo
* @return
*/
List<RfidReadRecordVo> 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<Long> ids, Boolean isValid);
}

@ -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<RfidDeviceVo> queryPageList(RfidDeviceBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<RfidDevice> lqw = buildQueryWrapper(bo);
// 使用自定义 Mapper XML + MyBatis-Plus Wrapper 进行分页查询
Page<RfidDeviceVo> result = baseMapper.selectCustomRfidDeviceVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<RfidDeviceVo> queryList(RfidDeviceBo bo) {
LambdaQueryWrapper<RfidDevice> lqw = buildQueryWrapper(bo);
// 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表
return baseMapper.selectCustomRfidDeviceVoList(lqw);
}
@Override
public long count() {
return baseMapper.countCustomRfidDevice(Wrappers.<RfidDevice>lambdaQuery());
}
@Override
public long count(LambdaQueryWrapper<RfidDevice> queryWrapper) {
LambdaQueryWrapper<RfidDevice> wrapper = queryWrapper;
if (wrapper == null) {
wrapper = Wrappers.lambdaQuery();
}
return baseMapper.countCustomRfidDevice(wrapper);
}
private LambdaQueryWrapper<RfidDevice> buildQueryWrapper(RfidDeviceBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<RfidDevice> 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.<RfidDevice>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<Long> ids, Boolean isValid) {
if (isValid && ids != null && !ids.isEmpty()) {
// 校验是否存在关联的读取记录,防止产生孤儿记录
boolean existsRecord = rfidReadRecordMapper.existsRfidReadRecord(
Wrappers.<RfidReadRecord>lambdaQuery().in(RfidReadRecord::getDeviceId, ids)
);
if (existsRecord) {
throw new ServiceException("存在关联读取记录的设备,无法删除");
}
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -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<RfidLocationVo> queryList(RfidLocationBo bo) {
LambdaQueryWrapper<RfidLocation> lqw = buildQueryWrapper(bo);
// 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表
return baseMapper.selectCustomRfidLocationVoList(lqw);
}
private LambdaQueryWrapper<RfidLocation> buildQueryWrapper(RfidLocationBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<RfidLocation> 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<RfidLocation> children = baseMapper.selectList(new LambdaQueryWrapper<RfidLocation>()
.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<RfidLocation>()
.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<Long> ids, Boolean isValid) {
if(isValid){
for (Long id : ids) {
if (baseMapper.exists(new LambdaQueryWrapper<RfidLocation>().eq(RfidLocation::getParentId, id))) {
throw new ServiceException("存在子节点,无法删除");
}
}
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -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<RfidReadRecordVo> queryPageList(RfidReadRecordBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<RfidReadRecord> lqw = buildQueryWrapper(bo);
// 使用自定义 Mapper XML + MyBatis-Plus Wrapper 进行分页查询
Page<RfidReadRecordVo> result = baseMapper.selectCustomRfidReadRecordVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
*
*
* @param bo
* @return
*/
@Override
public List<RfidReadRecordVo> queryList(RfidReadRecordBo bo) {
LambdaQueryWrapper<RfidReadRecord> lqw = buildQueryWrapper(bo);
// 使用自定义 Mapper XML + MyBatis-Plus Wrapper 查询列表
return baseMapper.selectCustomRfidReadRecordVoList(lqw);
}
private LambdaQueryWrapper<RfidReadRecord> buildQueryWrapper(RfidReadRecordBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<RfidReadRecord> 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<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.rfid.mapper.RfidDeviceMapper">
<resultMap type="org.dromara.rfid.domain.vo.RfidDeviceVo" id="RfidDeviceResult">
</resultMap>
<select id="selectCustomRfidDeviceVoList" resultMap="RfidDeviceResult">
select t.id,
t.device_code,
t.device_name,
t.location_id,
l.location_alias as locationAlias,
t.device_address,
t.device_port,
t.read_frequency,
t.online_status,
t.alarm_status,
t.is_marked,
t.remark,
t.created_by,
t.created_at,
t.updated_by,
t.updated_at
from rfid_device t
left join rfid_location l on t.location_id = l.id
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 根据ID查询详情 -->
<select id="selectCustomRfidDeviceVoById" resultMap="RfidDeviceResult">
select t.id,
t.device_code,
t.device_name,
t.location_id,
l.location_alias as locationAlias,
t.device_address,
t.device_port,
t.read_frequency,
t.online_status,
t.alarm_status,
t.is_marked,
t.remark,
t.created_by,
t.created_at,
t.updated_by,
t.updated_at
from rfid_device t
left join rfid_location l on t.location_id = l.id
where t.id = #{id}
</select>
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomRfidDeviceVoByIds" resultMap="RfidDeviceResult">
select t.id,
t.device_code,
t.device_name,
t.location_id,
l.location_alias as locationAlias,
t.device_address,
t.device_port,
t.read_frequency,
t.online_status,
t.alarm_status,
t.is_marked,
t.remark,
t.created_by,
t.created_at,
t.updated_by,
t.updated_at
from rfid_device t
left join rfid_location l on t.location_id = l.id
where t.id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 统计查询 -->
<select id="countCustomRfidDevice" resultType="java.lang.Long">
select count(1) from rfid_device t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomRfidDeviceVoPage" resultMap="RfidDeviceResult">
select t.id,
t.device_code,
t.device_name,
t.location_id,
l.location_alias as locationAlias,
t.device_address,
t.device_port,
t.read_frequency,
t.online_status,
t.alarm_status,
t.is_marked,
t.remark,
t.created_by,
t.created_at,
t.updated_by,
t.updated_at
from rfid_device t
left join rfid_location l on t.location_id = l.id
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 批量插入 -->
<insert id="batchInsertRfidDevice">
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
<foreach collection="list" item="item" separator=",">
(
#{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}
)
</foreach>
</insert>
<!-- 批量更新 -->
<update id="batchUpdateRfidDevice">
<foreach collection="list" item="item" separator=";">
update rfid_device
<set>
<if test="item.deviceCode != null and item.deviceCode != ''">
device_code = #{item.deviceCode},
</if>
<if test="item.deviceName != null and item.deviceName != ''">
device_name = #{item.deviceName},
</if>
<if test="item.locationId != null">
location_id = #{item.locationId},
</if>
<if test="item.deviceAddress != null and item.deviceAddress != ''">
device_address = #{item.deviceAddress},
</if>
<if test="item.devicePort != null">
device_port = #{item.devicePort},
</if>
<if test="item.readFrequency != null">
read_frequency = #{item.readFrequency},
</if>
<if test="item.onlineStatus != null and item.onlineStatus != ''">
online_status = #{item.onlineStatus},
</if>
<if test="item.alarmStatus != null and item.alarmStatus != ''">
alarm_status = #{item.alarmStatus},
</if>
<if test="item.isMarked != null and item.isMarked != ''">
is_marked = #{item.isMarked},
</if>
<if test="item.remark != null and item.remark != ''">
remark = #{item.remark},
</if>
<if test="item.createdBy != null and item.createdBy != ''">
created_by = #{item.createdBy},
</if>
<if test="item.createdAt != null">
created_at = #{item.createdAt},
</if>
<if test="item.updatedBy != null and item.updatedBy != ''">
updated_by = #{item.updatedBy},
</if>
<if test="item.updatedAt != null">
updated_at = #{item.updatedAt}
</if>
</set>
where id = #{item.id}
</foreach>
</update>
<!-- 根据自定义条件删除 -->
<delete id="deleteCustomRfidDevice">
delete from rfid_device
<if test="ew != null">
${ew.customSqlSegment}
</if>
</delete>
<!-- 根据ID列表批量删除 -->
<delete id="deleteCustomRfidDeviceByIds">
delete from rfid_device
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 检查是否存在 -->
<select id="existsRfidDevice" resultType="java.lang.Boolean">
select count(1) > 0 from rfid_device t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
</mapper>

@ -0,0 +1,169 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.rfid.mapper.RfidLocationMapper">
<resultMap type="org.dromara.rfid.domain.vo.RfidLocationVo" id="RfidLocationResult">
</resultMap>
<select id="selectCustomRfidLocationVoList" resultMap="RfidLocationResult">
select t.id, t.location_code, t.location_alias, t.location_type, t.parent_id, t.is_marked, t.remark, t.created_by, t.created_at, t.updated_by, t.updated_at
from rfid_location t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 根据ID查询详情 -->
<select id="selectCustomRfidLocationVoById" resultMap="RfidLocationResult">
select t.id, t.location_code, t.location_alias, t.location_type, t.parent_id, t.is_marked, t.remark, t.created_by, t.created_at, t.updated_by, t.updated_at
from rfid_location t
where t.id = #{id}
</select>
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomRfidLocationVoByIds" resultMap="RfidLocationResult">
select t.id, t.location_code, t.location_alias, t.location_type, t.parent_id, t.is_marked, t.remark, t.created_by, t.created_at, t.updated_by, t.updated_at
from rfid_location t
where t.id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 统计查询 -->
<select id="countCustomRfidLocation" resultType="java.lang.Long">
select count(1) from rfid_location t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomRfidLocationVoPage" resultMap="RfidLocationResult">
select t.id, t.location_code, t.location_alias, t.location_type, t.parent_id, t.is_marked, t.remark, t.created_by, t.created_at, t.updated_by, t.updated_at
from rfid_location t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 批量插入 -->
<insert id="batchInsertRfidLocation">
insert into rfid_location(
location_code,
location_alias,
location_type,
parent_id,
is_marked,
remark,
created_by,
created_at,
updated_by,
updated_at
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.locationCode},
#{item.locationAlias},
#{item.locationType},
#{item.parentId},
#{item.isMarked},
#{item.remark},
#{item.createdBy},
#{item.createdAt},
#{item.updatedBy},
#{item.updatedAt}
)
</foreach>
</insert>
<!-- 批量更新 -->
<update id="batchUpdateRfidLocation">
<foreach collection="list" item="item" separator=";">
update rfid_location
<set>
<if test="item.locationCode != null and item.locationCode != ''">
location_code = #{item.locationCode},
</if>
<if test="item.locationAlias != null and item.locationAlias != ''">
location_alias = #{item.locationAlias},
</if>
<if test="item.locationType != null and item.locationType != ''">
location_type = #{item.locationType},
</if>
<if test="item.parentId != null">
parent_id = #{item.parentId},
</if>
<if test="item.isMarked != null and item.isMarked != ''">
is_marked = #{item.isMarked},
</if>
<if test="item.remark != null and item.remark != ''">
remark = #{item.remark},
</if>
<if test="item.createdBy != null and item.createdBy != ''">
created_by = #{item.createdBy},
</if>
<if test="item.createdAt != null">
created_at = #{item.createdAt},
</if>
<if test="item.updatedBy != null and item.updatedBy != ''">
updated_by = #{item.updatedBy},
</if>
<if test="item.updatedAt != null">
updated_at = #{item.updatedAt}
</if>
</set>
where id = #{item.id}
</foreach>
</update>
<!-- 根据自定义条件删除 -->
<delete id="deleteCustomRfidLocation">
delete from rfid_location
<if test="ew != null">
${ew.customSqlSegment}
</if>
</delete>
<!-- 根据ID列表批量删除 -->
<delete id="deleteCustomRfidLocationByIds">
delete from rfid_location
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 检查是否存在 -->
<select id="existsRfidLocation" resultType="java.lang.Boolean">
select count(1) > 0 from rfid_location t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
</mapper>

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.rfid.mapper.RfidReadRecordMapper">
<resultMap type="org.dromara.rfid.domain.vo.RfidReadRecordVo" id="RfidReadRecordResult">
</resultMap>
<select id="selectCustomRfidReadRecordVoList" resultMap="RfidReadRecordResult">
select t.id,
t.device_id,
d.device_code as deviceCode,
d.device_name as deviceName,
t.read_status,
t.barcode,
t.record_time,
t.alarm_flag,
t.alarm_level,
t.alarm_type,
t.alarm_action
from rfid_read_record t
left join rfid_device d on t.device_id = d.id
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 根据ID查询详情 -->
<select id="selectCustomRfidReadRecordVoById" resultMap="RfidReadRecordResult">
select t.id,
t.device_id,
d.device_code as deviceCode,
d.device_name as deviceName,
t.read_status,
t.barcode,
t.record_time,
t.alarm_flag,
t.alarm_level,
t.alarm_type,
t.alarm_action
from rfid_read_record t
left join rfid_device d on t.device_id = d.id
where t.id = #{id}
</select>
<!-- 批量查询 - 根据ID列表 -->
<select id="selectCustomRfidReadRecordVoByIds" resultMap="RfidReadRecordResult">
select t.id,
t.device_id,
d.device_code as deviceCode,
d.device_name as deviceName,
t.read_status,
t.barcode,
t.record_time,
t.alarm_flag,
t.alarm_level,
t.alarm_type,
t.alarm_action
from rfid_read_record t
left join rfid_device d on t.device_id = d.id
where t.id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<!-- 统计查询 -->
<select id="countCustomRfidReadRecord" resultType="java.lang.Long">
select count(1) from rfid_read_record t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 分页查询(带自定义条件) -->
<select id="selectCustomRfidReadRecordVoPage" resultMap="RfidReadRecordResult">
select t.id,
t.device_id,
d.device_code as deviceCode,
d.device_name as deviceName,
t.read_status,
t.barcode,
t.record_time,
t.alarm_flag,
t.alarm_level,
t.alarm_type,
t.alarm_action
from rfid_read_record t
left join rfid_device d on t.device_id = d.id
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
<!-- 批量插入 -->
<insert id="batchInsertRfidReadRecord">
insert into rfid_read_record(
device_id,
read_status,
barcode,
record_time,
alarm_flag,
alarm_level,
alarm_type,
alarm_action
)
values
<foreach collection="list" item="item" separator=",">
(
#{item.deviceId},
#{item.readStatus},
#{item.barcode},
#{item.recordTime},
#{item.alarmFlag},
#{item.alarmLevel},
#{item.alarmType},
#{item.alarmAction}
)
</foreach>
</insert>
<!-- 批量更新 -->
<update id="batchUpdateRfidReadRecord">
<foreach collection="list" item="item" separator=";">
update rfid_read_record
<set>
<if test="item.deviceId != null">
device_id = #{item.deviceId},
</if>
<if test="item.readStatus != null and item.readStatus != ''">
read_status = #{item.readStatus},
</if>
<if test="item.barcode != null and item.barcode != ''">
barcode = #{item.barcode},
</if>
<if test="item.recordTime != null">
record_time = #{item.recordTime},
</if>
<if test="item.alarmFlag != null and item.alarmFlag != ''">
alarm_flag = #{item.alarmFlag},
</if>
<if test="item.alarmLevel != null and item.alarmLevel != ''">
alarm_level = #{item.alarmLevel},
</if>
<if test="item.alarmType != null and item.alarmType != ''">
alarm_type = #{item.alarmType},
</if>
<if test="item.alarmAction != null and item.alarmAction != ''">
alarm_action = #{item.alarmAction}
</if>
</set>
where id = #{item.id}
</foreach>
</update>
<!-- 根据自定义条件删除 -->
<delete id="deleteCustomRfidReadRecord">
delete from rfid_read_record
<if test="ew != null">
${ew.customSqlSegment}
</if>
</delete>
<!-- 根据ID列表批量删除 -->
<delete id="deleteCustomRfidReadRecordByIds">
delete from rfid_read_record
where id in
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<!-- 检查是否存在 -->
<select id="existsRfidReadRecord" resultType="java.lang.Boolean">
select count(1) > 0 from rfid_read_record t
<if test="ew != null">
${ew.customSqlSegment}
</if>
</select>
</mapper>
Loading…
Cancel
Save