Forráskód Böngészése

预警、能耗、部门

Newspaper 1 éve
szülő
commit
c73cb6f9c5
50 módosított fájl, 2772 hozzáadás és 0 törlés
  1. 99 0
      snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/department/entity/Department.java
  2. 10 0
      snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/vo/UserPhoneVo.java
  3. 20 0
      snowy-web-app/src/main/java/vip/xiaonuo/core/converter/MultipartJackson2HttpMessageConverter.java
  4. 43 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/param/DepartmentChildParam.java
  5. 107 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/controller/EnergyThresholdController.java
  6. 107 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/entity/EnergyThreshold.java
  7. 34 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/enums/EnergyThresholdEnum.java
  8. 25 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/mapper/EnergyThresholdMapper.java
  9. 5 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/mapper/mapping/EnergyThresholdMapper.xml
  10. 40 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdModifyParam.java
  11. 84 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdSaveParam.java
  12. 78 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdSyncParam.java
  13. 35 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdUnitIdParam.java
  14. 61 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/service/EnergyThresholdService.java
  15. 99 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/service/impl/EnergyThresholdServiceImpl.java
  16. 110 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/controller/EnvThresholdController.java
  17. 116 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/entity/EnvThreshold.java
  18. 34 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/enums/EnvThresholdEnum.java
  19. 25 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/mapper/EnvThresholdMapper.java
  20. 5 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/mapper/mapping/EnvThresholdMapper.xml
  21. 40 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdModifyParam.java
  22. 123 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdSaveParam.java
  23. 117 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdSyncParam.java
  24. 35 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdUnitIdParam.java
  25. 61 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/service/EnvThresholdService.java
  26. 101 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/service/impl/EnvThresholdServiceImpl.java
  27. 99 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/controller/WarningInfoController.java
  28. 75 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/WarningInfo.java
  29. 19 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoListVo.java
  30. 16 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoProportionVo.java
  31. 18 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoRateVo.java
  32. 34 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/enums/WarningInfoEnum.java
  33. 29 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/mapper/WarningInfoMapper.java
  34. 20 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/mapper/mapping/WarningInfoMapper.xml
  35. 62 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoAddParam.java
  36. 67 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoEditParam.java
  37. 35 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoIdParam.java
  38. 62 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoPageParam.java
  39. 46 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/service/WarningInfoService.java
  40. 156 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/service/impl/WarningInfoServiceImpl.java
  41. 77 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/controller/WarningManagerController.java
  42. 60 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/entity/WarningManager.java
  43. 19 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/entity/vo/WarningManagerVo.java
  44. 34 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/enums/WarningManagerEnum.java
  45. 26 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/WarningManagerMapper.java
  46. 5 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/mapping/WarningManagerMapper.xml
  47. 23 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/param/WarningManagerSaveParam.java
  48. 35 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/param/WarningManagerTypeParam.java
  49. 33 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/service/WarningManagerService.java
  50. 108 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/service/impl/WarningManagerServiceImpl.java

+ 99 - 0
snowy-plugin/snowy-plugin-biz/src/main/java/vip/xiaonuo/biz/modular/department/entity/Department.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.biz.modular.department.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+import com.fhs.core.trans.vo.TransPojo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+/**
+ * 部门实体
+ *
+ * @author newspaper
+ * @date  2023/12/13 08:44
+ **/
+@Getter
+@Setter
+@TableName(value = "department" ,autoResultMap = true)
+public class Department extends CommonEntity implements TransPojo {
+
+    /** ID */
+    @TableId
+    @ApiModelProperty(value = "ID", position = 1)
+    private String id;
+
+    /** 部门名称 */
+    @ApiModelProperty(value = "部门名称", position = 2)
+    private String departmentName;
+
+    /** 部门照片 */
+    @ApiModelProperty(value = "部门照片id", position = 3)
+    private String departmentImgId;
+
+    /** 上级部门ID */
+    @ApiModelProperty(value = "上级部门ID", position = 4)
+    @Trans(type = TransType.SIMPLE, target = Department.class, fields = "departmentName", alias = "parent", ref = "parentName")
+    private String parentId;
+
+    /** 所在区域 */
+    @ApiModelProperty(value = "所在区域", position = 5)
+    private String departmentRegion;
+
+    /** 详细地址 */
+    @ApiModelProperty(value = "详细地址", position = 6)
+    private String detailLocation;
+
+    /** 部门电话 */
+    @ApiModelProperty(value = "部门电话", position = 7)
+    private String departmentPhone;
+
+    /** 部门负责人ID */
+    @ApiModelProperty(value = "部门负责人ID", position = 8)
+    private String departmentManager;
+
+    /** 描述 */
+    @ApiModelProperty(value = "描述", position = 9)
+    private String remarks;
+
+    /** 排序码 */
+    @ApiModelProperty(value = "排序码", position = 10)
+    private Integer sortCode;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 11)
+    @TableField(fill = FieldFill.INSERT)
+    private String orgId;
+
+    /** 负责人名称 */
+    @ApiModelProperty(value = "负责人", position = 12)
+    @TableField(exist = false)
+    private String managerName;
+
+    /** 上级部门 */
+    @ApiModelProperty(value = "上级部门", position = 13)
+    @TableField(exist = false)
+    private String parentName;
+
+    /** 部门照片 */
+    @ApiModelProperty(value = "部门照片", position = 3)
+    @TableField(exist = false)
+    private String departmentImgUrl;
+}

+ 10 - 0
snowy-plugin/snowy-plugin-sys/src/main/java/vip/xiaonuo/sys/modular/user/entity/vo/UserPhoneVo.java

@@ -0,0 +1,10 @@
+package vip.xiaonuo.sys.modular.user.entity.vo;
+
+import lombok.Data;
+
+@Data
+public class UserPhoneVo {
+    private String name;
+
+    private String phone;
+}

+ 20 - 0
snowy-web-app/src/main/java/vip/xiaonuo/core/converter/MultipartJackson2HttpMessageConverter.java

@@ -0,0 +1,20 @@
+//package vip.xiaonuo.core.converter;
+//
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import org.springframework.http.MediaType;
+//import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
+//import org.springframework.stereotype.Component;
+//
+//import javax.sound.sampled.BooleanControl;
+//
+//@Component
+//public class MultipartJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter {
+//    protected MultipartJackson2HttpMessageConverter(ObjectMapper objectMapper) {
+//        super(objectMapper, MediaType.APPLICATION_OCTET_STREAM);
+//    }
+//
+//    @Override
+//    public boolean canWrite(Class<?> clazz, MediaType mediaType){
+//        return false;
+//    }
+//}

+ 43 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/param/DepartmentChildParam.java

@@ -0,0 +1,43 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.base.department.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 部门Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/13 08:44
+ **/
+@Getter
+@Setter
+public class DepartmentChildParam {
+
+    /** 父id */
+    @ApiModelProperty(value = "父id", required = true, position = 1)
+    @NotBlank(message = "父id不能为空")
+    private String parentId;
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码",position = 2)
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数",position = 3)
+    private Integer size;
+}

+ 107 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/controller/EnergyThresholdController.java

@@ -0,0 +1,107 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.modular.energy.energyThreshold.entity.EnergyThreshold;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdModifyParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSaveParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSyncParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdUnitIdParam;
+import vip.xiaonuo.modular.energy.energyThreshold.service.EnergyThresholdService;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdModifyParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSaveParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSyncParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdUnitIdParam;
+
+import javax.annotation.Resource;
+
+/**
+ * 能耗阈值控制器
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ */
+@Api(tags = "能耗阈值控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class EnergyThresholdController {
+
+    @Resource
+    private EnergyThresholdService energyThresholdService;
+
+    /**
+     * 根据单元ID获取阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("根据单元ID获取能耗阈值")
+    @GetMapping("/energy/energyThreshold/getThresholdByUnitId")
+    public CommonResult<EnergyThreshold> getThresholdByUnitId(EnergyThresholdUnitIdParam energyThresholdUnitIdParam) {
+        return CommonResult.data(energyThresholdService.getThresholdByUnitId(energyThresholdUnitIdParam));
+    }
+
+    /**
+     * 编辑能耗阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("编辑能耗阈值")
+    @GetMapping("/energy/energyThreshold/saveThreshold")
+    public CommonResult<String> saveThreshold(EnergyThresholdSaveParam energyThresholdSaveParam) {
+        energyThresholdService.saveThreshold(energyThresholdSaveParam);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 修改能耗阈值状态
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("修改能耗阈值状态")
+    @GetMapping("/energy/energyThreshold/modifyThresholdStatus")
+    public CommonResult<String> modifyThresholdStatus(EnergyThresholdModifyParam energyThresholdModifyParam) {
+        energyThresholdService.modifyThresholdStatus(energyThresholdModifyParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 同步能耗阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("同步能耗阈值")
+    @GetMapping("/energy/energyThreshold/syncThreshold")
+    public CommonResult<String> syncThreshold(EnergyThresholdSyncParam energyThresholdSyncParam) {
+        energyThresholdService.syncThreshold(energyThresholdSyncParam);
+        return CommonResult.ok();
+    }
+}

+ 107 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/entity/EnergyThreshold.java

@@ -0,0 +1,107 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 能耗阈值实体
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Getter
+@Setter
+@TableName("energy_threshold")
+public class EnergyThreshold {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 阈值对象 */
+    @ApiModelProperty(value = "阈值对象", position = 2)
+    private String unitId;
+
+    /** 0为不启用 1为启用 */
+    @ApiModelProperty(value = "0为不启用 1为启用", position = 3)
+    private Integer isEnable;
+
+    /** 用水下限 */
+    @ApiModelProperty(value = "用水下限", position = 4)
+    private BigDecimal waterLower;
+
+    /** 用水上限 */
+    @ApiModelProperty(value = "用水上限", position = 5)
+    private BigDecimal waterUpper;
+
+    /** 用电下限 */
+    @ApiModelProperty(value = "用电下限", position = 6)
+    private BigDecimal electricityLower;
+
+    /** 用电上限 */
+    @ApiModelProperty(value = "用电上限", position = 7)
+    private BigDecimal electricityUpper;
+
+    /** 七日用水下限 */
+    @ApiModelProperty(value = "七日用水下限", position = 8)
+    private BigDecimal sevenDayWaterLower;
+
+    /** 七日用水上限 */
+    @ApiModelProperty(value = "七日用水上限", position = 9)
+    private BigDecimal sevenDayWaterUpper;
+
+    /** 七日用电上限 */
+    @ApiModelProperty(value = "七日用电上限", position = 10)
+    private BigDecimal sevenDayElectricityLower;
+
+    /** 七日用电下限 */
+    @ApiModelProperty(value = "七日用电下限", position = 11)
+    private BigDecimal sevenDayElectricityUpper;
+
+    /** 组织id */
+    @ApiModelProperty(value = "组织id", position = 12)
+    private String orgId;
+
+    /** 删除标志 */
+    @ApiModelProperty(value = "删除标志", position = 13)
+    @TableLogic
+    @TableField(fill = FieldFill.INSERT)
+    private String deleteFlag;
+
+    /** 创建时间 */
+    @ApiModelProperty(value = "创建时间", position = 14)
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /** 创建用户 */
+    @ApiModelProperty(value = "创建用户", position = 15)
+    @TableField(fill = FieldFill.INSERT)
+    private String createUser;
+
+    /** 修改时间 */
+    @ApiModelProperty(value = "修改时间", position = 16)
+    @TableField(fill = FieldFill.UPDATE)
+    private Date updateTime;
+
+    /** 修改用户 */
+    @ApiModelProperty(value = "修改用户", position = 17)
+    @TableField(fill = FieldFill.UPDATE)
+    private String updateUser;
+}

+ 34 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/enums/EnergyThresholdEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.enums;
+
+import lombok.Getter;
+
+/**
+ * 能耗阈值枚举
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Getter
+public enum EnergyThresholdEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    EnergyThresholdEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/mapper/EnergyThresholdMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.modular.energy.energyThreshold.entity.EnergyThreshold;
+
+/**
+ * 能耗阈值Mapper接口
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+public interface EnergyThresholdMapper extends BaseMapper<EnergyThreshold> {
+}

+ 5 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/mapper/mapping/EnergyThresholdMapper.xml

@@ -0,0 +1,5 @@
+<?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="vip.xiaonuo.modular.energy.energyThreshold.mapper.EnergyThresholdMapper">
+
+</mapper>

+ 40 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdModifyParam.java

@@ -0,0 +1,40 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 环控阈值Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+public class EnergyThresholdModifyParam {
+
+    /** 单元ID */
+    @ApiModelProperty(value = "单元ID", required = true, position = 1)
+    @NotBlank(message = "单元父ID不能为空")
+    private String unitId;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", required = true, position = 2, example = "0:禁用 1:启用")
+    @NotBlank(message = "isEnable不能为空")
+    private String isEnable;
+}

+ 84 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdSaveParam.java

@@ -0,0 +1,84 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 能耗阈值添加参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Getter
+@Setter
+public class EnergyThresholdSaveParam {
+
+    /** 单元父id */
+    @ApiModelProperty(value = "单元父id", required = true, position = 2)
+    @NotBlank(message = "unitId不能为空")
+    private String unitId;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", required = true, position = 3)
+    @NotNull(message = "isEnable不能为空")
+    private Integer isEnable;
+
+    /** 用水下限 */
+    @ApiModelProperty(value = "用水下限", required = true, position = 4)
+    @NotNull(message = "waterLower不能为空")
+    private BigDecimal waterLower;
+
+    /** 用水上限 */
+    @ApiModelProperty(value = "用水上限", required = true, position = 5)
+    @NotNull(message = "waterUpper不能为空")
+    private BigDecimal waterUpper;
+
+    /** 用电下限 */
+    @ApiModelProperty(value = "用电下限", required = true, position = 6)
+    @NotNull(message = "electricityLower不能为空")
+    private BigDecimal electricityLower;
+
+    /** 用电上限 */
+    @ApiModelProperty(value = "用电上限", required = true, position = 7)
+    @NotNull(message = "electricityUpper不能为空")
+    private BigDecimal electricityUpper;
+
+    /** 七日用水下限 */
+    @ApiModelProperty(value = "七日用水下限", required = true, position = 8)
+    @NotNull(message = "sevenDayWaterLower不能为空")
+    private BigDecimal sevenDayWaterLower;
+
+    /** 七日用水上限 */
+    @ApiModelProperty(value = "七日用水上限", required = true, position = 9)
+    @NotNull(message = "sevenDayWaterUpper不能为空")
+    private BigDecimal sevenDayWaterUpper;
+
+    /** 七日用电上限 */
+    @ApiModelProperty(value = "七日用电上限", required = true, position = 10)
+    @NotNull(message = "sevenDayElectricityLower不能为空")
+    private BigDecimal sevenDayElectricityLower;
+
+    /** 七日用电下限 */
+    @ApiModelProperty(value = "七日用电下限", required = true, position = 11)
+    @NotNull(message = "sevenDayElectricityUpper不能为空")
+    private BigDecimal sevenDayElectricityUpper;
+
+}

+ 78 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdSyncParam.java

@@ -0,0 +1,78 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 能耗阈值添加参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Getter
+@Setter
+public class EnergyThresholdSyncParam {
+
+    /** 单元父id */
+    @ApiModelProperty(value = "单元父id", required = true, position = 2)
+    @NotBlank(message = "unitId不能为空")
+    private String unitId;
+
+    /** 用水下限 */
+    @ApiModelProperty(value = "用水下限", required = true, position = 4)
+    @NotNull(message = "waterLower不能为空")
+    private BigDecimal waterLower;
+
+    /** 用水上限 */
+    @ApiModelProperty(value = "用水上限", required = true, position = 5)
+    @NotNull(message = "waterUpper不能为空")
+    private BigDecimal waterUpper;
+
+    /** 用电下限 */
+    @ApiModelProperty(value = "用电下限", required = true, position = 6)
+    @NotNull(message = "electricityLower不能为空")
+    private BigDecimal electricityLower;
+
+    /** 用电上限 */
+    @ApiModelProperty(value = "用电上限", required = true, position = 7)
+    @NotNull(message = "electricityUpper不能为空")
+    private BigDecimal electricityUpper;
+
+    /** 七日用水下限 */
+    @ApiModelProperty(value = "七日用水下限", required = true, position = 8)
+    @NotNull(message = "sevenDayWaterLower不能为空")
+    private BigDecimal sevenDayWaterLower;
+
+    /** 七日用水上限 */
+    @ApiModelProperty(value = "七日用水上限", required = true, position = 9)
+    @NotNull(message = "sevenDayWaterUpper不能为空")
+    private BigDecimal sevenDayWaterUpper;
+
+    /** 七日用电上限 */
+    @ApiModelProperty(value = "七日用电上限", required = true, position = 10)
+    @NotNull(message = "sevenDayElectricityLower不能为空")
+    private BigDecimal sevenDayElectricityLower;
+
+    /** 七日用电下限 */
+    @ApiModelProperty(value = "七日用电下限", required = true, position = 11)
+    @NotNull(message = "sevenDayElectricityUpper不能为空")
+    private BigDecimal sevenDayElectricityUpper;
+
+}

+ 35 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/param/EnergyThresholdUnitIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 能耗阈值Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Getter
+@Setter
+public class EnergyThresholdUnitIdParam {
+
+    /** 单元父id */
+    @ApiModelProperty(value = "单元父id", required = true)
+    @NotBlank(message = "unitId不能为空")
+    private String unitId;
+}

+ 61 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/service/EnergyThresholdService.java

@@ -0,0 +1,61 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.modular.energy.energyThreshold.entity.EnergyThreshold;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdModifyParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSaveParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSyncParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdUnitIdParam;
+
+/**
+ * 能耗阈值Service接口
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+public interface EnergyThresholdService extends IService<EnergyThreshold> {
+
+    /**
+     * 根据单元ID获取阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    EnergyThreshold getThresholdByUnitId(EnergyThresholdUnitIdParam energyThresholdUnitIdParam);
+
+    /**
+     * 编辑能耗阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    void saveThreshold(EnergyThresholdSaveParam energyThresholdSaveParam);
+
+    /**
+     * 修改能耗阈值状态
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    void modifyThresholdStatus(EnergyThresholdModifyParam energyThresholdModifyParam);
+
+    /**
+     * 同步能耗阈值
+     *
+     * @author newspaper
+     * @date  2023/12/26 10:20
+     */
+    void syncThreshold(EnergyThresholdSyncParam energyThresholdSyncParam);
+}

+ 99 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyThreshold/service/impl/EnergyThresholdServiceImpl.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.energy.energyThreshold.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.modular.base.pigpen.entity.BasePigpen;
+import vip.xiaonuo.modular.base.pigpen.mapper.BasePigpenMapper;
+import vip.xiaonuo.modular.energy.energyThreshold.entity.EnergyThreshold;
+import vip.xiaonuo.modular.energy.energyThreshold.mapper.EnergyThresholdMapper;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdModifyParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSaveParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdSyncParam;
+import vip.xiaonuo.modular.energy.energyThreshold.param.EnergyThresholdUnitIdParam;
+import vip.xiaonuo.modular.energy.energyThreshold.service.EnergyThresholdService;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 能耗阈值Service接口实现类
+ *
+ * @author newspaper
+ * @date  2023/12/26 09:32
+ **/
+@Service
+public class EnergyThresholdServiceImpl extends ServiceImpl<EnergyThresholdMapper, EnergyThreshold> implements EnergyThresholdService {
+
+    @Autowired
+    private BasePigpenMapper basePigpenMapper;
+
+    @Override
+    public EnergyThreshold getThresholdByUnitId(EnergyThresholdUnitIdParam energyThresholdUnitIdParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        String unitId = energyThresholdUnitIdParam.getUnitId();
+        EnergyThreshold energyThreshold = this.getOne(new QueryWrapper<EnergyThreshold>().lambda().eq(EnergyThreshold::getOrgId, orgId).eq(EnergyThreshold::getUnitId, unitId));
+        if (ObjectUtil.isEmpty(energyThreshold)){
+            energyThreshold = new EnergyThreshold();
+            energyThreshold.setOrgId(orgId);
+            energyThreshold.setUnitId(unitId);
+            this.save(energyThreshold);
+        }
+        return energyThreshold;
+    }
+
+    @Override
+    public void saveThreshold(EnergyThresholdSaveParam energyThresholdSaveParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        EnergyThreshold energyThreshold = this.getOne(new QueryWrapper<EnergyThreshold>().lambda().eq(EnergyThreshold::getOrgId, orgId).eq(EnergyThreshold::getUnitId, energyThresholdSaveParam.getUnitId()));
+        BeanUtil.copyProperties(energyThresholdSaveParam,energyThreshold);
+        this.updateById(energyThreshold);
+    }
+
+    @Override
+    public void modifyThresholdStatus(EnergyThresholdModifyParam energyThresholdModifyParam) {
+        String unitId = energyThresholdModifyParam.getUnitId();
+        List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().like(BasePigpen::getPids, unitId).eq(BasePigpen::getType, 2));
+        List<String> unitIdList = basePigpens.stream().map(basePigpen -> basePigpen.getId()).collect(Collectors.toList());
+        this.update(new UpdateWrapper<EnergyThreshold>().lambda().set(EnergyThreshold::getIsEnable,energyThresholdModifyParam.getIsEnable()).in(EnergyThreshold::getUnitId,unitIdList));
+    }
+
+    @Override
+    public void syncThreshold(EnergyThresholdSyncParam energyThresholdSyncParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda()
+                .like(BasePigpen::getPids, energyThresholdSyncParam.getUnitId())
+                .eq(BasePigpen::getOrgId, orgId)
+                .eq(BasePigpen::getType,2));
+        List<String> unitList = basePigpens.stream().map(basePigpen -> basePigpen.getId()).collect(Collectors.toList());
+        this.remove(new QueryWrapper<EnergyThreshold>().lambda().in(EnergyThreshold::getUnitId,unitList));
+        List<EnergyThreshold> energyThresholds = new ArrayList<>();
+        for (String s : unitList) {
+            EnergyThreshold energyThreshold = new EnergyThreshold();
+            BeanUtil.copyProperties(energyThresholdSyncParam,energyThreshold);
+            energyThreshold.setUnitId(s);
+            energyThreshold.setOrgId(orgId);
+            energyThresholds.add(energyThreshold);
+        }
+        this.saveBatch(energyThresholds);
+    }
+}

+ 110 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/controller/EnvThresholdController.java

@@ -0,0 +1,110 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdModifyParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSaveParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSyncParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdUnitIdParam;
+import vip.xiaonuo.modular.env.envThreshold.service.EnvThresholdService;
+import vip.xiaonuo.modular.warning.warningManager.entity.vo.WarningManagerVo;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerTypeParam;
+
+import javax.annotation.Resource;
+
+/**
+ * 环控阈值控制器
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ */
+@Api(tags = "环控阈值控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class EnvThresholdController {
+
+    @Resource
+    private EnvThresholdService envThresholdService;
+
+    /**
+     * 根据单元ID获取阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("根据单元ID获取环控阈值")
+    @GetMapping("/env/envThreshold/getThresholdByUnitId")
+    public CommonResult<EnvThreshold> getThresholdByUnitId(EnvThresholdUnitIdParam envThresholdUnitIdParam) {
+        return CommonResult.data(envThresholdService.getThresholdByUnitId(envThresholdUnitIdParam));
+    }
+
+    /**
+     * 编辑环控阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("编辑环控阈值")
+    @GetMapping("/env/envThreshold/saveThreshold")
+    public CommonResult<String> saveThreshold(EnvThresholdSaveParam envThresholdSaveParam) {
+        envThresholdService.saveThreshold(envThresholdSaveParam);
+        return CommonResult.ok();
+    }
+
+
+    /**
+     * 修改环控阈值状态
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("修改环控阈值状态")
+    @GetMapping("/env/envThreshold/modifyThresholdStatus")
+    public CommonResult<String> modifyThresholdStatus(EnvThresholdModifyParam envThresholdModifyParam) {
+        envThresholdService.modifyThresholdStatus(envThresholdModifyParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 同步环控阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("同步环控阈值")
+    @GetMapping("/env/envThreshold/syncThreshold")
+    public CommonResult<String> syncThreshold(EnvThresholdSyncParam envThresholdSyncParam) {
+        envThresholdService.syncThreshold(envThresholdSyncParam);
+        return CommonResult.ok();
+    }
+
+
+
+}

+ 116 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/entity/EnvThreshold.java

@@ -0,0 +1,116 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 环控阈值实体
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+@TableName("env_threshold")
+public class EnvThreshold extends CommonEntity {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 春季温度上限 */
+    @ApiModelProperty(value = "春季温度上限", position = 2)
+    private BigDecimal springTemUpper;
+
+    /** 春季温度下限 */
+    @ApiModelProperty(value = "春季温度下限", position = 3)
+    private BigDecimal springTemLower;
+
+    /** 春季湿度上限 */
+    @ApiModelProperty(value = "春季湿度上限", position = 4)
+    private BigDecimal springHumiUpper;
+
+    /** 春季湿度下限 */
+    @ApiModelProperty(value = "春季湿度下限", position = 5)
+    private BigDecimal springHumiLower;
+
+    /** 夏季温度上限 */
+    @ApiModelProperty(value = "夏季温度上限", position = 6)
+    private BigDecimal summerTemUpper;
+
+    /** 夏季温度下限 */
+    @ApiModelProperty(value = "夏季温度下限", position = 7)
+    private BigDecimal summerTemLower;
+
+    /** 夏季湿度上限 */
+    @ApiModelProperty(value = "夏季湿度上限", position = 8)
+    private BigDecimal summerHumiUpper;
+
+    /** 夏季湿度下限 */
+    @ApiModelProperty(value = "夏季湿度下限", position = 9)
+    private BigDecimal summerHumiLower;
+
+    /** 秋季温度上限 */
+    @ApiModelProperty(value = "秋季温度上限", position = 10)
+    private BigDecimal autumnTemUpper;
+
+    /** 秋季温度下限 */
+    @ApiModelProperty(value = "秋季温度下限", position = 11)
+    private BigDecimal autumnTemLower;
+
+    /** 秋季湿度上限 */
+    @ApiModelProperty(value = "秋季湿度上限", position = 12)
+    private BigDecimal autumnHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", position = 13)
+    private BigDecimal autumnHumiLower;
+
+    /** 冬季温度上限 */
+    @ApiModelProperty(value = "冬季温度上限", position = 14)
+    private BigDecimal winterTemUpper;
+
+    /** 冬季温度下限 */
+    @ApiModelProperty(value = "冬季温度下限", position = 15)
+    private BigDecimal winterTemLower;
+
+    /** 冬季湿度上限 */
+    @ApiModelProperty(value = "冬季湿度上限", position = 16)
+    private BigDecimal winterHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", position = 17)
+    private BigDecimal winterHumiLower;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", position = 18)
+    private Integer isEnable;
+
+    /** 单元ID */
+    @ApiModelProperty(value = "单元ID", position = 19)
+    private String unitId;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 20)
+    @TableField(fill = FieldFill.INSERT)
+    private String orgId;
+}

+ 34 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/enums/EnvThresholdEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.enums;
+
+import lombok.Getter;
+
+/**
+ * 环控阈值枚举
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+public enum EnvThresholdEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    EnvThresholdEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/mapper/EnvThresholdMapper.java

@@ -0,0 +1,25 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+
+/**
+ * 环控阈值Mapper接口
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+public interface EnvThresholdMapper extends BaseMapper<EnvThreshold> {
+}

+ 5 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/mapper/mapping/EnvThresholdMapper.xml

@@ -0,0 +1,5 @@
+<?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="vip.xiaonuo.modular.env.envThreshold.mapper.EnvThresholdMapper">
+
+</mapper>

+ 40 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdModifyParam.java

@@ -0,0 +1,40 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 环控阈值Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+public class EnvThresholdModifyParam {
+
+    /** 单元ID */
+    @ApiModelProperty(value = "单元ID", required = true, position = 1)
+    @NotBlank(message = "单元父ID不能为空")
+    private String unitId;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", required = true, position = 2, example = "0:禁用 1:启用")
+    @NotBlank(message = "isEnable不能为空")
+    private String isEnable;
+}

+ 123 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdSaveParam.java

@@ -0,0 +1,123 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 环控阈值添加参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+public class EnvThresholdSaveParam {
+
+    /** 春季温度上限 */
+    @ApiModelProperty(value = "春季温度上限", required = true, position = 2)
+    @NotNull(message = "springTemUpper不能为空")
+    private BigDecimal springTemUpper;
+
+    /** 春季温度下限 */
+    @ApiModelProperty(value = "春季温度下限", required = true, position = 3)
+    @NotNull(message = "springTemLower不能为空")
+    private BigDecimal springTemLower;
+
+    /** 春季湿度上限 */
+    @ApiModelProperty(value = "春季湿度上限", required = true, position = 4)
+    @NotNull(message = "springHumiUpper不能为空")
+    private BigDecimal springHumiUpper;
+
+    /** 春季湿度下限 */
+    @ApiModelProperty(value = "春季湿度下限", required = true, position = 5)
+    @NotNull(message = "springHumiLower不能为空")
+    private BigDecimal springHumiLower;
+
+    /** 夏季温度上限 */
+    @ApiModelProperty(value = "夏季温度上限", required = true, position = 6)
+    @NotNull(message = "summerTemUpper不能为空")
+    private BigDecimal summerTemUpper;
+
+    /** 夏季温度下限 */
+    @ApiModelProperty(value = "夏季温度下限", required = true, position = 7)
+    @NotNull(message = "summerTemLower不能为空")
+    private BigDecimal summerTemLower;
+
+    /** 夏季湿度上限 */
+    @ApiModelProperty(value = "夏季湿度上限", required = true, position = 8)
+    @NotNull(message = "summerHumiUpper不能为空")
+    private BigDecimal summerHumiUpper;
+
+    /** 夏季湿度下限 */
+    @ApiModelProperty(value = "夏季湿度下限", required = true, position = 9)
+    @NotNull(message = "summerHumiLower不能为空")
+    private BigDecimal summerHumiLower;
+
+    /** 秋季温度上限 */
+    @ApiModelProperty(value = "秋季温度上限", required = true, position = 10)
+    @NotNull(message = "autumnTemUpper不能为空")
+    private BigDecimal autumnTemUpper;
+
+    /** 秋季温度下限 */
+    @ApiModelProperty(value = "秋季温度下限", required = true, position = 11)
+    @NotNull(message = "autumnTemLower不能为空")
+    private BigDecimal autumnTemLower;
+
+    /** 秋季湿度上限 */
+    @ApiModelProperty(value = "秋季湿度上限", required = true, position = 12)
+    @NotNull(message = "autumnHumiUpper不能为空")
+    private BigDecimal autumnHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", required = true, position = 13)
+    @NotNull(message = "autumnHumiLower不能为空")
+    private BigDecimal autumnHumiLower;
+
+    /** 冬季温度上限 */
+    @ApiModelProperty(value = "冬季温度上限", required = true, position = 14)
+    @NotNull(message = "winterTemUpper不能为空")
+    private BigDecimal winterTemUpper;
+
+    /** 冬季温度下限 */
+    @ApiModelProperty(value = "冬季温度下限", required = true, position = 15)
+    @NotNull(message = "winterTemLower不能为空")
+    private BigDecimal winterTemLower;
+
+    /** 冬季湿度上限 */
+    @ApiModelProperty(value = "冬季湿度上限", required = true, position = 16)
+    @NotNull(message = "winterHumiUpper不能为空")
+    private BigDecimal winterHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", required = true, position = 17)
+    @NotNull(message = "winterHumiLower不能为空")
+    private BigDecimal winterHumiLower;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", required = true, position = 18)
+    @NotNull(message = "isEnable不能为空")
+    private Integer isEnable;
+
+    /** 单元ID */
+    @ApiModelProperty(value = "单元ID", required = true, position = 19)
+    @NotBlank(message = "unitId不能为空")
+    private String unitId;
+}

+ 117 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdSyncParam.java

@@ -0,0 +1,117 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 环控阈值添加参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+public class EnvThresholdSyncParam {
+
+    /** 春季温度上限 */
+    @ApiModelProperty(value = "春季温度上限", required = true, position = 1)
+    @NotNull(message = "springTemUpper不能为空")
+    private BigDecimal springTemUpper;
+
+    /** 春季温度下限 */
+    @ApiModelProperty(value = "春季温度下限", required = true, position = 2)
+    @NotNull(message = "springTemLower不能为空")
+    private BigDecimal springTemLower;
+
+    /** 春季湿度上限 */
+    @ApiModelProperty(value = "春季湿度上限", required = true, position = 3)
+    @NotNull(message = "springHumiUpper不能为空")
+    private BigDecimal springHumiUpper;
+
+    /** 春季湿度下限 */
+    @ApiModelProperty(value = "春季湿度下限", required = true, position = 4)
+    @NotNull(message = "springHumiLower不能为空")
+    private BigDecimal springHumiLower;
+
+    /** 夏季温度上限 */
+    @ApiModelProperty(value = "夏季温度上限", required = true, position = 5)
+    @NotNull(message = "summerTemUpper不能为空")
+    private BigDecimal summerTemUpper;
+
+    /** 夏季温度下限 */
+    @ApiModelProperty(value = "夏季温度下限", required = true, position = 6)
+    @NotNull(message = "summerTemLower不能为空")
+    private BigDecimal summerTemLower;
+
+    /** 夏季湿度上限 */
+    @ApiModelProperty(value = "夏季湿度上限", required = true, position = 7)
+    @NotNull(message = "summerHumiUpper不能为空")
+    private BigDecimal summerHumiUpper;
+
+    /** 夏季湿度下限 */
+    @ApiModelProperty(value = "夏季湿度下限", required = true, position = 8)
+    @NotNull(message = "summerHumiLower不能为空")
+    private BigDecimal summerHumiLower;
+
+    /** 秋季温度上限 */
+    @ApiModelProperty(value = "秋季温度上限", required = true, position = 9)
+    @NotNull(message = "autumnTemUpper不能为空")
+    private BigDecimal autumnTemUpper;
+
+    /** 秋季温度下限 */
+    @ApiModelProperty(value = "秋季温度下限", required = true, position = 10)
+    @NotNull(message = "autumnTemLower不能为空")
+    private BigDecimal autumnTemLower;
+
+    /** 秋季湿度上限 */
+    @ApiModelProperty(value = "秋季湿度上限", required = true, position = 11)
+    @NotNull(message = "autumnHumiUpper不能为空")
+    private BigDecimal autumnHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", required = true, position = 12)
+    @NotNull(message = "autumnHumiLower不能为空")
+    private BigDecimal autumnHumiLower;
+
+    /** 冬季温度上限 */
+    @ApiModelProperty(value = "冬季温度上限", required = true, position = 13)
+    @NotNull(message = "winterTemUpper不能为空")
+    private BigDecimal winterTemUpper;
+
+    /** 冬季温度下限 */
+    @ApiModelProperty(value = "冬季温度下限", required = true, position = 14)
+    @NotNull(message = "winterTemLower不能为空")
+    private BigDecimal winterTemLower;
+
+    /** 冬季湿度上限 */
+    @ApiModelProperty(value = "冬季湿度上限", required = true, position = 15)
+    @NotNull(message = "winterHumiUpper不能为空")
+    private BigDecimal winterHumiUpper;
+
+    /** 冬季湿度下限 */
+    @ApiModelProperty(value = "冬季湿度下限", required = true, position = 16)
+    @NotNull(message = "winterHumiLower不能为空")
+    private BigDecimal winterHumiLower;
+
+    /** 单元父ID */
+    @ApiModelProperty(value = "单元父ID", required = true, position = 17)
+    @NotBlank(message = "单元父ID不能为空")
+    private String unitId;
+}

+ 35 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/param/EnvThresholdUnitIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 环控阈值Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Getter
+@Setter
+public class EnvThresholdUnitIdParam {
+
+    /** 单元ID */
+    @ApiModelProperty(value = "单元ID", required = true)
+    @NotBlank(message = "单元ID不能为空")
+    private String unitId;
+}

+ 61 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/service/EnvThresholdService.java

@@ -0,0 +1,61 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdModifyParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSaveParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSyncParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdUnitIdParam;
+
+/**
+ * 环控阈值Service接口
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+public interface EnvThresholdService extends IService<EnvThreshold> {
+
+    /**
+     * 根据单元ID获取阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    EnvThreshold getThresholdByUnitId(EnvThresholdUnitIdParam envThresholdUnitIdParam);
+
+    /**
+     * 编辑环控阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    void saveThreshold(EnvThresholdSaveParam envThresholdSaveParam);
+
+    /**
+     * 修改环控阈值状态
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    void modifyThresholdStatus(EnvThresholdModifyParam envThresholdModifyParam);
+
+    /**
+     * 同步环控阈值
+     *
+     * @author newspaper
+     * @date  2023/12/25 15:45
+     */
+    void syncThreshold(EnvThresholdSyncParam envThresholdSyncParam);
+}

+ 101 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envThreshold/service/impl/EnvThresholdServiceImpl.java

@@ -0,0 +1,101 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.env.envThreshold.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.modular.base.pigpen.entity.BasePigpen;
+import vip.xiaonuo.modular.base.pigpen.mapper.BasePigpenMapper;
+import vip.xiaonuo.modular.env.envThreshold.entity.EnvThreshold;
+import vip.xiaonuo.modular.env.envThreshold.mapper.EnvThresholdMapper;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdModifyParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSaveParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdSyncParam;
+import vip.xiaonuo.modular.env.envThreshold.param.EnvThresholdUnitIdParam;
+import vip.xiaonuo.modular.env.envThreshold.service.EnvThresholdService;
+
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 环控阈值Service接口实现类
+ *
+ * @author newspaper
+ * @date  2023/12/25 15:38
+ **/
+@Service
+public class EnvThresholdServiceImpl extends ServiceImpl<EnvThresholdMapper, EnvThreshold> implements EnvThresholdService {
+
+    @Autowired
+    private BasePigpenMapper basePigpenMapper;
+
+    @Override
+    public EnvThreshold getThresholdByUnitId(EnvThresholdUnitIdParam envThresholdUnitIdParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        String unitId = envThresholdUnitIdParam.getUnitId();
+        EnvThreshold envThreshold = this.getOne(new QueryWrapper<EnvThreshold>().lambda().eq(EnvThreshold::getOrgId, orgId).eq(EnvThreshold::getUnitId, unitId));
+        if (ObjectUtil.isEmpty(envThreshold)){
+            envThreshold = new EnvThreshold();
+            envThreshold.setOrgId(orgId);
+            envThreshold.setUnitId(unitId);
+            this.save(envThreshold);
+        }
+        return envThreshold;
+    }
+
+    @Override
+    public void saveThreshold(EnvThresholdSaveParam envThresholdSaveParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        EnvThreshold envThreshold = this.getOne(new QueryWrapper<EnvThreshold>().lambda().eq(EnvThreshold::getOrgId, orgId).eq(EnvThreshold::getUnitId, envThresholdSaveParam.getUnitId()));
+        BeanUtil.copyProperties(envThresholdSaveParam,envThreshold);
+        this.updateById(envThreshold);
+    }
+
+    @Override
+    public void modifyThresholdStatus(EnvThresholdModifyParam envThresholdModifyParam) {
+        String unitId = envThresholdModifyParam.getUnitId();
+        List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().like(BasePigpen::getPids, unitId).eq(BasePigpen::getType, 2));
+        List<String> unitIdList = basePigpens.stream().map(basePigpen -> basePigpen.getId()).collect(Collectors.toList());
+        this.update(new UpdateWrapper<EnvThreshold>().lambda().set(EnvThreshold::getIsEnable,envThresholdModifyParam.getIsEnable()).in(EnvThreshold::getUnitId,unitIdList));
+    }
+
+    @Override
+    @Transactional
+    public void syncThreshold(EnvThresholdSyncParam envThresholdSyncParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda()
+                .like(BasePigpen::getPids, envThresholdSyncParam.getUnitId())
+                .eq(BasePigpen::getOrgId, orgId)
+                .eq(BasePigpen::getType,2));
+        List<String> unitList = basePigpens.stream().map(basePigpen -> basePigpen.getId()).collect(Collectors.toList());
+        this.remove(new QueryWrapper<EnvThreshold>().lambda().in(EnvThreshold::getUnitId,unitList));
+        List<EnvThreshold> envThresholds = new ArrayList<>();
+        for (String s : unitList) {
+            EnvThreshold envThreshold = new EnvThreshold();
+            BeanUtil.copyProperties(envThresholdSyncParam,envThreshold);
+            envThreshold.setUnitId(s);
+            envThreshold.setOrgId(orgId);
+            envThresholds.add(envThreshold);
+        }
+        this.saveBatch(envThresholds);
+    }
+}

+ 99 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/controller/WarningInfoController.java

@@ -0,0 +1,99 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.annotation.CommonLog;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.common.pojo.CommonValidList;
+import vip.xiaonuo.modular.warning.warningInfo.entity.WarningInfo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoListVo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoProportionVo;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoAddParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoEditParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoIdParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoPageParam;
+import vip.xiaonuo.modular.warning.warningInfo.service.WarningInfoService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+/**
+ * 预警控制器
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ */
+@Api(tags = "预警控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class WarningInfoController {
+
+    @Resource
+    private WarningInfoService warningInfoService;
+
+    /**
+     * 获取预警分页
+     *
+     * @author newspaper
+     * @date  2023/12/26 13:40
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取预警分页")
+    @GetMapping("/warning/warningInfo/page")
+    public CommonResult<Page<WarningInfo>> page(WarningInfoPageParam warningInfoPageParam) {
+        return CommonResult.data(warningInfoService.page(warningInfoPageParam));
+    }
+
+    /**
+     * 获取预警占比
+     *
+     * @author newspaper
+     * @date  2023/12/26 13:40
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("获取预警占比")
+    @GetMapping("/warning/warningInfo/getProportion")
+    public CommonResult<WarningInfoProportionVo> getProportion() {
+        return CommonResult.data(warningInfoService.getProportion());
+    }
+
+    /**
+     * 获取近七天预警
+     *
+     * @author newspaper
+     * @date  2023/12/26 13:40
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("获取近七天预警")
+    @GetMapping("/warning/warningInfo/listSevenDayWarning")
+    public CommonResult<List<WarningInfoListVo>> listSevenDayWarning() {
+        return CommonResult.data(warningInfoService.listSevenDayWarning());
+    }
+
+
+
+}

+ 75 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/WarningInfo.java

@@ -0,0 +1,75 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fhs.core.trans.anno.Trans;
+import com.fhs.core.trans.constant.TransType;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+import vip.xiaonuo.modular.base.pigpen.entity.BasePigpen;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警实体
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+@Setter
+@TableName("warning_info")
+public class WarningInfo extends CommonEntity {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 预警类型 */
+    @ApiModelProperty(value = "预警类型", position = 2)
+    private String warningType;
+
+    /** 预警内容 */
+    @ApiModelProperty(value = "预警内容", position = 3)
+    private String warningContent;
+
+    /** 预警位置ID */
+    @ApiModelProperty(value = "预警位置ID", position = 4)
+    @Trans(type = TransType.SIMPLE,target = BasePigpen.class,fields = "fullName", alias = "unit", ref = "buildName")
+    private String unitId;
+
+    /** 预警状态 */
+    @ApiModelProperty(value = "预警状态", position = 5)
+    private Integer warningStatus;
+
+    /** 通知人ID */
+    @ApiModelProperty(value = "通知人ID", position = 6,example = "以逗号区分")
+    private String warningNotifierId;
+
+    /** 预警时间 */
+    @ApiModelProperty(value = "预警时间", position = 7)
+    private Date warningTime;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 8)
+    private String orgId;
+
+    @ApiModelProperty(value = "通知人名称", position = 9)
+    @TableField(exist = false)
+    private String warningNotifierName;
+}

+ 19 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoListVo.java

@@ -0,0 +1,19 @@
+package vip.xiaonuo.modular.warning.warningInfo.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class WarningInfoListVo {
+    @ApiModelProperty(value = "预警日期", position = 1)
+    @JsonFormat(pattern = "yyyy-MM-dd" ,timezone = "GMT+8")
+    private Date warningTime;
+
+    @ApiModelProperty(value = "预警数量", position = 2)
+    private Long warningQuantity;
+
+
+}

+ 16 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoProportionVo.java

@@ -0,0 +1,16 @@
+package vip.xiaonuo.modular.warning.warningInfo.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class WarningInfoProportionVo {
+    @ApiModelProperty(value = "本月预警数量", position = 1)
+    private Long total;
+
+    @ApiModelProperty(value = "比例列表", position = 2)
+    private List<WarningInfoRateVo> rateList;
+
+}

+ 18 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/entity/vo/WarningInfoRateVo.java

@@ -0,0 +1,18 @@
+package vip.xiaonuo.modular.warning.warningInfo.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class WarningInfoRateVo {
+    @ApiModelProperty(value = "预警类型", position = 1)
+    private String typeName;
+
+    @ApiModelProperty(value = "预警数量", position = 2)
+    private Long warningQuantity;
+
+    @ApiModelProperty(value = "占比", position = 3)
+    private BigDecimal proportion;
+}

+ 34 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/enums/WarningInfoEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.enums;
+
+import lombok.Getter;
+
+/**
+ * 预警枚举
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+public enum WarningInfoEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    WarningInfoEnum(String value) {
+        this.value = value;
+    }
+}

+ 29 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/mapper/WarningInfoMapper.java

@@ -0,0 +1,29 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.modular.warning.warningInfo.entity.WarningInfo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoListVo;
+
+import java.util.List;
+
+/**
+ * 预警Mapper接口
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+public interface WarningInfoMapper extends BaseMapper<WarningInfo> {
+    List<WarningInfoListVo> listSevenDayWarning(String orgId);
+}

+ 20 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/mapper/mapping/WarningInfoMapper.xml

@@ -0,0 +1,20 @@
+<?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="vip.xiaonuo.modular.warning.warningInfo.mapper.WarningInfoMapper">
+
+    <select id="listSevenDayWarning" resultType="vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoListVo"
+            parameterType="java.lang.String">
+        SELECT
+            DATE(warning_time) AS warningTime,
+            COUNT(*) AS warningQuantity
+        FROM
+            `warning_info`
+        WHERE
+            org_id = #{orgId}
+            AND warning_time BETWEEN DATE_SUB(CURDATE(), INTERVAL 6 DAY) AND CURDATE()
+        GROUP BY
+            DATE(warning_time)
+        ORDER BY
+            warningTime;
+    </select>
+</mapper>

+ 62 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoAddParam.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警添加参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+@Setter
+public class WarningInfoAddParam {
+
+    /** 预警类型 */
+    @ApiModelProperty(value = "预警类型", position = 2)
+    private String warningType;
+
+    /** 预警内容 */
+    @ApiModelProperty(value = "预警内容", position = 3)
+    private String warningContent;
+
+    /** 预警位置ID */
+    @ApiModelProperty(value = "预警位置ID", position = 4)
+    private String unitId;
+
+    /** 预警状态 */
+    @ApiModelProperty(value = "预警状态", position = 5)
+    private Integer warningStatus;
+
+    /** 通知人ID */
+    @ApiModelProperty(value = "通知人ID", position = 6)
+    private String warningNotifierId;
+
+    /** 预警时间 */
+    @ApiModelProperty(value = "预警时间", position = 7)
+    private Date warningTime;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 8)
+    private String orgId;
+
+}

+ 67 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoEditParam.java

@@ -0,0 +1,67 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警编辑参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+@Setter
+public class WarningInfoEditParam {
+
+    /** id */
+    @ApiModelProperty(value = "id", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 预警类型 */
+    @ApiModelProperty(value = "预警类型", position = 2)
+    private String warningType;
+
+    /** 预警内容 */
+    @ApiModelProperty(value = "预警内容", position = 3)
+    private String warningContent;
+
+    /** 预警位置ID */
+    @ApiModelProperty(value = "预警位置ID", position = 4)
+    private String unitId;
+
+    /** 预警状态 */
+    @ApiModelProperty(value = "预警状态", position = 5)
+    private Integer warningStatus;
+
+    /** 通知人ID */
+    @ApiModelProperty(value = "通知人ID", position = 6)
+    private String warningNotifierId;
+
+    /** 预警时间 */
+    @ApiModelProperty(value = "预警时间", position = 7)
+    private Date warningTime;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 8)
+    private String orgId;
+
+}

+ 35 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoIdParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 预警Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+@Setter
+public class WarningInfoIdParam {
+
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 62 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/param/WarningInfoPageParam.java

@@ -0,0 +1,62 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警查询参数
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Getter
+@Setter
+public class WarningInfoPageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 预警类型 */
+    @ApiModelProperty(value = "预警类型")
+    private String warningType;
+
+    /** 预警位置ID */
+    @ApiModelProperty(value = "预警位置ID")
+    private String unitId;
+
+    /** 显示类型 */
+    @ApiModelProperty(value = "显示类型", required = true, example = "0:今日, 1:本周, 2:本月, 3:自定义")
+    @NotBlank(message = "显示类型不能为空")
+    private String type;
+
+    /** 预警时间开始 */
+    @ApiModelProperty(value = "预警时间开始")
+    private String startWarningTime;
+
+    /** 预警时间结束 */
+    @ApiModelProperty(value = "预警时间结束")
+    private String endWarningTime;
+
+}

+ 46 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/service/WarningInfoService.java

@@ -0,0 +1,46 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.modular.warning.warningInfo.entity.WarningInfo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoListVo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoProportionVo;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoAddParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoEditParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoIdParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoPageParam;
+
+import java.util.List;
+
+/**
+ * 预警Service接口
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+public interface WarningInfoService extends IService<WarningInfo> {
+
+    /**
+     * 获取预警分页
+     *
+     * @author newspaper
+     * @date  2023/12/26 13:40
+     */
+    Page<WarningInfo> page(WarningInfoPageParam warningInfoPageParam);
+
+    WarningInfoProportionVo getProportion();
+
+    List<WarningInfoListVo> listSevenDayWarning();
+}

+ 156 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningInfo/service/impl/WarningInfoServiceImpl.java

@@ -0,0 +1,156 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningInfo.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.exception.CommonException;
+import vip.xiaonuo.common.page.CommonPageRequest;
+import vip.xiaonuo.modular.base.baseConfig.entity.BaseConfig;
+import vip.xiaonuo.modular.base.baseConfig.mapper.BaseConfigMapper;
+import vip.xiaonuo.modular.warning.warningInfo.entity.WarningInfo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoListVo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoProportionVo;
+import vip.xiaonuo.modular.warning.warningInfo.entity.vo.WarningInfoRateVo;
+import vip.xiaonuo.modular.warning.warningInfo.mapper.WarningInfoMapper;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoAddParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoEditParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoIdParam;
+import vip.xiaonuo.modular.warning.warningInfo.param.WarningInfoPageParam;
+import vip.xiaonuo.modular.warning.warningInfo.service.WarningInfoService;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
+import vip.xiaonuo.sys.modular.user.mapper.SysUserMapper;
+
+import javax.validation.constraints.NotBlank;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 预警Service接口实现类
+ *
+ * @author newspaper
+ * @date  2023/12/26 13:40
+ **/
+@Service
+public class WarningInfoServiceImpl extends ServiceImpl<WarningInfoMapper, WarningInfo> implements WarningInfoService {
+
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    @Autowired
+    private BaseConfigMapper baseConfigMapper;
+
+    @Autowired
+    private WarningInfoMapper warningInfoMapper;
+
+    @Override
+    public Page<WarningInfo> page(WarningInfoPageParam warningInfoPageParam) {
+        String type = warningInfoPageParam.getType();
+        QueryWrapper<WarningInfo> queryWrapper = new QueryWrapper<>();
+        if(ObjectUtil.isNotEmpty(warningInfoPageParam.getWarningType())) {
+            queryWrapper.lambda().eq(WarningInfo::getWarningType, warningInfoPageParam.getWarningType());
+        }
+        if(ObjectUtil.isNotEmpty(warningInfoPageParam.getUnitId())) {
+            queryWrapper.lambda().eq(WarningInfo::getUnitId, warningInfoPageParam.getUnitId());
+        }
+        switch (type) {
+            case "0":
+                // 处理今日的逻辑
+                queryWrapper.lambda().between(WarningInfo::getWarningTime, DateUtil.beginOfDay(new Date()), DateUtil.endOfDay(new Date()));
+                break;
+            case "1":
+                // 处理本周的逻辑
+                queryWrapper.lambda().ge(WarningInfo::getWarningTime, DateUtil.beginOfWeek(new Date()));
+                break;
+            case "2":
+                // 处理本月的逻辑
+                queryWrapper.lambda().ge(WarningInfo::getWarningTime, DateUtil.beginOfMonth(new Date()));
+                break;
+            case "3":
+                // 处理自定义时间范围的逻辑
+                String startWarningTime = warningInfoPageParam.getStartWarningTime() + " 00:00:00";
+                String endWarningTime = warningInfoPageParam.getEndWarningTime() + " 23:59:59";
+                queryWrapper.lambda().between(WarningInfo::getWarningTime, startWarningTime, endWarningTime);
+                break;
+            default:
+                throw new CommonException("显示类型不存在!");
+        }
+        queryWrapper.lambda().orderByDesc(WarningInfo::getWarningTime);
+        Page<WarningInfo> warningInfoPage = this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        List<WarningInfo> warningInfoList = warningInfoPage.getRecords();
+        for (WarningInfo warningInfo : warningInfoList) {
+            String[] split = warningInfo.getWarningNotifierId().split(",");
+            for (String s : split) {
+                String name = sysUserMapper.selectById(s).getName();
+                if (ObjectUtil.isNotEmpty(warningInfo.getWarningNotifierName())){
+                    warningInfo.setWarningNotifierName(warningInfo.getWarningNotifierName() + "," + name);
+                }else {
+                    warningInfo.setWarningNotifierName(name);
+                }
+            }
+        }
+        return warningInfoPage;
+    }
+
+    @Override
+    public WarningInfoProportionVo getProportion() {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        WarningInfoProportionVo warningInfoProportionVo = new WarningInfoProportionVo();
+        long total = this.count(new QueryWrapper<WarningInfo>().lambda().eq(WarningInfo::getOrgId, orgId).ge(WarningInfo::getWarningTime, DateUtil.beginOfMonth(new Date())));
+        warningInfoProportionVo.setTotal(total);
+
+        String parentConfig = baseConfigMapper.selectOne(new QueryWrapper<BaseConfig>().lambda().eq(BaseConfig::getParentId, 0).eq(BaseConfig::getConfigName, "预警类型")).getId();
+        List<BaseConfig> baseConfigs = baseConfigMapper.selectList(new QueryWrapper<BaseConfig>().lambda().eq(BaseConfig::getParentId, parentConfig).orderByAsc(BaseConfig::getSortCode));
+        List<String> types = baseConfigs.stream().map(baseConfig -> baseConfig.getConfigName()).collect(Collectors.toList());
+        List<WarningInfoRateVo> warningInfoRateVoList = new ArrayList<>();
+
+        for (String type : types) {
+            WarningInfoRateVo warningInfoRateVo = new WarningInfoRateVo();
+            long count = this.count(new QueryWrapper<WarningInfo>().lambda().eq(WarningInfo::getOrgId, orgId).eq(WarningInfo::getWarningType, type).ge(WarningInfo::getWarningTime, DateUtil.beginOfMonth(new Date())));
+            warningInfoRateVo.setTypeName(type);
+            warningInfoRateVo.setWarningQuantity(count);
+
+            // 使用 BigDecimal 进行比例计算
+            BigDecimal countBigDecimal = BigDecimal.valueOf(count);
+            BigDecimal totalBigDecimal = BigDecimal.valueOf(total);
+            BigDecimal proportion = countBigDecimal.divide(totalBigDecimal, 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
+
+            warningInfoRateVo.setProportion(proportion);
+            warningInfoRateVoList.add(warningInfoRateVo);
+        }
+        warningInfoProportionVo.setRateList(warningInfoRateVoList);
+        return warningInfoProportionVo;
+    }
+
+    @Override
+    public List<WarningInfoListVo> listSevenDayWarning() {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        List<WarningInfoListVo> warningInfoListVoList = warningInfoMapper.listSevenDayWarning(orgId);
+        return warningInfoListVoList;
+    }
+}

+ 77 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/controller/WarningManagerController.java

@@ -0,0 +1,77 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.controller;
+
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import com.github.xiaoymin.knife4j.annotations.ApiSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.modular.warning.warningManager.entity.vo.WarningManagerVo;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerSaveParam;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerTypeParam;
+import vip.xiaonuo.modular.warning.warningManager.service.WarningManagerService;
+
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 预警负责人控制器
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ */
+@Api(tags = "预警负责人控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class WarningManagerController {
+
+    @Resource
+    private WarningManagerService warningManagerService;
+
+    /**
+     * 根据类型获取预警负责人
+     *
+     * @author newspaper
+     * @date  2023/12/25 09:36
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("根据类型获取预警负责人")
+    @GetMapping("/warning/warningManager/getManagerByType")
+    public CommonResult<WarningManagerVo> getManagerByType(WarningManagerTypeParam warningManagerTypeParam) {
+        return CommonResult.data(warningManagerService.getManagerByType(warningManagerTypeParam));
+    }
+
+    /**
+     * 保存预警负责人
+     *
+     * @author newspaper
+     * @date  2023/12/25 09:36
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("保存预警负责人")
+    @PostMapping("/warning/warningManager/saveManager")
+    public CommonResult<String> saveManager(@RequestBody @Valid WarningManagerSaveParam warningManagerSaveParam) {
+        warningManagerService.saveManager(warningManagerSaveParam);
+        return CommonResult.ok();
+    }
+
+
+}

+ 60 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/entity/WarningManager.java

@@ -0,0 +1,60 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import vip.xiaonuo.common.pojo.CommonEntity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 预警负责人实体
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+@Getter
+@Setter
+@TableName("warning_manager")
+public class WarningManager extends CommonEntity {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 一级负责人ID */
+    @ApiModelProperty(value = "一级负责人ID", position = 2)
+    private String firstManagerId;
+
+    /** 二级负责人ID */
+    @ApiModelProperty(value = "二级负责人ID", position = 3)
+    private String secondManagerId;
+
+    /** 预警类型 0:环控 1:能耗 */
+    @ApiModelProperty(value = "预警类型 0:环控 1:能耗", position = 4)
+    private Integer type;
+
+    /** 预警升级时间(分钟) */
+    @ApiModelProperty(value = "预警升级时间(分钟)", position = 5)
+    private Integer wanringUpgradeTime;
+
+    /** 组织ID */
+    @ApiModelProperty(value = "组织ID", position = 6)
+    @TableField(fill = FieldFill.INSERT)
+    private String orgId;
+}

+ 19 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/entity/vo/WarningManagerVo.java

@@ -0,0 +1,19 @@
+package vip.xiaonuo.modular.warning.warningManager.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import vip.xiaonuo.sys.modular.user.entity.vo.UserPhoneVo;
+
+import java.util.List;
+
+@Data
+public class WarningManagerVo {
+    @ApiModelProperty(value = "一级负责人", position = 1)
+    private List<UserPhoneVo> firstManager;
+
+    @ApiModelProperty(value = "二级负责人", position = 2)
+    private List<UserPhoneVo> secondManager;
+
+    @ApiModelProperty(value = "预警升级时间", position = 3)
+    private Integer wanringUpgradeTime;
+}

+ 34 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/enums/WarningManagerEnum.java

@@ -0,0 +1,34 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.enums;
+
+import lombok.Getter;
+
+/**
+ * 预警负责人枚举
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+@Getter
+public enum WarningManagerEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    WarningManagerEnum(String value) {
+        this.value = value;
+    }
+}

+ 26 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/WarningManagerMapper.java

@@ -0,0 +1,26 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.modular.warning.warningManager.entity.WarningManager;
+
+/**
+ * 预警负责人Mapper接口
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+public interface WarningManagerMapper extends BaseMapper<WarningManager> {
+}

+ 5 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/mapping/WarningManagerMapper.xml

@@ -0,0 +1,5 @@
+<?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="vip.xiaonuo.modular.warning.warningManager.mapper.WarningManagerMapper">
+
+</mapper>

+ 23 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/param/WarningManagerSaveParam.java

@@ -0,0 +1,23 @@
+package vip.xiaonuo.modular.warning.warningManager.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class WarningManagerSaveParam {
+    @ApiModelProperty(value = "一级负责人,以&comma;分割", position = 1)
+    private String firstManagerId;
+
+    @ApiModelProperty(value = "二级负责人,以&comma;分割", position = 2)
+    private String secondManagerId;
+
+    @ApiModelProperty(value = "预警升级时间 ", position = 3)
+    private Integer wanringUpgradeTime;
+
+    @ApiModelProperty(value = "预警类型 0:环控 1:能耗 ", position = 4)
+    @NotBlank(message = "预警类型不能为空")
+    private Integer type;
+}

+ 35 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/param/WarningManagerTypeParam.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 预警负责人Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+@Getter
+@Setter
+public class WarningManagerTypeParam {
+
+    /** 预警类型 */
+    @ApiModelProperty(value = "预警类型", required = true, example = "0:环控 1:能耗")
+    @NotBlank(message = "预警类型不能为空")
+    private Integer type;
+}

+ 33 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/service/WarningManagerService.java

@@ -0,0 +1,33 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.service;
+
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.modular.warning.warningManager.entity.WarningManager;
+import vip.xiaonuo.modular.warning.warningManager.entity.vo.WarningManagerVo;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerSaveParam;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerTypeParam;
+
+/**
+ * 预警负责人Service接口
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+public interface WarningManagerService extends IService<WarningManager> {
+
+    WarningManagerVo getManagerByType(WarningManagerTypeParam warningManagerTypeParam);
+
+    void saveManager(WarningManagerSaveParam warningManagerSaveParam);
+}

+ 108 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/service/impl/WarningManagerServiceImpl.java

@@ -0,0 +1,108 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.modular.warning.warningManager.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.modular.warning.warningManager.entity.WarningManager;
+import vip.xiaonuo.modular.warning.warningManager.entity.vo.WarningManagerVo;
+import vip.xiaonuo.modular.warning.warningManager.mapper.WarningManagerMapper;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerSaveParam;
+import vip.xiaonuo.modular.warning.warningManager.param.WarningManagerTypeParam;
+import vip.xiaonuo.modular.warning.warningManager.service.WarningManagerService;
+import vip.xiaonuo.sys.modular.user.entity.SysUser;
+import vip.xiaonuo.sys.modular.user.entity.vo.UserPhoneVo;
+import vip.xiaonuo.sys.modular.user.service.SysUserService;
+
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 预警负责人Service接口实现类
+ *
+ * @author newspaper
+ * @date  2023/12/25 09:36
+ **/
+@Service
+public class WarningManagerServiceImpl extends ServiceImpl<WarningManagerMapper, WarningManager> implements WarningManagerService {
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @Override
+    public WarningManagerVo getManagerByType(WarningManagerTypeParam warningManagerTypeParam) {
+        Integer type = warningManagerTypeParam.getType();
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        WarningManager warningManager = this.getOne(new QueryWrapper<WarningManager>().lambda().eq(WarningManager::getType, type).eq(WarningManager::getOrgId, orgId));
+        if (ObjectUtil.isEmpty(warningManager)){
+            warningManager = new WarningManager();
+            warningManager.setOrgId(orgId);
+            warningManager.setType(type);
+            this.save(warningManager);
+        }
+        WarningManagerVo warningManagerVo = new WarningManagerVo();
+        List<UserPhoneVo> firstUserPhoneVoList = new ArrayList<>();
+        List<UserPhoneVo> secondUserPhoneVoList = new ArrayList<>();
+        String firstManagerId = warningManager.getFirstManagerId();
+        if (ObjectUtil.isNotEmpty(firstManagerId)){
+            String[] firstManagers = firstManagerId.split(",");
+            for (String firstManager : firstManagers) {
+                SysUser sysUser = sysUserService.queryEntity(firstManager);
+                UserPhoneVo userPhoneVo = new UserPhoneVo();
+                userPhoneVo.setName(sysUser.getName());
+                if (ObjectUtil.isNotEmpty(sysUser.getPhone())){
+                    userPhoneVo.setPhone(sysUser.getPhone());
+                }
+                firstUserPhoneVoList.add(userPhoneVo);
+            }
+            warningManagerVo.setFirstManager(firstUserPhoneVoList);
+        }
+        String secondManager = warningManager.getSecondManagerId();
+        if (ObjectUtil.isNotEmpty(secondManager)){
+            String[] firstManagers = secondManager.split(",");
+            for (String firstManager : firstManagers) {
+                SysUser sysUser = sysUserService.queryEntity(firstManager);
+                UserPhoneVo userPhoneVo = new UserPhoneVo();
+                userPhoneVo.setName(sysUser.getName());
+                if (ObjectUtil.isNotEmpty(sysUser.getPhone())){
+                    userPhoneVo.setPhone(sysUser.getPhone());
+                }
+                secondUserPhoneVoList.add(userPhoneVo);
+            }
+            warningManagerVo.setSecondManager(secondUserPhoneVoList);
+        }
+        if (ObjectUtil.isNotEmpty(warningManager.getWanringUpgradeTime())){
+            warningManagerVo.setWanringUpgradeTime(warningManager.getWanringUpgradeTime());
+        }
+        return warningManagerVo;
+    }
+
+    @Override
+    public void saveManager(WarningManagerSaveParam warningManagerSaveParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        WarningManager warningManager = this.getOne(new QueryWrapper<WarningManager>().lambda().eq(WarningManager::getOrgId, orgId).eq(WarningManager::getType, warningManagerSaveParam.getType()));
+        if (ObjectUtil.isEmpty(warningManager)){
+            warningManager = new WarningManager();
+        }
+        BeanUtil.copyProperties(warningManagerSaveParam,warningManager);
+        this.saveOrUpdate(warningManager);
+    }
+
+}