This commit is contained in:
2025-11-11 22:03:30 +08:00
parent 685bb0cebd
commit ff88c2c04a
947 changed files with 122829 additions and 0 deletions

View File

@@ -0,0 +1,99 @@
package com.klp.ems.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.ems.domain.vo.EmsAlarmRecordVo;
import com.klp.ems.domain.bo.EmsAlarmRecordBo;
import com.klp.ems.service.IEmsAlarmRecordService;
import com.klp.common.core.page.TableDataInfo;
/**
* 警报记录
*
* @author klp
* @date 2025-09-30
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ems/alarmRecord")
public class EmsAlarmRecordController extends BaseController {
private final IEmsAlarmRecordService iEmsAlarmRecordService;
/**
* 查询警报记录列表
*/
@GetMapping("/list")
public TableDataInfo<EmsAlarmRecordVo> list(EmsAlarmRecordBo bo, PageQuery pageQuery) {
return iEmsAlarmRecordService.queryPageList(bo, pageQuery);
}
/**
* 导出警报记录列表
*/
@Log(title = "警报记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(EmsAlarmRecordBo bo, HttpServletResponse response) {
List<EmsAlarmRecordVo> list = iEmsAlarmRecordService.queryList(bo);
ExcelUtil.exportExcel(list, "警报记录", EmsAlarmRecordVo.class, response);
}
/**
* 获取警报记录详细信息
*
* @param recordId 主键
*/
@GetMapping("/{recordId}")
public R<EmsAlarmRecordVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long recordId) {
return R.ok(iEmsAlarmRecordService.queryById(recordId));
}
/**
* 新增警报记录
*/
@Log(title = "警报记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody EmsAlarmRecordBo bo) {
return toAjax(iEmsAlarmRecordService.insertByBo(bo));
}
/**
* 修改警报记录
*/
@Log(title = "警报记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsAlarmRecordBo bo) {
return toAjax(iEmsAlarmRecordService.updateByBo(bo));
}
/**
* 删除警报记录
*
* @param recordIds 主键串
*/
@Log(title = "警报记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{recordIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] recordIds) {
return toAjax(iEmsAlarmRecordService.deleteWithValidByIds(Arrays.asList(recordIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.ems.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.ems.domain.vo.EmsAlertVo;
import com.klp.ems.domain.bo.EmsAlertBo;
import com.klp.ems.service.IEmsAlertService;
import com.klp.common.core.page.TableDataInfo;
/**
* 告警
*
* @author klp
* @date 2025-09-28
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ems/alert")
public class EmsAlertController extends BaseController {
private final IEmsAlertService iEmsAlertService;
/**
* 查询告警列表
*/
@GetMapping("/list")
public TableDataInfo<EmsAlertVo> list(EmsAlertBo bo, PageQuery pageQuery) {
return iEmsAlertService.queryPageList(bo, pageQuery);
}
/**
* 导出告警列表
*/
@Log(title = "告警", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(EmsAlertBo bo, HttpServletResponse response) {
List<EmsAlertVo> list = iEmsAlertService.queryList(bo);
ExcelUtil.exportExcel(list, "告警", EmsAlertVo.class, response);
}
/**
* 获取告警详细信息
*
* @param alertId 主键
*/
@GetMapping("/{alertId}")
public R<EmsAlertVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long alertId) {
return R.ok(iEmsAlertService.queryById(alertId));
}
/**
* 新增告警
*/
@Log(title = "告警", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody EmsAlertBo bo) {
return toAjax(iEmsAlertService.insertByBo(bo));
}
/**
* 修改告警
*/
@Log(title = "告警", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsAlertBo bo) {
return toAjax(iEmsAlertService.updateByBo(bo));
}
/**
* 删除告警
*
* @param alertIds 主键串
*/
@Log(title = "告警", businessType = BusinessType.DELETE)
@DeleteMapping("/{alertIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] alertIds) {
return toAjax(iEmsAlertService.deleteWithValidByIds(Arrays.asList(alertIds), true));
}
}

View File

@@ -0,0 +1,143 @@
package com.klp.ems.controller;
import java.util.List;
import java.util.Arrays;
import com.klp.ems.domain.bo.EmsEnergyConsumptionQueryBo;
import com.klp.ems.domain.vo.*;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.flywaydb.core.internal.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.ems.domain.bo.EmsEnergyConsumptionBo;
import com.klp.ems.service.IEmsEnergyConsumptionService;
import com.klp.common.core.page.TableDataInfo;
/**
* 能耗记录
*
* @author Joshi
* @date 2025-09-28
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ems/energyConsumption")
public class EmsEnergyConsumptionController extends BaseController {
private final IEmsEnergyConsumptionService iEmsEnergyConsumptionService;
/**
* 近期能耗趋势(测过了)
*/
@GetMapping("/getEnergySummary")
public R getEnergySummary(EmsEnergyConsumptionQueryBo queryBo){
if (StringUtils.hasText(queryBo.getMonth())) {
List<SummaryDailyVo> data = iEmsEnergyConsumptionService.getEnergySummaryDailyFiltered(queryBo);
return R.ok(data);
}else if (StringUtils.hasText(queryBo.getYear())) {
List<SummaryMonthlyVo> data = iEmsEnergyConsumptionService.getEnergySummaryMonthlyFiltered(queryBo);
return R.ok(data);
} else {
return R.fail("year 或 month 必须提供一个");
}
}
/**
* 获取能耗环比概况(没写完)
*/
@GetMapping("/getEnergyChainRatio")
public R<EnergyChainRatioVo> getEnergyChainRatio(EmsEnergyConsumptionQueryBo queryBo) {
EnergyChainRatioVo energyChainRatioVo = iEmsEnergyConsumptionService.getEnergyChainRatioFiltered(queryBo);
return R.ok(energyChainRatioVo);
}
/**
* 同比分析year 必填
*/
@GetMapping("/getYearOnYear")
public R<YearOnYearVo> getYearOnYear(EmsEnergyConsumptionQueryBo queryBo) {
return R.ok(iEmsEnergyConsumptionService.getYearOnYear(queryBo));
}
/**
* 环比分析periodType=day/week/month/year 与 dateKey
*/
@GetMapping("/getChainAnalysis")
public R<ChainAnalysisVo> getChainAnalysis(EmsEnergyConsumptionQueryBo queryBo) {
return R.ok(iEmsEnergyConsumptionService.getChainAnalysis(queryBo));
}
/**
* 查询能耗记录列表
*/
@GetMapping("/list")
public TableDataInfo<EmsEnergyConsumptionVo> list(EmsEnergyConsumptionBo bo, PageQuery pageQuery) {
return iEmsEnergyConsumptionService.queryPageList(bo, pageQuery);
}
/**
* 导出能耗记录列表
*/
@Log(title = "能耗记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(EmsEnergyConsumptionBo bo, HttpServletResponse response) {
List<EmsEnergyConsumptionVo> list = iEmsEnergyConsumptionService.queryList(bo);
ExcelUtil.exportExcel(list, "能耗记录", EmsEnergyConsumptionVo.class, response);
}
/**
* 获取能耗记录详细信息
*
* @param energyConsumptionId 主键
*/
@GetMapping("/{energyConsumptionId}")
public R<EmsEnergyConsumptionVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long energyConsumptionId) {
return R.ok(iEmsEnergyConsumptionService.queryById(energyConsumptionId));
}
/**
* 新增能耗记录
*/
@Log(title = "能耗记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody EmsEnergyConsumptionBo bo) {
return toAjax(iEmsEnergyConsumptionService.insertByBo(bo));
}
/**
* 修改能耗记录
*/
@Log(title = "能耗记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsEnergyConsumptionBo bo) {
return toAjax(iEmsEnergyConsumptionService.updateByBo(bo));
}
/**
* 删除能耗记录
*
* @param energyConsumptionIds 主键串
*/
@Log(title = "能耗记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{energyConsumptionIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] energyConsumptionIds) {
return toAjax(iEmsEnergyConsumptionService.deleteWithValidByIds(Arrays.asList(energyConsumptionIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.ems.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.ems.domain.vo.EmsHazardRecordVo;
import com.klp.ems.domain.bo.EmsHazardRecordBo;
import com.klp.ems.service.IEmsHazardRecordService;
import com.klp.common.core.page.TableDataInfo;
/**
* 设备隐患记录
*
* @author Joshi
* @date 2025-10-13
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/ems/hazardRecord")
public class EmsHazardRecordController extends BaseController {
private final IEmsHazardRecordService iEmsHazardRecordService;
/**
* 查询设备隐患记录列表
*/
@GetMapping("/list")
public TableDataInfo<EmsHazardRecordVo> list(EmsHazardRecordBo bo, PageQuery pageQuery) {
return iEmsHazardRecordService.queryPageList(bo, pageQuery);
}
/**
* 导出设备隐患记录列表
*/
@Log(title = "设备隐患记录", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(EmsHazardRecordBo bo, HttpServletResponse response) {
List<EmsHazardRecordVo> list = iEmsHazardRecordService.queryList(bo);
ExcelUtil.exportExcel(list, "设备隐患记录", EmsHazardRecordVo.class, response);
}
/**
* 获取设备隐患记录详细信息
*
* @param hazardId 主键
*/
@GetMapping("/{hazardId}")
public R<EmsHazardRecordVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long hazardId) {
return R.ok(iEmsHazardRecordService.queryById(hazardId));
}
/**
* 新增设备隐患记录
*/
@Log(title = "设备隐患记录", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody EmsHazardRecordBo bo) {
return toAjax(iEmsHazardRecordService.insertByBo(bo));
}
/**
* 修改设备隐患记录
*/
@Log(title = "设备隐患记录", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsHazardRecordBo bo) {
return toAjax(iEmsHazardRecordService.updateByBo(bo));
}
/**
* 删除设备隐患记录
*
* @param hazardIds 主键串
*/
@Log(title = "设备隐患记录", businessType = BusinessType.DELETE)
@DeleteMapping("/{hazardIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] hazardIds) {
return toAjax(iEmsHazardRecordService.deleteWithValidByIds(Arrays.asList(hazardIds), true));
}
}

View File

@@ -0,0 +1,65 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 安全警报设备对象 ems_alarm_device
*
* @author klp
* @date 2025-09-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_alarm_device")
public class EmsAlarmDevice extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "device_id")
private Long deviceId;
/**
* 设备名称
*/
private String deviceName;
/**
* 设备编码
*/
private String deviceCode;
/**
* 设备类型
*/
private String deviceType;
/**
* 绑定的能源位置区域ID
*/
private Long locationId;
/**
* 设备状态0=正常 1=故障 2=离线)
*/
private Long status;
/**
* 设备IP地址
*/
private String ipAddress;
/**
* 固件版本
*/
private String firmwareVer;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,75 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 警报记录对象 ems_alarm_record
*
* @author klp
* @date 2025-09-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_alarm_record")
public class EmsAlarmRecord extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "record_id")
private Long recordId;
/**
* 绑定的设备ID
*/
private Long deviceId;
/**
* 警报类型
*/
private String alarmType;
/**
* 警报级别1=低 2=中 3=高)
*/
private Long alarmLevel;
/**
* 警报内容
*/
private String alarmContent;
/**
* 警报发生时间
*/
private Date alarmTime;
/**
* 处理状态0=未处理 1=处理中 2=已处理)
*/
private Long handleStatus;
/**
* 处理人
*/
private String handleUser;
/**
* 处理时间
*/
private Date handleTime;
/**
* 处理备注
*/
private String handleNotes;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,68 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 能耗记录对象 ems_energy_consumption
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_energy_consumption")
public class EmsEnergyConsumption extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "energy_consumption_id")
private Long energyConsumptionId;
/**
* 关联计量设备
*/
private Long meterId;
/**
* 起始读数
*/
private BigDecimal startReading;
/**
* 结束读数
*/
private BigDecimal endReading;
/**
* 消耗量
*/
private BigDecimal consumption;
/**
* 起始时间
*/
private Date startTime;
/**
* 结束时间
*/
private Date endTime;
/**
* 记录人(不设外键)
*/
private Long recordedBy;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,83 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 设备隐患记录对象 ems_hazard_record
*
* @author Joshi
* @date 2025-10-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_hazard_record")
public class EmsHazardRecord extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "hazard_id")
private Long hazardId;
/**
* 关联的设备ID
*/
private Long deviceId;
/**
* 隐患类型
*/
private String hazardType;
/**
* 隐患级别1=一般 2=较大 3=重大)
*/
private Long hazardLevel;
/**
* 隐患描述
*/
private String hazardDesc;
/**
* 发现时间
*/
private Date discoveryTime;
/**
* 录入时间
*/
private Date inputTime;
/**
* 录入人
*/
private String inputUser;
/**
* 处理状态0=未处理 1=处理中 2=已整改 3=已关闭)
*/
private Long status;
/**
* 整改人
*/
private String rectifyUser;
/**
* 整改时间
*/
private Date rectifyTime;
/**
* 整改说明
*/
private String rectifyDesc;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,56 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 位置对象 ems_location
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_location")
public class EmsLocation extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "location_id")
private Long locationId;
/**
* 区域名称
*/
private String name;
/**
* 父级区域ID用于构建区域层级
*/
private Long parentId;
/**
* 区域描述
*/
private String description;
/**
* 详细地址
*/
private String address;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
private Integer x;
private Integer y;
}

View File

@@ -0,0 +1,76 @@
package com.klp.ems.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 计量设备(阈值移至此处)对象 ems_meter
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("ems_meter")
public class EmsMeter extends BaseEntity {
private static final long serialVersionUID=1L;
/**
*
*/
@TableId(value = "meter_id")
private Long meterId;
/**
* 设备编号
*/
private String meterCode;
/**
* 关联能源类型
*/
private Long energyTypeId;
/**
* 安装位置
*/
private Long locationId;
/**
* 设备型号
*/
private String model;
/**
* 制造商
*/
private String manufacturer;
/**
* 安装日期
*/
private Date installDate;
/**
* 设备状态0=在用,1=停用,2=维护
*/
private Long status;
/**
* 上次校准日期
*/
private Date lastCalibrationDate;
/**
* 阈值(按设备设置)
*/
private BigDecimal thresholdValue;
/**
* 删除标志0=存在 2=删除)
*/
@TableLogic
private String delFlag;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,78 @@
package com.klp.ems.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 警报记录业务对象 ems_alarm_record
*
* @author klp
* @date 2025-09-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class EmsAlarmRecordBo extends BaseEntity {
/**
*
*/
private Long recordId;
/**
* 绑定的设备ID
*/
private Long deviceId;
/**
* 警报类型
*/
private String alarmType;
/**
* 警报级别1=低 2=中 3=高)
*/
private Long alarmLevel;
/**
* 警报内容
*/
private String alarmContent;
/**
* 警报发生时间
*/
private Date alarmTime;
/**
* 处理状态0=未处理 1=处理中 2=已处理)
*/
private Long handleStatus;
/**
* 处理人
*/
private String handleUser;
/**
* 处理时间
*/
private Date handleTime;
/**
* 处理备注
*/
private String handleNotes;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,30 @@
package com.klp.ems.domain.bo;
import lombok.Data;
@Data
public class EmsEnergyConsumptionQueryBo {
/**
* 年份用于按月汇总格式yyyy
*/
private String year;
/**
* 月份用于按天汇总格式yyyy-MM
*/
private String month;
/** 能源类型ID可选 */
private Long energyTypeId;
/** 计量设备ID可选 */
private Long meterId;
/** 区域ID可选含子区域 */
private Long locationId;
/** 周期类型day/week/month/year用于环比分析 */
private String periodType;
/** 日期关键字:
* day=yyyy-MM-ddweek=年内周数(1-53)month=本年月份(1-12)year=yyyy
*/
private String dateKey;
}

View File

@@ -0,0 +1,59 @@
package com.klp.ems.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 能源费率currency 为 INT0=CNY,1=USD,2=EUR业务对象 ems_energy_rate
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class EmsEnergyRateBo extends BaseEntity {
/**
*
*/
private Long energyRateId;
/**
* 关联能源类型
*/
private Long energyTypeId;
/**
* 费率
*/
private BigDecimal rate;
/**
* 货币0=CNY,1=USD,2=EUR
*/
private Long currency;
/**
* 生效日期
*/
private Date effectiveDate;
/**
* 失效日期NULL表示长期有效
*/
private Date expiryDate;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,88 @@
package com.klp.ems.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 设备隐患记录业务对象 ems_hazard_record
*
* @author Joshi
* @date 2025-10-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class EmsHazardRecordBo extends BaseEntity {
/**
*
*/
private Long hazardId;
/**
* 关联的设备ID
*/
private Long deviceId;
/**
* 隐患类型
*/
private String hazardType;
/**
* 隐患级别1=一般 2=较大 3=重大)
*/
private Long hazardLevel;
/**
* 隐患描述
*/
private String hazardDesc;
/**
* 发现时间
*/
private Date discoveryTime;
/**
* 录入时间
*/
private Date inputTime;
/**
* 录入人
*/
private String inputUser;
/**
* 处理状态0=未处理 1=处理中 2=已整改 3=已关闭)
*/
private Long status;
/**
* 整改人
*/
private String rectifyUser;
/**
* 整改时间
*/
private Date rectifyTime;
/**
* 整改说明
*/
private String rectifyDesc;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,68 @@
package com.klp.ems.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 安全环保制度文档业务对象 ems_safety_env_doc
*
* @author Joshi
* @date 2025-10-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class EmsSafetyEnvDocBo extends BaseEntity {
/**
* 文档ID主键
*/
private Long docId;
/**
* 文档编号(唯一)
*/
private String docNo;
/**
* 文档名称
*/
private String docName;
/**
* 文档分类1=安全 2=环保)
*/
private Long docCategory;
/**
* 文档类型(如:制度、规范、手册等)
*/
private String docType;
/**
* 附件
*/
private String accessory;
/**
* 发布状态0=草稿 1=已发布)
*/
private Long publishStatus;
/**
* 发布日期
*/
private Date publishTime;
/**
* 备注
*/
private String remark;
}

View File

@@ -0,0 +1,23 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.util.List;
/**
* 环比分析返回:指定周期(天/周/月/年)本期与上期的序列
*/
@Data
public class ChainAnalysisVo {
/** 周期类型day/week/month/year */
private String periodType;
/** 本期标签(例如当前月的每一天、当前年的每个月等) */
private List<String> currentLabels;
/** 上期标签 */
private List<String> previousLabels;
/** 本期数值 */
private List<Double> currentValues;
/** 上期数值 */
private List<Double> previousValues;
}

View File

@@ -0,0 +1,81 @@
package com.klp.ems.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 告警视图对象 ems_alert
*
* @author klp
* @date 2025-09-28
*/
@Data
@ExcelIgnoreUnannotated
public class EmsAlertVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long alertId;
/**
* 关联计量设备
*/
@ExcelProperty(value = "关联计量设备")
private Long meterId;
/**
* 告警类型0=异常用量,1=高用量,2=设备故障
*/
@ExcelProperty(value = "告警类型0=异常用量,1=高用量,2=设备故障")
private Long alertType;
/**
* 实际值
*/
@ExcelProperty(value = "实际值")
private BigDecimal actualValue;
/**
* 告警时间
*/
@ExcelProperty(value = "告警时间")
private Date alertTime;
/**
* 告警状态0=待处理,1=已处理
*/
@ExcelProperty(value = "告警状态0=待处理,1=已处理")
private Long status;
/**
* 处理人(不设外键)
*/
@ExcelProperty(value = "处理人", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "不=设外键")
private Long resolvedBy;
/**
* 处理时间
*/
@ExcelProperty(value = "处理时间")
private Date resolvedTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,81 @@
package com.klp.ems.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 能耗记录视图对象 ems_energy_consumption
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@ExcelIgnoreUnannotated
public class EmsEnergyConsumptionVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long energyConsumptionId;
/**
* 关联计量设备
*/
@ExcelProperty(value = "关联计量设备")
private Long meterId;
/**
* 起始读数
*/
@ExcelProperty(value = "起始读数")
private BigDecimal startReading;
/**
* 结束读数
*/
@ExcelProperty(value = "结束读数")
private BigDecimal endReading;
/**
* 消耗量
*/
@ExcelProperty(value = "消耗量")
private BigDecimal consumption;
/**
* 起始时间
*/
@ExcelProperty(value = "起始时间")
private Date startTime;
/**
* 结束时间
*/
@ExcelProperty(value = "结束时间")
private Date endTime;
/**
* 记录人(不设外键)
*/
@ExcelProperty(value = "记录人", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "不=设外键")
private Long recordedBy;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,68 @@
package com.klp.ems.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 能源费率currency 为 INT0=CNY,1=USD,2=EUR视图对象 ems_energy_rate
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@ExcelIgnoreUnannotated
public class EmsEnergyRateVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long energyRateId;
/**
* 关联能源类型
*/
@ExcelProperty(value = "关联能源类型")
private Long energyTypeId;
/**
* 费率
*/
@ExcelProperty(value = "费率")
private BigDecimal rate;
/**
* 货币0=CNY,1=USD,2=EUR
*/
@ExcelProperty(value = "货币0=CNY,1=USD,2=EUR")
private Long currency;
/**
* 生效日期
*/
@ExcelProperty(value = "生效日期")
private Date effectiveDate;
/**
* 失效日期NULL表示长期有效
*/
@ExcelProperty(value = "失效日期NULL表示长期有效")
private Date expiryDate;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,113 @@
package com.klp.ems.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 设备隐患记录视图对象 ems_hazard_record
*
* @author Joshi
* @date 2025-10-13
*/
@Data
@ExcelIgnoreUnannotated
public class EmsHazardRecordVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long hazardId;
/**
* 关联的设备ID
*/
@ExcelProperty(value = "关联的设备ID")
private Long deviceId;
/**
* 设备名称
*/
@ExcelProperty(value = "设备名称")
private String deviceName;
/**
* 隐患类型
*/
@ExcelProperty(value = "隐患类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "hazard_type")
private String hazardType;
/**
* 隐患级别1=一般 2=较大 3=重大)
*/
@ExcelProperty(value = "隐患级别", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "hazard_level")
private Long hazardLevel;
/**
* 隐患描述
*/
@ExcelProperty(value = "隐患描述")
private String hazardDesc;
/**
* 发现时间
*/
@ExcelProperty(value = "发现时间")
private Date discoveryTime;
/**
* 录入时间
*/
@ExcelProperty(value = "录入时间")
private Date inputTime;
/**
* 录入人
*/
@ExcelProperty(value = "录入人")
private String inputUser;
/**
* 处理状态0=未处理 1=处理中 2=已整改 3=已关闭)
*/
@ExcelProperty(value = "处理状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "hazard_status")
private Long status;
/**
* 整改人
*/
@ExcelProperty(value = "整改人")
private String rectifyUser;
/**
* 整改时间
*/
@ExcelProperty(value = "整改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date rectifyTime;
/**
* 整改说明
*/
@ExcelProperty(value = "整改说明")
private String rectifyDesc;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,93 @@
package com.klp.ems.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 计量设备(阈值移至此处)视图对象 ems_meter
*
* @author Joshi
* @date 2025-09-28
*/
@Data
@ExcelIgnoreUnannotated
public class EmsMeterVo {
private static final long serialVersionUID = 1L;
/**
*
*/
@ExcelProperty(value = "")
private Long meterId;
/**
* 设备编号
*/
@ExcelProperty(value = "设备编号")
private String meterCode;
/**
* 关联能源类型
*/
@ExcelProperty(value = "关联能源类型")
private Long energyTypeId;
/**
* 安装位置
*/
@ExcelProperty(value = "安装位置")
private Long locationId;
/**
* 设备型号
*/
@ExcelProperty(value = "设备型号")
private String model;
/**
* 制造商
*/
@ExcelProperty(value = "制造商")
private String manufacturer;
/**
* 安装日期
*/
@ExcelProperty(value = "安装日期")
private Date installDate;
/**
* 设备状态0=在用,1=停用,2=维护
*/
@ExcelProperty(value = "设备状态0=在用,1=停用,2=维护")
private Long status;
/**
* 上次校准日期
*/
@ExcelProperty(value = "上次校准日期")
private Date lastCalibrationDate;
/**
* 阈值(按设备设置)
*/
@ExcelProperty(value = "阈值", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "按=设备设置")
private BigDecimal thresholdValue;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,84 @@
package com.klp.ems.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import lombok.Data;
/**
* 安全环保制度文档视图对象 ems_safety_env_doc
*
* @author Joshi
* @date 2025-10-13
*/
@Data
@ExcelIgnoreUnannotated
public class EmsSafetyEnvDocVo {
private static final long serialVersionUID = 1L;
/**
* 文档ID主键
*/
@ExcelProperty(value = "文档ID", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "主=键")
private Long docId;
/**
* 文档编号(唯一)
*/
@ExcelProperty(value = "文档编号", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "唯=一")
private String docNo;
/**
* 文档名称
*/
@ExcelProperty(value = "文档名称")
private String docName;
/**
* 文档分类1=安全 2=环保)
*/
@ExcelProperty(value = "文档分类", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "doc_category")
private Long docCategory;
/**
* 文档类型(如:制度、规范、手册等)
*/
@ExcelProperty(value = "文档类型", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "doc_type")
private String docType;
/**
* 附件
*/
@ExcelProperty(value = "附件")
private String accessory;
/**
* 发布状态0=草稿 1=已发布)
*/
@ExcelProperty(value = "发布状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "publish_status")
private Long publishStatus;
/**
* 发布日期
*/
@ExcelProperty(value = "发布日期")
private Date publishTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,19 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.util.List;
/**
* 区域树节点(包含路径与叶子设备)
*/
@Data
public class LocationTreeNodeVo {
private Long locationId;
private String name;
private Long parentId;
private String path;
private List<LocationTreeNodeVo> children;
private List<EmsAlarmDeviceVo> devices;
private Integer x;
private Integer y;
}

View File

@@ -0,0 +1,11 @@
package com.klp.ems.domain.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SummaryMonthlyVo {
private String month; // 月份,如 "2025-09"
private BigDecimal totalConsumption; // 当月总能耗
}

View File

@@ -0,0 +1,19 @@
package com.klp.ems.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.klp.ems.domain.EmsAlarmDevice;
import com.klp.ems.domain.vo.EmsAlarmDeviceVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
/**
* 安全警报设备Mapper接口
*
* @author klp
* @date 2025-09-30
*/
public interface EmsAlarmDeviceMapper extends BaseMapperPlus<EmsAlarmDeviceMapper, EmsAlarmDevice, EmsAlarmDeviceVo> {
Page<EmsAlarmDeviceVo> selectVoPagePlus(Page<Object> build,@Param("ew") QueryWrapper<EmsAlarmDevice> lqw);
}

View File

@@ -0,0 +1,15 @@
package com.klp.ems.mapper;
import com.klp.ems.domain.EmsEnergyRate;
import com.klp.ems.domain.vo.EmsEnergyRateVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 能源费率currency 为 INT0=CNY,1=USD,2=EURMapper接口
*
* @author Joshi
* @date 2025-09-28
*/
public interface EmsEnergyRateMapper extends BaseMapperPlus<EmsEnergyRateMapper, EmsEnergyRate, EmsEnergyRateVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.ems.mapper;
import com.klp.ems.domain.EmsLocation;
import com.klp.ems.domain.vo.EmsLocationVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 位置Mapper接口
*
* @author Joshi
* @date 2025-09-28
*/
public interface EmsLocationMapper extends BaseMapperPlus<EmsLocationMapper, EmsLocation, EmsLocationVo> {
}

View File

@@ -0,0 +1,22 @@
package com.klp.ems.mapper;
import com.klp.ems.domain.EmsMeter;
import com.klp.ems.domain.vo.EmsMeterVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import com.klp.ems.domain.bo.MeterFilterBo;
import java.util.List;
/**
* 计量设备阈值移至此处Mapper接口
*
* @author Joshi
* @date 2025-09-28
*/
public interface EmsMeterMapper extends BaseMapperPlus<EmsMeterMapper, EmsMeter, EmsMeterVo> {
/**
* 根据可选条件筛选计量设备ID列表
*/
java.util.List<Long> selectMeterIds(MeterFilterBo filter);
}

View File

@@ -0,0 +1,15 @@
package com.klp.ems.mapper;
import com.klp.ems.domain.EmsSafetyEnvDoc;
import com.klp.ems.domain.vo.EmsSafetyEnvDocVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 安全环保制度文档Mapper接口
*
* @author Joshi
* @date 2025-10-13
*/
public interface EmsSafetyEnvDocMapper extends BaseMapperPlus<EmsSafetyEnvDocMapper, EmsSafetyEnvDoc, EmsSafetyEnvDocVo> {
}

View File

@@ -0,0 +1,87 @@
package com.klp.ems.schedule;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.page.TableDataInfo;
import com.klp.ems.domain.bo.EmsAlarmDeviceBo;
import com.klp.ems.domain.bo.EmsAlarmRecordBo;
import com.klp.ems.domain.vo.EmsAlarmDeviceVo;
import com.klp.ems.service.IEmsAlarmDeviceService;
import com.klp.ems.service.IEmsAlarmRecordService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Random;
/**
* 每30分钟自动生成一条报警记录随机数据占位用
*/
@Component
public class EmsAlarmRecordScheduler {
private static final Logger log = LoggerFactory.getLogger(EmsAlarmRecordScheduler.class);
private static final String[] ALARM_TYPES = {"温度告警", "电压告警", "震动告警", "网络告警"};
private static final String[] ALARM_CONTENT_TEMPLATES = {
"检测到{type},数值异常",
"{type}触发,阈值超限",
"{type}持续波动,需要关注",
"{type}恢复后再次触发"
};
private final Random random = new Random();
private final IEmsAlarmRecordService alarmRecordService;
private final IEmsAlarmDeviceService alarmDeviceService;
public EmsAlarmRecordScheduler(IEmsAlarmRecordService alarmRecordService,
IEmsAlarmDeviceService alarmDeviceService) {
this.alarmRecordService = alarmRecordService;
this.alarmDeviceService = alarmDeviceService;
}
@Scheduled(cron = "0 0/30 * * * ?")
public void autoGenerateAlarmRecord() {
try {
Long deviceId = chooseRandomDeviceId();
String type = ALARM_TYPES[random.nextInt(ALARM_TYPES.length)];
int level = random.nextInt(3) + 1; // 1~3
String contentTpl = ALARM_CONTENT_TEMPLATES[random.nextInt(ALARM_CONTENT_TEMPLATES.length)];
String content = contentTpl.replace("{type}", type);
EmsAlarmRecordBo bo = new EmsAlarmRecordBo();
bo.setDeviceId(deviceId);
bo.setAlarmType(type);
bo.setAlarmLevel((long) level);
bo.setAlarmContent(content);
bo.setAlarmTime(new Date());
bo.setHandleStatus(0L); // 未处理
bo.setRemark("需解决");
Boolean ok = alarmRecordService.insertByBo(bo);
log.info("[AlarmScheduler] auto insert alarm record result={}, deviceId={}, type={}, level={}",
ok, deviceId, type, level);
} catch (Exception e) {
log.error("[AlarmScheduler] autoGenerateAlarmRecord error", e);
}
}
private Long chooseRandomDeviceId() {
try {
// 查询少量设备用于随机选取
EmsAlarmDeviceBo bo = new EmsAlarmDeviceBo();
TableDataInfo<EmsAlarmDeviceVo> page = alarmDeviceService.queryPageList(bo, new PageQuery());
List<EmsAlarmDeviceVo> list = page.getRows();
if (list != null && !list.isEmpty()) {
EmsAlarmDeviceVo any = list.get(random.nextInt(list.size()));
if (any != null && any.getDeviceId() != null) {
return any.getDeviceId();
}
}
} catch (Exception ignore) {
}
// 兜底
return 1L;
}
}

View File

@@ -0,0 +1,49 @@
package com.klp.ems.service;
import com.klp.ems.domain.EmsAlarmDevice;
import com.klp.ems.domain.vo.EmsAlarmDeviceVo;
import com.klp.ems.domain.bo.EmsAlarmDeviceBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 安全警报设备Service接口
*
* @author klp
* @date 2025-09-30
*/
public interface IEmsAlarmDeviceService {
/**
* 查询安全警报设备
*/
EmsAlarmDeviceVo queryById(Long deviceId);
/**
* 查询安全警报设备列表
*/
TableDataInfo<EmsAlarmDeviceVo> queryPageList(EmsAlarmDeviceBo bo, PageQuery pageQuery);
/**
* 查询安全警报设备列表
*/
List<EmsAlarmDeviceVo> queryList(EmsAlarmDeviceBo bo);
/**
* 新增安全警报设备
*/
Boolean insertByBo(EmsAlarmDeviceBo bo);
/**
* 修改安全警报设备
*/
Boolean updateByBo(EmsAlarmDeviceBo bo);
/**
* 校验并批量删除安全警报设备信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.ems.service;
import com.klp.ems.domain.EmsAlarmRecord;
import com.klp.ems.domain.vo.EmsAlarmRecordVo;
import com.klp.ems.domain.bo.EmsAlarmRecordBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 警报记录Service接口
*
* @author klp
* @date 2025-09-30
*/
public interface IEmsAlarmRecordService {
/**
* 查询警报记录
*/
EmsAlarmRecordVo queryById(Long recordId);
/**
* 查询警报记录列表
*/
TableDataInfo<EmsAlarmRecordVo> queryPageList(EmsAlarmRecordBo bo, PageQuery pageQuery);
/**
* 查询警报记录列表
*/
List<EmsAlarmRecordVo> queryList(EmsAlarmRecordBo bo);
/**
* 新增警报记录
*/
Boolean insertByBo(EmsAlarmRecordBo bo);
/**
* 修改警报记录
*/
Boolean updateByBo(EmsAlarmRecordBo bo);
/**
* 校验并批量删除警报记录信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.ems.service;
import com.klp.ems.domain.EmsHazardRecord;
import com.klp.ems.domain.vo.EmsHazardRecordVo;
import com.klp.ems.domain.bo.EmsHazardRecordBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 设备隐患记录Service接口
*
* @author Joshi
* @date 2025-10-13
*/
public interface IEmsHazardRecordService {
/**
* 查询设备隐患记录
*/
EmsHazardRecordVo queryById(Long hazardId);
/**
* 查询设备隐患记录列表
*/
TableDataInfo<EmsHazardRecordVo> queryPageList(EmsHazardRecordBo bo, PageQuery pageQuery);
/**
* 查询设备隐患记录列表
*/
List<EmsHazardRecordVo> queryList(EmsHazardRecordBo bo);
/**
* 新增设备隐患记录
*/
Boolean insertByBo(EmsHazardRecordBo bo);
/**
* 修改设备隐患记录
*/
Boolean updateByBo(EmsHazardRecordBo bo);
/**
* 校验并批量删除设备隐患记录信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,112 @@
package com.klp.ems.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.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 com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.ems.domain.bo.EmsEnergyTypeBo;
import com.klp.ems.domain.vo.EmsEnergyTypeVo;
import com.klp.ems.domain.EmsEnergyType;
import com.klp.ems.mapper.EmsEnergyTypeMapper;
import com.klp.ems.service.IEmsEnergyTypeService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 能源类型阈值已移除Service业务层处理
*
* @author Joshi
* @date 2025-09-28
*/
@RequiredArgsConstructor
@Service
public class EmsEnergyTypeServiceImpl implements IEmsEnergyTypeService {
private final EmsEnergyTypeMapper baseMapper;
/**
* 查询能源类型(阈值已移除)
*/
@Override
public EmsEnergyTypeVo queryById(Long energyTypeId){
return baseMapper.selectVoById(energyTypeId);
}
/**
* 查询能源类型(阈值已移除)列表
*/
@Override
public TableDataInfo<EmsEnergyTypeVo> queryPageList(EmsEnergyTypeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<EmsEnergyType> lqw = buildQueryWrapper(bo);
Page<EmsEnergyTypeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询能源类型(阈值已移除)列表
*/
@Override
public List<EmsEnergyTypeVo> queryList(EmsEnergyTypeBo bo) {
LambdaQueryWrapper<EmsEnergyType> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<EmsEnergyType> buildQueryWrapper(EmsEnergyTypeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<EmsEnergyType> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), EmsEnergyType::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getUnit()), EmsEnergyType::getUnit, bo.getUnit());
lqw.eq(StringUtils.isNotBlank(bo.getCode()), EmsEnergyType::getCode, bo.getCode());
lqw.eq(StringUtils.isNotBlank(bo.getDescription()), EmsEnergyType::getDescription, bo.getDescription());
return lqw;
}
/**
* 新增能源类型(阈值已移除)
*/
@Override
public Boolean insertByBo(EmsEnergyTypeBo bo) {
EmsEnergyType add = BeanUtil.toBean(bo, EmsEnergyType.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setEnergyTypeId(add.getEnergyTypeId());
}
return flag;
}
/**
* 修改能源类型(阈值已移除)
*/
@Override
public Boolean updateByBo(EmsEnergyTypeBo bo) {
EmsEnergyType update = BeanUtil.toBean(bo, EmsEnergyType.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EmsEnergyType entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除能源类型(阈值已移除)
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,167 @@
package com.klp.ems.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.ems.domain.bo.EmsLocationBo;
import com.klp.ems.domain.vo.EmsLocationVo;
import com.klp.ems.domain.EmsLocation;
import com.klp.ems.mapper.EmsLocationMapper;
import com.klp.ems.service.IEmsLocationService;
import com.klp.ems.service.IEmsAlarmDeviceService;
import com.klp.ems.domain.vo.EmsAlarmDeviceVo;
import com.klp.ems.domain.bo.EmsAlarmDeviceBo;
import com.klp.ems.domain.vo.LocationTreeNodeVo;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.stream.Collectors;
/**
* 位置Service业务层处理
*
* @author Joshi
* @date 2025-09-28
*/
@RequiredArgsConstructor
@Service
public class EmsLocationServiceImpl implements IEmsLocationService {
private final EmsLocationMapper baseMapper;
private final IEmsAlarmDeviceService alarmDeviceService;
/**
* 查询位置
*/
@Override
public EmsLocationVo queryById(Long locationId){
return baseMapper.selectVoById(locationId);
}
/**
* 查询位置列表
*/
@Override
public List<EmsLocationVo> queryList(EmsLocationBo bo) {
LambdaQueryWrapper<EmsLocation> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<EmsLocation> buildQueryWrapper(EmsLocationBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<EmsLocation> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getName()), EmsLocation::getName, bo.getName());
lqw.eq(bo.getParentId() != null, EmsLocation::getParentId, bo.getParentId());
lqw.eq(StringUtils.isNotBlank(bo.getDescription()), EmsLocation::getDescription, bo.getDescription());
lqw.eq(StringUtils.isNotBlank(bo.getAddress()), EmsLocation::getAddress, bo.getAddress());
lqw.eq(bo.getX() != null, EmsLocation::getX, bo.getX());
lqw.eq(bo.getY() != null, EmsLocation::getY, bo.getY());
return lqw;
}
/**
* 新增位置
*/
@Override
public Boolean insertByBo(EmsLocationBo bo) {
EmsLocation add = BeanUtil.toBean(bo, EmsLocation.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setLocationId(add.getLocationId());
}
return flag;
}
/**
* 修改位置
*/
@Override
public Boolean updateByBo(EmsLocationBo bo) {
EmsLocation update = BeanUtil.toBean(bo, EmsLocation.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EmsLocation entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除位置
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 查询全量区域树(包含路径),仅在叶子节点挂载设备列表
*/
@Override
public List<LocationTreeNodeVo> treeWithDevices() {
// 查询全部位置
List<EmsLocationVo> all = baseMapper.selectVoList(Wrappers.lambdaQuery());
if (all == null || all.isEmpty()) {
return new ArrayList<>();
}
// 映射与根节点
Map<Long, List<EmsLocationVo>> parent2children = new HashMap<>();
List<EmsLocationVo> roots = new ArrayList<>();
for (EmsLocationVo vo : all) {
Long pid = vo.getParentId();
if (pid == null) {
roots.add(vo);
} else {
parent2children.computeIfAbsent(pid, k -> new ArrayList<>()).add(vo);
}
}
// 递归构建
return roots.stream()
.map(root -> buildNode(root, parent2children, root.getName()))
.collect(Collectors.toList());
}
private LocationTreeNodeVo buildNode(EmsLocationVo vo,
Map<Long, List<EmsLocationVo>> parent2children,
String path) {
LocationTreeNodeVo node = new LocationTreeNodeVo();
node.setLocationId(vo.getLocationId());
node.setName(vo.getName());
node.setParentId(vo.getParentId());
node.setPath(path);
node.setX(vo.getX());
node.setY(vo.getY());
List<EmsLocationVo> children = parent2children.get(vo.getLocationId());
if (children == null || children.isEmpty()) {
// 叶子节点:查询设备
EmsAlarmDeviceBo bo = new EmsAlarmDeviceBo();
bo.setLocationId(vo.getLocationId());
List<EmsAlarmDeviceVo> devices = alarmDeviceService.queryList(bo);
node.setDevices(devices != null ? devices : new ArrayList<>());
node.setChildren(new ArrayList<>());
} else {
// 非叶子:递归子节点,不挂设备
List<LocationTreeNodeVo> childNodes = children.stream()
.map(c -> buildNode(c, parent2children, path + "/" + c.getName()))
.collect(Collectors.toList());
node.setChildren(childNodes);
node.setDevices(new ArrayList<>());
}
return node;
}
}

View File

@@ -0,0 +1,117 @@
package com.klp.ems.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.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 com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.ems.domain.bo.EmsMeterBo;
import com.klp.ems.domain.vo.EmsMeterVo;
import com.klp.ems.domain.EmsMeter;
import com.klp.ems.mapper.EmsMeterMapper;
import com.klp.ems.service.IEmsMeterService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 计量设备阈值移至此处Service业务层处理
*
* @author Joshi
* @date 2025-09-28
*/
@RequiredArgsConstructor
@Service
public class EmsMeterServiceImpl implements IEmsMeterService {
private final EmsMeterMapper baseMapper;
/**
* 查询计量设备(阈值移至此处)
*/
@Override
public EmsMeterVo queryById(Long meterId){
return baseMapper.selectVoById(meterId);
}
/**
* 查询计量设备(阈值移至此处)列表
*/
@Override
public TableDataInfo<EmsMeterVo> queryPageList(EmsMeterBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<EmsMeter> lqw = buildQueryWrapper(bo);
Page<EmsMeterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询计量设备(阈值移至此处)列表
*/
@Override
public List<EmsMeterVo> queryList(EmsMeterBo bo) {
LambdaQueryWrapper<EmsMeter> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<EmsMeter> buildQueryWrapper(EmsMeterBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<EmsMeter> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getMeterCode()), EmsMeter::getMeterCode, bo.getMeterCode());
lqw.eq(bo.getEnergyTypeId() != null, EmsMeter::getEnergyTypeId, bo.getEnergyTypeId());
lqw.eq(bo.getLocationId() != null, EmsMeter::getLocationId, bo.getLocationId());
lqw.eq(StringUtils.isNotBlank(bo.getModel()), EmsMeter::getModel, bo.getModel());
lqw.eq(StringUtils.isNotBlank(bo.getManufacturer()), EmsMeter::getManufacturer, bo.getManufacturer());
lqw.eq(bo.getInstallDate() != null, EmsMeter::getInstallDate, bo.getInstallDate());
lqw.eq(bo.getStatus() != null, EmsMeter::getStatus, bo.getStatus());
lqw.eq(bo.getLastCalibrationDate() != null, EmsMeter::getLastCalibrationDate, bo.getLastCalibrationDate());
lqw.eq(bo.getThresholdValue() != null, EmsMeter::getThresholdValue, bo.getThresholdValue());
return lqw;
}
/**
* 新增计量设备(阈值移至此处)
*/
@Override
public Boolean insertByBo(EmsMeterBo bo) {
EmsMeter add = BeanUtil.toBean(bo, EmsMeter.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setMeterId(add.getMeterId());
}
return flag;
}
/**
* 修改计量设备(阈值移至此处)
*/
@Override
public Boolean updateByBo(EmsMeterBo bo) {
EmsMeter update = BeanUtil.toBean(bo, EmsMeter.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(EmsMeter entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 批量删除计量设备(阈值移至此处)
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}