feat: 新功能开发,设备告警信息、设备实时数据查看等。

This commit is contained in:
tianyongbao
2025-10-30 11:19:50 +08:00
parent 9b1cbb69bb
commit 4d10d291a3
31 changed files with 2310 additions and 1 deletions

View File

@@ -92,7 +92,7 @@
<artifactId>intc-fishery</artifactId>
<version>${revision}</version> <!-- 使用项目统一版本变量 -->
</dependency>
<!-- 鱼测云模块 -->
<!-- 时序数据 -->
<dependency>
<groupId>com.intc</groupId>
<artifactId>intc-tdengine</artifactId>

View File

@@ -0,0 +1,104 @@
package com.intc.fishery.controller;
import java.util.List;
import com.intc.common.excel.utils.ExcelUtil;
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 com.intc.common.idempotent.annotation.RepeatSubmit;
import com.intc.common.log.annotation.Log;
import com.intc.common.web.core.BaseController;
import com.intc.common.mybatis.core.page.PageQuery;
import com.intc.common.core.domain.R;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.common.log.enums.BusinessType;
import com.intc.fishery.domain.vo.CallNoticeVo;
import com.intc.fishery.domain.bo.CallNoticeBo;
import com.intc.fishery.service.ICallNoticeService;
import com.intc.common.mybatis.core.page.TableDataInfo;
/**
* 告警电话通知记录
*
* @author intc
* @date 2025-10-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/fishery/callNotice")
public class CallNoticeController extends BaseController {
private final ICallNoticeService callNoticeService;
/**
* 查询告警电话通知记录列表
*/
@SaCheckPermission("fishery:callNotice:list")
@GetMapping("/list")
public TableDataInfo<CallNoticeVo> list(CallNoticeBo bo, PageQuery pageQuery) {
return callNoticeService.queryPageList(bo, pageQuery);
}
/**
* 导出告警电话通知记录列表
*/
@SaCheckPermission("fishery:callNotice:export")
@Log(title = "告警电话通知记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CallNoticeBo bo, HttpServletResponse response) {
List<CallNoticeVo> list = callNoticeService.queryList(bo);
ExcelUtil.exportExcel(list, "告警电话通知记录", CallNoticeVo.class, response);
}
/**
* 获取告警电话通知记录详细信息
*
* @param id 主键
*/
@SaCheckPermission("fishery:callNotice:query")
@GetMapping("/{id}")
public R<CallNoticeVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(callNoticeService.queryById(id));
}
/**
* 新增告警电话通知记录
*/
@SaCheckPermission("fishery:callNotice:add")
@Log(title = "告警电话通知记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CallNoticeBo bo) {
return toAjax(callNoticeService.insertByBo(bo));
}
/**
* 修改告警电话通知记录
*/
@SaCheckPermission("fishery:callNotice:edit")
@Log(title = "告警电话通知记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CallNoticeBo bo) {
return toAjax(callNoticeService.updateByBo(bo));
}
/**
* 删除告警电话通知记录
*
* @param ids 主键串
*/
@SaCheckPermission("fishery:callNotice:remove")
@Log(title = "告警电话通知记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(callNoticeService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@@ -0,0 +1,104 @@
package com.intc.fishery.controller;
import java.util.List;
import com.intc.common.excel.utils.ExcelUtil;
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 com.intc.common.idempotent.annotation.RepeatSubmit;
import com.intc.common.log.annotation.Log;
import com.intc.common.web.core.BaseController;
import com.intc.common.mybatis.core.page.PageQuery;
import com.intc.common.core.domain.R;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.common.log.enums.BusinessType;
import com.intc.fishery.domain.vo.MapMessageWarnCallNoticeVo;
import com.intc.fishery.domain.bo.MapMessageWarnCallNoticeBo;
import com.intc.fishery.service.IMapMessageWarnCallNoticeService;
import com.intc.common.mybatis.core.page.TableDataInfo;
/**
* 告警消息和电话告警通知关系表
*
* @author intc
* @date 2025-10-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/fishery/mapMessageWarnCallNotice")
public class MapMessageWarnCallNoticeController extends BaseController {
private final IMapMessageWarnCallNoticeService mapMessageWarnCallNoticeService;
/**
* 查询告警消息和电话告警通知关系表列表
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:list")
@GetMapping("/list")
public TableDataInfo<MapMessageWarnCallNoticeVo> list(MapMessageWarnCallNoticeBo bo, PageQuery pageQuery) {
return mapMessageWarnCallNoticeService.queryPageList(bo, pageQuery);
}
/**
* 导出告警消息和电话告警通知关系表列表
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:export")
@Log(title = "告警消息和电话告警通知关系表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(MapMessageWarnCallNoticeBo bo, HttpServletResponse response) {
List<MapMessageWarnCallNoticeVo> list = mapMessageWarnCallNoticeService.queryList(bo);
ExcelUtil.exportExcel(list, "告警消息和电话告警通知关系表", MapMessageWarnCallNoticeVo.class, response);
}
/**
* 获取告警消息和电话告警通知关系表详细信息
*
* @param id 主键
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:query")
@GetMapping("/{id}")
public R<MapMessageWarnCallNoticeVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(mapMessageWarnCallNoticeService.queryById(id));
}
/**
* 新增告警消息和电话告警通知关系表
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:add")
@Log(title = "告警消息和电话告警通知关系表", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody MapMessageWarnCallNoticeBo bo) {
return toAjax(mapMessageWarnCallNoticeService.insertByBo(bo));
}
/**
* 修改告警消息和电话告警通知关系表
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:edit")
@Log(title = "告警消息和电话告警通知关系表", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MapMessageWarnCallNoticeBo bo) {
return toAjax(mapMessageWarnCallNoticeService.updateByBo(bo));
}
/**
* 删除告警消息和电话告警通知关系表
*
* @param ids 主键串
*/
@SaCheckPermission("fishery:mapMessageWarnCallNotice:remove")
@Log(title = "告警消息和电话告警通知关系表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(mapMessageWarnCallNoticeService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@@ -0,0 +1,104 @@
package com.intc.fishery.controller;
import java.util.List;
import com.intc.common.excel.utils.ExcelUtil;
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 com.intc.common.idempotent.annotation.RepeatSubmit;
import com.intc.common.log.annotation.Log;
import com.intc.common.web.core.BaseController;
import com.intc.common.mybatis.core.page.PageQuery;
import com.intc.common.core.domain.R;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.common.log.enums.BusinessType;
import com.intc.fishery.domain.vo.MessageWarnVo;
import com.intc.fishery.domain.bo.MessageWarnBo;
import com.intc.fishery.service.IMessageWarnService;
import com.intc.common.mybatis.core.page.TableDataInfo;
/**
* 设备告警记录
*
* @author intc
* @date 2025-10-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/fishery/messageWarn")
public class MessageWarnController extends BaseController {
private final IMessageWarnService messageWarnService;
/**
* 查询设备告警记录列表
*/
@SaCheckPermission("fishery:messageWarn:list")
@GetMapping("/list")
public TableDataInfo<MessageWarnVo> list(MessageWarnBo bo, PageQuery pageQuery) {
return messageWarnService.queryPageList(bo, pageQuery);
}
/**
* 导出设备告警记录列表
*/
@SaCheckPermission("fishery:messageWarn:export")
@Log(title = "设备告警记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(MessageWarnBo bo, HttpServletResponse response) {
List<MessageWarnVo> list = messageWarnService.queryList(bo);
ExcelUtil.exportExcel(list, "设备告警记录", MessageWarnVo.class, response);
}
/**
* 获取设备告警记录详细信息
*
* @param id 主键
*/
@SaCheckPermission("fishery:messageWarn:query")
@GetMapping("/{id}")
public R<MessageWarnVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(messageWarnService.queryById(id));
}
/**
* 新增设备告警记录
*/
@SaCheckPermission("fishery:messageWarn:add")
@Log(title = "设备告警记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody MessageWarnBo bo) {
return toAjax(messageWarnService.insertByBo(bo));
}
/**
* 修改设备告警记录
*/
@SaCheckPermission("fishery:messageWarn:edit")
@Log(title = "设备告警记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody MessageWarnBo bo) {
return toAjax(messageWarnService.updateByBo(bo));
}
/**
* 删除设备告警记录
*
* @param ids 主键串
*/
@SaCheckPermission("fishery:messageWarn:remove")
@Log(title = "设备告警记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(messageWarnService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@@ -0,0 +1,128 @@
package com.intc.fishery.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.intc.common.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 告警电话通知记录对象 aqu_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("aqu_call_notice")
public class CallNotice extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 通知手机号
*/
private String mobilePhone;
/**
* 设备id
*/
private Long deviceId;
/**
* 设定的呼叫时间
*/
private Date callTime;
/**
* 呼叫的CallId
*/
private String callId;
/**
* 呼叫状态
*/
private Integer callStatus;
/**
* 主叫号码
*/
private String caller;
/**
* 通话时长
*/
private String duration;
/**
* 通话结束时间
*/
private String endTime;
/**
* 挂断方向
*/
private String hangupDirection;
/**
* 呼叫发起时间
*/
private String originateTime;
/**
* 扩展字段回传
*/
private String outId;
/**
* 被叫响铃时间
*/
private String ringTime;
/**
* 通话接通时间
*/
private String startTime;
/**
* 呼叫结果状态码
*/
private String statusCode;
/**
* 结果描述
*/
private String statusMsg;
/**
* 通话类型
*/
private String tollType;
/**
* 话单类型
*/
private String voiceType;
/**
* 塘口名称
*/
private String pondName;
}

View File

@@ -0,0 +1,46 @@
package com.intc.fishery.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.intc.common.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 告警消息和电话告警通知关系表对象 aqu_map_message_warn_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("aqu_map_message_warn_call_notice")
public class MapMessageWarnCallNotice extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 告警消息Id
*/
private Long messageWarnId;
/**
* 电话通知id
*/
private Long callNoticeId;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,71 @@
package com.intc.fishery.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.intc.common.tenant.core.TenantEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 设备告警记录对象 aqu_message_warn
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("aqu_message_warn")
public class MessageWarn extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@TableId(value = "id")
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 设备id
*/
private Long deviceId;
/**
* 消息标题
*/
private String title;
/**
* 消息内容
*/
private String message;
/**
* 是否已读
*/
private Integer isRead;
/**
* 告警类型
*/
private Integer warnType;
/**
* 塘口名称
*/
private String pondName;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,132 @@
package com.intc.fishery.domain.bo;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.fishery.domain.CallNotice;
import com.intc.common.mybatis.core.domain.BaseEntity;
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;
/**
* 告警电话通知记录业务对象 aqu_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = CallNotice.class, reverseConvertGenerate = false)
public class CallNoticeBo extends BaseEntity {
/**
* 主键id
*/
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long userId;
/**
* 通知手机号
*/
@NotBlank(message = "通知手机号不能为空", groups = { AddGroup.class, EditGroup.class })
private String mobilePhone;
/**
* 设备id
*/
@NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long deviceId;
/**
* 设定的呼叫时间
*/
@NotNull(message = "设定的呼叫时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date callTime;
/**
* 呼叫的CallId
*/
private String callId;
/**
* 呼叫状态
*/
@NotNull(message = "呼叫状态不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer callStatus;
/**
* 主叫号码
*/
private String caller;
/**
* 通话时长
*/
private String duration;
/**
* 通话结束时间
*/
private String endTime;
/**
* 挂断方向
*/
private String hangupDirection;
/**
* 呼叫发起时间
*/
private String originateTime;
/**
* 扩展字段回传
*/
private String outId;
/**
* 被叫响铃时间
*/
private String ringTime;
/**
* 通话接通时间
*/
private String startTime;
/**
* 呼叫结果状态码
*/
private String statusCode;
/**
* 结果描述
*/
private String statusMsg;
/**
* 通话类型
*/
private String tollType;
/**
* 话单类型
*/
private String voiceType;
/**
* 塘口名称
*/
@NotBlank(message = "塘口名称不能为空", groups = { AddGroup.class })
private String pondName;
}

View File

@@ -0,0 +1,46 @@
package com.intc.fishery.domain.bo;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.fishery.domain.MapMessageWarnCallNotice;
import com.intc.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 告警消息和电话告警通知关系表业务对象 aqu_map_message_warn_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = MapMessageWarnCallNotice.class, reverseConvertGenerate = false)
public class MapMessageWarnCallNoticeBo extends BaseEntity {
/**
* 主键id
*/
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 告警消息Id
*/
@NotNull(message = "告警消息Id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long messageWarnId;
/**
* 电话通知id
*/
@NotNull(message = "电话通知id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long callNoticeId;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,75 @@
package com.intc.fishery.domain.bo;
import com.intc.common.core.validate.AddGroup;
import com.intc.common.core.validate.EditGroup;
import com.intc.fishery.domain.MessageWarn;
import com.intc.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 设备告警记录业务对象 aqu_message_warn
*
* @author intc
* @date 2025-10-25
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = MessageWarn.class, reverseConvertGenerate = false)
public class MessageWarnBo extends BaseEntity {
/**
* 主键id
*/
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long userId;
/**
* 设备id
*/
@NotNull(message = "设备id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long deviceId;
/**
* 消息标题
*/
@NotBlank(message = "消息标题不能为空", groups = { AddGroup.class, EditGroup.class })
private String title;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String message;
/**
* 是否已读
*/
@NotNull(message = "是否已读不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer isRead;
/**
* 告警类型
*/
@NotNull(message = "告警类型不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer warnType;
/**
* 塘口名称
*/
private String pondName;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,196 @@
package com.intc.fishery.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.intc.fishery.domain.CallNotice;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.intc.common.excel.annotation.ExcelDictFormat;
import com.intc.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;
/**
* 告警电话通知记录视图对象 aqu_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = CallNotice.class)
public class CallNoticeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@ExcelProperty(value = "主键id")
private Long id;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 通知手机号
*/
@ExcelProperty(value = "通知手机号")
private String mobilePhone;
/**
* 设备id
*/
@ExcelProperty(value = "设备id")
private Long deviceId;
/**
* 呼叫状态
*/
@ExcelProperty(value = "呼叫状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "call_status")
private Integer callStatus;
/**
* 主叫号码
*/
@ExcelProperty(value = "主叫号码")
private String caller;
/**
* 通话时长
*/
@ExcelProperty(value = "通话时长")
private String duration;
/**
* 通话结束时间
*/
@ExcelProperty(value = "通话结束时间")
private String endTime;
/**
* 挂断方向
*/
@ExcelProperty(value = "挂断方向")
private String hangupDirection;
/**
* 呼叫发起时间
*/
@ExcelProperty(value = "呼叫发起时间")
private String originateTime;
/**
* 扩展字段回传
*/
@ExcelProperty(value = "扩展字段回传")
private String outId;
/**
* 被叫响铃时间
*/
@ExcelProperty(value = "被叫响铃时间")
private String ringTime;
/**
* 通话接通时间
*/
@ExcelProperty(value = "通话接通时间")
private String startTime;
/**
* 呼叫结果状态码
*/
@ExcelProperty(value = "呼叫结果状态码")
private String statusCode;
/**
* 设定的呼叫时间
*/
private Date callTime;
/**
* 结果描述
*/
@ExcelProperty(value = "结果描述")
private String statusMsg;
/**
* 通话类型
*/
@ExcelProperty(value = "通话类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "toll_type")
private String tollType;
/**
* 话单类型
*/
@ExcelProperty(value = "话单类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "voice_type")
private String voiceType;
private Date createTime;
private Date updateTime;
/**
* 用户名(关联查询)
*/
@ExcelProperty(value = "用户名")
private String userName;
/**
* 用户手机号(关联查询)
*/
@ExcelProperty(value = "用户手机号")
private String userMobilePhone;
/**
* 设备名称(关联查询)
*/
@ExcelProperty(value = "设备名称")
private String deviceName;
/**
* 设备编号(关联查询)
*/
@ExcelProperty(value = "设备编号")
private String serialNum;
/**
* 设备类型(关联查询)
*/
@ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "aqu_device_type")
private Integer deviceType;
/**
* 告警类型(关联查询)
*/
@ExcelProperty(value = "告警类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "warn_type")
private Integer warnType;
/**
* 告警标题(关联查询)
*/
@ExcelProperty(value = "告警标题")
private String warnTitle;
/**
* 告警内容(关联查询)
*/
@ExcelProperty(value = "告警内容")
private String warnMessage;
}

View File

@@ -0,0 +1,58 @@
package com.intc.fishery.domain.vo;
import com.intc.fishery.domain.MapMessageWarnCallNotice;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.intc.common.excel.annotation.ExcelDictFormat;
import com.intc.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;
/**
* 告警消息和电话告警通知关系表视图对象 aqu_map_message_warn_call_notice
*
* @author intc
* @date 2025-10-25
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = MapMessageWarnCallNotice.class)
public class MapMessageWarnCallNoticeVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@ExcelProperty(value = "主键id")
private Long id;
/**
* 告警消息Id
*/
@ExcelProperty(value = "告警消息Id")
private Long messageWarnId;
/**
* 电话通知id
*/
@ExcelProperty(value = "电话通知id")
private Long callNoticeId;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
private Date createTime;
private Date updateTime;
}

View File

@@ -0,0 +1,121 @@
package com.intc.fishery.domain.vo;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
import com.intc.common.excel.annotation.ExcelDictFormat;
import com.intc.common.excel.convert.ExcelDictConvert;
import com.intc.fishery.domain.MessageWarn;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
/**
* 设备告警记录视图对象 aqu_message_warn
*
* @author intc
* @date 2025-10-25
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = MessageWarn.class)
public class MessageWarnVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键id
*/
@ExcelProperty(value = "主键id")
private Long id;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 设备id
*/
@ExcelProperty(value = "设备id")
private Long deviceId;
/**
* 消息标题
*/
@ExcelProperty(value = "消息标题")
private String title;
/**
* 消息内容
*/
@ExcelProperty(value = "消息内容")
private String message;
/**
* 是否已读
*/
@ExcelProperty(value = "是否已读", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "yes_no")
private Integer isRead;
/**
* 告警类型
*/
@ExcelProperty(value = "告警类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "warn_type")
private Integer warnType;
/**
* 塘口名称
*/
@ExcelProperty(value = "塘口名称")
private String pondName;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
private Date createTime;
private Date updateTime;
/**
* 用户名(关联查询)
*/
@ExcelProperty(value = "用户名")
private String userName;
/**
* 用户手机号(关联查询)
*/
@ExcelProperty(value = "用户手机号")
private String mobilePhone;
/**
* 设备名称(关联查询)
*/
@ExcelProperty(value = "设备名称")
private String deviceName;
/**
* 设备编号(关联查询)
*/
@ExcelProperty(value = "设备编号")
private String serialNum;
/**
* 电话通知次数(统计查询)
*/
@ExcelProperty(value = "电话通知次数")
private Long callNoticeCount;
}

View File

@@ -0,0 +1,15 @@
package com.intc.fishery.mapper;
import com.intc.fishery.domain.CallNotice;
import com.intc.fishery.domain.vo.CallNoticeVo;
import com.intc.common.mybatis.core.mapper.BaseMapperPlusJoin;
/**
* 告警电话通知记录Mapper接口
*
* @author intc
* @date 2025-10-25
*/
public interface CallNoticeMapper extends BaseMapperPlusJoin<CallNotice, CallNoticeVo> {
}

View File

@@ -0,0 +1,15 @@
package com.intc.fishery.mapper;
import com.intc.fishery.domain.MapMessageWarnCallNotice;
import com.intc.fishery.domain.vo.MapMessageWarnCallNoticeVo;
import com.intc.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 告警消息和电话告警通知关系表Mapper接口
*
* @author intc
* @date 2025-10-25
*/
public interface MapMessageWarnCallNoticeMapper extends BaseMapperPlus<MapMessageWarnCallNotice, MapMessageWarnCallNoticeVo> {
}

View File

@@ -0,0 +1,15 @@
package com.intc.fishery.mapper;
import com.intc.common.mybatis.core.mapper.BaseMapperPlusJoin;
import com.intc.fishery.domain.MessageWarn;
import com.intc.fishery.domain.vo.MessageWarnVo;
/**
* 设备告警记录Mapper接口
*
* @author intc
* @date 2025-10-25
*/
public interface MessageWarnMapper extends BaseMapperPlusJoin<MessageWarn, MessageWarnVo> {
}

View File

@@ -0,0 +1,68 @@
package com.intc.fishery.service;
import com.intc.fishery.domain.vo.CallNoticeVo;
import com.intc.fishery.domain.bo.CallNoticeBo;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 告警电话通知记录Service接口
*
* @author intc
* @date 2025-10-25
*/
public interface ICallNoticeService {
/**
* 查询告警电话通知记录
*
* @param id 主键
* @return 告警电话通知记录
*/
CallNoticeVo queryById(Long id);
/**
* 分页查询告警电话通知记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 告警电话通知记录分页列表
*/
TableDataInfo<CallNoticeVo> queryPageList(CallNoticeBo bo, PageQuery pageQuery);
/**
* 查询符合条件的告警电话通知记录列表
*
* @param bo 查询条件
* @return 告警电话通知记录列表
*/
List<CallNoticeVo> queryList(CallNoticeBo bo);
/**
* 新增告警电话通知记录
*
* @param bo 告警电话通知记录
* @return 是否新增成功
*/
Boolean insertByBo(CallNoticeBo bo);
/**
* 修改告警电话通知记录
*
* @param bo 告警电话通知记录
* @return 是否修改成功
*/
Boolean updateByBo(CallNoticeBo bo);
/**
* 校验并批量删除告警电话通知记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,68 @@
package com.intc.fishery.service;
import com.intc.fishery.domain.vo.MapMessageWarnCallNoticeVo;
import com.intc.fishery.domain.bo.MapMessageWarnCallNoticeBo;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 告警消息和电话告警通知关系表Service接口
*
* @author intc
* @date 2025-10-25
*/
public interface IMapMessageWarnCallNoticeService {
/**
* 查询告警消息和电话告警通知关系表
*
* @param id 主键
* @return 告警消息和电话告警通知关系表
*/
MapMessageWarnCallNoticeVo queryById(Long id);
/**
* 分页查询告警消息和电话告警通知关系表列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 告警消息和电话告警通知关系表分页列表
*/
TableDataInfo<MapMessageWarnCallNoticeVo> queryPageList(MapMessageWarnCallNoticeBo bo, PageQuery pageQuery);
/**
* 查询符合条件的告警消息和电话告警通知关系表列表
*
* @param bo 查询条件
* @return 告警消息和电话告警通知关系表列表
*/
List<MapMessageWarnCallNoticeVo> queryList(MapMessageWarnCallNoticeBo bo);
/**
* 新增告警消息和电话告警通知关系表
*
* @param bo 告警消息和电话告警通知关系表
* @return 是否新增成功
*/
Boolean insertByBo(MapMessageWarnCallNoticeBo bo);
/**
* 修改告警消息和电话告警通知关系表
*
* @param bo 告警消息和电话告警通知关系表
* @return 是否修改成功
*/
Boolean updateByBo(MapMessageWarnCallNoticeBo bo);
/**
* 校验并批量删除告警消息和电话告警通知关系表信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,68 @@
package com.intc.fishery.service;
import com.intc.fishery.domain.vo.MessageWarnVo;
import com.intc.fishery.domain.bo.MessageWarnBo;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 设备告警记录Service接口
*
* @author intc
* @date 2025-10-25
*/
public interface IMessageWarnService {
/**
* 查询设备告警记录
*
* @param id 主键
* @return 设备告警记录
*/
MessageWarnVo queryById(Long id);
/**
* 分页查询设备告警记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 设备告警记录分页列表
*/
TableDataInfo<MessageWarnVo> queryPageList(MessageWarnBo bo, PageQuery pageQuery);
/**
* 查询符合条件的设备告警记录列表
*
* @param bo 查询条件
* @return 设备告警记录列表
*/
List<MessageWarnVo> queryList(MessageWarnBo bo);
/**
* 新增设备告警记录
*
* @param bo 设备告警记录
* @return 是否新增成功
*/
Boolean insertByBo(MessageWarnBo bo);
/**
* 修改设备告警记录
*
* @param bo 设备告警记录
* @return 是否修改成功
*/
Boolean updateByBo(MessageWarnBo bo);
/**
* 校验并批量删除设备告警记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,243 @@
package com.intc.fishery.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.intc.common.core.utils.MapstructUtils;
import com.intc.common.core.utils.StringUtils;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.intc.fishery.domain.bo.CallNoticeBo;
import com.intc.fishery.domain.vo.CallNoticeVo;
import com.intc.fishery.domain.CallNotice;
import com.intc.fishery.domain.AquUser;
import com.intc.fishery.domain.Device;
import com.intc.fishery.domain.MapMessageWarnCallNotice;
import com.intc.fishery.domain.MessageWarn;
import com.intc.fishery.mapper.CallNoticeMapper;
import com.intc.fishery.mapper.MapMessageWarnCallNoticeMapper;
import com.intc.fishery.service.ICallNoticeService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 告警电话通知记录Service业务层处理
*
* @author intc
* @date 2025-10-25
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class CallNoticeServiceImpl implements ICallNoticeService {
private final CallNoticeMapper baseMapper;
private final MapMessageWarnCallNoticeMapper mapMessageWarnCallNoticeMapper;
/**
* 查询告警电话通知记录
*
* @param id 主键
* @return 告警电话通知记录
*/
@Override
public CallNoticeVo queryById(Long id){
MPJLambdaWrapper<CallNotice> wrapper = new MPJLambdaWrapper<CallNotice>()
.selectAll(CallNotice.class)
.selectAs(AquUser::getUserName, CallNoticeVo::getUserName)
.selectAs(AquUser::getMobilePhone, CallNoticeVo::getUserMobilePhone)
.selectAs(Device::getDeviceName, CallNoticeVo::getDeviceName)
.selectAs(Device::getSerialNum, CallNoticeVo::getSerialNum)
.selectAs(Device::getDeviceType, CallNoticeVo::getDeviceType)
.select("mw.warn_type AS warnType")
.select("mw.title AS warnTitle")
.select("mw.message AS warnMessage")
.leftJoin(AquUser.class, AquUser::getId, CallNotice::getUserId)
.leftJoin(Device.class, Device::getId, CallNotice::getDeviceId)
.leftJoin("aqu_map_message_warn_call_notice map ON map.call_notice_id = t.id")
.leftJoin("aqu_message_warn mw ON mw.id = map.message_warn_id")
.eq(CallNotice::getId, id);
return baseMapper.selectJoinOne(CallNoticeVo.class, wrapper);
}
/**
* 分页查询告警电话通知记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 告警电话通知记录分页列表
*/
@Override
public TableDataInfo<CallNoticeVo> queryPageList(CallNoticeBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<CallNotice> wrapper = buildJoinQueryWrapper(bo);
Page<CallNoticeVo> result = baseMapper.selectJoinPage(pageQuery.build(), CallNoticeVo.class, wrapper);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的告警电话通知记录列表
*
* @param bo 查询条件
* @return 告警电话通知记录列表
*/
@Override
public List<CallNoticeVo> queryList(CallNoticeBo bo) {
MPJLambdaWrapper<CallNotice> wrapper = buildJoinQueryWrapper(bo);
return baseMapper.selectJoinList(CallNoticeVo.class, wrapper);
}
/**
* 构建关联查询条件
*
* @param bo 查询条件
* @return 关联查询Wrapper
*/
private MPJLambdaWrapper<CallNotice> buildJoinQueryWrapper(CallNoticeBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<CallNotice> wrapper = new MPJLambdaWrapper<CallNotice>()
.selectAll(CallNotice.class)
.selectAs(AquUser::getUserName, CallNoticeVo::getUserName)
.selectAs(AquUser::getMobilePhone, CallNoticeVo::getUserMobilePhone)
.selectAs(Device::getDeviceName, CallNoticeVo::getDeviceName)
.selectAs(Device::getSerialNum, CallNoticeVo::getSerialNum)
.selectAs(Device::getDeviceType, CallNoticeVo::getDeviceType)
.select("mw.warn_type AS warnType")
.select("mw.title AS warnTitle")
.select("mw.message AS warnMessage")
.leftJoin(AquUser.class, AquUser::getId, CallNotice::getUserId)
.leftJoin(Device.class, Device::getId, CallNotice::getDeviceId)
.leftJoin("aqu_map_message_warn_call_notice map ON map.call_notice_id = t.id")
.leftJoin("aqu_message_warn mw ON mw.id = map.message_warn_id")
.eq(bo.getUserId() != null, CallNotice::getUserId, bo.getUserId())
.eq(bo.getCallStatus() != null, CallNotice::getCallStatus, bo.getCallStatus())
.eq(StringUtils.isNotBlank(bo.getMobilePhone()), CallNotice::getMobilePhone, bo.getMobilePhone())
.eq(bo.getDeviceId() != null, CallNotice::getDeviceId, bo.getDeviceId())
.eq(StringUtils.isNotBlank(bo.getDuration()), CallNotice::getDuration, bo.getDuration())
.eq(StringUtils.isNotBlank(bo.getEndTime()), CallNotice::getEndTime, bo.getEndTime())
.eq(StringUtils.isNotBlank(bo.getHangupDirection()), CallNotice::getHangupDirection, bo.getHangupDirection())
.eq(StringUtils.isNotBlank(bo.getTollType()), CallNotice::getTollType, bo.getTollType())
.orderByDesc(CallNotice::getCallTime);
// 处理额外的查询参数
if (params != null && !params.isEmpty()) {
handleExtraParams(wrapper, params);
}
return wrapper;
}
/**
* 处理额外的查询参数
*
* @param wrapper 查询包装器
* @param params 额外参数
*/
private void handleExtraParams(MPJLambdaWrapper<CallNotice> wrapper, Map<String, Object> params) {
// 处理用户名或用户手机号模糊查询
String userKeyword = (String) params.get("userKeyword");
if (StringUtils.isNotBlank(userKeyword)) {
wrapper.and(w -> w.like(AquUser::getUserName, userKeyword)
.or()
.like(AquUser::getMobilePhone, userKeyword));
}
// 处理设备名称或设备编号模糊查询
String deviceKeyword = (String) params.get("deviceKeyword");
if (StringUtils.isNotBlank(deviceKeyword)) {
wrapper.and(w -> w.like(Device::getDeviceName, deviceKeyword)
.or()
.like(Device::getSerialNum, deviceKeyword));
}
// 处理设备类型精确查询
Object deviceTypeObj = params.get("deviceType");
if (deviceTypeObj != null) {
Integer deviceType = deviceTypeObj instanceof String ?
Integer.valueOf((String) deviceTypeObj) : (Integer) deviceTypeObj;
wrapper.eq(Device::getDeviceType, deviceType);
}
// 处理告警类型精确查询
Object warnTypeObj = params.get("warnType");
if (warnTypeObj != null) {
Integer warnType = warnTypeObj instanceof String ?
Integer.valueOf((String) warnTypeObj) : (Integer) warnTypeObj;
wrapper.apply("mw.warn_type = {0}", warnType);
}
// 处理告警ID精确查询
Object messageWarnIdObj = params.get("messageWarnId");
if (messageWarnIdObj != null) {
Long messageWarnId = messageWarnIdObj instanceof String ?
Long.valueOf((String) messageWarnIdObj) : (Long) messageWarnIdObj;
wrapper.eq("mw.id", messageWarnId);
}
}
/**
* 新增告警电话通知记录
*
* @param bo 告警电话通知记录
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(CallNoticeBo bo) {
CallNotice add = MapstructUtils.convert(bo, CallNotice.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改告警电话通知记录
*
* @param bo 告警电话通知记录
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(CallNoticeBo bo) {
CallNotice update = MapstructUtils.convert(bo, CallNotice.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(CallNotice entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除告警电话通知记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
// 先删除中间表的关联记录
for (Long callNoticeId : ids) {
LambdaQueryWrapper<MapMessageWarnCallNotice> wrapper = Wrappers.lambdaQuery();
wrapper.eq(MapMessageWarnCallNotice::getCallNoticeId, callNoticeId);
mapMessageWarnCallNoticeMapper.delete(wrapper);
}
// 再删除主表记录
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@@ -0,0 +1,133 @@
package com.intc.fishery.service.impl;
import com.intc.common.core.utils.MapstructUtils;
import com.intc.common.core.utils.StringUtils;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.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 com.intc.fishery.domain.bo.MapMessageWarnCallNoticeBo;
import com.intc.fishery.domain.vo.MapMessageWarnCallNoticeVo;
import com.intc.fishery.domain.MapMessageWarnCallNotice;
import com.intc.fishery.mapper.MapMessageWarnCallNoticeMapper;
import com.intc.fishery.service.IMapMessageWarnCallNoticeService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 告警消息和电话告警通知关系表Service业务层处理
*
* @author intc
* @date 2025-10-25
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class MapMessageWarnCallNoticeServiceImpl implements IMapMessageWarnCallNoticeService {
private final MapMessageWarnCallNoticeMapper baseMapper;
/**
* 查询告警消息和电话告警通知关系表
*
* @param id 主键
* @return 告警消息和电话告警通知关系表
*/
@Override
public MapMessageWarnCallNoticeVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询告警消息和电话告警通知关系表列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 告警消息和电话告警通知关系表分页列表
*/
@Override
public TableDataInfo<MapMessageWarnCallNoticeVo> queryPageList(MapMessageWarnCallNoticeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<MapMessageWarnCallNotice> lqw = buildQueryWrapper(bo);
Page<MapMessageWarnCallNoticeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的告警消息和电话告警通知关系表列表
*
* @param bo 查询条件
* @return 告警消息和电话告警通知关系表列表
*/
@Override
public List<MapMessageWarnCallNoticeVo> queryList(MapMessageWarnCallNoticeBo bo) {
LambdaQueryWrapper<MapMessageWarnCallNotice> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<MapMessageWarnCallNotice> buildQueryWrapper(MapMessageWarnCallNoticeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<MapMessageWarnCallNotice> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(MapMessageWarnCallNotice::getId);
lqw.eq(bo.getMessageWarnId() != null, MapMessageWarnCallNotice::getMessageWarnId, bo.getMessageWarnId());
lqw.eq(bo.getCallNoticeId() != null, MapMessageWarnCallNotice::getCallNoticeId, bo.getCallNoticeId());
return lqw;
}
/**
* 新增告警消息和电话告警通知关系表
*
* @param bo 告警消息和电话告警通知关系表
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(MapMessageWarnCallNoticeBo bo) {
MapMessageWarnCallNotice add = MapstructUtils.convert(bo, MapMessageWarnCallNotice.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改告警消息和电话告警通知关系表
*
* @param bo 告警消息和电话告警通知关系表
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(MapMessageWarnCallNoticeBo bo) {
MapMessageWarnCallNotice update = MapstructUtils.convert(bo, MapMessageWarnCallNotice.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(MapMessageWarnCallNotice entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除告警消息和电话告警通知关系表信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@@ -0,0 +1,200 @@
package com.intc.fishery.service.impl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.intc.common.core.utils.MapstructUtils;
import com.intc.common.core.utils.StringUtils;
import com.intc.common.mybatis.core.page.TableDataInfo;
import com.intc.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 com.intc.fishery.domain.bo.MessageWarnBo;
import com.intc.fishery.domain.vo.MessageWarnVo;
import com.intc.fishery.domain.MessageWarn;
import com.intc.fishery.domain.AquUser;
import com.intc.fishery.domain.Device;
import com.intc.fishery.domain.Pond;
import com.intc.fishery.mapper.MessageWarnMapper;
import com.intc.fishery.service.IMessageWarnService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 设备告警记录Service业务层处理
*
* @author intc
* @date 2025-10-25
*/
@Slf4j
@RequiredArgsConstructor
@Service
public class MessageWarnServiceImpl implements IMessageWarnService {
private final MessageWarnMapper baseMapper;
/**
* 查询设备告警记录
*
* @param id 主键
* @return 设备告警记录
*/
@Override
public MessageWarnVo queryById(Long id){
MPJLambdaWrapper<MessageWarn> wrapper = new MPJLambdaWrapper<MessageWarn>()
.selectAll(MessageWarn.class)
.selectAs(AquUser::getUserName, MessageWarnVo::getUserName)
.selectAs(AquUser::getMobilePhone, MessageWarnVo::getMobilePhone)
.selectAs(Device::getDeviceName, MessageWarnVo::getDeviceName)
.selectAs(Device::getSerialNum, MessageWarnVo::getSerialNum)
.selectAs(Pond::getPondName, MessageWarnVo::getPondName)
.select("(SELECT COUNT(*) FROM aqu_map_message_warn_call_notice map WHERE map.message_warn_id = t.id AND map.tenant_id = t.tenant_id) AS callNoticeCount")
.leftJoin(AquUser.class, AquUser::getId, MessageWarn::getUserId)
.leftJoin(Device.class, Device::getId, MessageWarn::getDeviceId)
.leftJoin(Pond.class, Pond::getId, Device::getPondId)
.eq(MessageWarn::getId, id);
return baseMapper.selectJoinOne(MessageWarnVo.class, wrapper);
}
/**
* 分页查询设备告警记录列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 设备告警记录分页列表
*/
@Override
public TableDataInfo<MessageWarnVo> queryPageList(MessageWarnBo bo, PageQuery pageQuery) {
MPJLambdaWrapper<MessageWarn> wrapper = buildJoinQueryWrapper(bo);
Page<MessageWarnVo> result = baseMapper.selectJoinPage(pageQuery.build(), MessageWarnVo.class, wrapper);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的设备告警记录列表
*
* @param bo 查询条件
* @return 设备告警记录列表
*/
@Override
public List<MessageWarnVo> queryList(MessageWarnBo bo) {
MPJLambdaWrapper<MessageWarn> wrapper = buildJoinQueryWrapper(bo);
return baseMapper.selectJoinList(MessageWarnVo.class, wrapper);
}
/**
* 构建关联查询条件
*
* @param bo 查询条件
* @return 关联查询Wrapper
*/
private MPJLambdaWrapper<MessageWarn> buildJoinQueryWrapper(MessageWarnBo bo) {
Map<String, Object> params = bo.getParams();
MPJLambdaWrapper<MessageWarn> wrapper = new MPJLambdaWrapper<MessageWarn>()
.selectAll(MessageWarn.class)
.selectAs(AquUser::getUserName, MessageWarnVo::getUserName)
.selectAs(AquUser::getMobilePhone, MessageWarnVo::getMobilePhone)
.selectAs(Device::getDeviceName, MessageWarnVo::getDeviceName)
.selectAs(Device::getSerialNum, MessageWarnVo::getSerialNum)
.selectAs(Pond::getPondName, MessageWarnVo::getPondName)
.select("(SELECT COUNT(*) FROM aqu_map_message_warn_call_notice map WHERE map.message_warn_id = t.id AND map.tenant_id = t.tenant_id) AS callNoticeCount")
.leftJoin(AquUser.class, AquUser::getId, MessageWarn::getUserId)
.leftJoin(Device.class, Device::getId, MessageWarn::getDeviceId)
.leftJoin(Pond.class, Pond::getId, Device::getPondId)
.eq(bo.getUserId() != null, MessageWarn::getUserId, bo.getUserId())
.eq(bo.getDeviceId() != null, MessageWarn::getDeviceId, bo.getDeviceId())
.eq(StringUtils.isNotBlank(bo.getTitle()), MessageWarn::getTitle, bo.getTitle())
.eq(StringUtils.isNotBlank(bo.getMessage()), MessageWarn::getMessage, bo.getMessage())
.eq(bo.getIsRead() != null, MessageWarn::getIsRead, bo.getIsRead())
.eq(bo.getWarnType() != null, MessageWarn::getWarnType, bo.getWarnType())
.like(StringUtils.isNotBlank(bo.getPondName()), MessageWarn::getPondName, bo.getPondName())
.orderByDesc(MessageWarn::getCreateTime);
// 处理额外的查询参数
if (params != null && !params.isEmpty()) {
handleExtraParams(wrapper, params);
}
return wrapper;
}
/**
* 处理额外的查询参数
*
* @param wrapper 查询包装器
* @param params 额外参数
*/
private void handleExtraParams(MPJLambdaWrapper<MessageWarn> wrapper, Map<String, Object> params) {
// 处理用户名或用户手机号模糊查询
String userKeyword = (String) params.get("userKeyword");
if (StringUtils.isNotBlank(userKeyword)) {
wrapper.and(w -> w.like(AquUser::getUserName, userKeyword)
.or()
.like(AquUser::getMobilePhone, userKeyword));
}
// 处理设备名称或设备编号模糊查询
String deviceKeyword = (String) params.get("deviceKeyword");
if (StringUtils.isNotBlank(deviceKeyword)) {
wrapper.and(w -> w.like(Device::getDeviceName, deviceKeyword)
.or()
.like(Device::getSerialNum, deviceKeyword));
}
}
/**
* 新增设备告警记录
*
* @param bo 设备告警记录
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(MessageWarnBo bo) {
MessageWarn add = MapstructUtils.convert(bo, MessageWarn.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改设备告警记录
*
* @param bo 设备告警记录
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(MessageWarnBo bo) {
MessageWarn update = MapstructUtils.convert(bo, MessageWarn.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(MessageWarn entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除设备告警记录信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@@ -0,0 +1,6 @@
<?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="com.intc.fishery.mapper.CallNoticeMapper">
</mapper>

View File

@@ -0,0 +1,6 @@
<?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="com.intc.fishery.mapper.MapMessageWarnCallNoticeMapper">
</mapper>

View File

@@ -0,0 +1,6 @@
<?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="com.intc.fishery.mapper.MessageWarnMapper">
</mapper>

View File

@@ -0,0 +1,34 @@
package com.intc.tdengine.controller;
import com.intc.common.web.core.BaseController;
import com.intc.tdengine.domain.DeviceSensorData;
import com.intc.tdengine.service.IDeviceSensorDataService;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* TDEngines设备数据信息Controller
*
* @author Tianyongbao
* @date 2025-10-27
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/td/device")
public class DeviceSensorDataController extends BaseController
{
@Resource
private IDeviceSensorDataService deviceSensorDataService;
@GetMapping("/getHistoryData")
public List<DeviceSensorData> getHistoryData(@RequestParam("serialNum") String serialNum, @RequestParam("deviceId") Long deviceId, @RequestParam("mobilePhone") String mobilePhone, @RequestParam("deviceType") int deviceType, @RequestParam("startTime") String startTime, @RequestParam("endTime") String endTime)
{
return deviceSensorDataService.getHistoryDataList(serialNum,deviceId,mobilePhone,deviceType,startTime,endTime);
}
}

View File

@@ -0,0 +1,33 @@
package com.intc.tdengine.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor // 生成无参构造方法
@AllArgsConstructor // 生成全参构造方法
public class DeviceSensorData {
// 测量字段(随时间变化的数值)
private LocalDateTime time; // 时序主键时间戳
private LocalDateTime createTime; // 数据创建时间
private double dissolvedOxygen; // 溶解氧
private double temperature; // 温度
private double saturability; // 饱和度
private double ph; // pH值
private double salinity; // 盐度
private double treference; // 参考值(具体含义需结合业务)
private double tfluorescence; // 荧光值
private double phaseDifference; // 相位差
private double battery; // 电池电量
// 标签字段(元数据,不随时间频繁变化)
private String serialNum; // 设备序列号
private long deviceId; // 设备ID对应TDengine的BIGINT
private long userId; // 用户ID对应TDengine的BIGINT
private String userName; // 用户名
private String mobilePhone; // 手机号
private String deviceName; // 设备名称
private int deviceType; // 设备类型
}

View File

@@ -0,0 +1,58 @@
package com.intc.tdengine.mapper;
import com.intc.tdengine.domain.DeviceSensorData;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
@Mapper
public interface DeviceSensorDataMapper {
/**
* 删除数据库
*
* @return 结果
*/
void dropDB();
/**
* 创建数据库
*
* @return 结果
*/
void createDB();
/**
* 创建超级表
*
* @return 结果
*/
void createSuperTable();
/**
* 创建子表
*
* @param deviceSensorData 数据信息
* @return 结果
*/
void createTable(DeviceSensorData deviceSensorData);
/**
* 批量插入数据
*
* @param dataList 数据列表
* @return 影响行数
*/
int batchInsertDeviceSensorData(@Param("dataList") List<DeviceSensorData> dataList);
/**
* 查询数据
*
* @return 影响行数
*/
List<DeviceSensorData> getHistoryDataList(@Param("serialNum") String serialNum,@Param("deviceId") Long deviceId,@Param("mobilePhone") String mobilePhone,@Param("deviceType") int deviceType,@Param("startTime") String startTime,@Param("endTime") String endTime);
}

View File

@@ -0,0 +1,37 @@
package com.intc.tdengine.service;
import com.intc.tdengine.domain.DeviceSensorData;
import org.springframework.scheduling.annotation.Async;
import java.util.List;
/**
* @author YaphetS
*/
public interface IDeviceSensorDataService {
/**
* 创建子表
*
* @param deviceSensorData 数据信息
* @return 结果
*/
void createTable(DeviceSensorData deviceSensorData);
/**
* 批量插入数据
*
* @param dataList 数据列表
* @return 影响行数
*/
@Async
public void batchInsertDeviceSensorData(List<DeviceSensorData> dataList);
/**
* 查询数据
*
* @return 影响行数
*/
public List<DeviceSensorData> getHistoryDataList(String serialNum, Long deviceId, String mobilePhone, int deviceType, String startTime, String endTime);
}

View File

@@ -0,0 +1,54 @@
package com.intc.tdengine.service.impl;
import com.intc.tdengine.domain.DeviceSensorData;
import com.intc.tdengine.mapper.DeviceSensorDataMapper;
import com.intc.tdengine.service.IDeviceSensorDataService;
import jakarta.annotation.Resource;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
import java.util.List;
public class DeviceSensorDataService implements IDeviceSensorDataService {
@Resource
private DeviceSensorDataMapper deviceSensorDataMapper;
/**
* 创建子表
*
* @param deviceSensorData 数据信息
* @return 结果
*/
@Override
public void createTable(DeviceSensorData deviceSensorData) {
deviceSensorDataMapper.createTable(deviceSensorData);
}
/**
* 批量插入数据
*
* @param dataList 数据列表
* @return 影响行数
*/
@Override
public void batchInsertDeviceSensorData(List<DeviceSensorData> dataList) {
deviceSensorDataMapper.batchInsertDeviceSensorData(dataList);
}
/**
* 查询数据
*
* @return 影响行数
*/
@Override
public List<DeviceSensorData> getHistoryDataList(String serialNum,Long deviceId, String mobilePhone, int deviceType,String startTime, String endTime) {
List<DeviceSensorData> list=new ArrayList<>();
try {
list=deviceSensorDataMapper.getHistoryDataList(serialNum,deviceId,mobilePhone,deviceType,startTime,endTime);
}catch (Exception e){
}
return list;
}
}

View File

@@ -0,0 +1,65 @@
<?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="com.intc.tdengine.mapper.DeviceSensorDataMapper">
<update id="dropDB">
drop database if exists fishery
</update>
<update id="createDB">
create database if not exists fishery
</update>
<update id="createSuperTable">
create table if not exists
fishery.device_sensor_data(time timestamp,createTime timestamp, dissolvedOxygen double, temperature double , saturability double , ph double , salinity double , treference double , tfluorescence double , phaseDifference double , battery double)
tags(
tenant_id nchar(50),
serialNum nchar(100),
deviceId BIGINT,
userId BIGINT,
userName nchar(100),
mobilePhone nchar(20),
deviceName nchar(100),
deviceType int
)
</update>
<update id="createTable" parameterType="com.intc.tdengine.domain.DeviceSensorData">
create table if not exists
`fishery`.t_#{serialNum}
using fishery.device_sensor_data
tags(#{tenantId},#{serialNum},#{deviceId},#{userId},#{userName},#{mobilePhone},#{deviceName},#{deviceType})
</update>
<insert id="batchInsertDeviceSensorData">
insert into
<foreach collection="dataList" item="data" open="" close="" separator=" ">
`fishery`.t_#{serialNum}
using fishery.device_sensor_data
tags(#{data.tenantId},#{data.serialNum},#{data.deviceId},#{data.userId},#{data.userName},#{data.mobilePhone},#{data.deviceName},#{data.deviceType})
(time, createTime, dissolvedOxygen, temperature, saturability, ph, salinity, treference, tfluorescence, phaseDifference, battery) values (#{data.time}, ${data.createTime}, ${data.dissolvedOxygen}, ${data.temperature}, ${data.saturability}, ${data.ph}, ${data.salinity}, ${data.treference}, ${data.tfluorescence}, ${data.phaseDifference}, ${data.battery})
</foreach>
</insert>
<select id="getHistoryDataList" parameterType="String" resultType="com.intc.tdengine.domain.DeviceSensorData">
select time,createTime,dissolvedOxygen,temperature,saturability,ph,salinity,treference,tfluorescence,phaseDifference,battery,serialNum,deviceId,data.mobilePhone,deviceType from fishery.t_#{serialNum}
<where>
time >= #{startTime} and time &lt;= #{endTime}
<if test="serialNum != null and serialNum != ''"> AND serialNum=#{serialNum}</if>
<if test="deviceId != null "> AND deviceId=#{deviceId}</if>
<if test="mobilePhone != null and mobilePhone != ''"> AND mobilePhone=#{mobilePhone}</if>
<if test="deviceType != null"> AND deviceType=#{deviceType}</if>
</where>
</select>
</mapper>