lihui001 пре 3 година
родитељ
комит
9973f27c2f
16 измењених фајлова са 332 додато и 39 уклоњено
  1. 1 0
      zoniot-common/zoniot-core-common/src/main/java/com/zcxk/core/common/constant/FileFormatConstants.java
  2. 19 0
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/CollectionsUtils.java
  3. 36 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/CommunityProductCategoryVo.java
  4. 45 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCategoryCommunityVo.java
  5. 1 1
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCommunityVo.java
  6. 5 2
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceMapDataVo.java
  7. 6 2
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceNoCellVo.java
  8. 25 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryCommunityVo.java
  9. 25 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryStatusVo.java
  10. 2 5
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java
  11. 3 3
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceCommandMapper.xml
  12. 19 15
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml
  13. 4 4
      zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/base/BaseSync.java
  14. 1 1
      zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/constant/MqConstant.java
  15. 1 1
      zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/mq/SyncOrgConsumer.java
  16. 139 5
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/DeviceServiceImpl.java

+ 1 - 0
zoniot-common/zoniot-core-common/src/main/java/com/zcxk/core/common/constant/FileFormatConstants.java

@@ -16,6 +16,7 @@ public interface FileFormatConstants {
      * ppt格式
      */
     String FILE_PPT_SUFFIX = "ppt";
+
     String FILE_PPTX_SUFFIX = "pptx";
     /**
      * Excel格式

+ 19 - 0
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/CollectionsUtils.java

@@ -0,0 +1,19 @@
+package com.zcxk.core.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 集合处理
+ * @date 2021/7/30
+ **/
+public class CollectionsUtils {
+
+   public static <T> List<T> mapToList(Map<Long ,T> map) {
+        return new ArrayList(map.values());
+   }
+
+}

+ 36 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/CommunityProductCategoryVo.java

@@ -0,0 +1,36 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 产品分类
+ * @date 2021/7/21
+ **/
+@Data
+public class CommunityProductCategoryVo {
+
+    @ApiModelProperty(value="小区ID")
+    private Long communityId;
+
+    @ApiModelProperty(value="小区名字")
+    private String name;
+
+    @ApiModelProperty(value="小区地址")
+    private String address;
+
+    @ApiModelProperty(value="经度")
+    private BigDecimal lng;
+
+    @ApiModelProperty(value="维度")
+    private BigDecimal lat;
+
+    @ApiModelProperty(value="分类集合")
+    private List<ProductCategoryStatusVo> categoryStatusVos;
+
+}

+ 45 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCategoryCommunityVo.java

@@ -0,0 +1,45 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 设备分类小区vo
+ * @date 2021/7/21
+ **/
+@Data
+public class DeviceCategoryCommunityVo {
+
+    @ApiModelProperty(value="分类id")
+    private Long categoryId;
+
+    @ApiModelProperty(value="分类名字")
+    private String categoryName;
+
+    @ApiModelProperty(value="小区ID")
+    private Long communityId;
+
+    @ApiModelProperty(value="小区名字")
+    private String name;
+
+    @ApiModelProperty(value="小区地址")
+    private String address;
+
+    @ApiModelProperty(value="经度")
+    private BigDecimal lng;
+
+    @ApiModelProperty(value="维度")
+    private BigDecimal lat;
+
+    @ApiModelProperty(value="状态")
+    private String status;
+
+    @ApiModelProperty(value="总数")
+    private int total;
+
+}

+ 1 - 1
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCommunityVo.java

@@ -31,6 +31,6 @@ public class DeviceCommunityVo {
     private BigDecimal lat;
 
     @ApiModelProperty(value="状态集合")
-    private List<StatusStatisticsVo> statistics;
+    private List<StatusStatisticsVo> statusVos;
 
 }

+ 5 - 2
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceMapDataVo.java

@@ -14,8 +14,11 @@ import java.util.List;
 @Data
 public class DeviceMapDataVo {
 
-    @ApiModelProperty(value="设备小区信息")
-    private List<DeviceCommunityVo> deviceCommunityList;
+    @ApiModelProperty(value="分类设备小区信息")
+    private List<ProductCategoryCommunityVo> categoryCommunityVos;
+
+    @ApiModelProperty(value="小区分类设备信息")
+    private List<CommunityProductCategoryVo> communityCategoryVos;
 
     @ApiModelProperty(value="设备信息")
     private List<DeviceNoCellVo> noCellVoList;

+ 6 - 2
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceNoCellVo.java

@@ -3,6 +3,7 @@ package com.zcxk.rmcp.api.vo;
 import com.zcxk.core.utils.ZoniotStringUtils;
 import com.zcxk.rmcp.api.enums.DeviceStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -19,8 +20,11 @@ public class DeviceNoCellVo {
     @ApiModelProperty(value="设备ID")
     private Long deviceId;
 
-    @ApiModelProperty(value="设备名字")
-    private String name;
+    @ApiModelProperty(value="分类名字")
+    private String categoryName;
+
+    @ApiModelProperty(value="分类Id")
+    private Integer categoryId;
 
     @ApiModelProperty(value="水表电子号")
     private String meterNo;

+ 25 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryCommunityVo.java

@@ -0,0 +1,25 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 产品分类
+ * @date 2021/7/21
+ **/
+@Data
+public class ProductCategoryCommunityVo {
+
+    @ApiModelProperty(value="分类id")
+    private Long categoryId;
+
+    @ApiModelProperty(value="分类名字")
+    private String categoryName;
+
+    @ApiModelProperty(value="小区集合")
+    private List<DeviceCommunityVo> communityVos;
+}

+ 25 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryStatusVo.java

@@ -0,0 +1,25 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 产品分类
+ * @date 2021/7/21
+ **/
+@Data
+public class ProductCategoryStatusVo {
+
+    @ApiModelProperty(value="分类id")
+    private Long categoryId;
+
+    @ApiModelProperty(value="分类名字")
+    private String categoryName;
+
+    @ApiModelProperty(value="状态集合")
+    private List<StatusStatisticsVo> statusVos;
+}

+ 2 - 5
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java

@@ -4,10 +4,7 @@ package com.zcxk.rmcp.core.dao;
 import com.zcxk.core.common.pojo.UserCondition;
 import com.zcxk.rmcp.api.dto.measurementSettlement.MeasurementSettlementDto;
 import com.zcxk.rmcp.api.query.CommonQueryCondition;
-import com.zcxk.rmcp.api.vo.DeviceCommunityVo;
-import com.zcxk.rmcp.api.vo.DeviceNoCellVo;
-import com.zcxk.rmcp.api.vo.DeviceStatusVo;
-import com.zcxk.rmcp.api.vo.DeviceVo;
+import com.zcxk.rmcp.api.vo.*;
 import com.zcxk.rmcp.core.entity.Device;
 import org.apache.ibatis.annotations.Param;
 import org.mapstruct.Mapper;
@@ -51,7 +48,7 @@ public interface DeviceMapper {
     * @param categoryId:分类ID, userCondition
     * @return java.util.List<com.zcxk.rmcp.api.vo.DeviceCommunityVo>
     **/
-    List<DeviceCommunityVo> listCommunityDevice(@Param("categoryId") Integer categoryId, @Param("userCondition") UserCondition userCondition);
+    List<DeviceCategoryCommunityVo> listCommunityDevice(@Param("categoryId") Integer categoryId, @Param("userCondition") UserCondition userCondition);
 
     /**
     * @author Andy

+ 3 - 3
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceCommandMapper.xml

@@ -240,7 +240,7 @@
 
   <select id="findDeviceCommand" resultType="com.zcxk.rmcp.api.vo.DeviceCommandVo">
     select
-    rd.id,
+    dc.id,
     rd.meter_no,
     CONCAT(rm.name,"/",rp.product_name,"/",rp.product_model) as deviceNo,
     rd.device_status,
@@ -254,12 +254,12 @@
     left join rmcp_product rp on (rp.id = rd.product_id)
     left join rmcp_manufacturer rm on (rm.id = rp.manufacturer_id)
     where dc.status = 1 and rd.status = 1
-    and id = #{id}
+    and dc.id = #{id}
   </select>
 
   <select id="listDeviceCommand" resultType="com.zcxk.rmcp.api.vo.DeviceCommandVo">
     select
-    rd.id,
+    dc.id,
     rd.meter_no,
     CONCAT(rm.name,"/",rp.product_name,"/",rp.product_model) as deviceNo,
     rd.device_status,

+ 19 - 15
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml

@@ -47,16 +47,24 @@
     </collection>
   </resultMap>
 
-  <resultMap type="com.zcxk.rmcp.api.vo.DeviceCommunityVo" id="deviceCommunityMap">
+  <resultMap type="com.zcxk.rmcp.api.vo.ProductCategoryCommunityVo" id="productCategoryCommunityVoMap">
+    <result property="categoryId" column="categoryId" jdbcType="INTEGER"/>
+    <result property="categoryName" column="categoryName" jdbcType="INTEGER"/>
+    <collection property="communityVos" resultMap="communityVos"/>
+  </resultMap>
+
+  <resultMap id="communityVos" type="com.zcxk.rmcp.api.vo.DeviceCommunityVo">
     <result property="communityId" column="communityId" jdbcType="BIGINT"/>
     <result property="name" column="name" jdbcType="VARCHAR"/>
     <result property="address" column="address" jdbcType="VARCHAR"/>
     <result property="lng" column="lng" jdbcType="DOUBLE"/>
     <result property="lat" column="lat" jdbcType="DOUBLE"/>
-    <collection property="statistics" ofType="com.zcxk.rmcp.api.vo.StatusStatisticsVo" javaType="list">
-      <result property="status" column="status" jdbcType="INTEGER"/>
-      <result property="total" column="total" jdbcType="INTEGER"/>
-    </collection>
+    <collection property="statusVos" resultMap="statusVos"/>
+  </resultMap>
+
+  <resultMap id="statusVos" type="com.zcxk.rmcp.api.vo.StatusStatisticsVo">
+    <result property="status" column="status" jdbcType="INTEGER"/>
+    <result property="total" column="total" jdbcType="INTEGER"/>
   </resultMap>
 
   <sql id="Base_Column_List">
@@ -485,16 +493,12 @@
     GROUP BY rd.device_status, rc.name
   </select>
 
-  <select id="listCommunityDevice" resultMap="deviceCommunityMap">
-  SELECT rc.id as communityId,rc.name,rc.address,rc.lng,rc.lat,rd.device_status as status,count(1) as total
+  <select id="listCommunityDevice" resultType="com.zcxk.rmcp.api.vo.DeviceCategoryCommunityVo">
+  SELECT rc.id as communityId, rc.name,rp.name as categoryName,rp.id as categoryId,rc.address,rc.lng,rc.lat,rd.device_status as status,count(1) as total
   FROM
      rmcp_device rd
-  LEFT JOIN
-    rmcp_community rc on rd.community_id = rc.id
-  <if test="categoryId != null and category != ''">
-  LEFT JOIN
-    rmcp_product_category rp on rp.id = rd.category_id
-  </if>
+  LEFT JOIN rmcp_community rc on rd.community_id = rc.id
+  LEFT JOIN rmcp_product_category rp on rp.id = rd.category_id
   WHERE
     rd.status = 1 and rc.status = 1
     <if test="categoryId != null and category != ''">
@@ -502,11 +506,11 @@
     </if>
   <include refid="permissionCondition"/>
   AND rd.community_id > 0
-  GROUP BY rd.community_id, rd.device_status
+  GROUP BY rd.community_id, rp.id,rp.name, rd.device_status
   </select>
 
   <select id="listNoCellDevice" resultType="com.zcxk.rmcp.api.vo.DeviceNoCellVo">
-    SELECT rd.id as deviceId,rc.name, rd.meter_no, rd.address, rd.lng, rd.lat,rd.read_data,device_status as status
+    SELECT rd.id as deviceId,rc.name as categoryName,rc.id as categoryId, rd.meter_no, rd.address, rd.lng, rd.lat,rd.read_data,device_status as status
      FROM
     rmcp_device rd
     LEFT JOIN rmcp_product_category rc on rc.id = rd.category_id

+ 4 - 4
zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/base/BaseSync.java

@@ -40,7 +40,7 @@ public class BaseSync<T> {
         for (int i = 0; i < jsonArray.size(); i++) {
             list.add(JSON.toJavaObject(jsonArray.getJSONObject(i), tClass));
         }
-        log.info("【mq sync数据】同步的表名:{},操作类型:{},数据大小:{} 同步的数据:{}", syncTable, typeSql, list.size(), jsonArray.toString());
+        log.info("【mq sync数据】同步的表名:{},操作类型:{},数据大小:{},同步的数据:{}", syncTable, typeSql, list.size(), jsonArray.toString());
         result.put(typeSql, list);
         return result;
     }
@@ -54,15 +54,15 @@ public class BaseSync<T> {
      **/
     private void checkData(JSONArray jsonArray, String typeSql, String tableName, String syncTable){
         if (!syncTable.equals(tableName)) {
-            throw BusinessException.builder("【mq sync数据错误】表名不一致,需要同步的表【"+syncTable+"】,当前同步过来的表:" + tableName);
+            throw BusinessException.builder("【mq sync数据错误】表名不一致,需要同步的表【"+ syncTable +"】,当前同步过来的表:" + tableName);
         }
         try {
             SqlType.valueOf(typeSql);
         } catch (IllegalArgumentException e) {
-            throw BusinessException.builder("【mq sync数据错误】表名:"+ tableName+",操作:【"+typeSql+"】不属于更新操作。" );
+            throw BusinessException.builder("【mq sync数据错误】表名:"+ tableName + ",操作:【"+ typeSql +"】不属于更新操作。" );
         }
         if (jsonArray.size() == 0) {
-            throw BusinessException.builder("【mq sync数据错误】表名:"+syncTable+",无数据需要更新。");
+            throw BusinessException.builder("【mq sync数据错误】表名:"+ syncTable + ",无数据需要更新。");
         }
     }
 

+ 1 - 1
zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/constant/MqConstant.java

@@ -3,7 +3,7 @@ package com.zcxk.sync.constant;
 /**
  * @author Andy
  * @version V1.0
- * @description: TODO
+ * @description: mq常量
  * @date 2021/7/28
  **/
 public class MqConstant {

+ 1 - 1
zoniot-rmcp/zoniot-rmcp-sync/src/main/java/com/zcxk/sync/mq/SyncOrgConsumer.java

@@ -57,7 +57,7 @@ public class SyncOrgConsumer extends BaseSync<Org> {
         } catch (Exception e) {
             log.error("同步org机构数据异常:{}", msg);
         }
-        log.info("======================同步org机构数据 end======================");
+        log.info("======================同步org机构数据  end======================");
     }
 
     /**

+ 139 - 5
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/DeviceServiceImpl.java

@@ -12,6 +12,7 @@ import com.zcxk.core.mysql.pageing.Pagination;
 import com.zcxk.core.oauth2.pojo.LoginUser;
 import com.zcxk.core.oauth2.util.UserUtil;
 import com.zcxk.core.utils.BigDecimalUtils;
+import com.zcxk.core.utils.CollectionsUtils;
 import com.zcxk.core.utils.ZoniotIntegerUtils;
 import com.zcxk.core.utils.export.EasyExcelUtil;
 import com.zcxk.rmcp.api.dto.device.DeviceInputDto;
@@ -27,6 +28,7 @@ import com.zcxk.rmcp.core.entity.Org;
 import com.zcxk.rmcp.core.entity.Product;
 import com.zcxk.rmcp.web.excel.download.adapter.DeviceExcelFillAdapter;
 import com.zcxk.rmcp.web.excel.download.service.DeviceDownloadExcelService;
+import com.zcxk.rmcp.web.excel.model.CommImportData;
 import com.zcxk.rmcp.web.excel.model.DeviceImportData;
 import com.zcxk.rmcp.web.excel.model.DownloadExcelData;
 import com.zcxk.rmcp.web.excel.model.ExcelData;
@@ -43,10 +45,7 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -238,13 +237,148 @@ public class DeviceServiceImpl implements DeviceService{
     @Override
     public DeviceMapDataVo listDeviceAndCommunityInfo(Integer categoryId){
         UserCondition condition = UserUtil.getCurrentUser().getUserCondition();
+        List<DeviceCategoryCommunityVo> communityVos = deviceMapper.listCommunityDevice(categoryId, condition);
         DeviceMapDataVo result = new DeviceMapDataVo();
-        result.setDeviceCommunityList(deviceMapper.listCommunityDevice(categoryId, condition));
+        // 分类
+        Map<Long, ProductCategoryCommunityVo> productCategoryCommunityVoMap = new HashMap<>();
+        // 小区
+        Map<Long, CommunityProductCategoryVo> communityProductCategoryVoHashMap = new HashMap<>();
+        for (DeviceCategoryCommunityVo communityVo : communityVos) {
+            if (communityVo.getCategoryId() != null) {
+                mergeCategoryCommunity(productCategoryCommunityVoMap, communityVo);
+            }
+            mergeCommunityCategory(communityProductCategoryVoHashMap, communityVo);
+        }
+        result.setCategoryCommunityVos(CollectionsUtils.mapToList(productCategoryCommunityVoMap));
+        result.setCommunityCategoryVos(CollectionsUtils.mapToList(communityProductCategoryVoHashMap));
         result.setNoCellVoList(deviceMapper.listNoCellDevice(categoryId, condition));
         return result;
     }
 
 
+    /**
+    * @author Andy 
+    * @description 合并相同的小区数据
+    * @date 14:05 2021/7/30
+    * @param communityProductCategoryVoHashMap, communityVo]
+    * @return void 
+    **/
+    private void mergeCommunityCategory(Map<Long, CommunityProductCategoryVo> communityProductCategoryVoHashMap, DeviceCategoryCommunityVo communityVo){
+        CommunityProductCategoryVo communityProductCategoryVo = communityProductCategoryVoHashMap.get(communityVo.getCommunityId());
+        if (communityProductCategoryVo == null) {
+            communityProductCategoryVo = new CommunityProductCategoryVo();
+            BeanCopyUtils.copyProperties(communityVo, communityProductCategoryVo, CommunityProductCategoryVo.class);
+        }
+
+        // 查找分类
+        List<ProductCategoryStatusVo> deviceCommunityVos = communityProductCategoryVo.getCategoryStatusVos();
+        if (CollectionUtils.isEmpty(deviceCommunityVos)) {
+            deviceCommunityVos = new ArrayList<>();
+        }
+        ProductCategoryStatusVo deviceCommunityVo = findProductCategory(communityVo.getCategoryId(), deviceCommunityVos);
+        boolean isEmpty = false;
+        if (deviceCommunityVo == null) {
+            deviceCommunityVo = new ProductCategoryStatusVo();
+            BeanCopyUtils.copyProperties(communityVo, deviceCommunityVo, ProductCategoryStatusVo.class);
+            isEmpty = true;
+        }
+        List<StatusStatisticsVo> statusStatisticsVos = deviceCommunityVo.getStatusVos();
+        if (statusStatisticsVos == null) {
+            statusStatisticsVos = new ArrayList<>();
+            deviceCommunityVo.setStatusVos(statusStatisticsVos);
+        }
+        setStatusStatisticsVos(statusStatisticsVos,communityVo);
+        if (isEmpty) {
+            deviceCommunityVos.add(deviceCommunityVo);
+            communityProductCategoryVo.setCategoryStatusVos(deviceCommunityVos);
+        }
+        communityProductCategoryVoHashMap.put(communityVo.getCommunityId(), communityProductCategoryVo);
+    }
+
+    /**
+    * @author Andy
+    * @description 合并相同的分类数据
+    * @date 14:05 2021/7/30
+    * @param productCategoryCommunityVoMap, communityVo
+    * @return void
+    **/
+    private void mergeCategoryCommunity(Map<Long, ProductCategoryCommunityVo> productCategoryCommunityVoMap, DeviceCategoryCommunityVo communityVo){
+        ProductCategoryCommunityVo productCategoryCommunityVo = productCategoryCommunityVoMap.get(communityVo.getCategoryId());
+        if (productCategoryCommunityVo == null) {
+            productCategoryCommunityVo = new ProductCategoryCommunityVo();
+            productCategoryCommunityVo.setCategoryId(communityVo.getCategoryId());
+            productCategoryCommunityVo.setCategoryName(communityVo.getCategoryName());
+        }
+        // 查找小区
+        List<DeviceCommunityVo> deviceCommunityVos = productCategoryCommunityVo.getCommunityVos();
+        if (CollectionUtils.isEmpty(deviceCommunityVos)) {
+            deviceCommunityVos = new ArrayList<>();
+        }
+        DeviceCommunityVo deviceCommunityVo = findCommunity(communityVo.getCommunityId(), deviceCommunityVos);
+        boolean isEmpty = false;
+        if (deviceCommunityVo == null) {
+            deviceCommunityVo = new DeviceCommunityVo();
+            BeanCopyUtils.copyProperties(communityVo, deviceCommunityVo, DeviceCommunityVo.class);
+            isEmpty = true;
+        }
+        List<StatusStatisticsVo> statusStatisticsVos = deviceCommunityVo.getStatusVos();
+        if (statusStatisticsVos == null) {
+            statusStatisticsVos = new ArrayList<>();
+            deviceCommunityVo.setStatusVos(statusStatisticsVos);
+        }
+        setStatusStatisticsVos(statusStatisticsVos, communityVo);
+        if (isEmpty) {
+            deviceCommunityVos.add(deviceCommunityVo);
+            productCategoryCommunityVo.setCommunityVos(deviceCommunityVos);
+        }
+        productCategoryCommunityVoMap.put(communityVo.getCategoryId(), productCategoryCommunityVo);
+    }
+
+    /**
+    * @author Andy
+    * @description 设置状态数据
+    * @date 14:06 2021/7/30
+    * @param statusStatisticsVos, communityVo
+    * @return void
+    **/
+    private void setStatusStatisticsVos(List<StatusStatisticsVo> statusStatisticsVos, DeviceCategoryCommunityVo communityVo){
+        StatusStatisticsVo statusStatisticsVo = new StatusStatisticsVo();
+        BeanCopyUtils.copyProperties(communityVo, statusStatisticsVo, StatusStatisticsVo.class);
+        statusStatisticsVos.add(statusStatisticsVo);
+    }
+
+    /**
+    * @author Andy
+    * @description 查找小区
+    * @date 14:06 2021/7/30
+    * @param communityId, list
+    * @return com.zcxk.rmcp.api.vo.DeviceCommunityVo
+    **/
+    private DeviceCommunityVo findCommunity(Long communityId, List<DeviceCommunityVo> list){
+        for (DeviceCommunityVo deviceCommunityVo : list) {
+            if (deviceCommunityVo.getCommunityId() == communityId) {
+                return deviceCommunityVo;
+            }
+        }
+        return null;
+    }
+
+    /**
+    * @author Andy
+    * @description 查找分类
+    * @date 14:06 2021/7/30
+    * @param categoryId, list
+    * @return com.zcxk.rmcp.api.vo.ProductCategoryStatusVo
+    **/
+    private ProductCategoryStatusVo findProductCategory(Long categoryId, List<ProductCategoryStatusVo> list){
+        for (ProductCategoryStatusVo productCategoryStatusVo : list) {
+            if (productCategoryStatusVo.getCategoryId() == categoryId) {
+                return productCategoryStatusVo;
+            }
+        }
+        return null;
+    }
+
     /**
      * @author Andy
      * @description 统计状态数