Browse Source

基础配置

Newspaper 1 year ago
parent
commit
b193d19e58
24 changed files with 997 additions and 46 deletions
  1. 0 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/baseConfig/mapper/mapping/BizDepartmentMapper.xml
  2. 2 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/baseSeason/service/impl/BaseSeasonServiceImpl.java
  3. 2 1
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/controller/DepartmentController.java
  4. 2 1
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/service/DepartmentService.java
  5. 6 4
      snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/service/impl/DepartmentServiceImpl.java
  6. 0 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigbackfat/mapper/mapping/BizDepartmentMapper.xml
  7. 0 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigeliminate/mapper/mapping/BizDepartmentMapper.xml
  8. 181 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/controller/EnergyDeviceController.java
  9. 67 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/entity/EnergyDevice.java
  10. 21 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/entity/vo/EnergyDeviceCountVo.java
  11. 34 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/enums/EnergyDeviceEnum.java
  12. 25 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/mapper/EnergyDeviceMapper.java
  13. 2 2
      snowy-web-app/src/main/resources/mapper/EnvDeviceEquipmentMapper.xml
  14. 58 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceAddParam.java
  15. 63 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceEditParam.java
  16. 35 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceIdParam.java
  17. 59 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDevicePageParam.java
  18. 87 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/service/EnergyDeviceService.java
  19. 212 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/service/impl/EnergyDeviceServiceImpl.java
  20. 33 1
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/controller/EnvDeviceController.java
  21. 21 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/entity/vo/EnvDeviceCountVo.java
  22. 4 1
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/service/EnvDeviceService.java
  23. 83 36
      snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/service/impl/EnvDeviceServiceImpl.java
  24. 0 0
      snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/mapping/BizDepartmentMapper.xml

snowy-web-app/src/main/java/vip/xiaonuo/modular/base/baseConfig/mapper/mapping/BaseConfigMapper.xml → snowy-web-app/src/main/java/vip/xiaonuo/modular/base/baseConfig/mapper/mapping/BizDepartmentMapper.xml


+ 2 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/base/baseSeason/service/impl/BaseSeasonServiceImpl.java

@@ -14,6 +14,7 @@ package vip.xiaonuo.modular.base.baseSeason.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollStreamUtil;
+import cn.hutool.core.date.ChineseDate;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -39,6 +40,7 @@ import java.sql.Date;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.Month;
 import java.time.temporal.TemporalAdjusters;
 import java.util.List;

+ 2 - 1
snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/controller/DepartmentController.java

@@ -23,6 +23,7 @@ import io.swagger.annotations.ApiParam;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.common.pojo.CommonValidList;
@@ -176,7 +177,7 @@ public class DepartmentController {
     @ApiOperationSupport(order = 7)
     @ApiOperation("获取人员选择器")
     @GetMapping("/base/department/userSelector")
-    public CommonResult<List<SysUser>> userSelector() {
+    public CommonResult<List<BizUser>> userSelector() {
         return CommonResult.data(departmentService.userSelector());
     }
 

+ 2 - 1
snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/service/DepartmentService.java

@@ -16,6 +16,7 @@ import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springframework.web.multipart.MultipartFile;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
 import vip.xiaonuo.modular.base.department.entity.Department;
 import vip.xiaonuo.modular.base.department.param.*;
 import vip.xiaonuo.sys.modular.user.entity.SysUser;
@@ -82,5 +83,5 @@ public interface DepartmentService extends IService<Department> {
 
     Page<Department> listChild(DepartmentChildParam departmentChildParam);
 
-    List<SysUser> userSelector();
+    List<BizUser> userSelector();
 }

+ 6 - 4
snowy-web-app/src/main/java/vip/xiaonuo/modular/base/department/service/impl/DepartmentServiceImpl.java

@@ -30,6 +30,8 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.biz.modular.user.entity.BizUser;
+import vip.xiaonuo.biz.modular.user.mapper.BizUserMapper;
 import vip.xiaonuo.common.enums.CommonSortOrderEnum;
 import vip.xiaonuo.common.exception.CommonException;
 import vip.xiaonuo.common.listener.CommonDataChangeEventCenter;
@@ -61,7 +63,7 @@ import java.util.stream.Collectors;
 public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Department> implements DepartmentService {
 
     @Autowired
-    private SysUserMapper sysUserMapper;
+    private BizUserMapper bizUserMapper;
 
     @Autowired
     private DevFileService devFileService;
@@ -159,7 +161,7 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
             if (this.count(new QueryWrapper<Department>().lambda().eq(Department::getParentId,s)) > 0) {
                 throw new CommonException("部门存在下级,请先删除下级部门!");
             }
-            if (sysUserMapper.selectCount(new QueryWrapper<SysUser>().eq("department_id",s)) > 0){
+            if (bizUserMapper.selectCount(new QueryWrapper<BizUser>().lambda().eq(BizUser::getDepartmentId,s)) > 0){
                 throw new CommonException("部门存在人员,请先编辑或删除下属人员!");
             }
         }
@@ -192,9 +194,9 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
     }
 
     @Override
-    public List<SysUser> userSelector() {
+    public List<BizUser> userSelector() {
         String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
-        List<SysUser> users = sysUserMapper.selectList(new QueryWrapper<SysUser>().eq("ORG_ID", orgId));
+        List<BizUser> users = bizUserMapper.selectList(new QueryWrapper<BizUser>().eq("ORG_ID", orgId));
         return users;
     }
 

snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigbackfat/mapper/mapping/PigBackfatMapper.xml → snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigbackfat/mapper/mapping/BizDepartmentMapper.xml


snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigeliminate/mapper/mapping/PigEliminateMapper.xml → snowy-web-app/src/main/java/vip/xiaonuo/modular/bi/pigeliminate/mapper/mapping/BizDepartmentMapper.xml


+ 181 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/controller/EnergyDeviceController.java

@@ -0,0 +1,181 @@
+/*
+ * 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.energyDevice.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
+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.base.pigpen.service.BasePigpenService;
+import vip.xiaonuo.modular.energy.energyDevice.entity.EnergyDevice;
+import vip.xiaonuo.modular.energy.energyDevice.entity.vo.EnergyDeviceCountVo;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceAddParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceEditParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceIdParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDevicePageParam;
+import vip.xiaonuo.modular.energy.energyDevice.service.EnergyDeviceService;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 能耗设备控制器
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ */
+@Api(tags = "能耗设备控制器")
+@ApiSupport(author = "SNOWY_TEAM", order = 1)
+@RestController
+@Validated
+public class EnergyDeviceController {
+
+    @Resource
+    private EnergyDeviceService energyDeviceService;
+    @Resource
+    private BasePigpenService basePigpenService;
+
+    /**
+     * 获取能耗设备分页
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 1)
+    @ApiOperation("获取能耗设备分页")
+    @SaCheckPermission("/energy/energyDevice/page")
+    @GetMapping("/energy/energyDevice/page")
+    public CommonResult<Page<EnergyDevice>> page(EnergyDevicePageParam energyDevicePageParam) {
+        return CommonResult.data(energyDeviceService.page(energyDevicePageParam));
+    }
+
+    /**
+     * 添加能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 2)
+    @ApiOperation("添加能耗设备")
+    @CommonLog("添加能耗设备")
+    @SaCheckPermission("/energy/energyDevice/add")
+    @PostMapping("/energy/energyDevice/add")
+    public CommonResult<String> add(@RequestBody @Valid EnergyDeviceAddParam energyDeviceAddParam) {
+        energyDeviceService.add(energyDeviceAddParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 编辑能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 3)
+    @ApiOperation("编辑能耗设备")
+    @CommonLog("编辑能耗设备")
+    @SaCheckPermission("/energy/energyDevice/edit")
+    @PostMapping("/energy/energyDevice/edit")
+    public CommonResult<String> edit(@RequestBody @Valid EnergyDeviceEditParam energyDeviceEditParam) {
+        energyDeviceService.edit(energyDeviceEditParam);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 删除能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 4)
+    @ApiOperation("删除能耗设备")
+    @CommonLog("删除能耗设备")
+    @SaCheckPermission("/energy/energyDevice/delete")
+    @PostMapping("/energy/energyDevice/delete")
+    public CommonResult<String> delete(@RequestBody @Valid @NotEmpty(message = "集合不能为空")
+                                                   CommonValidList<EnergyDeviceIdParam> energyDeviceIdParamList) {
+        energyDeviceService.delete(energyDeviceIdParamList);
+        return CommonResult.ok();
+    }
+
+    /**
+     * 获取能耗设备详情
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 5)
+    @ApiOperation("获取能耗设备详情")
+    @SaCheckPermission("/energy/energyDevice/detail")
+    @GetMapping("/energy/energyDevice/detail")
+    public CommonResult<EnergyDevice> detail(@Valid EnergyDeviceIdParam energyDeviceIdParam) {
+        return CommonResult.data(energyDeviceService.detail(energyDeviceIdParam));
+    }
+
+
+    /**
+     * 获取环控设备汇总
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    @ApiOperationSupport(order = 6)
+    @ApiOperation("获取能耗设备汇总")
+    @GetMapping("/energy/energyDevice/deviceCount")
+    public CommonResult<EnergyDeviceCountVo> deviceCount() {
+        return CommonResult.data(energyDeviceService.deviceCount());
+    }
+
+
+    /**
+     * 获取栋舍选择器
+     *
+     * @author newspaper
+     * @date  2023/12/18 09:58
+     */
+    @ApiOperationSupport(order = 7)
+    @ApiOperation("获取栋舍选择器")
+    @GetMapping("/energy/energyDevice/pipgpenSelector")
+    public CommonResult<List<Tree<String>>> pipgpenSelector() {
+        return CommonResult.data(basePigpenService.tree());
+    }
+
+    /**
+     * 获取设备类型选择器
+     *
+     * @author newspaper
+     * @date  2023/12/18 09:58
+     */
+    @ApiOperationSupport(order = 8)
+    @ApiOperation("获取设备类型选择器")
+    @GetMapping("/energy/energyDevice/deviceTypeSelector")
+    public CommonResult<List<String>> deviceTypeSelector() {
+        return CommonResult.data(energyDeviceService.deviceTypeSelector());
+    }
+
+
+}

+ 67 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/entity/EnergyDevice.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.energy.energyDevice.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/28 08:46
+ **/
+@Getter
+@Setter
+@TableName("energy_device")
+public class EnergyDevice extends CommonEntity {
+
+    /** id */
+    @TableId
+    @ApiModelProperty(value = "id", position = 1)
+    private String id;
+
+    /** 设备编号 */
+    @ApiModelProperty(value = "设备编号", position = 2)
+    private String deviceCode;
+
+    /** 设备类型 */
+    @ApiModelProperty(value = "设备类型", position = 3)
+    private String deviceType;
+
+    /** 设备名称 */
+    @ApiModelProperty(value = "设备名称", position = 4)
+    private String deviceName;
+
+    /** 安装位置id */
+    @ApiModelProperty(value = "安装位置id", position = 5)
+    @Trans(type = TransType.SIMPLE, target = BasePigpen.class,fields = "fullName", alias = "pigpen", ref = "buildName")
+    private String installPosition;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", position = 6)
+    private Integer status;
+
+    /** 组织id */
+    @ApiModelProperty(value = "组织id", position = 7)
+    private String orgId;
+}

+ 21 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/entity/vo/EnergyDeviceCountVo.java

@@ -0,0 +1,21 @@
+package vip.xiaonuo.modular.energy.energyDevice.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class EnergyDeviceCountVo {
+    @ApiModelProperty(value = "设备总数", position = 1)
+    private Long deviceNum;
+
+    @ApiModelProperty(value = "在线设备", position = 2)
+    private Long onDeviceNum;
+
+    @ApiModelProperty(value = "离线设备", position = 3)
+    private Long offDeviceNum;
+
+    @ApiModelProperty(value = "设备在线率", position = 4)
+    private String onlineRate;
+}

+ 34 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/enums/EnergyDeviceEnum.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.energyDevice.enums;
+
+import lombok.Getter;
+
+/**
+ * 能耗设备枚举
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+@Getter
+public enum EnergyDeviceEnum {
+
+    /** 测试 */
+    TEST("TEST");
+
+    private final String value;
+
+    EnergyDeviceEnum(String value) {
+        this.value = value;
+    }
+}

+ 25 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/mapper/EnergyDeviceMapper.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.energyDevice.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import vip.xiaonuo.modular.energy.energyDevice.entity.EnergyDevice;
+
+/**
+ * 能耗设备Mapper接口
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+public interface EnergyDeviceMapper extends BaseMapper<EnergyDevice> {
+}

+ 2 - 2
snowy-web-app/src/main/resources/mapper/EnvDeviceEquipmentMapper.xml

@@ -1,5 +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.mapper.EnvDeviceEquipmentMapper">
+<mapper namespace="vip.xiaonuo.modular.energy.energyDevice.mapper.EnergyDeviceMapper">
 
-</mapper>
+</mapper>

+ 58 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceAddParam.java

@@ -0,0 +1,58 @@
+/*
+ * 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.energyDevice.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/28 08:46
+ **/
+@Getter
+@Setter
+public class EnergyDeviceAddParam {
+
+    /** 设备编号 */
+    @ApiModelProperty(value = "设备编号", required = true, position = 2)
+    @NotBlank(message = "deviceCode不能为空")
+    private String deviceCode;
+
+    /** 设备类型 */
+    @ApiModelProperty(value = "设备类型", required = true, position = 3)
+    @NotBlank(message = "deviceType不能为空")
+    private String deviceType;
+
+    /** 设备名称 */
+    @ApiModelProperty(value = "设备名称", required = true, position = 4)
+    @NotBlank(message = "deviceName不能为空")
+    private String deviceName;
+
+    /** 安装位置id */
+    @ApiModelProperty(value = "安装位置id", required = true, position = 5)
+    @NotBlank(message = "installPosition不能为空")
+    private String installPosition;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", position = 6)
+    private Integer status;
+
+}

+ 63 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceEditParam.java

@@ -0,0 +1,63 @@
+/*
+ * 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.energyDevice.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/28 08:46
+ **/
+@Getter
+@Setter
+public class EnergyDeviceEditParam {
+
+    /** id */
+    @ApiModelProperty(value = "id", required = true, position = 1)
+    @NotBlank(message = "id不能为空")
+    private String id;
+
+    /** 设备编号 */
+    @ApiModelProperty(value = "设备编号", required = true, position = 2)
+    @NotBlank(message = "deviceCode不能为空")
+    private String deviceCode;
+
+    /** 设备类型 */
+    @ApiModelProperty(value = "设备类型", required = true, position = 3)
+    @NotBlank(message = "deviceType不能为空")
+    private String deviceType;
+
+    /** 设备名称 */
+    @ApiModelProperty(value = "设备名称", required = true, position = 4)
+    @NotBlank(message = "deviceName不能为空")
+    private String deviceName;
+
+    /** 安装位置id */
+    @ApiModelProperty(value = "安装位置id", required = true, position = 5)
+    @NotBlank(message = "installPosition不能为空")
+    private String installPosition;
+
+    /** 状态 */
+    @ApiModelProperty(value = "状态", position = 6)
+    private Integer status;
+
+}

+ 35 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDeviceIdParam.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.energyDevice.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 能耗设备Id参数
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+@Getter
+@Setter
+public class EnergyDeviceIdParam {
+
+    /** id */
+    @ApiModelProperty(value = "id", required = true)
+    @NotBlank(message = "id不能为空")
+    private String id;
+}

+ 59 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/param/EnergyDevicePageParam.java

@@ -0,0 +1,59 @@
+/*
+ * 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.energyDevice.param;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 能耗设备查询参数
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+@Getter
+@Setter
+public class EnergyDevicePageParam {
+
+    /** 当前页 */
+    @ApiModelProperty(value = "当前页码")
+    private Integer current;
+
+    /** 每页条数 */
+    @ApiModelProperty(value = "每页条数")
+    private Integer size;
+
+    /** 排序字段 */
+    @ApiModelProperty(value = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /** 排序方式 */
+    @ApiModelProperty(value = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /** 关键词 */
+    @ApiModelProperty(value = "关键词")
+    private String searchKey;
+
+    /** 设备类型 */
+    @ApiModelProperty(value = "设备类型")
+    private String deviceType;
+
+    /** 安装位置id */
+    @ApiModelProperty(value = "安装位置id")
+    private String installPosition;
+
+}

+ 87 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/service/EnergyDeviceService.java

@@ -0,0 +1,87 @@
+/*
+ * 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.energyDevice.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.modular.energy.energyDevice.entity.EnergyDevice;
+import vip.xiaonuo.modular.energy.energyDevice.entity.vo.EnergyDeviceCountVo;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceAddParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceEditParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceIdParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDevicePageParam;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 能耗设备Service接口
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+public interface EnergyDeviceService extends IService<EnergyDevice> {
+
+    /**
+     * 获取能耗设备分页
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    Page<EnergyDevice> page(EnergyDevicePageParam energyDevicePageParam);
+
+    /**
+     * 添加能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    void add(EnergyDeviceAddParam energyDeviceAddParam);
+
+    /**
+     * 编辑能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    void edit(EnergyDeviceEditParam energyDeviceEditParam);
+
+    /**
+     * 删除能耗设备
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    void delete(List<EnergyDeviceIdParam> energyDeviceIdParamList);
+
+    /**
+     * 获取能耗设备详情
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     */
+    EnergyDevice detail(EnergyDeviceIdParam energyDeviceIdParam);
+
+    /**
+     * 获取能耗设备详情
+     *
+     * @author newspaper
+     * @date  2023/12/28 08:46
+     **/
+    EnergyDevice queryEntity(String id);
+
+    EnergyDeviceCountVo deviceCount();
+
+    List<String> deviceTypeSelector();
+}

+ 212 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/energy/energyDevice/service/impl/EnergyDeviceServiceImpl.java

@@ -0,0 +1,212 @@
+/*
+ * 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.energyDevice.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollStreamUtil;
+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.base.pigpen.entity.BasePigpen;
+import vip.xiaonuo.modular.base.pigpen.mapper.BasePigpenMapper;
+import vip.xiaonuo.modular.energy.energyDevice.entity.EnergyDevice;
+import vip.xiaonuo.modular.energy.energyDevice.entity.vo.EnergyDeviceCountVo;
+import vip.xiaonuo.modular.energy.energyDevice.mapper.EnergyDeviceMapper;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceAddParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceEditParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDeviceIdParam;
+import vip.xiaonuo.modular.energy.energyDevice.param.EnergyDevicePageParam;
+import vip.xiaonuo.modular.energy.energyDevice.service.EnergyDeviceService;
+import vip.xiaonuo.modular.env.envdevice.entity.EnvDevice;
+
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 能耗设备Service接口实现类
+ *
+ * @author newspaper
+ * @date  2023/12/28 08:46
+ **/
+@Service
+public class EnergyDeviceServiceImpl extends ServiceImpl<EnergyDeviceMapper, EnergyDevice> implements EnergyDeviceService {
+
+    @Autowired
+    private BaseConfigMapper baseConfigMapper;
+    @Autowired
+    private BasePigpenMapper basePigpenMapper;
+
+    @Override
+    public Page<EnergyDevice> page(EnergyDevicePageParam energyDevicePageParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        QueryWrapper<EnergyDevice> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(EnergyDevice::getOrgId,orgId).orderByAsc(EnergyDevice::getId);
+        if(ObjectUtil.isNotEmpty(energyDevicePageParam.getDeviceType())) {
+            queryWrapper.lambda().eq(EnergyDevice::getDeviceType, energyDevicePageParam.getDeviceType());
+        }
+        String installPosition = energyDevicePageParam.getInstallPosition();
+        List<String> pigpenList = new ArrayList<>();
+        if(ObjectUtil.isNotEmpty(installPosition)) {
+            BasePigpen basePigpen = basePigpenMapper.selectById(installPosition);
+            Integer type = basePigpen.getType();
+            switch (type){
+                case 0:
+                    List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, basePigpen.getId()));
+                    if (ObjectUtil.isNotEmpty(basePigpens)){
+                        pigpenList.addAll(basePigpens.stream().map(basePigpen1 -> basePigpen1.getId()).collect(Collectors.toList()));
+                    }
+                    for (BasePigpen pigpen : basePigpens) {
+                        List<BasePigpen> childPigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, pigpen.getId()));
+                        if (ObjectUtil.isNotEmpty(childPigpens)){
+                            pigpenList.addAll(childPigpens.stream().map(basePigpen2 -> basePigpen2.getId()).collect(Collectors.toList()));
+                        }
+                    }
+                    break;
+                case 1:
+                    List<BasePigpen> pigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, basePigpen.getId()));
+                    if (ObjectUtil.isNotEmpty(pigpens)){
+                        pigpenList.addAll(pigpens.stream().map(basePigpen3 -> basePigpen3.getId()).collect(Collectors.toList()));
+                    }
+                case 2:
+                    pigpenList.add(installPosition);
+                    break;
+            }
+            queryWrapper.lambda().in(EnergyDevice::getInstallPosition, pigpenList);
+        }
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void add(EnergyDeviceAddParam energyDeviceAddParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        EnergyDevice energyDevice = BeanUtil.toBean(energyDeviceAddParam, EnergyDevice.class);
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getDeviceCode,energyDevice.getDeviceCode())) > 0) {
+            throw new CommonException("存在相同设备编号,编号为:{}",energyDevice.getDeviceCode());
+        }
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getDeviceName,energyDevice.getDeviceName())) > 0) {
+            throw new CommonException("存在相同设备名称,名称为:{}",energyDevice.getDeviceName());
+        }
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getInstallPosition,energyDevice.getInstallPosition())) > 0) {
+            throw new CommonException("该位置已存在设备!");
+        }
+        this.save(energyDevice);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void edit(EnergyDeviceEditParam energyDeviceEditParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        EnergyDevice energyDevice = this.queryEntity(energyDeviceEditParam.getId());
+        BeanUtil.copyProperties(energyDeviceEditParam, energyDevice);
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getDeviceCode,energyDevice.getDeviceCode())
+                .ne(EnergyDevice::getId,energyDevice.getId())) > 0) {
+            throw new CommonException("存在相同设备编号,编号为:{}",energyDevice.getDeviceCode());
+        }
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getDeviceName,energyDevice.getDeviceName())
+                .ne(EnergyDevice::getId,energyDevice.getId())) > 0) {
+            throw new CommonException("存在相同设备名称,名称为:{}",energyDevice.getDeviceName());
+        }
+        if (this.count(new QueryWrapper<EnergyDevice>().lambda()
+                .eq(EnergyDevice::getOrgId,orgId)
+                .eq(EnergyDevice::getInstallPosition,energyDevice.getInstallPosition())
+                .ne(EnergyDevice::getId,energyDevice.getId())) > 0) {
+            throw new CommonException("该位置已存在设备!");
+        }
+        this.updateById(energyDevice);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void delete(List<EnergyDeviceIdParam> energyDeviceIdParamList) {
+        // 执行删除
+        this.removeByIds(CollStreamUtil.toList(energyDeviceIdParamList, EnergyDeviceIdParam::getId));
+    }
+
+    @Override
+    public EnergyDevice detail(EnergyDeviceIdParam energyDeviceIdParam) {
+        return this.queryEntity(energyDeviceIdParam.getId());
+    }
+
+    @Override
+    public EnergyDevice queryEntity(String id) {
+        EnergyDevice energyDevice = this.getById(id);
+        if(ObjectUtil.isEmpty(energyDevice)) {
+            throw new CommonException("能耗设备不存在,id值为:{}", id);
+        }
+        return energyDevice;
+    }
+
+    @Override
+    public EnergyDeviceCountVo deviceCount() {
+        EnergyDeviceCountVo energyDeviceCountVo = new EnergyDeviceCountVo();
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        long deviceNum = this.count(new QueryWrapper<EnergyDevice>().lambda().eq(EnergyDevice::getOrgId, orgId));
+        if (deviceNum == 0){
+            energyDeviceCountVo.setDeviceNum(0L);
+            energyDeviceCountVo.setOnDeviceNum(0L);
+            energyDeviceCountVo.setOffDeviceNum(0L);
+            energyDeviceCountVo.setOnlineRate("0%");
+        }else {
+            energyDeviceCountVo.setDeviceNum(deviceNum);
+            long onDeviceNum = this.count(new QueryWrapper<EnergyDevice>().lambda().eq(EnergyDevice::getStatus,"1").eq(EnergyDevice::getOrgId, orgId));
+            energyDeviceCountVo.setOnDeviceNum(onDeviceNum);
+            long offDeviceNum = this.count(new QueryWrapper<EnergyDevice>().lambda().eq(EnergyDevice::getStatus,"1").eq(EnergyDevice::getOrgId, orgId));
+            energyDeviceCountVo.setOffDeviceNum(offDeviceNum);
+            //创建一个数值格式化对象
+            NumberFormat numberFormat = NumberFormat.getInstance();
+            //设置精确到小数点后两位
+            numberFormat.setMaximumFractionDigits(2);
+            String onlineRate = numberFormat.format((float)onDeviceNum / (float) deviceNum* 100) + "%";
+            energyDeviceCountVo.setOnlineRate(onlineRate);
+        }
+        return energyDeviceCountVo;
+    }
+
+    @Override
+    public List<String> deviceTypeSelector() {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        List<String> list = new ArrayList<>();
+        String parentId = 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, parentId).eq(BaseConfig::getOrgId, orgId));
+        if (ObjectUtil.isNotEmpty(baseConfigs)){
+            list = baseConfigs.stream().map(baseConfig -> baseConfig.getConfigName()).collect(Collectors.toList());
+        }
+        return list;
+    }
+}

+ 33 - 1
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/controller/EnvDeviceController.java

@@ -13,6 +13,7 @@
 package vip.xiaonuo.modular.env.envdevice.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import com.github.xiaoymin.knife4j.annotations.ApiSupport;
@@ -26,7 +27,9 @@ 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.base.pigpen.service.BasePigpenService;
 import vip.xiaonuo.modular.env.envdevice.entity.EnvDevice;
+import vip.xiaonuo.modular.env.envdevice.entity.vo.EnvDeviceCountVo;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceAddParam;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceEditParam;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceIdParam;
@@ -36,6 +39,7 @@ import vip.xiaonuo.modular.env.envdevice.service.EnvDeviceService;
 import javax.annotation.Resource;
 import javax.validation.Valid;
 import javax.validation.constraints.NotEmpty;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -52,6 +56,8 @@ public class EnvDeviceController {
 
     @Resource
     private EnvDeviceService envDeviceService;
+    @Resource
+    private BasePigpenService basePigpenService;
 
     /**
      * 获取环控设备分页
@@ -134,7 +140,33 @@ public class EnvDeviceController {
     @ApiOperationSupport(order = 6)
     @ApiOperation("获取环控设备汇总")
     @GetMapping("/env/envdevice/deviceCount")
-    public CommonResult<Map> deviceCount() {
+    public CommonResult<EnvDeviceCountVo> deviceCount() {
         return CommonResult.data(envDeviceService.deviceCount());
     }
+
+    /**
+     * 获取栋舍选择器
+     *
+     * @author newspaper
+     * @date  2023/12/18 09:58
+     */
+    @ApiOperationSupport(order = 7)
+    @ApiOperation("获取栋舍选择器")
+    @GetMapping("/energy/energyDevice/pipgpenSelector")
+    public CommonResult<List<Tree<String>>> pipgpenSelector() {
+        return CommonResult.data(basePigpenService.tree());
+    }
+
+    /**
+     * 获取设备类型选择器
+     *
+     * @author newspaper
+     * @date  2023/12/18 09:58
+     */
+    @ApiOperationSupport(order = 8)
+    @ApiOperation("获取设备类型选择器")
+    @GetMapping("/env/envdevice/deviceTypeSelector")
+    public CommonResult<List<String>> deviceTypeSelector() {
+        return CommonResult.data(envDeviceService.deviceTypeSelector());
+    }
 }

+ 21 - 0
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/entity/vo/EnvDeviceCountVo.java

@@ -0,0 +1,21 @@
+package vip.xiaonuo.modular.env.envdevice.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class EnvDeviceCountVo {
+    @ApiModelProperty(value = "设备总数", position = 1)
+    private Long deviceNum;
+
+    @ApiModelProperty(value = "在线设备", position = 2)
+    private Long onDeviceNum;
+
+    @ApiModelProperty(value = "离线设备", position = 3)
+    private Long offDeviceNum;
+
+    @ApiModelProperty(value = "设备在线率", position = 4)
+    private String onlineRate;
+}

+ 4 - 1
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/service/EnvDeviceService.java

@@ -16,6 +16,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.modular.env.envdevice.entity.EnvDevice;
+import vip.xiaonuo.modular.env.envdevice.entity.vo.EnvDeviceCountVo;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceAddParam;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceEditParam;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceIdParam;
@@ -80,5 +81,7 @@ public interface EnvDeviceService extends IService<EnvDevice> {
      **/
     EnvDevice queryEntity(String id);
 
-    Map deviceCount();
+    EnvDeviceCountVo deviceCount();
+
+    List<String> deviceTypeSelector();
 }

+ 83 - 36
snowy-web-app/src/main/java/vip/xiaonuo/modular/env/envdevice/service/impl/EnvDeviceServiceImpl.java

@@ -30,8 +30,14 @@ import vip.xiaonuo.common.listener.CommonDataChangeEventCenter;
 import vip.xiaonuo.common.page.CommonPageRequest;
 import vip.xiaonuo.common.pojo.CommonResult;
 import vip.xiaonuo.core.enums.EnvDataTypeEnum;
+import vip.xiaonuo.modular.base.baseConfig.entity.BaseConfig;
+import vip.xiaonuo.modular.base.baseConfig.mapper.BaseConfigMapper;
+import vip.xiaonuo.modular.base.pigpen.entity.BasePigpen;
+import vip.xiaonuo.modular.base.pigpen.mapper.BasePigpenMapper;
+import vip.xiaonuo.modular.energy.energyDevice.entity.EnergyDevice;
 import vip.xiaonuo.modular.env.entity.EnvDeviceEquipment;
 import vip.xiaonuo.modular.env.envdevice.entity.EnvDevice;
+import vip.xiaonuo.modular.env.envdevice.entity.vo.EnvDeviceCountVo;
 import vip.xiaonuo.modular.env.envdevice.mapper.EnvDeviceMapper;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceAddParam;
 import vip.xiaonuo.modular.env.envdevice.param.EnvDeviceEditParam;
@@ -42,10 +48,8 @@ import vip.xiaonuo.modular.env.mapper.EnvDeviceEquipmentMapper;
 
 import javax.validation.constraints.NotBlank;
 import java.text.NumberFormat;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 环控设备Service接口实现类
@@ -60,22 +64,10 @@ public class EnvDeviceServiceImpl extends ServiceImpl<EnvDeviceMapper, EnvDevice
     private EnvDeviceMapper envDeviceMapper;
     @Autowired
     private EnvDeviceEquipmentMapper equipmentMapper;
-
-//    @Override
-//    public Page<EnvDevice> page(EnvDevicePageParam envDevicePageParam) {
-//        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
-//        QueryWrapper<EnvDevice> queryWrapper = new QueryWrapper<>();
-//        queryWrapper.eq("d.org_id",orgId).orderByAsc("d.id");
-//        if(ObjectUtil.isNotEmpty(envDevicePageParam.getDeviceType())) {
-//            queryWrapper.eq("d.device_type", envDevicePageParam.getDeviceType());
-//        }
-//        if(ObjectUtil.isNotEmpty(envDevicePageParam.getInstallPosition())) {
-//            queryWrapper.eq("d.install_position", envDevicePageParam.getInstallPosition());
-//        }
-//        return envDeviceMapper.page(CommonPageRequest.defaultPage(), queryWrapper);
-//
-//
-//    }
+    @Autowired
+    private BaseConfigMapper baseConfigMapper;
+    @Autowired
+    private BasePigpenMapper basePigpenMapper;
 
     @Override
     public Page<EnvDevice> page(EnvDevicePageParam envDevicePageParam) {
@@ -85,10 +77,36 @@ public class EnvDeviceServiceImpl extends ServiceImpl<EnvDeviceMapper, EnvDevice
         if(ObjectUtil.isNotEmpty(envDevicePageParam.getDeviceType())) {
             queryWrapper.eq("device_type", envDevicePageParam.getDeviceType());
         }
-        if(ObjectUtil.isNotEmpty(envDevicePageParam.getInstallPosition())) {
-            queryWrapper.eq("install_position", envDevicePageParam.getInstallPosition());
+        String installPosition = envDevicePageParam.getInstallPosition();
+        List<String> pigpenList = new ArrayList<>();
+        if(ObjectUtil.isNotEmpty(installPosition)) {
+            BasePigpen basePigpen = basePigpenMapper.selectById(installPosition);
+            Integer type = basePigpen.getType();
+            switch (type) {
+                case 0:
+                    List<BasePigpen> basePigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, basePigpen.getId()));
+                    if (ObjectUtil.isNotEmpty(basePigpens)) {
+                        pigpenList.addAll(basePigpens.stream().map(basePigpen1 -> basePigpen1.getId()).collect(Collectors.toList()));
+                    }
+                    for (BasePigpen pigpen : basePigpens) {
+                        List<BasePigpen> childPigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, pigpen.getId()));
+                        if (ObjectUtil.isNotEmpty(childPigpens)) {
+                            pigpenList.addAll(childPigpens.stream().map(basePigpen2 -> basePigpen2.getId()).collect(Collectors.toList()));
+                        }
+                    }
+                    break;
+                case 1:
+                    List<BasePigpen> pigpens = basePigpenMapper.selectList(new QueryWrapper<BasePigpen>().lambda().eq(BasePigpen::getParentId, basePigpen.getId()));
+                    if (ObjectUtil.isNotEmpty(pigpens)) {
+                        pigpenList.addAll(pigpens.stream().map(basePigpen3 -> basePigpen3.getId()).collect(Collectors.toList()));
+                    }
+                case 2:
+                    pigpenList.add(installPosition);
+                    break;
+            }
+            queryWrapper.lambda().in(EnvDevice::getInstallPosition, pigpenList);
         }
-        return  this.page(CommonPageRequest.defaultPage(), queryWrapper);
+        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
 
 
     }
@@ -135,10 +153,28 @@ public class EnvDeviceServiceImpl extends ServiceImpl<EnvDeviceMapper, EnvDevice
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(EnvDeviceEditParam envDeviceEditParam) {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
         EnvDevice envDevice = this.queryEntity(envDeviceEditParam.getId());
         BeanUtil.copyProperties(envDeviceEditParam, envDevice);
+        if (this.count(new QueryWrapper<EnvDevice>().lambda()
+                .eq(EnvDevice::getOrgId,orgId)
+                .eq(EnvDevice::getDeviceCode,envDevice.getDeviceCode())
+                .ne(EnvDevice::getId,envDevice.getId())) > 0) {
+            throw new CommonException("存在相同设备编号,编号为:{}",envDevice.getDeviceCode());
+        }
+        if (this.count(new QueryWrapper<EnvDevice>().lambda()
+                .eq(EnvDevice::getOrgId,orgId)
+                .eq(EnvDevice::getDeviceName,envDevice.getDeviceName())
+                .ne(EnvDevice::getId,envDevice.getId())) > 0) {
+            throw new CommonException("存在相同设备名称,名称为:{}",envDevice.getDeviceName());
+        }
+        if (this.count(new QueryWrapper<EnvDevice>().lambda()
+                .eq(EnvDevice::getOrgId,orgId)
+                .eq(EnvDevice::getInstallPosition,envDevice.getInstallPosition())
+                .ne(EnvDevice::getId,envDevice.getId())) > 0) {
+            throw new CommonException("该位置已存在设备!");
+        }
         this.updateById(envDevice);
-
         CommonDataChangeEventCenter.doUpdateWithData(EnvDataTypeEnum.DEVICE.getValue(), JSONUtil.createArray().put(envDevice));
     }
 
@@ -167,29 +203,40 @@ public class EnvDeviceServiceImpl extends ServiceImpl<EnvDeviceMapper, EnvDevice
     }
 
     @Override
-    public Map deviceCount() {
-        Map resultMap = new HashMap();
+    public EnvDeviceCountVo deviceCount() {
+        EnvDeviceCountVo envDeviceCountVo = new EnvDeviceCountVo();
         String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
-//        .eq(EnvDevice::getDeleteFlag,"NOT_DELETE")
         long deviceNum = this.count(new QueryWrapper<EnvDevice>().lambda().eq(EnvDevice::getOrgId, orgId));
         if (deviceNum == 0){
-            resultMap.put("deviceNum",0);
-            resultMap.put("onDeviceNum",0);
-            resultMap.put("offDeviceNum",0);
-            resultMap.put("onlineRate",0);
+            envDeviceCountVo.setDeviceNum(0L);
+            envDeviceCountVo.setOnDeviceNum(0L);
+            envDeviceCountVo.setOffDeviceNum(0L);
+            envDeviceCountVo.setOnlineRate("0%");
         }else {
-            resultMap.put("deviceNum",deviceNum);
+            envDeviceCountVo.setDeviceNum(deviceNum);
             long onDeviceNum = this.count(new QueryWrapper<EnvDevice>().lambda().eq(EnvDevice::getStatus,"1").eq(EnvDevice::getOrgId, orgId));
-            resultMap.put("onDeviceNum",onDeviceNum);
+            envDeviceCountVo.setOnDeviceNum(onDeviceNum);
             long offDeviceNum = this.count(new QueryWrapper<EnvDevice>().lambda().eq(EnvDevice::getStatus,"1").eq(EnvDevice::getOrgId, orgId));
-            resultMap.put("offDeviceNum",offDeviceNum);
+            envDeviceCountVo.setOffDeviceNum(offDeviceNum);
             //创建一个数值格式化对象
             NumberFormat numberFormat = NumberFormat.getInstance();
             //设置精确到小数点后两位
             numberFormat.setMaximumFractionDigits(2);
             String onlineRate = numberFormat.format((float)onDeviceNum / (float) deviceNum* 100) + "%";
-            resultMap.put("onlineRate",onlineRate);
+            envDeviceCountVo.setOnlineRate(onlineRate);
+        }
+        return envDeviceCountVo;
+    }
+
+    @Override
+    public List<String> deviceTypeSelector() {
+        String orgId = StpLoginUserUtil.getLoginUser().getOrgId();
+        List<String> list = new ArrayList<>();
+        String parentId = 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, parentId).eq(BaseConfig::getOrgId, orgId));
+        if (ObjectUtil.isNotEmpty(baseConfigs)){
+            list = baseConfigs.stream().map(baseConfig -> baseConfig.getConfigName()).collect(Collectors.toList());
         }
-        return resultMap;
+        return list;
     }
 }

snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/mapping/WarningManagerMapper.xml → snowy-web-app/src/main/java/vip/xiaonuo/modular/warning/warningManager/mapper/mapping/BizDepartmentMapper.xml