From a0587b1f268b8535ed660fbc521d341d9268340a Mon Sep 17 00:00:00 2001
From: chenjiantian <214228265@qq.com>
Date: 星期五, 17 十二月 2021 18:15:17 +0800
Subject: [PATCH] 灯模块

---
 dao/src/main/java/com/sandu/ximon/dao/domain/Light.java                                                              |   12 
 dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java                                                        |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java                   |   16 
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/InitAmqpListener.java                               |   14 
 dao/src/main/resources/mapper/LightMapper.xml                                                                        |   47 +++
 dao/src/main/java/com/sandu/ximon/dao/mapper/LightMapper.java                                                        |   30 ++
 dao/src/main/resources/mapper/LightReportErrorMapper.xml                                                             |   35 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java                                            |   96 ++++++
 dao/src/main/java/com/sandu/ximon/dao/domain/LightReportData.java                                                    |    9 
 dao/src/main/java/com/sandu/ximon/dao/bo/LightReportDataBo.java                                                      |   14 +
 dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportDataMapper.java                                              |   18 +
 dao/src/main/resources/mapper/LightReportDataMapper.xml                                                              |   50 +++
 dao/src/main/java/com/sandu/ximon/dao/bo/LightBo.java                                                                |   22 +
 dao/src/main/resources/mapper/PoleBindingMapper.xml                                                                  |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleBindingParam.java                                          |    4 
 ximon-admin/src/main/java/com/sandu/ximon/admin/dto/DeviceStatus.java                                                |   21 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java                                      |   18 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java                                  |   25 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportErrorService.java                                 |   44 +++
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java                                             |   25 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java                                      |   48 ++
 dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportErrorMapper.java                                             |   26 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java                                       |   13 
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java                                  |    2 
 /dev/null                                                                                                            |   15 -
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java |    8 
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightRemarkParam.java                                          |   21 +
 dao/src/main/java/com/sandu/ximon/dao/bo/LightReportErrorBo.java                                                     |   15 +
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/DeviceStateEnum.java                          |   44 +++
 dao/src/main/java/com/sandu/ximon/dao/domain/LightReportError.java                                                   |   18 
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java |   11 
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightErrorEnum.java                           |   61 ++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/redis/LightKey.java                                                  |    5 
 33 files changed, 698 insertions(+), 97 deletions(-)

diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/LightBo.java b/dao/src/main/java/com/sandu/ximon/dao/bo/LightBo.java
new file mode 100644
index 0000000..479594f
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/LightBo.java
@@ -0,0 +1,22 @@
+package com.sandu.ximon.dao.bo;
+
+import com.sandu.ximon.dao.domain.Light;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/17 14:51
+ * 璺伅鍒楄〃瀹炰綋绫�
+ */
+@Data
+public class LightBo extends Light {
+
+    private Long poleId;
+    private String poleCode;
+    private String poleName;
+    private String taskName;
+    private LocalDateTime reportTime;
+
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportDataBo.java b/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportDataBo.java
new file mode 100644
index 0000000..b086376
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportDataBo.java
@@ -0,0 +1,14 @@
+package com.sandu.ximon.dao.bo;
+
+import com.sandu.ximon.dao.domain.LightReportData;
+import lombok.Data;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/17 16:51
+ */
+@Data
+public class LightReportDataBo extends LightReportData {
+
+    private String poleName;
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportErrorBo.java b/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportErrorBo.java
new file mode 100644
index 0000000..fb52838
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/bo/LightReportErrorBo.java
@@ -0,0 +1,15 @@
+package com.sandu.ximon.dao.bo;
+
+import com.sandu.ximon.dao.domain.LightReportError;
+import lombok.Data;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/17 16:51
+ */
+@Data
+public class LightReportErrorBo extends LightReportError {
+
+    private String poleName;
+    private String errorMsg;
+}
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java b/dao/src/main/java/com/sandu/ximon/dao/domain/Light.java
similarity index 79%
rename from dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java
rename to dao/src/main/java/com/sandu/ximon/dao/domain/Light.java
index beba73c..622aa09 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/Light.java
@@ -9,22 +9,22 @@
 import lombok.Data;
 
 /**
- * 璺伅澶囨敞琛�
- * @TableName light_remark
+ * 璺伅琛�
+ * @TableName light
  */
-@TableName(value ="light_remark")
+@TableName(value ="light")
 @Data
-public class LightRemark implements Serializable {
+public class Light implements Serializable {
     /**
      * 
      */
     @TableId(type = IdType.AUTO)
-    private Long id;
+    private Long lightId;
 
     /**
      * 璁惧璇嗗埆鐮�
      */
-    private String deviceMac;
+    private String deviceCode;
 
     /**
      * 澶囨敞淇℃伅
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportData.java b/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportData.java
index f2fa8f6..101b032 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportData.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportData.java
@@ -24,7 +24,7 @@
     /**
      * 璁惧mac
      */
-    private String deviceMac;
+    private String deviceCode;
 
     /**
      * 甯傜數鐢靛帇
@@ -57,11 +57,16 @@
     private Double reactivePower;
 
     /**
-     * 浜害鐧惧垎姣旓紝0-100
+     * 鐏�1浜害鐧惧垎姣旓紝0-100
      */
     private Integer lightPercent;
 
     /**
+     * 鐏�2浜害鐧惧垎姣�
+     */
+    private Integer light2Percent;
+
+    /**
      * 鏈�杩戜竴娆′寒鐏椂闂�
      */
     private Long recentlyLightSec;
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java b/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportError.java
similarity index 69%
copy from dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java
copy to dao/src/main/java/com/sandu/ximon/dao/domain/LightReportError.java
index beba73c..817358b 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/LightRemark.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/LightReportError.java
@@ -9,27 +9,27 @@
 import lombok.Data;
 
 /**
- * 璺伅澶囨敞琛�
- * @TableName light_remark
+ * 鐏笂鎶ユ晠闅滅爜琛�
+ * @TableName light_report_error
  */
-@TableName(value ="light_remark")
+@TableName(value ="light_report_error")
 @Data
-public class LightRemark implements Serializable {
+public class LightReportError implements Serializable {
     /**
      * 
      */
     @TableId(type = IdType.AUTO)
-    private Long id;
+    private Long lightReportErrorId;
 
     /**
-     * 璁惧璇嗗埆鐮�
+     * 璁惧mac
      */
-    private String deviceMac;
+    private String deviceCode;
 
     /**
-     * 澶囨敞淇℃伅
+     * 鏁呴殰鐮�
      */
-    private String remark;
+    private Integer errorCode;
 
     /**
      * 鍒涘缓鏃堕棿
diff --git a/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java b/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
index 32bb63c..bf15c04 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/domain/PoleBinding.java
@@ -32,9 +32,9 @@
     private String deviceName;
 
     /**
-     * 缁戝畾璁惧mac
+     * 缁戝畾璁惧鐮�
      */
-    private String deviceMac;
+    private String deviceCode;
 
     /**
      * 璁惧绫诲瀷锛�0璺伅锛�1led灞忓箷锛�2鍏呯數妗╋紝3澶ф皵鐩戞祴锛�4姘磋川鐩戞祴锛�5ip闊虫煴锛�6lcd骞垮憡鏈猴紝7鎽勫儚澶达紝8鏉嗕綋鍊炬祴锛�9涓�閿晳鍔�
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightMapper.java
new file mode 100644
index 0000000..36e61f7
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightMapper.java
@@ -0,0 +1,30 @@
+package com.sandu.ximon.dao.mapper;
+
+import com.sandu.ximon.dao.bo.LightBo;
+import com.sandu.ximon.dao.domain.Light;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sandu.ximon.dao.domain.LightReportData;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @Entity com.sandu.ximon.dao.domain.Light
+ */
+@Mapper
+public interface LightMapper extends BaseMapper<Light> {
+
+    /**
+     * 鏈嶅姟鍣ㄨ幏鍙栬矾鐏垪琛�
+     *
+     * @param clientId 瀹㈡埛id
+     * @param keyword 鍏抽敭瀛�
+     * @return 璺伅鍒楄〃
+     */
+    List<LightBo> listLight(Long clientId, String keyword);
+
+}
+
+
+
+
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightRemarkMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightRemarkMapper.java
deleted file mode 100644
index 325fb2e..0000000
--- a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightRemarkMapper.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.sandu.ximon.dao.mapper;
-
-import com.sandu.ximon.dao.domain.LightRemark;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * @Entity com.sandu.ximon.dao.domain.LightRemark
- */
-@Mapper
-public interface LightRemarkMapper extends BaseMapper<LightRemark> {
-
-}
-
-
-
-
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportDataMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportDataMapper.java
index fada183..40ea701 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportDataMapper.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportDataMapper.java
@@ -1,8 +1,11 @@
 package com.sandu.ximon.dao.mapper;
 
+import com.sandu.ximon.dao.bo.LightReportDataBo;
 import com.sandu.ximon.dao.domain.LightReportData;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * @Entity com.sandu.ximon.dao.domain.LightReportData
@@ -10,6 +13,21 @@
 @Mapper
 public interface LightReportDataMapper extends BaseMapper<LightReportData> {
 
+    /**
+     * 鑾峰彇鎸囧畾璁惧鍚楁渶鏂颁笂鎶ョ殑涓�鏉℃暟鎹�
+     * @param deviceCodeList 鎸囧畾璁惧鐮�
+     * @return 涓婃姤鏁版嵁
+     */
+    List<LightReportData> getNewestReportByDeviceCode(List<String> deviceCodeList);
+
+
+    /**
+     * 鑾峰彇涓婃姤鏁版嵁鍒楄〃
+     * @param keyword 鍏抽敭璇�
+     * @param deviceCode 璁惧鐮�
+     * @return 涓婃姤鏁版嵁
+     */
+    List<LightReportDataBo> listReportData(String keyword, String deviceCode);
 }
 
 
diff --git a/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportErrorMapper.java b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportErrorMapper.java
new file mode 100644
index 0000000..e451d0c
--- /dev/null
+++ b/dao/src/main/java/com/sandu/ximon/dao/mapper/LightReportErrorMapper.java
@@ -0,0 +1,26 @@
+package com.sandu.ximon.dao.mapper;
+
+import com.sandu.ximon.dao.bo.LightReportErrorBo;
+import com.sandu.ximon.dao.domain.LightReportError;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * @Entity com.sandu.ximon.dao.domain.LightReportError
+ */
+@Mapper
+public interface LightReportErrorMapper extends BaseMapper<LightReportError> {
+
+    /**
+     * 鑾峰彇鏁呴殰鐮佸垪琛�
+     * @param keyword 鍏抽敭璇�
+     * @return 鏁呴殰鐮佸垪琛�
+     */
+    List<LightReportErrorBo> listReportError(String keyword);
+}
+
+
+
+
diff --git a/dao/src/main/resources/mapper/LightMapper.xml b/dao/src/main/resources/mapper/LightMapper.xml
new file mode 100644
index 0000000..13a5468
--- /dev/null
+++ b/dao/src/main/resources/mapper/LightMapper.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sandu.ximon.dao.mapper.LightMapper">
+
+    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.Light">
+        <id property="lightId" column="light_id" jdbcType="BIGINT"/>
+        <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+        <result property="remark" column="remark" jdbcType="VARCHAR"/>
+        <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+        <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+
+    <resultMap id="listLight" type="com.sandu.ximon.dao.bo.LightBo" extends="BaseResultMap">
+        <result property="poleId" column="pole_id" jdbcType="BIGINT"/>
+        <result property="poleCode" column="pole_code" jdbcType="VARCHAR"/>
+        <result property="poleName" column="pole_name" jdbcType="VARCHAR"/>
+        <result property="taskName" column="task_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+
+    <select id="listLight" resultMap="listLight">
+        SELECT
+        t1.*,
+        t2.id AS pole_id,
+        t2.pole_code,
+        t2.pole_name,
+        t4.task_name
+        FROM
+        light t1
+        LEFT JOIN pole t2 USING ( device_code )
+        LEFT JOIN light_task_pole_relation t3 ON t3.pole_id = t2.id
+        LEFT JOIN light_task t4 ON t3.task_id = t4.task_id
+        <where>
+            <if test="clientId != null">
+                AND t2.client_id = #{clientId}
+            </if>
+            <if test="keyword != null and keyword != ''">
+                AND (
+                t1.device_code LIKE CONCAT('%', #{keyword},'%')
+                OR t2.pole_name LIKE CONCAT('%', #{keyword},'%')
+                )
+            </if>
+        </where>
+    </select>
+</mapper>
diff --git a/dao/src/main/resources/mapper/LightRemarkMapper.xml b/dao/src/main/resources/mapper/LightRemarkMapper.xml
deleted file mode 100644
index 830b576..0000000
--- a/dao/src/main/resources/mapper/LightRemarkMapper.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper
-        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="com.sandu.ximon.dao.mapper.LightRemarkMapper">
-
-    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightRemark">
-            <id property="id" column="id" jdbcType="BIGINT"/>
-            <result property="deviceMac" column="device_mac" jdbcType="VARCHAR"/>
-            <result property="remark" column="remark" jdbcType="VARCHAR"/>
-            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
-            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
-    </resultMap>
-
-    <sql id="Base_Column_List">
-        id,device_mac,remark,
-        create_time,update_time
-    </sql>
-</mapper>
diff --git a/dao/src/main/resources/mapper/LightReportDataMapper.xml b/dao/src/main/resources/mapper/LightReportDataMapper.xml
index 360d7cc..649f93f 100644
--- a/dao/src/main/resources/mapper/LightReportDataMapper.xml
+++ b/dao/src/main/resources/mapper/LightReportDataMapper.xml
@@ -6,7 +6,7 @@
 
     <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightReportData">
             <id property="lightReportDataId" column="light_report_data_id" jdbcType="BIGINT"/>
-            <result property="deviceMac" column="device_mac" jdbcType="VARCHAR"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
             <result property="voltage" column="voltage" jdbcType="FLOAT"/>
             <result property="electricCurrent" column="electric_current" jdbcType="FLOAT"/>
             <result property="deviceTemperature" column="device_temperature" jdbcType="FLOAT"/>
@@ -14,6 +14,7 @@
             <result property="activePower" column="active_power" jdbcType="FLOAT"/>
             <result property="reactivePower" column="reactive_power" jdbcType="FLOAT"/>
             <result property="lightPercent" column="light_percent" jdbcType="INTEGER"/>
+            <result property="light2Percent" column="light2_percent" jdbcType="INTEGER"/>
             <result property="recentlyLightSec" column="recently_light_sec" jdbcType="BIGINT"/>
             <result property="totalLightSec" column="total_light_sec" jdbcType="BIGINT"/>
             <result property="recentlyUsingPower" column="recently_using_power" jdbcType="DOUBLE"/>
@@ -22,11 +23,44 @@
             <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
     </resultMap>
 
-    <sql id="Base_Column_List">
-        light_report_data_id,device_mac,voltage,
-        electric_current,device_temperature,power_factor,
-        active_power,reactive_power,light_percent,
-        recently_light_sec,total_light_sec,recently_using_power,
-        total_using_power,create_time,update_time
-    </sql>
+    <resultMap id="listReportData" type="com.sandu.ximon.dao.bo.LightReportDataBo" extends="BaseResultMap">
+        <result property="poleName" column="pole_name" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <select id="getNewestReportByDeviceCode" resultMap="BaseResultMap">
+        SELECT
+        t1.*
+        FROM
+        light_report_data t1
+        JOIN (
+        SELECT
+        MAX( light_report_data_id ) AS light_report_data_id
+        FROM
+        light_report_data
+        WHERE device_code IN
+        <foreach collection="deviceCodeList" open="(" close=")" separator="," item="deviceCode">
+            #{deviceCode}
+        </foreach>
+        GROUP BY device_code
+        ) AS t2 USING ( light_report_data_id )
+    </select>
+    <select id="listReportData" resultMap="listReportData">
+        SELECT
+            t1.* ,t2.pole_name
+        FROM
+            light_report_data t1
+                LEFT JOIN pole t2 USING ( device_code )
+        <where>
+            <if test="keyword != null and keyword != ''">
+                AND (
+                t1.device_code LIKE CONCAT('%', #{keyword},'%')
+                OR t2.pole_name LIKE CONCAT('%', #{keyword},'%')
+                )
+            </if>
+            <if test="deviceCode != null and keyword != ''">
+                AND t1.device_code = #{deviceCode}
+            </if>
+        </where>
+        ORDER BY t1.light_report_data_id DESC
+    </select>
 </mapper>
diff --git a/dao/src/main/resources/mapper/LightReportErrorMapper.xml b/dao/src/main/resources/mapper/LightReportErrorMapper.xml
new file mode 100644
index 0000000..c578b23
--- /dev/null
+++ b/dao/src/main/resources/mapper/LightReportErrorMapper.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.sandu.ximon.dao.mapper.LightReportErrorMapper">
+
+    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightReportError">
+            <id property="lightReportErrorId" column="light_report_error_id" jdbcType="BIGINT"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
+            <result property="errorCode" column="error_code" jdbcType="INTEGER"/>
+            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
+            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
+    </resultMap>
+    <resultMap id="listReportError" type="com.sandu.ximon.dao.bo.LightReportErrorBo" extends="BaseResultMap">
+        <result property="poleName" column="pole_name" jdbcType="INTEGER"/>
+    </resultMap>
+
+    <select id="listReportError" resultMap="listReportError">
+        SELECT
+            t1.*,
+            t2.pole_name
+        FROM
+            light_report_error t1
+                LEFT JOIN pole t2 USING ( device_code )
+        <where>
+            <if test="keyword != null and keyword != ''">
+                AND (
+                t1.device_code LIKE CONCAT('%', #{keyword},'%')
+                OR t2.pole_name LIKE CONCAT('%', #{keyword},'%')
+                )
+            </if>
+        </where>
+        ORDER BY t1.light_report_error_id DESC
+    </select>
+</mapper>
diff --git a/dao/src/main/resources/mapper/PoleBindingMapper.xml b/dao/src/main/resources/mapper/PoleBindingMapper.xml
index 20a429d..23aaa92 100644
--- a/dao/src/main/resources/mapper/PoleBindingMapper.xml
+++ b/dao/src/main/resources/mapper/PoleBindingMapper.xml
@@ -8,7 +8,7 @@
             <id property="id" column="id" jdbcType="BIGINT"/>
             <result property="poleId" column="pole_id" jdbcType="BIGINT"/>
             <result property="deviceName" column="device_name" jdbcType="VARCHAR"/>
-            <result property="deviceMac" column="device_mac" jdbcType="VARCHAR"/>
+            <result property="deviceCode" column="device_code" jdbcType="VARCHAR"/>
             <result property="deviceType" column="device_type" jdbcType="INTEGER"/>
             <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
             <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
@@ -16,7 +16,7 @@
 
     <sql id="Base_Column_List">
         id,pole_id,device_name,
-        device_mac,device_type,create_time,
+        device_code,device_type,create_time,
         update_time
     </sql>
 </mapper>
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java
index 05cc0d0..61607c9 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java
@@ -1,19 +1,18 @@
 package com.sandu.ximon.admin.controller;
 
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.sandu.common.domain.ResponseVO;
 import com.sandu.common.object.BaseConditionVO;
 import com.sandu.common.util.ResponseUtil;
-import com.sandu.ximon.admin.dto.LightDataDto;
+import com.sandu.ximon.admin.param.LightRemarkParam;
 import com.sandu.ximon.admin.service.LightReportDataService;
-import com.sandu.ximon.dao.domain.Pole;
+import com.sandu.ximon.admin.service.LightReportErrorService;
+import com.sandu.ximon.admin.service.LightService;
+import com.sandu.ximon.dao.bo.LightBo;
+import com.sandu.ximon.dao.bo.LightReportDataBo;
+import com.sandu.ximon.dao.bo.LightReportErrorBo;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -27,13 +26,42 @@
 @RequestMapping("/v1/light")
 public class LightController {
 
+    private final LightService lightService;
     private final LightReportDataService lightReportDataService;
+    private final LightReportErrorService lightReportErrorService;
 
 
     @GetMapping("/list")
     public ResponseVO<Object> listLight(BaseConditionVO conditionVO, @RequestParam(required = false) String keyword) {
-        List<LightDataDto> list = lightReportDataService.listLight(conditionVO.getPageNo(),conditionVO.getPageSize(),keyword);
+        List<LightBo> list = lightService.listLight(conditionVO.getPageNo(), conditionVO.getPageSize(), keyword);
         return ResponseUtil.success(list);
     }
 
+    @PostMapping("/remark")
+    public ResponseVO<Object> addRemark(@RequestBody @Validated LightRemarkParam param) {
+        boolean result = lightService.addRemark(param);
+        if (result) {
+            return ResponseUtil.success("娣诲姞鎴愬姛");
+        } else {
+            return ResponseUtil.fail("娣诲姞澶辫触");
+        }
+    }
+
+    /**
+     * 鑾峰彇涓婃姤鏁版嵁
+     *
+     * @param conditionVO
+     * @return
+     */
+    @GetMapping("/report/list")
+    public ResponseVO<Object> listReportData(BaseConditionVO conditionVO, @RequestParam(required = false) String keyword, @RequestParam(required = false) String deviceCode) {
+        List<LightReportDataBo> list = lightReportDataService.listReportData(conditionVO.getPageNo(), conditionVO.getPageSize(), keyword, deviceCode);
+        return ResponseUtil.success(list);
+    }
+
+    @GetMapping("/error/list")
+    public ResponseVO<Object> listReportError(BaseConditionVO conditionVO, @RequestParam(required = false) String keyword) {
+        List<LightReportErrorBo> list = lightReportErrorService.listReportError(conditionVO.getPageNo(), conditionVO.getPageSize(), keyword);
+        return ResponseUtil.success(list);
+    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java
index 508c787..fbcd48e 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java
@@ -54,7 +54,7 @@
 
     @PostMapping("/update/{taskId}")
     public ResponseVO<Object> updateLightTask(@PathVariable Long taskId, @RequestBody @Validated LightTaskParam param) {
-        boolean result = lightTaskService.updateLightTask(taskId,param);
+        boolean result = lightTaskService.updateLightTask(taskId, param);
         if (result) {
             return ResponseUtil.success("缂栬緫鎴愬姛");
         } else {
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
index 9d41d53..bf7a5df 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/controller/PoleController.java
@@ -1,10 +1,13 @@
 package com.sandu.ximon.admin.controller;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.sandu.common.domain.ResponseVO;
 import com.sandu.common.util.ResponseUtil;
+import com.sandu.ximon.admin.dto.DeviceStatus;
 import com.sandu.ximon.admin.param.PoleBindingParam;
 import com.sandu.ximon.admin.param.PoleParam;
 import com.sandu.ximon.admin.service.PoleService;
@@ -13,6 +16,7 @@
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Arrays;
 import java.util.List;
 
 /**
@@ -92,5 +96,14 @@
         }
     }
 
+    @PostMapping("/listStatusByDeviceCode")
+    public ResponseVO<Object> getStatusById(@RequestBody String[] deviceCodeList){
+        if(ArrayUtil.isEmpty(deviceCodeList)) {
+            return ResponseUtil.fail("鍙傛暟涓嶈兘涓虹┖");
+        }
+        List<DeviceStatus> statusList = poleService.listStatusByDeviceCode(CollectionUtil.toList(deviceCodeList));
+        return ResponseUtil.success(statusList);
+    }
+
 
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/dto/DeviceStatus.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/dto/DeviceStatus.java
new file mode 100644
index 0000000..3886764
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/dto/DeviceStatus.java
@@ -0,0 +1,21 @@
+package com.sandu.ximon.admin.dto;
+
+import lombok.Data;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/17 15:55
+ * 闃块噷浜戣澶囩姸鎬�
+ */
+@Data
+public class DeviceStatus {
+
+    private String deviceCode;
+    /**
+     *     0 涓嬬嚎
+     *     1 涓婄嚎
+     *     2 鏈縺娲�
+     *     3 涓嶅彲鐢�
+     */
+    private Integer status;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/InitAmqpListener.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/InitAmqpListener.java
index ae06b5f..ce8a8ad 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/InitAmqpListener.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/InitAmqpListener.java
@@ -13,12 +13,12 @@
 @AllArgsConstructor
 public class InitAmqpListener {
 
-   private final MqttMainBoardConfig mqttMainBoardConfig;
+    private final MqttMainBoardConfig mqttMainBoardConfig;
 
-  /*  @PostConstruct
-    public void initListener() throws Exception {
-        new AmqpClient(
-                mqttMainBoardConfig
-        ).execute();
-    }*/
+//    @PostConstruct
+//    public void initListener() throws Exception {
+//        new AmqpClient(
+//                mqttMainBoardConfig
+//        ).execute();
+//    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
index dfeaae7..79add96 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java
@@ -7,9 +7,9 @@
 import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightReportEnum;
 import com.sandu.ximon.admin.service.LightReportDataService;
+import com.sandu.ximon.admin.service.LightReportErrorService;
+import com.sandu.ximon.admin.service.LightService;
 import lombok.extern.slf4j.Slf4j;
-
-import java.util.ArrayList;
 
 /**
  * @author chenjiantian
@@ -37,20 +37,20 @@
         if (A5LightReportEnum.HeartBeat_Data.getCode().equals(functionCode)) {
             log.info("蹇冭烦鐩稿簲");
             A5LightHeartbeatReportInnerFrame heartbeatReportInnerFrame = new A5LightHeartbeatReportInnerFrame().transformFrame(frame.getPayload());
-            log.info(heartbeatReportInnerFrame.toString());
 
-            SpringContextHolder.getBean(LightReportDataService.class).saveReportData(deviceName,heartbeatReportInnerFrame.getHeartBeatDataPackage());
-
-//            SpringContextHolder.getBean(LightService.class).saveLight(deviceName,heartbeatReportInnerFrame.getHeartBeatDataPackage());
+            SpringContextHolder.getBean(LightReportDataService.class).saveReportData(deviceName, heartbeatReportInnerFrame.getHeartBeatDataPackage());
+            SpringContextHolder.getBean(LightService.class).saveLight(deviceName);
 
         } else if (A5LightReportEnum.Time_Synchronized.getCode().equals(functionCode)) {
 //            log.info("璇锋眰鏃堕棿鍚屾");
             A5LightTimeSyncReportInnerFrame syncRespInnerFrame = new A5LightTimeSyncReportInnerFrame().transformFrame(frame.getPayload());
 //            log.info(syncRespInnerFrame.toString());
         } else if (A5LightReportEnum.Error_Code.getCode().equals(functionCode)) {
-//            log.info("鏁呴殰鐮佷笂鎶�");
+            log.info("鏁呴殰鐮佷笂鎶�");
             A5LightErrorCodeReportInnerFrame codeRespInnerFrame = new A5LightErrorCodeReportInnerFrame().transformFrame(frame.getPayload());
-//            log.info(codeRespInnerFrame.toString());
+            if (codeRespInnerFrame.getErrorCode() != 0) {
+                SpringContextHolder.getBean(LightReportErrorService.class).saveReportError(deviceName, codeRespInnerFrame);
+            }
         }
     }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java
index 5a44b37..c48128f 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightErrorCodeReportInnerFrame.java
@@ -1,5 +1,6 @@
 package com.sandu.ximon.admin.manager.iot.frame.inner.report;
 
+import cn.hutool.core.util.HexUtil;
 import cn.hutool.core.util.StrUtil;
 import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
 import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
@@ -23,7 +24,7 @@
     /**
      * 鏁呴殰鐮�
      */
-    private String errorCode;
+    private int errorCode;
 
     @Override
     public A5LightErrorCodeReportInnerFrame transformFrame(String hex) {
@@ -39,7 +40,10 @@
 
         setDestinationAddress(hex.substring(8, 12));
 
-        setErrorCode(hex.substring(12, 16));
+        String errorCodeHex = hex.substring(12, 16);
+        errorCode = HexUtil.hexToInt(errorCodeHex);
+        System.out.println("鏁呴殰鐮侊細"+ errorCodeHex +" - " + errorCode);
+
         setCrc32(hex.substring(hex.length() - 8));
         //  鏍¢獙CRC32
         String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getErrorCode();
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java
index 566ce55..e25240e 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightHeartbeatReportInnerFrame.java
@@ -69,7 +69,7 @@
         private Integer sec;
         //  璁惧娓╁害 2  1瀛楄妭鏁存暟1瀛楄妭灏忔暟
         private Double deviceTemperature;
-        //  浜害鐧惧垎姣� 1
+        //  鐏�1浜害鐧惧垎姣� 1
         private Integer lightPercent;
         //  鐢电綉鐢靛帇 2 1瀛楄妭鏁存暟1瀛楄妭灏忔暟
         private Double voltage;
@@ -91,6 +91,8 @@
         private Double recentlyUsingPower;
         //  绱鐢ㄧ數鐢甸噺 4
         private Double totalUsingPower;
+        //  鐏�2浜害鐧惧垎姣� 1
+        private Integer light2Percent;
         //  淇濈暀 11
         private String retain;
         //  鍘熷抚
@@ -118,13 +120,10 @@
             this.totalLightSec = HexUtil.hexToLong(hex.substring(50, 58));
             this.recentlyUsingPower = NumberUtil.round(HexUtil.hexToInt(hex.substring(58, 66)) * (double) 0.001, 3).doubleValue();
             this.totalUsingPower = NumberUtil.round(HexUtil.hexToInt(hex.substring(66, 74)) * (double) 0.001, 3).doubleValue();
-            this.retain = hex.substring(74, 96);
+            this.light2Percent = HexUtil.hexToInt(hex.substring(74, 76));
+            this.retain = hex.substring(76, 96);
             return this;
         }
     }
 
-    public static void main(String[] args) {
-        System.out.println(HexUtil.hexToLong("F64D020F"));
-        System.out.println(5 * (float) 0.001);
-    }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/DeviceStateEnum.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/DeviceStateEnum.java
new file mode 100644
index 0000000..aff9b80
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/DeviceStateEnum.java
@@ -0,0 +1,44 @@
+package com.sandu.ximon.admin.manager.iot.rrpc.enums;
+
+import com.sandu.common.enums.ResponseStatusEnums;
+
+/**
+ * @author chenjiantian
+ * 闃块噷浜戣澶囩姸鎬佹灇涓�
+ */
+public enum DeviceStateEnum {
+
+     /*
+    ON_LINE 璁惧鍦ㄧ嚎銆�
+    OFFLINE  璁惧绂荤嚎
+    UNACTIVE  璁惧鏈縺娲�
+    DISABLE  璁惧宸茬鐢�
+    */
+
+    OFFLINE(0),
+    ONLINE(1),
+    UNACTIVE(2),
+    DISABLE(3);
+
+
+    DeviceStateEnum(Integer code) {
+        this.code = code;
+    }
+
+    private final Integer code;
+
+    public Integer getCode() {
+        return code;
+    }
+
+
+    public static Integer getCode(String name) {
+        for (DeviceStateEnum ut : DeviceStateEnum.values()) {
+            if (ut.name().equals(name)) {
+                return ut.getCode();
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LampPostOnLineState.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LampPostOnLineState.java
deleted file mode 100644
index fa998ee..0000000
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LampPostOnLineState.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.sandu.ximon.admin.manager.iot.rrpc.enums;
-
-public enum LampPostOnLineState {
-
-     /*
-    ON_LINE 璁惧鍦ㄧ嚎銆�
-    OFFLINE  璁惧绂荤嚎
-    UNACTIVE  璁惧鏈縺娲�
-    DISABLE  璁惧宸茬鐢�
-    */
-
-    ONLINE(1),
-    OFFLINE(2),
-    UNACTIVE(3),
-    DISABLE(0)
-    ;
-
-
-
-    LampPostOnLineState(Integer code) {
-        this.code = code;
-    }
-
-    private final Integer code;
-
-    public Integer getCode() {
-        return code;
-    }
-}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightErrorEnum.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightErrorEnum.java
new file mode 100644
index 0000000..1149242
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/LightErrorEnum.java
@@ -0,0 +1,61 @@
+package com.sandu.ximon.admin.manager.iot.rrpc.enums;
+
+/**
+ * @author chenjiantian
+ * 鍗曠伅閿欒涓婃姤鐮�
+ * "鏁呴殰鐮侊細锛堢敤浜岃繘鍒惰〃绀猴級
+ * 0x0000,浜岃繘鍒跺嵆涓篬bit15:bit0]銆�
+ * 瀵瑰簲鏁呴殰bit浣嶇疆1锛屾甯哥疆0"		bit15	bit14	bit13	bit12	bit11	bit10	bit9	bit8	bit7	bit6	bit5	bit4	bit3	bit2	bit1	bit0
+ * 0	0	0	0	0	0	0	0	鏃ュ巻鏃堕棿閿欒	甯傜數鐢靛帇杩囦綆(110V)	甯傜數鐢靛帇杩囬珮(250V)	杈撳嚭婕忕數	鍔熺巼杩囪浇	璁惧娓╁害杩囬珮	鏃犵數娴�	鏃犵數鍘�
+ */
+public enum LightErrorEnum {
+
+    /**
+     * 鏃犵數鍘�
+     */
+    NO_VOL(1,"鏃犵數鍘�"),
+    /**
+     * 鏃犵數娴�
+     */
+    NO_CUR(2,"鏃犵數娴�"),
+    /**
+     * 璁惧娓╁害杩囬珮
+     */
+    DEVICE_TEMPERATURE_HIGHER(4,"璁惧娓╁害杩囬珮"),
+    /**
+     * 鍔熺巼杩囪浇
+     */
+    OVER_POWER(8,"鍔熺巼杩囪浇"),
+    /**
+     * 杈撳嚭婕忕數
+     */
+    OUTPUT_ELE_LEAKAGE(16,"杈撳嚭婕忕數"),
+    /**
+     * 甯傜數鐢靛帇杩囬珮(250V)
+     */
+    OVER_VOL(32,"甯傜數鐢靛帇杩囬珮(250V)"),
+    /**
+     * 甯傜數鐢靛帇杩囦綆(110V)
+     */
+    LOWER_VOL(64,"甯傜數鐢靛帇杩囦綆(110V)"),
+    /**
+     * 鏃ュ巻鏃堕棿閿欒
+     */
+    CALENDAR_ERROR(128,"鏃ュ巻鏃堕棿閿欒");
+
+    private final Integer code;
+    private final String message;
+
+    LightErrorEnum(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightRemarkParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightRemarkParam.java
new file mode 100644
index 0000000..1f06110
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightRemarkParam.java
@@ -0,0 +1,21 @@
+package com.sandu.ximon.admin.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * @author chenjiantian
+ */
+@Data
+public class LightRemarkParam {
+
+    @NotNull(message = "璺伅id涓嶈兘涓虹┖")
+    private Long lightId;
+    @NotEmpty(message = "澶囨敞涓嶈兘涓虹┖")
+    private String remark;
+
+
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleBindingParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleBindingParam.java
index 6a1684a..8598150 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleBindingParam.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/PoleBindingParam.java
@@ -13,8 +13,8 @@
 @Data
 public class PoleBindingParam {
 
-    @NotBlank(message = "璁惧Mac涓嶈兘涓虹┖")
-    private String deviceMac;
+    @NotBlank(message = "璁惧鐮佷笉鑳戒负绌�")
+    private String deviceCode;
     @NotNull(message = "璁惧绫诲瀷涓嶈兘涓虹┖")
     private Integer deviceType;
 
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/LightKey.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/LightKey.java
index c5f7bea..f7fe403 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/LightKey.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/redis/LightKey.java
@@ -21,8 +21,11 @@
     /**
      * 鍗曠伅涓婃姤鐨刴ac锛屽鏋滄湁璇存槑璇ヤ笂鎶ョ殑鍗曠伅浠ュ墠宸茬粡涓婃姤杩�
      */
-    public static LightKey REPORT_MAC = new LightKey(0, "ReportMac");
+    public static LightKey REPORT_MAC = new LightKey(3600, "ReportMac");
 
+    /**
+     * 鐏潌缂栧彿鍚庣紑姣忓ぉ浠�1寮�濮嬮�掑锛屽畾鏃朵换鍔�0鐐归噸缃�
+     */
     public static LightKey POLE_SN = new LightKey(300, "PoleSn");
 
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightRemarkService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightRemarkService.java
deleted file mode 100644
index 7d92ed2..0000000
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightRemarkService.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.sandu.ximon.admin.service;
-
-import com.sandu.common.service.impl.BaseServiceImpl;
-import com.sandu.ximon.dao.domain.LightRemark;
-import com.sandu.ximon.dao.mapper.LightRemarkMapper;
-import org.springframework.stereotype.Service;
-
-/**
- * @author chenjiantian
- * @date 2021/12/13 16:00
- * 鐏澶噑ervice
- */
-@Service
-public class LightRemarkService extends BaseServiceImpl<LightRemarkMapper, LightRemark> {
-}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java
index 5a79a77..3ce83ab 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportDataService.java
@@ -4,6 +4,8 @@
 import com.sandu.common.service.impl.BaseServiceImpl;
 import com.sandu.ximon.admin.dto.LightDataDto;
 import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightHeartbeatReportInnerFrame;
+import com.sandu.ximon.dao.bo.LightBo;
+import com.sandu.ximon.dao.bo.LightReportDataBo;
 import com.sandu.ximon.dao.domain.LightReportData;
 import com.sandu.ximon.dao.mapper.LightReportDataMapper;
 import org.springframework.beans.BeanUtils;
@@ -19,27 +21,36 @@
 @Service
 public class LightReportDataService extends BaseServiceImpl<LightReportDataMapper, LightReportData> {
 
+
     /**
      * 淇濆瓨涓婃姤鐨勭伅蹇冭烦鏁版嵁
      *
      * @return 鏄惁鎴愬姛
      */
     public boolean saveReportData(String deviceName, A5LightHeartbeatReportInnerFrame.HeartBeatDataPackage heartBeatDataPackage) {
-
         LightReportData lightReportData = new LightReportData();
         BeanUtils.copyProperties(heartBeatDataPackage, lightReportData);
-        lightReportData.setDeviceMac(deviceName);
+        lightReportData.setDeviceCode(deviceName);
 
         return save(lightReportData);
     }
 
     /**
-     * 鑾峰彇璺伅鍒楄〃
-     * @return 杩斿洖缁勫悎鏁版嵁dto
+     * 鑾峰彇鎸囧畾璁惧鐮佹渶鏂扮殑涓�澶╀笂鎶ユ暟鎹�
+     * @param deviceCodeList 璁惧鐮佸垪琛�
+     * @return 涓婃姤鏁版嵁
      */
-    public List<LightDataDto> listLight(int pageNo, int pageSize, String keyword) {
-        PageHelper.startPage(pageNo,pageSize);
+    public List<LightReportData> getNewestReportByDeviceCode(List<String> deviceCodeList) {
+        return baseMapper.getNewestReportByDeviceCode(deviceCodeList);
+    }
 
-        return null;
+    /**
+     * 鑾峰彇涓婃姤鏁版嵁
+     * @param keyword 鍏抽敭璇�
+     * @param deviceCode 璁惧鐮�
+     */
+    public List<LightReportDataBo> listReportData(int pageNo, int pageSize, String keyword, String deviceCode) {
+        PageHelper.startPage(pageNo,pageSize);
+        return baseMapper.listReportData(keyword,deviceCode);
     }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportErrorService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportErrorService.java
new file mode 100644
index 0000000..73c5b22
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightReportErrorService.java
@@ -0,0 +1,44 @@
+package com.sandu.ximon.admin.service;
+
+import com.github.pagehelper.PageHelper;
+import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightErrorCodeReportInnerFrame;
+import com.sandu.ximon.admin.manager.iot.rrpc.enums.LightErrorEnum;
+import com.sandu.ximon.dao.bo.LightReportErrorBo;
+import com.sandu.ximon.dao.domain.LightReportError;
+import com.sandu.ximon.dao.mapper.LightReportErrorMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/17 17:47
+ */
+@Service
+public class LightReportErrorService extends BaseServiceImpl<LightReportErrorMapper, LightReportError> {
+
+    public void saveReportError(String deviceName, A5LightErrorCodeReportInnerFrame codeRespInnerFrame) {
+        LightReportError lightReportError = new LightReportError();
+        lightReportError.setDeviceCode(deviceName);
+        lightReportError.setErrorCode(codeRespInnerFrame.getErrorCode());
+        save(lightReportError);
+    }
+
+    public List<LightReportErrorBo> listReportError(int pageNo, int pageSize, String keyword) {
+        PageHelper.startPage(pageNo,pageSize);
+        List<LightReportErrorBo> lightReportErrorBos = baseMapper.listReportError(keyword);
+        for (LightReportErrorBo lightReportErrorBo : lightReportErrorBos) {
+            Integer errorCode = lightReportErrorBo.getErrorCode();
+            StringBuilder sb = new StringBuilder();
+            LightErrorEnum[] values = LightErrorEnum.values();
+            for (LightErrorEnum value : values) {
+                if((value.getCode() & errorCode) > 0){
+                    sb.append(value.getMessage());
+                }
+            }
+            lightReportErrorBo.setErrorMsg(sb.toString());
+        }
+        return lightReportErrorBos;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
new file mode 100644
index 0000000..dfa16dd
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java
@@ -0,0 +1,96 @@
+package com.sandu.ximon.admin.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
+import com.sandu.common.execption.BusinessException;
+import com.sandu.common.redis.RedisService;
+import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.dto.LightDataDto;
+import com.sandu.ximon.admin.param.LightRemarkParam;
+import com.sandu.ximon.admin.redis.LightKey;
+import com.sandu.ximon.admin.security.SecurityUtils;
+import com.sandu.ximon.dao.bo.LightBo;
+import com.sandu.ximon.dao.domain.Light;
+import com.sandu.ximon.dao.domain.LightReportData;
+import com.sandu.ximon.dao.mapper.LightMapper;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author chenjiantian
+ * @date 2021/12/13 16:00
+ * 鐏澶噑ervice
+ */
+@Service
+@Slf4j
+@AllArgsConstructor
+public class LightService extends BaseServiceImpl<LightMapper, Light> {
+
+    private final RedisService redisService;
+    private final LightReportDataService lightReportDataService;
+
+    /**
+     * 褰曞叆褰撳墠璁惧鐮佺殑璺伅鏁版嵁
+     * @param deviceName mac
+     */
+    public void saveLight(String deviceName) {
+        Boolean hasKey = redisService.hasKey(LightKey.REPORT_MAC.key(deviceName));
+        if(!hasKey){
+            int count = count(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, deviceName));
+            log.info("redis鏌ヤ笉鍒拌矾鐏暟鎹畕}={}",count,deviceName);
+            // 褰撳墠璺伅琛ㄦ病鏈夊綍鍏ヨ澶囧悧
+            if(count == 0){
+                Light light = new Light();
+                light.setDeviceCode(deviceName);
+                save(light);
+            }
+            redisService.set(LightKey.REPORT_MAC.key(deviceName),1,LightKey.REPORT_MAC.expireSeconds());
+        }
+    }
+
+    /**
+     * 鑾峰彇璺伅鍒楄〃
+     *
+     * @return 杩斿洖缁勫悎鏁版嵁dto
+     */
+    public List<LightBo> listLight(int pageNo, int pageSize, String keyword) {
+        Long clientId = SecurityUtils.getClientId();
+
+        PageHelper.startPage(pageNo, pageSize);
+
+        List<LightBo> listLight = baseMapper.listLight(clientId,keyword);
+
+        // 鑾峰彇鏈�杩戠殑涓婃姤鏃堕棿
+        List<String> deviceCodeList = listLight.stream().map(Light::getDeviceCode).collect(Collectors.toList());
+        if(CollectionUtil.isNotEmpty(deviceCodeList)){
+            List<LightReportData> reportDataList =  lightReportDataService.getNewestReportByDeviceCode(deviceCodeList);
+            for (LightBo lightBo : listLight) {
+                for (LightReportData lightReportData : reportDataList) {
+                    if(StrUtil.equals(lightBo.getDeviceCode(),lightReportData.getDeviceCode())){
+                        lightBo.setReportTime(lightReportData.getCreateTime());
+                        break;
+                    }
+                }
+            }
+        }
+
+        return listLight;
+    }
+
+    public boolean addRemark(LightRemarkParam param) {
+        Light light = getById(param.getLightId());
+        if(light == null){
+            throw new BusinessException("鎵句笉鍒拌矾鐏�");
+        }
+        Light update = new Light();
+        update.setLightId(param.getLightId());
+        update.setRemark(param.getRemark());
+        return updateById(update);
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java
index 8f810d5..749fd9c 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleBindingService.java
@@ -20,15 +20,15 @@
 
     public boolean bindPole(Long poleId, PoleBindingParam param) {
         Integer deviceType = param.getDeviceType();
-        if (PoleBindingEnums.LIGHT.getCode().equals(deviceType)) {
-            PoleBinding poleBinding = new PoleBinding();
-            poleBinding.setPoleId(poleId);
-            poleBinding.setDeviceType(deviceType);
-            poleBinding.setDeviceName(param.getDeviceName());
-            poleBinding.setDeviceMac(param.getDeviceMac());
-            return save(poleBinding);
-        }
+//        if (PoleBindingEnums.LIGHT.getCode().equals(deviceType)) {
+//        }
+        PoleBinding poleBinding = new PoleBinding();
+        poleBinding.setPoleId(poleId);
+        poleBinding.setDeviceType(deviceType);
+        poleBinding.setDeviceName(param.getDeviceName());
+        poleBinding.setDeviceCode(param.getDeviceCode());
+        return save(poleBinding);
 
-        return false;
+//        return false;
     }
 }
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
index 744345a..510f104 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -8,6 +8,7 @@
 import com.sandu.common.execption.BusinessException;
 import com.sandu.common.redis.RedisService;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.dto.DeviceStatus;
 import com.sandu.ximon.admin.manager.iot.frame.A1Frame;
 import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
 import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
@@ -21,6 +22,7 @@
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A1OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A2OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
+import com.sandu.ximon.admin.manager.iot.rrpc.enums.DeviceStateEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
 import com.sandu.ximon.admin.param.PoleBindingParam;
 import com.sandu.ximon.admin.param.PoleParam;
@@ -288,4 +290,27 @@
         return list(Wrappers.lambdaQuery(Pole.class).in(Pole::getId, poleIdList).select(Pole::getDeviceCode))
                 .stream().map(Pole::getDeviceCode).filter(StrUtil::isNotEmpty).collect(Collectors.toList());
     }
+
+    /**
+     * 鎵归噺鑾峰彇闃块噷浜戣澶囩殑鐘舵��
+     * @param deviceCodeList 闃块噷浜戣澶囩爜
+     * @return 璁惧鐘舵�佸垪琛�
+     */
+    public List<DeviceStatus> listStatusByDeviceCode(ArrayList<String> deviceCodeList) {
+        // 鏈�澶у彧鑳芥煡50涓�
+        List<List<String>> split = CollectionUtil.split(deviceCodeList, 50);
+        List<DeviceStatus> statusList = new ArrayList<>();
+        for (List<String> list : split) {
+            List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(list);
+            if(CollectionUtil.isNotEmpty(deviceStatuses)){
+                for (BatchGetDeviceStateResponse.DeviceStatus d : deviceStatuses) {
+                    DeviceStatus deviceStatus = new DeviceStatus();
+                    deviceStatus.setDeviceCode(d.getDeviceName());
+                    deviceStatus.setStatus(DeviceStateEnum.getCode(d.getStatus()));
+                    statusList.add(deviceStatus);
+                }
+            }
+        }
+        return statusList;
+    }
 }

--
Gitblit v1.9.3