Browse Source

+ 自动巡检任务

chen.cheng 11 months ago
parent
commit
226109a425
19 changed files with 1645 additions and 17 deletions
  1. 105 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/AdmEmsElecPgIndexController.java
  2. 105 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/AdmEmsIndexRangeController.java
  3. 139 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/AdmEmsElecPgIndex.java
  4. 129 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/AdmEmsIndexRange.java
  5. 69 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AdmEmsElecPgIndexMapper.java
  6. 64 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AdmEmsIndexRangeMapper.java
  7. 61 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IAdmEmsElecPgIndexService.java
  8. 61 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IAdmEmsIndexRangeService.java
  9. 93 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/AdmEmsElecPgIndexServiceImpl.java
  10. 93 0
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/AdmEmsIndexRangeServiceImpl.java
  11. 116 4
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/EmsFacsServiceImpl.java
  12. 6 10
      ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/task/taskiml/FacTask.java
  13. 106 0
      ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AdmEmsElecPgIndexMapper.xml
  14. 99 0
      ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AdmEmsIndexRangeMapper.xml
  15. 9 0
      ems-cloud/pom.xml
  16. 6 3
      ems-cloud/ruoyi-common/ruoyi-common-core/pom.xml
  17. 85 0
      ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/FacTypes.java
  18. 39 0
      ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExpressUtil.java
  19. 260 0
      ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StreamUtils.java

+ 105 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/AdmEmsElecPgIndexController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.ems.controller;
+
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.ems.domain.AdmEmsElecPgIndex;
+import com.ruoyi.ems.service.IAdmEmsElecPgIndexService;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+
+/**
+ * 电网设施指标Controller
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+@RestController
+@RequestMapping("/elecPgIndex")
+public class AdmEmsElecPgIndexController extends BaseController
+{
+    @Autowired
+    private IAdmEmsElecPgIndexService admEmsElecPgIndexService;
+
+    /**
+     * 查询电网设施指标列表
+     */
+    @RequiresPermissions("ems:elecPgIndex:list")
+    @GetMapping("/list")
+    public TableDataInfo list(AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        startPage();
+        List<AdmEmsElecPgIndex> list = admEmsElecPgIndexService.selectAdmEmsElecPgIndexList(admEmsElecPgIndex);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出电网设施指标列表
+     */
+    @RequiresPermissions("ems:elecPgIndex:export")
+    @Log(title = "电网设施指标", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        List<AdmEmsElecPgIndex> list = admEmsElecPgIndexService.selectAdmEmsElecPgIndexList(admEmsElecPgIndex);
+        ExcelUtil<AdmEmsElecPgIndex> util = new ExcelUtil<AdmEmsElecPgIndex>(AdmEmsElecPgIndex.class);
+        util.exportExcel(response, list, "电网设施指标数据");
+    }
+
+    /**
+     * 获取电网设施指标详细信息
+     */
+    @RequiresPermissions("ems:elecPgIndex:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(admEmsElecPgIndexService.selectAdmEmsElecPgIndexById(id));
+    }
+
+    /**
+     * 新增电网设施指标
+     */
+    @RequiresPermissions("ems:elecPgIndex:add")
+    @Log(title = "电网设施指标", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        return toAjax(admEmsElecPgIndexService.insertAdmEmsElecPgIndex(admEmsElecPgIndex));
+    }
+
+    /**
+     * 修改电网设施指标
+     */
+    @RequiresPermissions("ems:elecPgIndex:edit")
+    @Log(title = "电网设施指标", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        return toAjax(admEmsElecPgIndexService.updateAdmEmsElecPgIndex(admEmsElecPgIndex));
+    }
+
+    /**
+     * 删除电网设施指标
+     */
+    @RequiresPermissions("ems:elecPgIndex:remove")
+    @Log(title = "电网设施指标", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(admEmsElecPgIndexService.deleteAdmEmsElecPgIndexByIds(ids));
+    }
+}

+ 105 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/controller/AdmEmsIndexRangeController.java

@@ -0,0 +1,105 @@
+package com.ruoyi.ems.controller;
+
+import java.util.List;
+import java.io.IOException;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.log.annotation.Log;
+import com.ruoyi.common.log.enums.BusinessType;
+import com.ruoyi.common.security.annotation.RequiresPermissions;
+import com.ruoyi.ems.domain.AdmEmsIndexRange;
+import com.ruoyi.ems.service.IAdmEmsIndexRangeService;
+import com.ruoyi.common.core.web.controller.BaseController;
+import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.common.core.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.web.page.TableDataInfo;
+
+/**
+ * 能源指标范围Controller
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+@RestController
+@RequestMapping("/indexRange")
+public class AdmEmsIndexRangeController extends BaseController
+{
+    @Autowired
+    private IAdmEmsIndexRangeService admEmsIndexRangeService;
+
+    /**
+     * 查询能源指标范围列表
+     */
+    @RequiresPermissions("ems:indexRange:list")
+    @GetMapping("/list")
+    public TableDataInfo list(AdmEmsIndexRange admEmsIndexRange)
+    {
+        startPage();
+        List<AdmEmsIndexRange> list = admEmsIndexRangeService.selectAdmEmsIndexRangeList(admEmsIndexRange);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出能源指标范围列表
+     */
+    @RequiresPermissions("ems:indexRange:export")
+    @Log(title = "能源指标范围", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, AdmEmsIndexRange admEmsIndexRange)
+    {
+        List<AdmEmsIndexRange> list = admEmsIndexRangeService.selectAdmEmsIndexRangeList(admEmsIndexRange);
+        ExcelUtil<AdmEmsIndexRange> util = new ExcelUtil<AdmEmsIndexRange>(AdmEmsIndexRange.class);
+        util.exportExcel(response, list, "能源指标范围数据");
+    }
+
+    /**
+     * 获取能源指标范围详细信息
+     */
+    @RequiresPermissions("ems:indexRange:query")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(admEmsIndexRangeService.selectAdmEmsIndexRangeById(id));
+    }
+
+    /**
+     * 新增能源指标范围
+     */
+    @RequiresPermissions("ems:indexRange:add")
+    @Log(title = "能源指标范围", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody AdmEmsIndexRange admEmsIndexRange)
+    {
+        return toAjax(admEmsIndexRangeService.insertAdmEmsIndexRange(admEmsIndexRange));
+    }
+
+    /**
+     * 修改能源指标范围
+     */
+    @RequiresPermissions("ems:indexRange:edit")
+    @Log(title = "能源指标范围", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody AdmEmsIndexRange admEmsIndexRange)
+    {
+        return toAjax(admEmsIndexRangeService.updateAdmEmsIndexRange(admEmsIndexRange));
+    }
+
+    /**
+     * 删除能源指标范围
+     */
+    @RequiresPermissions("ems:indexRange:remove")
+    @Log(title = "能源指标范围", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(admEmsIndexRangeService.deleteAdmEmsIndexRangeByIds(ids));
+    }
+}

+ 139 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/AdmEmsElecPgIndex.java

@@ -0,0 +1,139 @@
+package com.ruoyi.ems.domain;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 电网设施指标对象 adm_ems_elec_pg_index
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public class AdmEmsElecPgIndex extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 序号 */
+    private Long id;
+
+    /** 园区代码 */
+    @Excel(name = "园区代码")
+    private String areaCode;
+
+    /** 设施代码 */
+    @Excel(name = "设施代码")
+    private String facsCode;
+
+    /** 日期 yyyy-MM-dd */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "日期 yyyy-MM-dd", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date date;
+
+    /** 时间 yyyy-MM-dd HH:mm:ss */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "时间 yyyy-MM-dd HH:mm:ss", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date time;
+
+    /** 电压 单位:kV(千伏) */
+    @Excel(name = "电压 单位:kV", readConverterExp = "千=伏")
+    private Double voltage;
+
+    /** 电流 单位:A(安培) */
+    @Excel(name = "电流 单位:A", readConverterExp = "安=培")
+    private Double electricity;
+
+    /** 功率 单位:kW(千瓦) */
+    @Excel(name = "功率 单位:kW", readConverterExp = "千=瓦")
+    private Double power;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setAreaCode(String areaCode) 
+    {
+        this.areaCode = areaCode;
+    }
+
+    public String getAreaCode() 
+    {
+        return areaCode;
+    }
+    public void setFacsCode(String facsCode) 
+    {
+        this.facsCode = facsCode;
+    }
+
+    public String getFacsCode() 
+    {
+        return facsCode;
+    }
+    public void setDate(Date date) 
+    {
+        this.date = date;
+    }
+
+    public Date getDate() 
+    {
+        return date;
+    }
+    public void setTime(Date time) 
+    {
+        this.time = time;
+    }
+
+    public Date getTime() 
+    {
+        return time;
+    }
+    public void setVoltage(Double voltage) 
+    {
+        this.voltage = voltage;
+    }
+
+    public Double getVoltage() 
+    {
+        return voltage;
+    }
+    public void setElectricity(Double electricity) 
+    {
+        this.electricity = electricity;
+    }
+
+    public Double getElectricity() 
+    {
+        return electricity;
+    }
+    public void setPower(Double power) 
+    {
+        this.power = power;
+    }
+
+    public Double getPower() 
+    {
+        return power;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("areaCode", getAreaCode())
+            .append("facsCode", getFacsCode())
+            .append("date", getDate())
+            .append("time", getTime())
+            .append("voltage", getVoltage())
+            .append("electricity", getElectricity())
+            .append("power", getPower())
+            .toString();
+    }
+}

+ 129 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/domain/AdmEmsIndexRange.java

@@ -0,0 +1,129 @@
+package com.ruoyi.ems.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import com.ruoyi.common.core.annotation.Excel;
+import com.ruoyi.common.core.web.domain.BaseEntity;
+
+/**
+ * 能源指标范围对象 adm_ems_index_range
+ *
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public class AdmEmsIndexRange extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    private Long id;
+
+    /**
+     * 对象代码
+     */
+    @Excel(name = "对象代码")
+    private String objCode;
+
+    /**
+     * 对象类型
+     */
+    @Excel(name = "对象类型")
+    private Integer objType;
+
+    /**
+     * 指标名称
+     */
+    @Excel(name = "指标名称")
+    private String indexName;
+
+    /**
+     * 指标描述
+     */
+    @Excel(name = "指标描述")
+    private String indexDesc;
+
+    /**
+     * 指标上限
+     */
+    @Excel(name = "指标上限")
+    private Double indexUpperLimit;
+
+    /**
+     * 指标下限
+     */
+    @Excel(name = "指标下限")
+    private Double indexLowerLimit;
+
+    private String facsType;
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setObjCode(String objCode) {
+        this.objCode = objCode;
+    }
+
+    public String getObjCode() {
+        return objCode;
+    }
+
+    public void setObjType(Integer objType) {
+        this.objType = objType;
+    }
+
+    public Integer getObjType() {
+        return objType;
+    }
+
+    public void setIndexName(String indexName) {
+        this.indexName = indexName;
+    }
+
+    public String getIndexName() {
+        return indexName;
+    }
+
+    public void setIndexDesc(String indexDesc) {
+        this.indexDesc = indexDesc;
+    }
+
+    public String getIndexDesc() {
+        return indexDesc;
+    }
+
+    public void setIndexUpperLimit(Double indexUpperLimit) {
+        this.indexUpperLimit = indexUpperLimit;
+    }
+
+    public Double getIndexUpperLimit() {
+        return indexUpperLimit;
+    }
+
+    public void setIndexLowerLimit(Double indexLowerLimit) {
+        this.indexLowerLimit = indexLowerLimit;
+    }
+
+    public Double getIndexLowerLimit() {
+        return indexLowerLimit;
+    }
+
+    public String getFacsType() {
+        return facsType;
+    }
+
+    public void setFacsType(String facsType) {
+        this.facsType = facsType;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE).append("id", getId()).append("objCode", getObjCode()).append("objType", getObjType()).append("indexName", getIndexName()).append("indexDesc", getIndexDesc()).append("indexUpperLimit", getIndexUpperLimit()).append("indexLowerLimit", getIndexLowerLimit()).toString();
+    }
+}

+ 69 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AdmEmsElecPgIndexMapper.java

@@ -0,0 +1,69 @@
+package com.ruoyi.ems.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.ibatis.annotations.MapKey;
+import org.apache.ibatis.annotations.Param;
+
+import com.ruoyi.ems.domain.AdmEmsElecPgIndex;
+
+/**
+ * 电网设施指标Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public interface AdmEmsElecPgIndexMapper {
+    /**
+     * 查询电网设施指标
+     *
+     * @param id 电网设施指标主键
+     * @return 电网设施指标
+     */
+    public AdmEmsElecPgIndex selectAdmEmsElecPgIndexById(Long id);
+
+    /**
+     * 查询电网设施指标列表
+     *
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 电网设施指标集合
+     */
+    public List<AdmEmsElecPgIndex> selectAdmEmsElecPgIndexList(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 新增电网设施指标
+     *
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    public int insertAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 修改电网设施指标
+     *
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    public int updateAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 删除电网设施指标
+     *
+     * @param id 电网设施指标主键
+     * @return 结果
+     */
+    public int deleteAdmEmsElecPgIndexById(Long id);
+
+    /**
+     * 批量删除电网设施指标
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteAdmEmsElecPgIndexByIds(Long[] ids);
+
+
+    @MapKey("facsCode")
+    Map<String, Map<String, Object>> qryLatestObjIndex(@Param("set") List<String> set);
+}

+ 64 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/mapper/AdmEmsIndexRangeMapper.java

@@ -0,0 +1,64 @@
+package com.ruoyi.ems.mapper;
+
+import java.util.List;
+import java.util.Map;
+
+import com.ruoyi.ems.domain.AdmEmsIndexRange;
+
+/**
+ * 能源指标范围Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public interface AdmEmsIndexRangeMapper {
+    /**
+     * 查询能源指标范围
+     *
+     * @param id 能源指标范围主键
+     * @return 能源指标范围
+     */
+    public AdmEmsIndexRange selectAdmEmsIndexRangeById(Long id);
+
+    /**
+     * 查询能源指标范围列表
+     *
+     * @param admEmsIndexRange 能源指标范围
+     * @return 能源指标范围集合
+     */
+    public List<AdmEmsIndexRange> selectAdmEmsIndexRangeList(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 新增能源指标范围
+     *
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    public int insertAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 修改能源指标范围
+     *
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    public int updateAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 删除能源指标范围
+     *
+     * @param id 能源指标范围主键
+     * @return 结果
+     */
+    public int deleteAdmEmsIndexRangeById(Long id);
+
+    /**
+     * 批量删除能源指标范围
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteAdmEmsIndexRangeByIds(Long[] ids);
+
+    public List<Map<String, Object>> selectAdmEmsIndexRange();
+}

+ 61 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IAdmEmsElecPgIndexService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.ems.service;
+
+import java.util.List;
+import com.ruoyi.ems.domain.AdmEmsElecPgIndex;
+
+/**
+ * 电网设施指标Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public interface IAdmEmsElecPgIndexService 
+{
+    /**
+     * 查询电网设施指标
+     * 
+     * @param id 电网设施指标主键
+     * @return 电网设施指标
+     */
+    public AdmEmsElecPgIndex selectAdmEmsElecPgIndexById(Long id);
+
+    /**
+     * 查询电网设施指标列表
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 电网设施指标集合
+     */
+    public List<AdmEmsElecPgIndex> selectAdmEmsElecPgIndexList(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 新增电网设施指标
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    public int insertAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 修改电网设施指标
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    public int updateAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex);
+
+    /**
+     * 批量删除电网设施指标
+     * 
+     * @param ids 需要删除的电网设施指标主键集合
+     * @return 结果
+     */
+    public int deleteAdmEmsElecPgIndexByIds(Long[] ids);
+
+    /**
+     * 删除电网设施指标信息
+     * 
+     * @param id 电网设施指标主键
+     * @return 结果
+     */
+    public int deleteAdmEmsElecPgIndexById(Long id);
+}

+ 61 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/IAdmEmsIndexRangeService.java

@@ -0,0 +1,61 @@
+package com.ruoyi.ems.service;
+
+import java.util.List;
+import com.ruoyi.ems.domain.AdmEmsIndexRange;
+
+/**
+ * 能源指标范围Service接口
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+public interface IAdmEmsIndexRangeService 
+{
+    /**
+     * 查询能源指标范围
+     * 
+     * @param id 能源指标范围主键
+     * @return 能源指标范围
+     */
+    public AdmEmsIndexRange selectAdmEmsIndexRangeById(Long id);
+
+    /**
+     * 查询能源指标范围列表
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 能源指标范围集合
+     */
+    public List<AdmEmsIndexRange> selectAdmEmsIndexRangeList(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 新增能源指标范围
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    public int insertAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 修改能源指标范围
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    public int updateAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange);
+
+    /**
+     * 批量删除能源指标范围
+     * 
+     * @param ids 需要删除的能源指标范围主键集合
+     * @return 结果
+     */
+    public int deleteAdmEmsIndexRangeByIds(Long[] ids);
+
+    /**
+     * 删除能源指标范围信息
+     * 
+     * @param id 能源指标范围主键
+     * @return 结果
+     */
+    public int deleteAdmEmsIndexRangeById(Long id);
+}

+ 93 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/AdmEmsElecPgIndexServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.ems.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.ems.mapper.AdmEmsElecPgIndexMapper;
+import com.ruoyi.ems.domain.AdmEmsElecPgIndex;
+import com.ruoyi.ems.service.IAdmEmsElecPgIndexService;
+
+/**
+ * 电网设施指标Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+@Service
+public class AdmEmsElecPgIndexServiceImpl implements IAdmEmsElecPgIndexService 
+{
+    @Autowired
+    private AdmEmsElecPgIndexMapper admEmsElecPgIndexMapper;
+
+    /**
+     * 查询电网设施指标
+     * 
+     * @param id 电网设施指标主键
+     * @return 电网设施指标
+     */
+    @Override
+    public AdmEmsElecPgIndex selectAdmEmsElecPgIndexById(Long id)
+    {
+        return admEmsElecPgIndexMapper.selectAdmEmsElecPgIndexById(id);
+    }
+
+    /**
+     * 查询电网设施指标列表
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 电网设施指标
+     */
+    @Override
+    public List<AdmEmsElecPgIndex> selectAdmEmsElecPgIndexList(AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        return admEmsElecPgIndexMapper.selectAdmEmsElecPgIndexList(admEmsElecPgIndex);
+    }
+
+    /**
+     * 新增电网设施指标
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    @Override
+    public int insertAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        return admEmsElecPgIndexMapper.insertAdmEmsElecPgIndex(admEmsElecPgIndex);
+    }
+
+    /**
+     * 修改电网设施指标
+     * 
+     * @param admEmsElecPgIndex 电网设施指标
+     * @return 结果
+     */
+    @Override
+    public int updateAdmEmsElecPgIndex(AdmEmsElecPgIndex admEmsElecPgIndex)
+    {
+        return admEmsElecPgIndexMapper.updateAdmEmsElecPgIndex(admEmsElecPgIndex);
+    }
+
+    /**
+     * 批量删除电网设施指标
+     * 
+     * @param ids 需要删除的电网设施指标主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAdmEmsElecPgIndexByIds(Long[] ids)
+    {
+        return admEmsElecPgIndexMapper.deleteAdmEmsElecPgIndexByIds(ids);
+    }
+
+    /**
+     * 删除电网设施指标信息
+     * 
+     * @param id 电网设施指标主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAdmEmsElecPgIndexById(Long id)
+    {
+        return admEmsElecPgIndexMapper.deleteAdmEmsElecPgIndexById(id);
+    }
+}

+ 93 - 0
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/AdmEmsIndexRangeServiceImpl.java

@@ -0,0 +1,93 @@
+package com.ruoyi.ems.service.impl;
+
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.ems.mapper.AdmEmsIndexRangeMapper;
+import com.ruoyi.ems.domain.AdmEmsIndexRange;
+import com.ruoyi.ems.service.IAdmEmsIndexRangeService;
+
+/**
+ * 能源指标范围Service业务层处理
+ * 
+ * @author ruoyi
+ * @date 2024-08-30
+ */
+@Service
+public class AdmEmsIndexRangeServiceImpl implements IAdmEmsIndexRangeService 
+{
+    @Autowired
+    private AdmEmsIndexRangeMapper admEmsIndexRangeMapper;
+
+    /**
+     * 查询能源指标范围
+     * 
+     * @param id 能源指标范围主键
+     * @return 能源指标范围
+     */
+    @Override
+    public AdmEmsIndexRange selectAdmEmsIndexRangeById(Long id)
+    {
+        return admEmsIndexRangeMapper.selectAdmEmsIndexRangeById(id);
+    }
+
+    /**
+     * 查询能源指标范围列表
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 能源指标范围
+     */
+    @Override
+    public List<AdmEmsIndexRange> selectAdmEmsIndexRangeList(AdmEmsIndexRange admEmsIndexRange)
+    {
+        return admEmsIndexRangeMapper.selectAdmEmsIndexRangeList(admEmsIndexRange);
+    }
+
+    /**
+     * 新增能源指标范围
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    @Override
+    public int insertAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange)
+    {
+        return admEmsIndexRangeMapper.insertAdmEmsIndexRange(admEmsIndexRange);
+    }
+
+    /**
+     * 修改能源指标范围
+     * 
+     * @param admEmsIndexRange 能源指标范围
+     * @return 结果
+     */
+    @Override
+    public int updateAdmEmsIndexRange(AdmEmsIndexRange admEmsIndexRange)
+    {
+        return admEmsIndexRangeMapper.updateAdmEmsIndexRange(admEmsIndexRange);
+    }
+
+    /**
+     * 批量删除能源指标范围
+     * 
+     * @param ids 需要删除的能源指标范围主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAdmEmsIndexRangeByIds(Long[] ids)
+    {
+        return admEmsIndexRangeMapper.deleteAdmEmsIndexRangeByIds(ids);
+    }
+
+    /**
+     * 删除能源指标范围信息
+     * 
+     * @param id 能源指标范围主键
+     * @return 结果
+     */
+    @Override
+    public int deleteAdmEmsIndexRangeById(Long id)
+    {
+        return admEmsIndexRangeMapper.deleteAdmEmsIndexRangeById(id);
+    }
+}

+ 116 - 4
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/service/impl/EmsFacsServiceImpl.java

@@ -1,20 +1,41 @@
 package com.ruoyi.ems.service.impl;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.ruoyi.common.core.enums.FacTypes;
 import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.ExpressUtil;
+import com.ruoyi.common.core.utils.StreamUtils;
+import com.ruoyi.ems.domain.AdmEmsElecPgIndex;
+import com.ruoyi.ems.domain.AdmEmsIndexRange;
 import com.ruoyi.ems.domain.EmsFacs;
 import com.ruoyi.ems.domain.EmsFacsAbility;
 import com.ruoyi.ems.domain.EmsFacsAttr;
 import com.ruoyi.ems.domain.EmsFacsEvent;
+import com.ruoyi.ems.mapper.AdmEmsElecPgIndexMapper;
+import com.ruoyi.ems.mapper.AdmEmsIndexRangeMapper;
 import com.ruoyi.ems.mapper.EmsFacsMapper;
+import com.ruoyi.ems.service.IAdmEmsIndexRangeService;
 import com.ruoyi.ems.service.IEmsFacsAbilityService;
 import com.ruoyi.ems.service.IEmsFacsAttrService;
 import com.ruoyi.ems.service.IEmsFacsEventService;
 import com.ruoyi.ems.service.IEmsFacsService;
-import org.apache.commons.collections4.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
 
-import java.util.List;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.map.MapUtil;
 
 /**
  * 能源设施/系统Service业务层处理
@@ -28,6 +49,12 @@ public class EmsFacsServiceImpl implements IEmsFacsService {
     private EmsFacsMapper emsFacsMapper;
 
     @Autowired
+    private AdmEmsIndexRangeMapper admEmsIndexRangeMapper;
+
+    @Autowired
+    private AdmEmsElecPgIndexMapper admEmsElecPgIndexMapper;
+
+    @Autowired
     private IEmsFacsAttrService facsAttrService;
 
     @Autowired
@@ -36,6 +63,9 @@ public class EmsFacsServiceImpl implements IEmsFacsService {
     @Autowired
     private IEmsFacsEventService facsEventService;
 
+    @Autowired
+    private IAdmEmsIndexRangeService admEmsIndexRangeService;
+
     /**
      * 查询能源设施
      *
@@ -181,6 +211,88 @@ public class EmsFacsServiceImpl implements IEmsFacsService {
         return emsFacsMapper.deleteEmsFacsById(id);
     }
 
+    public List<String> inspectFacIndex() {
+        List<Map<String, Object>> admEmsIndexRanges = admEmsIndexRangeMapper.selectAdmEmsIndexRange();
+        Map<String, List<Map<String, Object>>> facTypeRangeMap = StreamUtils.groupByKey(admEmsIndexRanges,
+            stringObjectMap -> MapUtil.getStr(stringObjectMap, "facsType"));
+        List<String> errorReport = Collections.synchronizedList(new ArrayList<String>());
+        Map<String, BiFunction<List<String>, Map.Entry<String, List<Map<String, Object>>>, Void>> handlers = new HashMap<String, BiFunction<List<String>, Map.Entry<String, List<Map<String, Object>>>, Void>>() {
+            {
+                put(FacTypes.PRODUCT.getCode(), (strings, stringListEntry) -> {
+                    pgIndexInspection(errorReport, stringListEntry);
+                    return null;
+                });
+            }
+        };
+        for (Map.Entry<String, List<Map<String, Object>>> facTypeRange : facTypeRangeMap.entrySet()) {
+            String key = facTypeRange.getKey();
+            if (!handlers.containsKey(key)) {
+                continue;
+            }
+            handlers.get(key).apply(errorReport, facTypeRange);
+        }
+        return errorReport;
+    }
+
+    private void pgIndexInspection(List<String> errorReport,
+        Map.Entry<String, List<Map<String, Object>>> facTypeRange) {
+        Map<String, List<Map<String, Object>>> objCodeRangeMap = StreamUtils.groupByKey(facTypeRange.getValue(),
+            stringObjectMap -> MapUtil.getStr(stringObjectMap, "objCode"));
+        Set<String> objCodes = objCodeRangeMap.keySet();
+        List<List<String>> splitObjCodes = StreamUtils.splitSet(objCodes, 100);
+        for (List<String> splitObjCode : splitObjCodes) {
+            Map<String, Map<String, Object>> objCodePgIndexes = admEmsElecPgIndexMapper.qryLatestObjIndex(splitObjCode);
+            for (Map.Entry<String, Map<String, Object>> objCodePgIndex : objCodePgIndexes.entrySet()) {
+                if (!objCodeRangeMap.containsKey(objCodePgIndex.getKey())) {
+                    continue;
+                }
+                Date time = MapUtil.getDate(objCodePgIndex.getValue(), "time");
+                long between = DateUtil.between(time, new Date(), DateUnit.DAY);
+                List<Map<String, Object>> ranges = objCodeRangeMap.get(objCodePgIndex.getKey());
+                String objTypeName = MapUtil.getStr(ranges.get(0), "facsName");
+                if (between > 1) {
+                    errorReport.add(String.format("%s(%s)已经离线", objCodePgIndex.getKey(), objTypeName));
+                    continue;
+                }
+                List<Map<String, Object>> errors = ExpressUtil.hitExpress(objCodePgIndex.getValue(),
+                    objCodeRangeMap.get(objCodePgIndex.getKey()));
+                if (CollectionUtils.isEmpty(errors)) {
+                    continue;
+                }
+                for (Map<String, Object> error : errors) {
+                    errorReport.add(String.format("%s(%s)超出%s", objCodePgIndex.getKey(), objTypeName,
+                        MapUtil.getStr(error, "indexDesc")));
+                }
+            }
+        }
+    }
+
+    public static void main(String[] args) {
+        List<Map<String, Object>> admEmsIndexRanges = new ArrayList<>();
+        admEmsIndexRanges.add(BeanUtil.beanToMap(new AdmEmsIndexRange() {
+            {
+                setFacsType(FacTypes.PRODUCT.getCode());
+                setIndexName("voltage");
+                setIndexUpperLimit(225.0D);
+                setIndexLowerLimit(220.1D);
+            }
+        }, "facsType", "indexName", "indexUpperLimit", "indexLowerLimit"));
+        admEmsIndexRanges.add(BeanUtil.beanToMap(new AdmEmsIndexRange() {
+            {
+                setFacsType(FacTypes.PRODUCT.getCode());
+                setIndexName("electricity");
+                setIndexUpperLimit(225.0D);
+                setIndexLowerLimit(220.1D);
+            }
+        }, "facsType", "indexName", "indexUpperLimit", "indexLowerLimit"));
+        System.out.println(ExpressUtil.hitExpress(new AdmEmsElecPgIndex() {
+            {
+                setVoltage(220.1D);
+                setElectricity(1.1D);
+            }
+        }, admEmsIndexRanges));
+    }
+
     private List<EmsFacsAttr> getFacsAttrs(EmsFacs emsFacs) {
         EmsFacsAttr param = new EmsFacsAttr(emsFacs.getFacsCode());
         return facsAttrService.selectEmsFacsAttrList(param);

+ 6 - 10
ems-cloud/ems-modules/ems-server/src/main/java/com/ruoyi/ems/task/taskiml/FacTask.java

@@ -1,15 +1,12 @@
 package com.ruoyi.ems.task.taskiml;
 
-import com.alibaba.fastjson2.JSON;
-import com.ruoyi.common.log.aspect.LogAspect;
-import com.ruoyi.ems.mapper.AreaMapper;
-import com.ruoyi.ems.task.BaseTask;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.ems.service.impl.EmsFacsServiceImpl;
+import com.ruoyi.ems.task.BaseTask;
 
 /**
  * 定时任务调度测试
@@ -20,10 +17,9 @@ import com.ruoyi.common.core.utils.StringUtils;
 public class FacTask extends BaseTask {
 
     @Autowired
-    private AreaMapper areaMapper;
-
+    private EmsFacsServiceImpl emsFacsService;
     @Override
     public void run() {
-       log.info(JSON.toJSONString(areaMapper.selectAreaById(1L)));
+        List<String> errorReport = emsFacsService.inspectFacIndex();
     }
 }

+ 106 - 0
ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AdmEmsElecPgIndexMapper.xml

@@ -0,0 +1,106 @@
+<?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.ruoyi.ems.mapper.AdmEmsElecPgIndexMapper">
+
+    <resultMap type="com.ruoyi.ems.domain.AdmEmsElecPgIndex" id="AdmEmsElecPgIndexResult">
+        <result property="id" column="id"/>
+        <result property="areaCode" column="area_code"/>
+        <result property="facsCode" column="facs_code"/>
+        <result property="date" column="date"/>
+        <result property="time" column="time"/>
+        <result property="voltage" column="voltage"/>
+        <result property="electricity" column="electricity"/>
+        <result property="power" column="power"/>
+    </resultMap>
+
+    <sql id="selectAdmEmsElecPgIndexVo">
+        select id, area_code, facs_code, date, time, voltage, electricity, power
+        from adm_ems_elec_pg_index
+    </sql>
+
+    <select id="selectAdmEmsElecPgIndexList" parameterType="com.ruoyi.ems.domain.AdmEmsElecPgIndex"
+            resultMap="AdmEmsElecPgIndexResult">
+        <include refid="selectAdmEmsElecPgIndexVo"/>
+        <where>
+            <if test="areaCode != null  and areaCode != ''">and area_code = #{areaCode}</if>
+            <if test="facsCode != null  and facsCode != ''">and facs_code = #{facsCode}</if>
+            <if test="date != null ">and date = #{date}</if>
+            <if test="time != null ">and time = #{time}</if>
+            <if test="voltage != null ">and voltage = #{voltage}</if>
+            <if test="electricity != null ">and electricity = #{electricity}</if>
+            <if test="power != null ">and power = #{power}</if>
+        </where>
+    </select>
+
+    <select id="selectAdmEmsElecPgIndexById" parameterType="Long" resultMap="AdmEmsElecPgIndexResult">
+        <include refid="selectAdmEmsElecPgIndexVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertAdmEmsElecPgIndex" parameterType="com.ruoyi.ems.domain.AdmEmsElecPgIndex" useGeneratedKeys="true"
+            keyProperty="id">
+        insert into adm_ems_elec_pg_index
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="areaCode != null and areaCode != ''">area_code,</if>
+            <if test="facsCode != null and facsCode != ''">facs_code,</if>
+            <if test="date != null">date,</if>
+            <if test="time != null">time,</if>
+            <if test="voltage != null">voltage,</if>
+            <if test="electricity != null">electricity,</if>
+            <if test="power != null">power,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="areaCode != null and areaCode != ''">#{areaCode},</if>
+            <if test="facsCode != null and facsCode != ''">#{facsCode},</if>
+            <if test="date != null">#{date},</if>
+            <if test="time != null">#{time},</if>
+            <if test="voltage != null">#{voltage},</if>
+            <if test="electricity != null">#{electricity},</if>
+            <if test="power != null">#{power},</if>
+        </trim>
+    </insert>
+
+    <update id="updateAdmEmsElecPgIndex" parameterType="com.ruoyi.ems.domain.AdmEmsElecPgIndex">
+        update adm_ems_elec_pg_index
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="areaCode != null and areaCode != ''">area_code = #{areaCode},</if>
+            <if test="facsCode != null and facsCode != ''">facs_code = #{facsCode},</if>
+            <if test="date != null">date = #{date},</if>
+            <if test="time != null">time = #{time},</if>
+            <if test="voltage != null">voltage = #{voltage},</if>
+            <if test="electricity != null">electricity = #{electricity},</if>
+            <if test="power != null">power = #{power},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteAdmEmsElecPgIndexById" parameterType="Long">
+        delete
+        from adm_ems_elec_pg_index
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteAdmEmsElecPgIndexByIds" parameterType="String">
+        delete from adm_ems_elec_pg_index where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="qryLatestObjIndex" resultType="Map">
+        SELECT
+        id, area_code as areaCode, facs_code as facsCode, date, time, voltage, electricity, power
+        FROM
+        ( SELECT *, RANK() OVER ( PARTITION BY facs_code ORDER BY time DESC ) AS num FROM adm_ems_elec_pg_index pgInde
+        where facs_code
+        <foreach item="item" index="index" collection="set" open="in (" separator=", " close=")">
+            ${item}
+        </foreach>
+        ) f
+        WHERE
+        f.num =1
+    </select>
+
+</mapper>

+ 99 - 0
ems-cloud/ems-modules/ems-server/src/main/resources/mapper/ems/AdmEmsIndexRangeMapper.xml

@@ -0,0 +1,99 @@
+<?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.ruoyi.ems.mapper.AdmEmsIndexRangeMapper">
+
+    <resultMap type="com.ruoyi.ems.domain.AdmEmsIndexRange" id="AdmEmsIndexRangeResult">
+        <result property="id" column="id"/>
+        <result property="objCode" column="obj_code"/>
+        <result property="objType" column="obj_type"/>
+        <result property="indexName" column="index_name"/>
+        <result property="indexDesc" column="index_desc"/>
+        <result property="indexUpperLimit" column="index_upper_limit"/>
+        <result property="indexLowerLimit" column="index_lower_limit"/>
+    </resultMap>
+
+    <sql id="selectAdmEmsIndexRangeVo">
+        select id, obj_code, obj_type, index_name, index_desc, index_upper_limit, index_lower_limit
+        from adm_ems_index_range
+    </sql>
+
+    <select id="selectAdmEmsIndexRangeList" parameterType="com.ruoyi.ems.domain.AdmEmsIndexRange"
+            resultMap="AdmEmsIndexRangeResult">
+        <include refid="selectAdmEmsIndexRangeVo"/>
+        <where>
+            <if test="objType != null ">and obj_type = #{objType}</if>
+            <if test="indexName != null  and indexName != ''">and index_name like concat('%', #{indexName}, '%')</if>
+            <if test="indexDesc != null  and indexDesc != ''">and index_desc = #{indexDesc}</if>
+        </where>
+    </select>
+
+    <select id="selectAdmEmsIndexRangeById" parameterType="Long" resultMap="AdmEmsIndexRangeResult">
+        <include refid="selectAdmEmsIndexRangeVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertAdmEmsIndexRange" parameterType="com.ruoyi.ems.domain.AdmEmsIndexRange" useGeneratedKeys="true"
+            keyProperty="id">
+        insert into adm_ems_index_range
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="objCode != null and objCode != ''">obj_code,</if>
+            <if test="objType != null">obj_type,</if>
+            <if test="indexName != null and indexName != ''">index_name,</if>
+            <if test="indexDesc != null">index_desc,</if>
+            <if test="indexUpperLimit != null">index_upper_limit,</if>
+            <if test="indexLowerLimit != null">index_lower_limit,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="objCode != null and objCode != ''">#{objCode},</if>
+            <if test="objType != null">#{objType},</if>
+            <if test="indexName != null and indexName != ''">#{indexName},</if>
+            <if test="indexDesc != null">#{indexDesc},</if>
+            <if test="indexUpperLimit != null">#{indexUpperLimit},</if>
+            <if test="indexLowerLimit != null">#{indexLowerLimit},</if>
+        </trim>
+    </insert>
+
+    <update id="updateAdmEmsIndexRange" parameterType="com.ruoyi.ems.domain.AdmEmsIndexRange">
+        update adm_ems_index_range
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="objCode != null and objCode != ''">obj_code = #{objCode},</if>
+            <if test="objType != null">obj_type = #{objType},</if>
+            <if test="indexName != null and indexName != ''">index_name = #{indexName},</if>
+            <if test="indexDesc != null">index_desc = #{indexDesc},</if>
+            <if test="indexUpperLimit != null">index_upper_limit = #{indexUpperLimit},</if>
+            <if test="indexLowerLimit != null">index_lower_limit = #{indexLowerLimit},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteAdmEmsIndexRangeById" parameterType="Long">
+        delete
+        from adm_ems_index_range
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteAdmEmsIndexRangeByIds" parameterType="String">
+        delete from adm_ems_index_range where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectAdmEmsIndexRange" resultType="Map">
+        select id,
+               obj_code objCode,
+               obj_type objType,
+               index_name indexName,
+               index_desc indexDesc,
+               index_upper_limit indexUpperLimit,
+               index_lower_limit indexLowerLimit,
+               facs.facs_type facsType,
+               facs.facs_name facsName
+        FROM adm_ems_index_range indexRange
+                 LEFT JOIN adm_ems_facs facs ON indexRange.obj_code = facs.facs_code
+            AND indexRange.obj_type = 1
+    </select>
+
+</mapper>

+ 9 - 0
ems-cloud/pom.xml

@@ -34,6 +34,7 @@
         <jjwt.version>0.9.1</jjwt.version>
         <minio.version>8.2.2</minio.version>
         <poi.version>4.1.2</poi.version>
+        <hutool.version>5.8.26</hutool.version>
         <transmittable-thread-local.version>2.14.4</transmittable-thread-local.version>
     </properties>
 
@@ -227,6 +228,14 @@
                 <artifactId>ruoyi-common-quartz</artifactId>
                 <version>${ruoyi.version}</version>
             </dependency>
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-bom</artifactId>
+                <version>${hutool.version}</version>
+                <type>pom</type>
+                <!-- 注意这里是import -->
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 6 - 3
ems-cloud/ruoyi-common/ruoyi-common-core/pom.xml

@@ -10,7 +10,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>ruoyi-common-core</artifactId>
-    
+
     <description>
         ruoyi-common-core核心模块
     </description>
@@ -22,7 +22,7 @@
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-openfeign</artifactId>
         </dependency>
-        
+
         <!-- SpringCloud Loadbalancer -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>
@@ -112,7 +112,10 @@
             <groupId>io.swagger</groupId>
             <artifactId>swagger-annotations</artifactId>
         </dependency>
-
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-core</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 85 - 0
ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/FacTypes.java

@@ -0,0 +1,85 @@
+package com.ruoyi.common.core.enums;
+
+/**
+ * 设备类型
+ *
+ * @author ruoyi
+ */
+public enum FacTypes {
+    /**
+     * Product fac types.
+     *
+     * @author chen.cheng
+     */
+    PRODUCT("E", "能源生产系统"),
+    /**
+     * Transfer fac types.
+     *
+     * @author chen.cheng
+     */
+    TRANSFER("T", "中转系统"),
+    /**
+     * Transmit fac types.
+     *
+     * @author chen.cheng
+     */
+    TRANSMIT("W", "传输系统"),
+    /**
+     * Storage fac types.
+     *
+     * @author chen.cheng
+     */
+    STORAGE("C", "存储系统"),
+    /**
+     * Energy fac types.
+     *
+     * @author chen.cheng
+     */
+    ENERGY("Z", "用能系统");
+
+    /**
+     * The Code.
+     *
+     * @author chen.cheng
+     */
+    private final String code;
+
+    /**
+     * The Info.
+     *
+     * @author chen.cheng
+     */
+    private final String info;
+
+    /**
+     * Instantiates a new Fac types.
+     *
+     * @param code the code
+     * @param info the info
+     * @author chen.cheng
+     */
+    FacTypes(String code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    /**
+     * Gets code.
+     *
+     * @return the code
+     * @author chen.cheng
+     */
+    public String getCode() {
+        return code;
+    }
+
+    /**
+     * Gets info.
+     *
+     * @return the info
+     * @author chen.cheng
+     */
+    public String getInfo() {
+        return info;
+    }
+}

+ 39 - 0
ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/ExpressUtil.java

@@ -0,0 +1,39 @@
+package com.ruoyi.common.core.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.expression.Expression;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.map.MapUtil;
+
+public final class ExpressUtil {
+    public static <T> List<Map<String, Object>> hitExpress(T obj, List<Map<String, Object>> indexRangeList) {
+        if (CollectionUtils.isEmpty(indexRangeList)) {
+            return null;
+        }
+        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
+        List<Map<String, Object>> result = new ArrayList<>();
+        Map<String, Object> map = new HashMap<>();
+        BeanUtil.beanToMap(obj, map, false, false);
+        String express;
+        String indexName;
+        Expression expression;
+        Boolean eval;
+        for (Map<String, Object> stringObjectMap : indexRangeList) {
+            indexName = MapUtil.getStr(stringObjectMap, "indexName");
+            express = String.format("%s < ['indexUpperLimit'] && %s >= ['indexLowerLimit']", map.get(indexName), map.get(indexName));
+            expression = spelExpressionParser.parseExpression(express);
+            eval = expression.getValue(stringObjectMap, Boolean.class);
+            if (Boolean.FALSE.equals(eval)) {
+                result.add(stringObjectMap);
+            }
+        }
+        return result;
+    }
+}

+ 260 - 0
ems-cloud/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/StreamUtils.java

@@ -0,0 +1,260 @@
+package com.ruoyi.common.core.utils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.util.CollectionUtils;
+
+/**
+ * stream 流工具类
+ */
+
+public class StreamUtils {
+
+    /**
+     * 将collection过滤
+     *
+     * @param collection 需要转化的集合
+     * @param function 过滤方法
+     * @return 过滤后的list
+     */
+    public static <E> List<E> filter(Collection<E> collection, Predicate<E> function) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new ArrayList<>();
+        }
+        return collection.stream().filter(function).collect(Collectors.toList());
+    }
+
+    /**
+     * 将collection拼接
+     *
+     * @param collection 需要转化的集合
+     * @param function 拼接方法
+     * @return 拼接后的list
+     */
+    public static <E> String join(Collection<E> collection, Function<E, String> function) {
+        return join(collection, function, StringUtils.SPACE);
+    }
+
+    /**
+     * 将collection拼接
+     *
+     * @param collection 需要转化的集合
+     * @param function 拼接方法
+     * @param delimiter 拼接符
+     * @return 拼接后的list
+     */
+    public static <E> String join(Collection<E> collection, Function<E, String> function, CharSequence delimiter) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return StringUtils.EMPTY;
+        }
+        return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.joining(delimiter));
+    }
+
+    /**
+     * 将collection排序
+     *
+     * @param collection 需要转化的集合
+     * @param comparing 排序方法
+     * @return 排序后的list
+     */
+    public static <E> List<E> sorted(Collection<E> collection, Comparator<E> comparing) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new ArrayList<>();
+        }
+        return collection.stream().sorted(comparing).collect(Collectors.toList());
+    }
+
+    /**
+     * 将collection转化为类型不变的map<br>
+     * <B>{@code Collection<V>  ---->  Map<K,V>}</B>
+     *
+     * @param collection 需要转化的集合
+     * @param key V类型转化为K类型的lambda方法
+     * @param <V> collection中的泛型
+     * @param <K> map中的key类型
+     * @return 转化后的map
+     */
+    public static <V, K> Map<K, V> toIdentityMap(Collection<V> collection, Function<V, K> key) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new HashMap<>();
+        }
+        return collection.stream().collect(Collectors.toMap(key, Function.identity(), (l, r) -> l));
+    }
+
+    /**
+     * 将Collection转化为map(value类型与collection的泛型不同)<br>
+     * <B>{@code Collection<E> -----> Map<K,V>  }</B>
+     *
+     * @param collection 需要转化的集合
+     * @param key E类型转化为K类型的lambda方法
+     * @param value E类型转化为V类型的lambda方法
+     * @param <E> collection中的泛型
+     * @param <K> map中的key类型
+     * @param <V> map中的value类型
+     * @return 转化后的map
+     */
+    public static <E, K, V> Map<K, V> toMap(Collection<E> collection, Function<E, K> key, Function<E, V> value) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new HashMap<>();
+        }
+        return collection.stream().collect(Collectors.toMap(key, value, (l, r) -> l));
+    }
+
+    /**
+     * 将collection按照规则(比如有相同的班级id)分类成map<br>
+     * <B>{@code Collection<E> -------> Map<K,List<E>> } </B>
+     *
+     * @param collection 需要分类的集合
+     * @param key 分类的规则
+     * @param <E> collection中的泛型
+     * @param <K> map中的key类型
+     * @return 分类后的map
+     */
+    public static <E, K> Map<K, List<E>> groupByKey(Collection<E> collection, Function<E, K> key) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new HashMap<>();
+        }
+        return collection.stream().collect(Collectors.groupingBy(key, LinkedHashMap::new, Collectors.toList()));
+    }
+
+    /**
+     * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map<br>
+     * <B>{@code Collection<E>  --->  Map<T,Map<U,List<E>>> } </B>
+     *
+     * @param collection 需要分类的集合
+     * @param key1 第一个分类的规则
+     * @param key2 第二个分类的规则
+     * @param <E> 集合元素类型
+     * @param <K> 第一个map中的key类型
+     * @param <U> 第二个map中的key类型
+     * @return 分类后的map
+     */
+    public static <E, K, U> Map<K, Map<U, List<E>>> groupBy2Key(Collection<E> collection, Function<E, K> key1,
+        Function<E, U> key2) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new HashMap<>();
+        }
+        return collection.stream().collect(Collectors.groupingBy(key1, LinkedHashMap::new,
+            Collectors.groupingBy(key2, LinkedHashMap::new, Collectors.toList())));
+    }
+
+    /**
+     * 将collection按照两个规则(比如有相同的年级id,班级id)分类成双层map<br>
+     * <B>{@code Collection<E>  --->  Map<T,Map<U,E>> } </B>
+     *
+     * @param collection 需要分类的集合
+     * @param key1 第一个分类的规则
+     * @param key2 第二个分类的规则
+     * @param <T> 第一个map中的key类型
+     * @param <U> 第二个map中的key类型
+     * @param <E> collection中的泛型
+     * @return 分类后的map
+     */
+    public static <E, T, U> Map<T, Map<U, E>> group2Map(Collection<E> collection, Function<E, T> key1,
+        Function<E, U> key2) {
+        if (CollectionUtils.isEmpty(collection) || key1 == null || key2 == null) {
+            return new HashMap<>();
+        }
+        return collection.stream().collect(
+            Collectors.groupingBy(key1, LinkedHashMap::new, Collectors.toMap(key2, Function.identity(), (l, r) -> l)));
+    }
+
+    /**
+     * 将collection转化为List集合,但是两者的泛型不同<br>
+     * <B>{@code Collection<E>  ------>  List<T> } </B>
+     *
+     * @param collection 需要转化的集合
+     * @param function collection中的泛型转化为list泛型的lambda表达式
+     * @param <E> collection中的泛型
+     * @param <T> List中的泛型
+     * @return 转化后的list
+     */
+    public static <E, T> List<T> toList(Collection<E> collection, Function<E, T> function) {
+        if (CollectionUtils.isEmpty(collection)) {
+            return new ArrayList<>();
+        }
+        return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.toList());
+    }
+
+    /**
+     * 将collection转化为Set集合,但是两者的泛型不同<br>
+     * <B>{@code Collection<E>  ------>  Set<T> } </B>
+     *
+     * @param collection 需要转化的集合
+     * @param function collection中的泛型转化为set泛型的lambda表达式
+     * @param <E> collection中的泛型
+     * @param <T> Set中的泛型
+     * @return 转化后的Set
+     */
+    public static <E, T> Set<T> toSet(Collection<E> collection, Function<E, T> function) {
+        if (CollectionUtils.isEmpty(collection) || function == null) {
+            return new HashSet<>();
+        }
+        return collection.stream().map(function).filter(Objects::nonNull).collect(Collectors.toSet());
+    }
+
+    /**
+     * 合并两个相同key类型的map
+     *
+     * @param map1 第一个需要合并的 map
+     * @param map2 第二个需要合并的 map
+     * @param merge 合并的lambda,将key value1 value2合并成最终的类型,注意value可能为空的情况
+     * @param <K> map中的key类型
+     * @param <X> 第一个 map的value类型
+     * @param <Y> 第二个 map的value类型
+     * @param <V> 最终map的value类型
+     * @return 合并后的map
+     */
+    public static <K, X, Y, V> Map<K, V> merge(Map<K, X> map1, Map<K, Y> map2, BiFunction<X, Y, V> merge) {
+        if (MapUtils.isEmpty(map1) && MapUtils.isEmpty(map2)) {
+            return new HashMap<>();
+        }
+        else if (MapUtils.isEmpty(map1)) {
+            map1 = new HashMap<>();
+        }
+        else if (MapUtils.isEmpty(map2)) {
+            map2 = new HashMap<>();
+        }
+        Set<K> key = new HashSet<>();
+        key.addAll(map1.keySet());
+        key.addAll(map2.keySet());
+        Map<K, V> map = new HashMap<>();
+        for (K t : key) {
+            X x = map1.get(t);
+            Y y = map2.get(t);
+            V z = merge.apply(x, y);
+            if (z != null) {
+                map.put(t, z);
+            }
+        }
+        return map;
+    }
+    /**
+     * 将 Set 切分成多个子集
+     * @param originalSet 原始 Set
+     * @param chunkSize 每个子集的大小
+     * @return 切分后的子集列表
+     */
+    public static List<List<String>> splitSet(Set<String> originalSet, int chunkSize) {
+        List<String> list = new ArrayList<>(originalSet);
+        return IntStream.range(0, (int) Math.ceil((double) list.size() / chunkSize))
+                .mapToObj(i -> list.subList(i * chunkSize, Math.min((i + 1) * chunkSize, list.size())))
+                .collect(Collectors.toList());
+    }
+}