Browse Source

版本更新

lihui001 3 years ago
parent
commit
ebd49ed186
35 changed files with 922 additions and 22 deletions
  1. 4 0
      zoniot-common/zoniot-core-mongo/pom.xml
  2. 2 0
      zoniot-common/zoniot-core-mongo/src/main/java/com/zcxk/core/mongo/base/BaseDO.java
  3. 2 1
      zoniot-common/zoniot-core-mongo/src/main/java/com/zcxk/core/mongo/pageing/PageableImpl.java
  4. 26 0
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/BigDecimalUtils.java
  5. 16 0
      zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/ZoniotIntegerUtils.java
  6. 41 9
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/DeviceStatusEnum.java
  7. 36 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCommunityVo.java
  8. 23 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceMapDataVo.java
  9. 47 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceNoCellVo.java
  10. 46 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceStatisticsVo.java
  11. 24 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceStatusVo.java
  12. 20 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryVo.java
  13. 27 0
      zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/StatusStatisticsVo.java
  14. 4 0
      zoniot-rmcp/zoniot-rmcp-core/pom.xml
  15. 32 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java
  16. 14 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ProductCategoryMapper.java
  17. 2 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ProductMapper.java
  18. 26 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java
  19. 3 1
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/Device.java
  20. 67 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml
  21. 43 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ProductCategoryMapper.xml
  22. 7 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ProductMapper.xml
  23. 111 0
      zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mongo/MeterReadRecord.java
  24. 15 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/DeviceController.java
  25. 41 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReadRecordController.java
  26. 30 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/ProductCategoryController.java
  27. 14 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/DeviceCommandService.java
  28. 22 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/DeviceService.java
  29. 21 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/MeterReadRecordServcie.java
  30. 14 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ProductCategoryService.java
  31. 87 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/DeviceServiceImpl.java
  32. 26 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReadRecordServcieImpl.java
  33. 16 7
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReplaceLogServiceImpl.java
  34. 9 0
      zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/ProductCategoryServiceImpl.java
  35. 4 1
      zoniot-rmcp/zoniot-rmcp-web/src/main/resources/application-dev.properties

+ 4 - 0
zoniot-common/zoniot-core-mongo/pom.xml

@@ -22,6 +22,10 @@
             <groupId>com.zcxk</groupId>
             <artifactId>zoniot-core-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>

+ 2 - 0
zoniot-common/zoniot-core-mongo/src/main/java/com/zcxk/core/mongo/base/BaseDO.java

@@ -15,6 +15,8 @@ import lombok.Data;
 @Data
 public class BaseDO implements Serializable {
 
+    private String id;
+
     /**
      * 创建时间
      **/

+ 2 - 1
zoniot-common/zoniot-core-mongo/src/main/java/com/zcxk/core/mongo/pageing/PageableImpl.java

@@ -1,6 +1,5 @@
 package com.zcxk.core.mongo.pageing;
 
-import java.io.Serializable;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.springframework.data.domain.PageRequest;
@@ -8,6 +7,8 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
 import org.springframework.data.domain.Sort.Direction;
 
+import java.io.Serializable;
+
 /**
  * mongodb分类组件实现类
  */

+ 26 - 0
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/BigDecimalUtils.java

@@ -0,0 +1,26 @@
+package com.zcxk.core.utils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: BigDecimal运算处理
+ * @date 2021/7/21
+ **/
+public class BigDecimalUtils {
+
+    public static String percentDivide(Object value, Object value2, int scale){
+        return divide(value, value2, scale).multiply(new BigDecimal("100")).stripTrailingZeros().toPlainString() + "%";
+    }
+
+    public static BigDecimal divide(Object value, Object value2, int scale){
+        return new BigDecimal(value.toString()).divide(new BigDecimal(value2.toString()), scale, RoundingMode.HALF_UP);
+    }
+
+    public static void main(String[] args) {
+        System.out.println(BigDecimalUtils.percentDivide(3,10,2));
+    }
+
+}

+ 16 - 0
zoniot-common/zoniot-core-utils/src/main/java/com/zcxk/core/utils/ZoniotIntegerUtils.java

@@ -1,6 +1,8 @@
 package com.zcxk.core.utils;
 
 
+import java.text.DecimalFormat;
+
 /**
  * @author Andy
  * @version V1.0
@@ -9,6 +11,8 @@ package com.zcxk.core.utils;
  **/
 public class ZoniotIntegerUtils {
 
+    private static  final  String pattern = "###,###";
+
     /**
      * @author Andy
      * @description 不为空,值 != 0
@@ -30,4 +34,16 @@ public class ZoniotIntegerUtils {
     public static boolean isEmpty(Integer value){
         return value == null || value == 0;
     }
+
+    /**
+    * @author Andy
+    * @description 1000000格式化为 1,000,000
+    * @date 16:38 2021/7/21
+    * @param value
+    * @return java.lang.String
+    **/
+    public static String decimalFormat(int value) {
+        return new DecimalFormat(pattern).format(value);
+    }
+
 }

+ 41 - 9
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/enums/DeviceStatusEnum.java

@@ -1,27 +1,59 @@
 package com.zcxk.rmcp.api.enums;
 
+import io.swagger.models.auth.In;
 import lombok.Getter;
 
+import java.util.Arrays;
+import java.util.Optional;
+
 /**
  * @author linqingwei
  * @date 2021-07-20 11:40
  */
 @Getter
 public enum DeviceStatusEnum {
-    //正常
-    NORMAL(1),
-    //离线
-    OFFLINE(2),
-    //报警
-    ALARM(3),
-    //未启用
-    UNUSED(4),
+
+    /**
+     * 正常
+     */
+    NORMAL(1, "正常"),
+
+    /**
+     * 离线
+     */
+    OFFLINE(2 , "离线"),
+
+    /**
+     * 报警
+     */
+    ALARM(3, "报警"),
+
+    /**
+     * 未启用
+     */
+    UNUSED(4, "未启用"),
     ;
 
+    /**
+     * code
+     */
     private final Integer code;
 
+    /**
+     * 值
+     */
+    private final String message;
+
 
-    DeviceStatusEnum(Integer code) {
+    DeviceStatusEnum(Integer code, String message) {
         this.code = code;
+        this.message = message;
+    }
+
+    public static String getMessage(String code) {
+        Optional<DeviceStatusEnum> optional = Arrays.stream(DeviceStatusEnum.values())
+                .filter(p -> p.getCode() == Integer.parseInt(code))
+                .findFirst();
+        return optional.get().getMessage();
     }
 }

+ 36 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceCommunityVo.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 DeviceCommunityVo {
+
+    @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<StatusStatisticsVo> statistics;
+
+}

+ 23 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceMapDataVo.java

@@ -0,0 +1,23 @@
+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/22
+ **/
+@Data
+public class DeviceMapDataVo {
+
+    @ApiModelProperty(value="设备小区信息")
+    private List<DeviceCommunityVo> deviceCommunityList;
+
+    @ApiModelProperty(value="设备信息")
+    private List<DeviceNoCellVo> noCellVoList;
+
+}

+ 47 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceNoCellVo.java

@@ -0,0 +1,47 @@
+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 lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 设备信息不包含小区
+ * @date 2021/7/22
+ **/
+@Data
+public class DeviceNoCellVo {
+
+    @ApiModelProperty(value="设备ID")
+    private Long deviceId;
+
+    @ApiModelProperty(value="设备名字")
+    private String name;
+
+    @ApiModelProperty(value="水表电子号")
+    private String meterNo;
+
+    @ApiModelProperty(value="设备地址")
+    private String address;
+
+    @ApiModelProperty(value="经度")
+    private BigDecimal lng;
+
+    @ApiModelProperty(value="维度")
+    private BigDecimal lat;
+
+    @ApiModelProperty(value="读数")
+    private String readData;
+
+    @ApiModelProperty(value="状态")
+    private String status;
+
+    public String getStatus(){
+        return ZoniotStringUtils.isNotEmpty(status) ? DeviceStatusEnum.getMessage(status) : "";
+    }
+
+}

+ 46 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceStatisticsVo.java

@@ -0,0 +1,46 @@
+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 DeviceStatisticsVo {
+
+    @ApiModelProperty(value="设备总数")
+    private String total;
+
+    @ApiModelProperty(value="设备占比")
+    private List<DeviceRatio> ratios;
+
+    @ApiModelProperty(value="状态数")
+    private List<StatusStatisticsVo> statusList;
+
+    /**
+     * @author Andy
+     * @version V1.0
+     * @description: 设备占比情况
+     * @date 2021/7/21
+     **/
+    @Data
+    public static class DeviceRatio {
+
+        @ApiModelProperty(value="设备分类名字")
+        private String name;
+
+        @ApiModelProperty(value="占比%")
+        private String ratio;
+
+        @ApiModelProperty(value="总数")
+        private int total;
+
+    }
+
+}

+ 24 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/DeviceStatusVo.java

@@ -0,0 +1,24 @@
+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 DeviceStatusVo {
+
+    @ApiModelProperty(value="设备分类名字")
+    private String name;
+
+    @ApiModelProperty(value="状态集合")
+    private List<StatusStatisticsVo> statistics;
+
+}

+ 20 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/ProductCategoryVo.java

@@ -0,0 +1,20 @@
+package com.zcxk.rmcp.api.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 产品分类
+ * @date 2021/7/21
+ **/
+@Data
+public class ProductCategoryVo {
+
+    @ApiModelProperty(value="分类id")
+    private Long id;
+
+    @ApiModelProperty(value="分类名字")
+    private String name;
+}

+ 27 - 0
zoniot-rmcp/zoniot-rmcp-api/src/main/java/com/zcxk/rmcp/api/vo/StatusStatisticsVo.java

@@ -0,0 +1,27 @@
+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 lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 设备状态统计
+ * @date 2021/7/21
+ **/
+@Data
+public class StatusStatisticsVo {
+
+    @ApiModelProperty(value="状态")
+    private String status;
+
+    @ApiModelProperty(value="总数")
+    private int total;
+
+    public String getStatus(){
+        return StringUtils.isNumeric(status) ? DeviceStatusEnum.getMessage(status) : status;
+    }
+}

+ 4 - 0
zoniot-rmcp/zoniot-rmcp-core/pom.xml

@@ -20,6 +20,10 @@
             <groupId>com.zcxk</groupId>
             <artifactId>zoniot-core-mysql</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.zcxk</groupId>
+            <artifactId>zoniot-core-mongo</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 32 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/DeviceMapper.java

@@ -3,6 +3,9 @@ package com.zcxk.rmcp.core.dao;
 
 import com.zcxk.core.common.pojo.UserCondition;
 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.core.entity.Device;
 import org.apache.ibatis.annotations.Param;
@@ -29,4 +32,33 @@ public interface DeviceMapper {
     int findByDeviceNoUnique(@Param("id") Long id, @Param("deviceNo") String deviceNo);
 
     int findByMeterNoUnique(@Param("id") Long id, @Param("meterNo") String meterNo);
+
+
+    /**
+     * @author Andy
+     * @description 统计设备状态数
+     * @date 15:43 2021/7/21
+     * @param userCondition
+     * @return java.util.List<com.zcxk.rmcp.api.vo.DeviceStatusVo>
+     **/
+    List<DeviceStatusVo> totalDeviceStatus(@Param("userCondition") UserCondition userCondition);
+
+    /**
+    * @author Andy
+    * @description 获取小区设备数据
+    * @date 10:19 2021/7/22
+    * @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);
+
+    /**
+    * @author Andy
+    * @description 获取没有绑定小区的设备信息
+    * @date 10:34 2021/7/22
+    * @param categoryId:分类ID, userCondition
+    * @return java.util.List<com.zcxk.rmcp.api.vo.DeviceNoCellVo>
+    **/
+    List<DeviceNoCellVo> listNoCellDevice(@Param("categoryId") Integer categoryId, @Param("userCondition") UserCondition userCondition);
+
 }

+ 14 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ProductCategoryMapper.java

@@ -1,7 +1,12 @@
 package com.zcxk.rmcp.core.dao;
 
+import com.zcxk.core.common.pojo.UserCondition;
+import com.zcxk.rmcp.api.vo.ProductCategoryVo;
 import com.zcxk.rmcp.core.entity.ProductCategory;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * 
@@ -13,4 +18,13 @@ public interface ProductCategoryMapper {
     int insertSelective(ProductCategory record);
 
     int updateByPrimaryKeySelective(ProductCategory record);
+
+    /**
+    * @author Andy
+    * @description 获取产品分类
+    * @date 17:14 2021/7/21
+    * @param userCondition
+    * @return java.util.List<com.zcxk.rmcp.api.vo.ProductCategoryVo>
+    **/
+    List<ProductCategoryVo> listProductCategory(@Param("userCondition") UserCondition userCondition);
 }

+ 2 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/ProductMapper.java

@@ -13,4 +13,6 @@ public interface ProductMapper {
     int insertSelective(Product record);
 
     int updateByPrimaryKeySelective(Product record);
+
+    Product findById(Integer id);
 }

+ 26 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/dao/mongo/MeterReadRecordDao.java

@@ -0,0 +1,26 @@
+package com.zcxk.rmcp.core.dao.mongo;
+
+import com.zcxk.core.mongo.base.BaseDao;
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
+import org.springframework.stereotype.Repository;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/22
+ **/
+@Repository
+public class MeterReadRecordDao extends BaseDao {
+
+    /**
+    * @author Andy
+    * @description 保存抄表记录
+    * @date 16:32 2021/7/22
+    * @param readRecord
+    * @return void
+    **/
+    public void saveMeterReadRecord(MeterReadRecord readRecord){
+        super.save(readRecord);
+    }
+}

+ 3 - 1
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/entity/Device.java

@@ -2,6 +2,8 @@ package com.zcxk.rmcp.core.entity;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import lombok.Data;
@@ -13,7 +15,7 @@ import lombok.Data;
  */
 @ApiModel(value="com-zcxk-rmcp-core-entity-Device")
 @Data
-public class Device {
+public class Device implements Serializable {
     @ApiModelProperty(value="")
     private Long id;
 

+ 67 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/DeviceMapper.xml

@@ -28,6 +28,27 @@
     <result column="update_by" property="updateBy" />
     <result column="update_date" property="updateDate" />
   </resultMap>
+
+  <resultMap type="com.zcxk.rmcp.api.vo.DeviceStatusVo" id="deviceStatusMap">
+    <result property="name" column="name" jdbcType="VARCHAR"/>
+    <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>
+  </resultMap>
+
+  <resultMap type="com.zcxk.rmcp.api.vo.DeviceCommunityVo" id="deviceCommunityMap">
+    <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>
+  </resultMap>
+
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, tenant_id, company_org_id, dept_org_id, product_id, device_no, meter_no, file_no, 
@@ -349,4 +370,50 @@
     select count(1) from rmcp_device where status = 1 and meter_no = #{meterNo}
     <if test="id != null"> and id != #{id}</if>
   </select>
+
+  <select id="totalDeviceStatus" resultMap="deviceStatusMap">
+    SELECT
+    rc.name, rd.device_status as status, count(1) total
+    FROM
+    rmcp_device rd
+    INNER JOIN rmcp_product_category rc on rd.category_id = rc.id
+    WHERE
+    rd.status = 1 and rc.status = 1
+    <include refid="permissionCondition"/>
+    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
+  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>
+  WHERE
+    rd.status = 1 and rc.status = 1
+    <if test="categoryId != null and category != ''">
+      and rp.id = #{categoryId}
+    </if>
+  <include refid="permissionCondition"/>
+  AND rd.community_id > 0
+  GROUP BY rd.community_id, 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
+     FROM
+    rmcp_device rd
+    LEFT JOIN rmcp_product_category rc on rc.id = rd.category_id
+     WHERE
+    rd.status = 1 and rc.status = 1
+    <if test="categoryId != null and category != ''">
+      and rc.id = 1 = #{categoryId}
+    </if>
+    <include refid="permissionCondition"/>
+      AND rd.community_id = 0
+  </select>
 </mapper>

+ 43 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ProductCategoryMapper.xml

@@ -17,6 +17,37 @@
     <!--@mbg.generated-->
     id, `name`, icon, `status`, create_date, create_by, update_date, update_by
   </sql>
+
+  <sql id="permissionCondition">
+    <if test="userCondition.tenantId != null">and rd.tenant_id = #{userCondition.tenantId}</if>
+    <if test="userCondition.userType!=null and userCondition.userType!=-999 and userCondition.userType!=-9999 and  userCondition.programItems != null and userCondition.programItems.size() > 0">
+      <if test="userCondition.permissionType == 5 or userCondition.permissionType == 2">
+        and ( rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        or
+        rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        )
+      </if>
+      <if test="userCondition.permissionType == 4 or userCondition.permissionType == 3">
+        and rd.dept_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+      </if>
+      <if test="userCondition.permissionType == 1">
+        and rd.company_org_id in
+        <foreach collection="userCondition.programItems" item="item" open="(" close=")" separator=",">
+          #{item.orgId}
+        </foreach>
+        and (rd.dept_org_id is null or rd.dept_org_id =0)
+      </if>
+    </if>
+  </sql>
   <insert id="insertSelective" keyColumn="id" keyProperty="id" parameterType="com.zcxk.rmcp.core.entity.ProductCategory" useGeneratedKeys="true">
     <!--@mbg.generated-->
     insert into rmcp_product_category
@@ -95,4 +126,16 @@
     </set>
     where id = #{id}
   </update>
+
+  <select id="listProductCategory" resultType="com.zcxk.rmcp.api.vo.ProductCategoryVo">
+    select
+    rc.id, rc.name
+    from
+    rmcp_device rd
+    INNER JOIN rmcp_product_category rc on rd.category_id = rc.id
+    where
+    rd.status = 1 and rc.status = 1
+    <include refid="permissionCondition"/>
+    GROUP BY rc.id, rc.name
+  </select>
 </mapper>

+ 7 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mapper/ProductMapper.xml

@@ -157,4 +157,11 @@
     </set>
     where id = #{id}
   </update>
+
+  <select id="findById" resultType="com.zcxk.rmcp.core.entity.Product">
+    select <include refid="Base_Column_List"></include>
+    from rmcp_product
+    where
+    id = #{id} and status = 1
+  </select>
 </mapper>

+ 111 - 0
zoniot-rmcp/zoniot-rmcp-core/src/main/java/com/zcxk/rmcp/core/mongo/MeterReadRecord.java

@@ -0,0 +1,111 @@
+package com.zcxk.rmcp.core.mongo;
+
+import com.zcxk.core.mongo.base.BaseDO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/22
+ **/
+@Data
+public class MeterReadRecord extends BaseDO {
+
+    @ApiModelProperty(value="年")
+    private Integer year;
+
+    @ApiModelProperty(value="租户")
+    private String tenantId;
+
+    @ApiModelProperty(value="分类")
+    private Integer categoryId;
+
+    @ApiModelProperty(value="公司ID")
+    private Integer companyOrgId;
+
+    @ApiModelProperty(value="公司名字")
+    private String companyOrgName;
+
+    @ApiModelProperty(value="部门Id")
+    private Integer deptOrgId;
+
+    @ApiModelProperty(value="部门名字")
+    private String deptOrgName;
+
+    @ApiModelProperty(value="小区ID")
+    private Integer communityId;
+
+    @ApiModelProperty(value="小区名字")
+    private String communityName;
+
+    @ApiModelProperty(value="集中器ID")
+    private Integer concentratorId;
+
+    @ApiModelProperty(value="集中器编码")
+    private String concentratorCode;
+
+    @ApiModelProperty(value="采集器ID")
+    private Integer collectorId;
+
+    @ApiModelProperty(value="采集器编码")
+    private String collectorCode;
+
+    @ApiModelProperty(value="设备id")
+    private Long deviceId;
+
+    @ApiModelProperty(value="设备编号")
+    private String deviceNo;
+
+    @ApiModelProperty(value="安装地址")
+    private String location;
+
+    @ApiModelProperty(value="产品ID/水表类型")
+    private Integer productId;
+
+    @ApiModelProperty(value="设备型号 <= 厂商名字/产品名字/产品型号")
+    private String deviceModel;
+
+    @ApiModelProperty(value="通道号")
+    private String channelNumber;
+
+    @ApiModelProperty(value="电子号")
+    private String meterNo;
+
+    @ApiModelProperty(value="档案号")
+    private String fileNo;
+
+    @ApiModelProperty(value="抄表数据")
+    private List<MeterReadInfo> data;
+
+    @Data
+    public static  class MeterReadInfo implements Serializable  {
+
+        @ApiModelProperty(value="读表日期")
+        private String readDate;
+
+        @ApiModelProperty(value="抄表时间/读表时间")
+        private Date readTime;
+
+        @ApiModelProperty(value="阀门状态")
+        private Integer valveStatus;
+
+        @ApiModelProperty(value="读数")
+        private String readData;
+
+        @ApiModelProperty(value="最近有效数据")
+        private String lastValid;
+
+        @ApiModelProperty(value="距离上次的消耗/当天用水量")
+        private BigDecimal lastCost;
+    }
+
+
+
+}

+ 15 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/DeviceController.java

@@ -7,6 +7,8 @@ import com.zcxk.core.common.util.UserUtil;
 import com.zcxk.core.mysql.pageing.Pagination;
 import com.zcxk.rmcp.api.dto.DeviceInputDto;
 import com.zcxk.rmcp.api.query.CommonQueryCondition;
+import com.zcxk.rmcp.api.vo.DeviceMapDataVo;
+import com.zcxk.rmcp.api.vo.DeviceStatisticsVo;
 import com.zcxk.rmcp.api.vo.DeviceVo;
 import com.zcxk.rmcp.core.entity.Device;
 import com.zcxk.rmcp.web.service.DeviceService;
@@ -225,4 +227,17 @@ public class DeviceController {
         deviceService.allDel(condition);
         return AjaxMessage.success();
     }
+
+    @RequestMapping(value = "/statistics", method = RequestMethod.GET)
+    @ApiOperation(value = "设备统计")
+    public AjaxMessage<DeviceStatisticsVo> statisticsDevice() {
+        return AjaxMessage.success(deviceService.statisticsDevice());
+    }
+
+    @RequestMapping(value = "/map/data", method = RequestMethod.GET)
+    @ApiOperation(value = "地图数据")
+    public AjaxMessage<DeviceMapDataVo> mapData(@ApiParam(value = "分类id", required = false) @RequestParam(required = false) Integer categoryId) {
+        return AjaxMessage.success(deviceService.listDeviceAndCommunityInfo(categoryId));
+    }
+
 }

+ 41 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/MeterReadRecordController.java

@@ -0,0 +1,41 @@
+package com.zcxk.rmcp.web.controller;
+
+import com.zcxk.core.common.pojo.AjaxMessage;
+import com.zcxk.core.mysql.pageing.Pagination;
+import com.zcxk.rmcp.api.vo.DeviceCommandVo;
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
+import com.zcxk.rmcp.web.service.MeterReadRecordServcie;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/22
+ **/
+@Controller
+@ResponseBody
+@RequestMapping("/meter/read/record")
+@Api(tags = "抄表记录")
+public class MeterReadRecordController {
+
+    @Resource
+    private MeterReadRecordServcie meterReadRecordServcie;
+
+    @RequestMapping(value = "/add", method = RequestMethod.POST)
+    @ApiOperation(value = "抄表记录添加")
+    public AjaxMessage<Void> addMeterReadRecord(@RequestBody @Valid MeterReadRecord readRecord) {
+        meterReadRecordServcie.saveMeterReadRecord(readRecord);
+        return AjaxMessage.success();
+    }
+
+}

+ 30 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/controller/ProductCategoryController.java

@@ -0,0 +1,30 @@
+package com.zcxk.rmcp.web.controller;
+
+import com.zcxk.core.common.pojo.AjaxMessage;
+import com.zcxk.rmcp.web.service.ProductCategoryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+
+@Controller
+@ResponseBody
+@RequestMapping("/product/category")
+@Api(tags = "产品分类")
+public class ProductCategoryController {
+
+    @Autowired
+    private ProductCategoryService productCategoryService;
+
+    @RequestMapping(value = "/list", method = RequestMethod.GET)
+    @ApiOperation(value = "查询产品分类")
+    public AjaxMessage<List> listProductCategory() {
+        return AjaxMessage.success(productCategoryService.listProductCategory());
+    }
+
+}

+ 14 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/DeviceCommandService.java

@@ -14,9 +14,22 @@ import java.util.List;
  */
 public interface DeviceCommandService{
 
-
+    /**
+    * @author Andy
+    * @description 保存数据
+    * @date 11:47 2021/7/21
+    * @param record:请求参数
+    * @return int
+    **/
     int insertSelective(DeviceCommand record);
 
+    /**
+    * @author Andy
+    * @description 更新数据
+    * @date 11:48 2021/7/21
+    * @param  record:请求参数
+    * @return int
+    **/
     int updateByPrimaryKeySelective(DeviceCommand record);
 
     /**

+ 22 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/DeviceService.java

@@ -3,6 +3,8 @@ package com.zcxk.rmcp.web.service;
 import com.zcxk.core.mysql.pageing.Pagination;
 import com.zcxk.rmcp.api.dto.DeviceInputDto;
 import com.zcxk.rmcp.api.query.CommonQueryCondition;
+import com.zcxk.rmcp.api.vo.DeviceMapDataVo;
+import com.zcxk.rmcp.api.vo.DeviceStatisticsVo;
 import com.zcxk.rmcp.api.vo.DeviceVo;
 import com.zcxk.rmcp.core.entity.Device;
 
@@ -33,4 +35,24 @@ public interface DeviceService{
     void batchDel(List<Integer> ids);
 
     void allDel(CommonQueryCondition condition);
+
+    /**
+     * @author Andy
+     * @description 统计设备占比、状态数
+     * @date 15:45 2021/7/21
+     * @param
+     * @return com.zcxk.rmcp.api.vo.DeviceStatisticsVo
+     **/
+    DeviceStatisticsVo statisticsDevice();
+
+    /**
+    * @author Andy
+    * @description  获取设备和小区信息
+    * @date 10:45 2021/7/22
+    * @param
+    * @return com.zcxk.rmcp.api.vo.DeviceMapDataVo
+    **/
+    DeviceMapDataVo listDeviceAndCommunityInfo(Integer categoryId);
+
+
 }

+ 21 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/MeterReadRecordServcie.java

@@ -0,0 +1,21 @@
+package com.zcxk.rmcp.web.service;
+
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/21
+ **/
+public interface MeterReadRecordServcie {
+
+    /**
+    * @author Andy
+    * @description 保存抄表记录
+    * @date 16:34 2021/7/22
+    * @param readRecord
+    * @return void
+    **/
+    void saveMeterReadRecord(MeterReadRecord readRecord);
+}

+ 14 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/ProductCategoryService.java

@@ -1,7 +1,11 @@
 package com.zcxk.rmcp.web.service;
 
+import com.zcxk.rmcp.api.vo.ProductCategoryVo;
 import com.zcxk.rmcp.core.entity.ProductCategory;
-    /**
+
+import java.util.List;
+
+/**
  * 
  * @author linqingwei
  * @date 2021-07-21 17:00
@@ -13,4 +17,13 @@ public interface ProductCategoryService{
 
     int updateByPrimaryKeySelective(ProductCategory record);
 
+    /**
+    * @author Andy
+    * @description 获取产品分类
+    * @date 17:15 2021/7/21
+    * @param
+    * @return java.util.List<com.zcxk.rmcp.api.vo.ProductCategoryVo>
+    **/
+    List<ProductCategoryVo> listProductCategory();
+
 }

+ 87 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/DeviceServiceImpl.java

@@ -6,16 +6,19 @@ import com.github.pagehelper.PageHelper;
 import com.zcxk.core.common.enums.StatusEnum;
 import com.zcxk.core.common.exception.BusinessException;
 import com.zcxk.core.common.pojo.LoginUser;
+import com.zcxk.core.common.pojo.UserCondition;
 import com.zcxk.core.common.util.BeanCopyUtils;
 import com.zcxk.core.common.util.SnowflakeIdWorker;
 import com.zcxk.core.common.util.UserUtil;
 import com.zcxk.core.mysql.pageing.Pagination;
+import com.zcxk.core.utils.BigDecimalUtils;
+import com.zcxk.core.utils.ZoniotIntegerUtils;
 import com.zcxk.rmcp.api.dto.DeviceInputDto;
 import com.zcxk.rmcp.api.enums.DeviceStatusEnum;
 import com.zcxk.rmcp.api.enums.RmcpErrorEnum;
 import com.zcxk.rmcp.api.enums.ValveStatusEnum;
 import com.zcxk.rmcp.api.query.CommonQueryCondition;
-import com.zcxk.rmcp.api.vo.DeviceVo;
+import com.zcxk.rmcp.api.vo.*;
 import com.zcxk.rmcp.core.dao.DeviceMapper;
 import com.zcxk.rmcp.core.entity.Device;
 import lombok.extern.slf4j.Slf4j;
@@ -23,8 +26,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import com.zcxk.rmcp.web.service.DeviceService;
+import org.springframework.util.CollectionUtils;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 
@@ -133,4 +141,82 @@ public class DeviceServiceImpl implements DeviceService{
         deviceMapper.delByIds(null);
         log.info("end DeviceServiceImpl allDel ");
     }
+
+
+    @Override
+    public DeviceStatisticsVo statisticsDevice() {
+        List<DeviceStatusVo> list = deviceMapper.totalDeviceStatus(UserUtil.getCurrentUser().getUserCondition());
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+        // 总数
+        int allTotal = 0;
+        // 单个设备总数
+        int deviceTotal = 0;
+        DeviceStatisticsVo  statisticsVo = new DeviceStatisticsVo();
+        Map<String, StatusStatisticsVo> statusMap = new HashMap<>();
+        List<DeviceStatisticsVo.DeviceRatio> ratioList = new ArrayList<>();
+        for (DeviceStatusVo deviceStatusVo : list) {
+            for (StatusStatisticsVo statistic : deviceStatusVo.getStatistics()) {
+                // 统计同一个状态的条数
+                totalStatus(statusMap, statistic);
+                deviceTotal += statistic.getTotal();
+            }
+            DeviceStatisticsVo.DeviceRatio ratio = new DeviceStatisticsVo.DeviceRatio();
+            ratio.setName(deviceStatusVo.getName());
+            ratio.setTotal(deviceTotal);
+            ratioList.add(ratio);
+            allTotal += deviceTotal;
+        }
+        // 占比运算
+        ratioDevice(ratioList, allTotal);
+        // 状态统计数
+        statisticsVo.setStatusList(statusMap.values().stream().collect(Collectors.toList()));
+        // 设备占比数
+        statisticsVo.setRatios(ratioList);
+        // 总数
+        statisticsVo.setTotal(ZoniotIntegerUtils.decimalFormat(allTotal));
+        return statisticsVo;
+    }
+
+
+    @Override
+    public DeviceMapDataVo listDeviceAndCommunityInfo(Integer categoryId){
+        UserCondition condition = UserUtil.getCurrentUser().getUserCondition();
+        DeviceMapDataVo result = new DeviceMapDataVo();
+        result.setDeviceCommunityList(deviceMapper.listCommunityDevice(categoryId, condition));
+        result.setNoCellVoList(deviceMapper.listNoCellDevice(categoryId, condition));
+        return result;
+    }
+
+
+    /**
+     * @author Andy
+     * @description 统计状态数
+     * @date 16:34 2021/7/21
+     * @param statusMap, statistic
+     * @return void
+     **/
+    private void totalStatus(Map<String, StatusStatisticsVo> statusMap, StatusStatisticsVo statistic){
+        StatusStatisticsVo statusStatisticsVo = statusMap.get(statistic.getStatus());
+        if (statusStatisticsVo == null) {
+            statusStatisticsVo = new StatusStatisticsVo();
+        }
+        statusStatisticsVo.setStatus(statistic.getStatus());
+        statusStatisticsVo.setTotal(statusStatisticsVo.getTotal() + statistic.getTotal());
+        statusMap.put(statistic.getStatus(), statusStatisticsVo);
+    }
+
+    /**
+     * @author Andy
+     * @description 占比运算
+     * @date 16:34 2021/7/21
+     * @param ratioList, total
+     * @return void
+     **/
+    private void ratioDevice(List<DeviceStatisticsVo.DeviceRatio> ratioList, int total){
+        for (DeviceStatisticsVo.DeviceRatio ratio : ratioList) {
+            ratio.setRatio(BigDecimalUtils.percentDivide(ratio.getTotal(), total, 2));
+        }
+    }
 }

+ 26 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReadRecordServcieImpl.java

@@ -0,0 +1,26 @@
+package com.zcxk.rmcp.web.service.impl;
+
+import com.zcxk.rmcp.core.dao.mongo.MeterReadRecordDao;
+import com.zcxk.rmcp.core.mongo.MeterReadRecord;
+import com.zcxk.rmcp.web.service.MeterReadRecordServcie;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ * @author Andy
+ * @version V1.0
+ * @description: 抄表记录
+ * @date 2021/7/22
+ **/
+@Service
+public class MeterReadRecordServcieImpl implements MeterReadRecordServcie {
+
+    @Resource
+    private MeterReadRecordDao meterReadRecordDao;
+
+    @Override
+    public void saveMeterReadRecord(MeterReadRecord readRecord) {
+        meterReadRecordDao.saveMeterReadRecord(readRecord);
+    }
+}

+ 16 - 7
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/MeterReplaceLogServiceImpl.java

@@ -13,9 +13,12 @@ import com.zcxk.rmcp.api.dto.meterReplace.MeterReplacePageDto;
 import com.zcxk.rmcp.api.dto.meterReplace.WaterMeterReplaceInputDto;
 import com.zcxk.rmcp.api.enums.ReplaceMethodEnum;
 import com.zcxk.rmcp.api.enums.RmcpErrorEnum;
+import com.zcxk.rmcp.api.vo.DeviceVo;
 import com.zcxk.rmcp.api.vo.MeterReplaceVo;
 import com.zcxk.rmcp.core.dao.DeviceMapper;
+import com.zcxk.rmcp.core.dao.ProductMapper;
 import com.zcxk.rmcp.core.entity.Device;
+import com.zcxk.rmcp.core.entity.Product;
 import com.zcxk.rmcp.web.service.MeterReplaceLogService;
 import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
@@ -45,6 +48,9 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
     @Resource
     private DeviceMapper deviceMapper;
 
+    @Resource
+    private ProductMapper productMapper;
+
     @Override
     public int insertSelective(MeterReplaceLog record) {
         return meterReplaceLogMapper.insertSelective(record);
@@ -81,7 +87,7 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
     public void submitWaterMeterReplace(WaterMeterReplaceInputDto waterMeterReplaceDto) {
         log.info("begin submitWaterMeterReplace waterMeterReplaceInputDto:{}", JSON.toJSON(waterMeterReplaceDto));
         Boolean remoteMeterFlag = false;
-        Device device = deviceMapper.findById(waterMeterReplaceDto.getDeviceId());
+        DeviceVo device = deviceMapper.findById(waterMeterReplaceDto.getDeviceId());
         // 判断设备编号和电子号是否已经存在
         if (ZoniotStringUtils.isNotEmpty(waterMeterReplaceDto.getNewDeviceNo())) {
             int resultDeviceNo = deviceMapper.findByDeviceNoUnique(waterMeterReplaceDto.getDeviceId(), waterMeterReplaceDto.getNewDeviceNo());
@@ -99,6 +105,8 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
         insertSelective(waterMeterReplaceDto, device);
         // 2、更改设备信息
         updateDevice(waterMeterReplaceDto, device);
+
+        // TODO  waterRelatedDeviceMapper.realDelByDeviceId(waterMeterReplaceInputDto.getDeviceId());
         /*if (remoteMeterFlag) {
             //先删除再插入
             waterRelatedDeviceMapper.realDelByDeviceId(waterMeterReplaceInputDto.getDeviceId());
@@ -148,7 +156,7 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
     * @param waterMeterReplaceDto:换标记录, device, deviceTypeId]
     * @return void
     **/
-    private void insertSelective(WaterMeterReplaceInputDto waterMeterReplaceDto, Device device){
+    private void insertSelective(WaterMeterReplaceInputDto waterMeterReplaceDto, DeviceVo device){
         Integer deviceTypeId = waterMeterReplaceDto.getNewDeviceTypeId() != null ? waterMeterReplaceDto.getNewDeviceTypeId() : device.getProductId();
         LoginUser loginUser = UserUtil.getCurrentUser();
         String username  = loginUser.getUsername();
@@ -181,8 +189,7 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
     * @param waterMeterReplaceDto:换表信息, device:设备信息]
     * @return void
     **/
-    private void updateDevice(WaterMeterReplaceInputDto waterMeterReplaceDto, Device device){
-
+    private void updateDevice(WaterMeterReplaceInputDto waterMeterReplaceDto, DeviceVo device){
         Device newDevice = new Device();
         newDevice.setId(device.getId());
         if (ZoniotStringUtils.isNotEmpty(waterMeterReplaceDto.getNewDeviceNo())) {
@@ -192,12 +199,14 @@ public class MeterReplaceLogServiceImpl implements MeterReplaceLogService {
             newDevice.setMeterNo(waterMeterReplaceDto.getNewMeterNo());
         }
         if (ZoniotIntegerUtils.isNotEmpty(waterMeterReplaceDto.getNewDeviceTypeId())) {
-            // TODO 根据产品ID,查询产品
-            // ChannelDeviceTypeUse use = channelDeviceTypeUseMapper.findByDeviceId(waterMeterReplaceDto.getNewDeviceTypeId());
-            // newDevice.setCategoryId();
+            Product product = productMapper.findById(waterMeterReplaceDto.getNewDeviceTypeId());
+            if (product != null) {
+                newDevice.setCategoryId(product.getProductCategoryId());
+            }
         }
         newDevice.setSealNo(waterMeterReplaceDto.getSealNo());
         newDevice.setUpdateDate(LocalDateTime.now());
+        newDevice.setUpdateBy(UserUtil.getUsername());
         deviceMapper.updateByPrimaryKeySelective(newDevice);
     }
 }

+ 9 - 0
zoniot-rmcp/zoniot-rmcp-web/src/main/java/com/zcxk/rmcp/web/service/impl/ProductCategoryServiceImpl.java

@@ -1,11 +1,15 @@
 package com.zcxk.rmcp.web.service.impl;
 
+import com.zcxk.core.common.util.UserUtil;
+import com.zcxk.rmcp.api.vo.ProductCategoryVo;
 import com.zcxk.rmcp.web.service.ProductCategoryService;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import com.zcxk.rmcp.core.entity.ProductCategory;
 import com.zcxk.rmcp.core.dao.ProductCategoryMapper;
 
+import java.util.List;
+
 /**
  * 
  * @author linqingwei
@@ -27,4 +31,9 @@ public class ProductCategoryServiceImpl implements ProductCategoryService {
         return productCategoryMapper.updateByPrimaryKeySelective(record);
     }
 
+    @Override
+    public List<ProductCategoryVo> listProductCategory() {
+        return productCategoryMapper.listProductCategory(UserUtil.getCurrentUser().getUserCondition());
+    }
+
 }

+ 4 - 1
zoniot-rmcp/zoniot-rmcp-web/src/main/resources/application-dev.properties

@@ -100,6 +100,10 @@ spring.rabbitmq.publisher-confirm-type=correlated
 spring.rabbitmq.publisher-returns=true
 spring.rabbitmq.template.mandatory=true
 
+#mongodb url
+spring.data.mongodb.uri=mongodb://114.135.61.188:17017/meter-reading-database
+logging.level.org.springframework.data.mongodb.core=DEBUG
+
 dispath.queue=dispath
 receive.exchange.name=messageExchange
 dispath.routing.key=dipathKey
@@ -109,7 +113,6 @@ ribbon.ReadTimeout=5000:
 ribbon.ConnectTimeout=3000
 
 
--