From 41622b7aa1d948040b0f8ea024aece42d5a518a2 Mon Sep 17 00:00:00 2001
From: kaiyu <404897439@qq.com>
Date: Wed, 25 Aug 2021 09:29:05 +0800
Subject: [PATCH] screen-api                 SQL优化 screen-manage                日志模块更新,SQL优化

---
 screen-api/src/main/java/com/moral/api/websocket/SingleDeviceServer.java                    |   23 +
 screen-api/src/main/java/com/moral/api/entity/OrganizationUnitAlarm.java                    |    6 
 screen-api/src/main/java/com/moral/api/entity/DeviceAdjustValue.java                        |   74 ++++++
 screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java        |    1 
 screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java        |   72 ++++-
 screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java           |    2 
 screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java                  |   27 ++
 screen-common/src/main/java/com/moral/pojo/CompareFieldResult.java                          |   33 ++
 screen-manage/src/main/java/com/moral/api/service/impl/VersionServiceImpl.java              |    3 
 screen-api/src/main/java/com/moral/api/service/MonitorPointService.java                     |    2 
 screen-api/src/main/java/com/moral/api/service/DeviceService.java                           |    3 
 screen-manage/src/main/java/com/moral/api/service/impl/UserServiceImpl.java                 |   60 +++++
 screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java                      |    2 
 screen-manage/src/main/resources/mapper/ManageMenuMapper.xml                                |    4 
 screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java                 |   82 ++++++
 screen-common/src/main/java/com/moral/anno/FieldName.java                                   |   16 +
 screen-manage/src/main/java/com/moral/api/entity/ManageAccount.java                         |    5 
 screen-api/src/main/java/com/moral/api/controller/TestController.java                       |   15 +
 screen-api/src/main/java/com/moral/api/service/impl/OrganizationUnitAlarmServiceImpl.java   |   49 ++++
 screen-manage/src/main/java/com/moral/api/util/CompareFieldUtils.java                       |   98 ++++++++
 screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java            |    6 
 screen-api/src/main/java/com/moral/api/utils/AdjustDataUtils.java                           |   84 +++++++
 screen-manage/src/main/java/com/moral/api/entity/User.java                                  |    5 
 screen-manage/src/main/java/com/moral/api/entity/Menu.java                                  |    9 
 screen-manage/src/main/java/com/moral/api/util/LogUtils.java                                |    4 
 screen-manage/src/main/resources/mapper/ManageRoleMapper.xml                                |   12 
 screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceHistoryServiceImpl.java |    1 
 screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java            |    2 
 screen-api/src/main/java/com/moral/api/controller/DeviceController.java                     |    9 
 screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java               |    5 
 30 files changed, 670 insertions(+), 44 deletions(-)

diff --git a/screen-api/src/main/java/com/moral/api/controller/DeviceController.java b/screen-api/src/main/java/com/moral/api/controller/DeviceController.java
index 1c32fd9..3262a32 100644
--- a/screen-api/src/main/java/com/moral/api/controller/DeviceController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/DeviceController.java
@@ -54,8 +54,17 @@
     @Autowired
     private DeviceService deviceService;
 
+    /**
+    * @Description: ������mac������������������
+            * @Param: [mac]
+            * @return: com.moral.constant.ResultMessage
+            * @Author: ���������
+            * @Date: 2021/8/23
+            */
     @GetMapping("queryAlarmByMac")
     public ResultMessage queryAlarmByMac(String mac) {
+        if(mac==null)
+            return new ResultMessage(ResponseCodeEnum.PARAMETERS_IS_MISSING.getCode(), ResponseCodeEnum.PARAMETERS_IS_MISSING.getMsg(),null);
         List<Sensor> sensors = organizationUnitAlarmService.queryAlarmLevel(mac);
         AlarmLevelVO vo = AlarmLevelVO.convert(sensors);
         return new ResultMessage(ResponseCodeEnum.SUCCESS.getCode(), ResponseCodeEnum.SUCCESS.getMsg(), vo);
diff --git a/screen-api/src/main/java/com/moral/api/controller/TestController.java b/screen-api/src/main/java/com/moral/api/controller/TestController.java
index 47dfffb..1981134 100644
--- a/screen-api/src/main/java/com/moral/api/controller/TestController.java
+++ b/screen-api/src/main/java/com/moral/api/controller/TestController.java
@@ -1,10 +1,13 @@
 package com.moral.api.controller;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.moral.api.entity.HistoryFiveMinutely;
+import com.moral.api.entity.Sensor;
 import com.moral.api.entity.Test;
 import com.moral.api.mapper.HistoryFiveMinutelyMapper;
+import com.moral.api.mapper.SensorMapper;
 import com.moral.api.service.TestService;
 import com.moral.constant.Constants;
 import com.moral.constant.ResultMessage;
@@ -15,8 +18,11 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.kafka.core.KafkaTemplate;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.handler.WebRequestHandlerInterceptorAdapter;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 @Slf4j
@@ -30,6 +36,9 @@
 
     @Autowired
     private TestService testService;
+
+    @Autowired
+    private SensorMapper sensorMapper;
 
     @Autowired
     private HistoryFiveMinutelyMapper historyFiveMinutelyMapper;
@@ -107,8 +116,8 @@
 
     @GetMapping("test")
     public void test(){
-        QueryWrapper<HistoryFiveMinutely> queryWrapper = new QueryWrapper<>();
-        List<HistoryFiveMinutely> historyFiveMinutelies = historyFiveMinutelyMapper.selectList(queryWrapper);
-        System.out.println(1111);
+
     }
+
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/entity/DeviceAdjustValue.java b/screen-api/src/main/java/com/moral/api/entity/DeviceAdjustValue.java
new file mode 100644
index 0000000..4c471d4
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/entity/DeviceAdjustValue.java
@@ -0,0 +1,74 @@
+package com.moral.api.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.sql.Time;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author moral
+ * @since 2021-06-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeviceAdjustValue extends Model<DeviceAdjustValue> {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ������
+     */
+    private Integer id;
+
+    /**
+     * ������id
+     */
+    private String mac;
+
+    /**
+     * ������������
+     */
+    @DateTimeFormat(pattern = "HH:mm:ss")
+    @JsonFormat(pattern = "HH:mm:ss",timezone = "GMT+8")
+    private Time startTime;
+
+    /**
+     * ������������
+     */
+    private Time endTime;
+
+    /**
+     * ���������
+     */
+    private String sensorCode;
+
+    /**
+     * ������
+     */
+    private String value;
+
+    /**
+     * ������������
+     */
+    private Date createTime;
+
+    /**
+     * ������������
+     */
+    private Date updateTime;
+
+    /**
+     * ������������
+     */
+    private String isDelete;
+
+
+}
diff --git a/screen-api/src/main/java/com/moral/api/entity/OrganizationUnitAlarm.java b/screen-api/src/main/java/com/moral/api/entity/OrganizationUnitAlarm.java
index 42794b5..b5056fd 100644
--- a/screen-api/src/main/java/com/moral/api/entity/OrganizationUnitAlarm.java
+++ b/screen-api/src/main/java/com/moral/api/entity/OrganizationUnitAlarm.java
@@ -5,6 +5,8 @@
 import com.baomidou.mybatisplus.annotation.TableId;
 import java.time.LocalDateTime;
 import java.io.Serializable;
+import java.util.Date;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -61,12 +63,12 @@
     /**
      * ������������
      */
-    private LocalDateTime createTime;
+    private Date createTime;
 
     /**
      * ������������
      */
-    private LocalDateTime updateTime;
+    private Date updateTime;
 
     /**
      * ������������
diff --git a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
index c573c6a..aa5bcc7 100644
--- a/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
+++ b/screen-api/src/main/java/com/moral/api/kafka/consumer/SecondDataConsumer.java
@@ -37,7 +37,7 @@
     public void listen(ConsumerRecord<String, String> record, Consumer consumer) throws Exception {
         String messageStr = record.value();
         Map<String, Object> message = (Map<String, Object>) JSON.parse(messageStr);
-        long serverStartTime = System.currentTimeMillis();
+        //long serverStartTime = System.currentTimeMillis();
         CopyOnWriteArraySet<SingleDeviceServer> sockets = SingleDeviceServer.sockets;
         for (SingleDeviceServer socket : sockets) {
             //���������������������������socket
@@ -46,8 +46,7 @@
             if (!mac.equalsIgnoreCase(messageMac))
                 continue;
             //������������������
-            Map<String, Device> devicesInfo = socket.getDevicesInfo();
-            Device device = devicesInfo.get(mac);
+            Device device = socket.getDeviceAlarmInfo();
             //������������������������
             Map<String, Object> resultMessgae = new HashMap<>();
             //������������
diff --git a/screen-api/src/main/java/com/moral/api/service/DeviceService.java b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
index 0e18dd2..662d3c4 100644
--- a/screen-api/src/main/java/com/moral/api/service/DeviceService.java
+++ b/screen-api/src/main/java/com/moral/api/service/DeviceService.java
@@ -25,4 +25,7 @@
     //���������������������������������
     List<Map<String, Object>> getTrendChartData(Map<String,Object> params);
 
+    //������mac������������������
+    Device getDeviceByMac(String mac);
+
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
index dd7cc79..9195454 100644
--- a/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
+++ b/screen-api/src/main/java/com/moral/api/service/MonitorPointService.java
@@ -17,7 +17,7 @@
 public interface MonitorPointService extends IService<MonitorPoint> {
 
     /**
-    * @Description: ������������id���������������������������������
+    * @Description: ������������id������������(���������������)���������������������
             * @Param: [form]
             * @return: java.util.List<com.moral.api.entity.MonitorPoint>
             * @Author: ���������
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
index 23efdd1..98bffb3 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/DeviceServiceImpl.java
@@ -1,5 +1,6 @@
 package com.moral.api.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.Device;
 import com.moral.api.entity.Sensor;
@@ -13,6 +14,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
 import java.util.ArrayList;
 
@@ -142,5 +144,30 @@
         return result;
     }
 
+    @Override
+    public Device getDeviceByMac(String mac) {
+        Map<String,Object> deviceMap = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DEVICE,mac);
+        Device device = JSON.parseObject(JSON.toJSONString(deviceMap), Device.class);
+        //���map������organizationId���monitorPointId������versionId
+        Map<String,Object> organizationMap = (Map<String,Object>)deviceMap.get("organization");
+        Map<String,Object> monitorPointMap = (Map<String,Object>)deviceMap.get("monitorPoint");
+        Map<String,Object> versionMap = (Map<String,Object>)deviceMap.get("version");
+        device.setDeviceVersionId((Integer) versionMap.get("id"));
+        device.setOrganizationId((Integer) organizationMap.get("id"));
+        device.setMonitorPointId((Integer) monitorPointMap.get("id"));
+        //������������������������������������
+        if(ObjectUtils.isEmpty(device)){
+            return getDeviceByMacFromDB(mac);
+        }
+        return device;
+    }
+
+    private Device getDeviceByMacFromDB(String mac){
+        QueryWrapper<Device> wrapper = new QueryWrapper<>();
+        wrapper.eq("mac",mac);
+        wrapper.eq("is_delete",Constants.NOT_DELETE);
+        return deviceMapper.selectOne(wrapper);
+    }
+
 
 }
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
index b64554c..59a1139 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -35,7 +35,7 @@
     public Map<String, Object> getHourlyAqiByMac(String mac) {
         QueryWrapper<HistoryHourly> queryWrapper = new QueryWrapper<>();
         String time = DateUtils.dateToDateString(new Date(), DateUtils.yyyy_MM_dd_HH_EN) + ":00:00";
-        queryWrapper.eq("mac", mac).eq("time", time);
+        queryWrapper.eq("time", time).eq("mac", mac);
         //������������������
         HistoryHourly historyHourly = historyHourlyMapper.selectOne(queryWrapper);
         Map<String, Object> result = new HashMap<>();
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
index 0837c4a..8de6dc0 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/MonitorPointServiceImpl.java
@@ -16,6 +16,10 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -58,6 +62,7 @@
         QueryWrapper<MonitorPoint> queryMonitorPointsWrapper = new QueryWrapper<>();
 
         //������region������������������������������������������������������������������������������
+        //������region���������������������������������������������������������
         if (region != null){
             queryMonitorPointsWrapper.eq(region, regionCode);
         }
@@ -83,6 +88,7 @@
         queryWrapper.eq(RegionCodeUtils.regionCodeConvertToName(regionCode), regionCode);
         return monitorPointMapper.selectList(queryWrapper);
     }
+
 }
 
 
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
index db78fac..ce1ee37 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationServiceImpl.java
@@ -37,6 +37,7 @@
     @Override
     public Organization getStateControlStation() {
         QueryWrapper<Organization> wrapper = new QueryWrapper<>();
+        wrapper.select("id");
         wrapper.eq("name","���������");
         wrapper.eq("is_delete",Constants.NOT_DELETE);
         Organization organization = organizationMapper.selectOne(wrapper);
@@ -52,6 +53,7 @@
             */
     private void recursionQueryChildren(Integer parentId, List<Organization> children) {
         QueryWrapper<Organization> queryWrapper = new QueryWrapper();
+        queryWrapper.select("id");
         queryWrapper.eq("is_delete", Constants.NOT_DELETE);
         queryWrapper.eq("parent_id", parentId);
         List<Organization> organizations = organizationMapper.selectList(queryWrapper);
diff --git a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationUnitAlarmServiceImpl.java b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationUnitAlarmServiceImpl.java
index 761a62b..a8ad783 100644
--- a/screen-api/src/main/java/com/moral/api/service/impl/OrganizationUnitAlarmServiceImpl.java
+++ b/screen-api/src/main/java/com/moral/api/service/impl/OrganizationUnitAlarmServiceImpl.java
@@ -1,17 +1,23 @@
 package com.moral.api.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.moral.api.entity.Device;
 import com.moral.api.entity.OrganizationUnitAlarm;
 import com.moral.api.entity.Sensor;
 import com.moral.api.entity.Version;
 import com.moral.api.mapper.OrganizationUnitAlarmMapper;
+import com.moral.api.service.DeviceService;
 import com.moral.api.service.OrganizationUnitAlarmService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.constant.Constants;
 import com.moral.constant.RedisConstants;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.util.ObjectUtils;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -28,12 +34,55 @@
 
     @Autowired
     RedisTemplate redisTemplate;
+    @Autowired
+    DeviceService deviceService;
+    @Autowired
+    OrganizationUnitAlarmMapper organizationUnitAlarmMapper;
 
+    /**
+     * @Description: ���������������������������������
+     * @Param: [mac]
+     * @return: java.util.List<com.moral.api.entity.Sensor>
+     * @Author: ���������
+     * @Date: 2021/8/23
+     */
     @Override
     public List<Sensor> queryAlarmLevel(String mac) {
         Device device = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac);
         Version version = device.getVersion();
         List<Sensor> sensors = version.getSensors();
+        //������������������������������������������������
+        if (ObjectUtils.isEmpty(sensors)) {
+            sensors = queryAlarmLevelFromDb(mac);
+        }
+        return sensors;
+    }
+
+
+    /**
+     * @Description: ������������������������������������
+     * @Param: [mac]
+     * @return: java.util.List<com.moral.api.entity.Sensor>
+     * @Author: ���������
+     * @Date: 2021/8/23
+     */
+    private List<Sensor> queryAlarmLevelFromDb(String mac) {
+        Device device = deviceService.getDeviceByMac(mac);
+        Integer organizationId = device.getOrganizationId();
+        Integer deviceVersionId = device.getDeviceVersionId();
+        QueryWrapper<OrganizationUnitAlarm> wrapper = new QueryWrapper<>();
+        wrapper.eq("organization_id", organizationId);
+        wrapper.eq("version_id", deviceVersionId);
+        wrapper.eq("is_delete", Constants.NOT_DELETE);
+        List<OrganizationUnitAlarm> organizationUnitAlarms = organizationUnitAlarmMapper.selectList(wrapper);
+        List<Sensor> sensors = new ArrayList<>();
+        //���������sensorcode���alarmlevel������
+        for (OrganizationUnitAlarm organizationUnitAlarm : organizationUnitAlarms) {
+            Sensor sensor = new Sensor();
+            sensor.setCode(organizationUnitAlarm.getSensorCode());
+            sensor.setAlarmLevel(organizationUnitAlarm.getAlarmLevel());
+            sensors.add(sensor);
+        }
         return sensors;
     }
 }
diff --git a/screen-api/src/main/java/com/moral/api/utils/AdjustDataUtils.java b/screen-api/src/main/java/com/moral/api/utils/AdjustDataUtils.java
new file mode 100644
index 0000000..324795d
--- /dev/null
+++ b/screen-api/src/main/java/com/moral/api/utils/AdjustDataUtils.java
@@ -0,0 +1,84 @@
+package com.moral.api.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.googlecode.aviator.AviatorEvaluator;
+import com.googlecode.aviator.Expression;
+import com.moral.api.entity.DeviceAdjustValue;
+import com.moral.constant.Constants;
+import com.moral.util.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Slf4j
+@Component
+public class AdjustDataUtils {
+    /**
+     * @param deviceData ������������
+     * @param adjustFormula ������������
+     * @param aqiMap ���������������������������������aqi������
+     * @return Map<String, Object> ���������������
+     * */
+    public Map<String, Object> adjust(Map<String, Object> deviceData, Map<String, Object> adjustFormula, Map<String, Object> aqiMap) {
+        try {
+            Date time = DateUtils.getDate((String) deviceData.get("DataTime"), DateUtils.yyyyMMddHHmmss_EN);
+            long finalTime = DateUtils.dataToTimeStampTime(time, DateUtils.HH_mm_ss_EN).getTime();
+            for (String key : deviceData.keySet()) {
+                if (!key.equals("mac") && !key.equals("time") && !key.equals("DataTime") && !key.equals("ver") && !key.contains("Flag")) {
+                    //���������
+                    Object measuredValue = deviceData.get(key);
+                    //������������������������
+                    List<DeviceAdjustValue> sensorFormulas = (List<DeviceAdjustValue>) adjustFormula.get(key);
+                    if (ObjectUtils.isEmpty(sensorFormulas)) {
+                        deviceData.put(key, measuredValue);
+                        continue;
+                    }
+
+                    //���������������������������������
+                    DeviceAdjustValue deviceAdjustValue = sensorFormulas.stream()
+                            .filter(o -> o.getStartTime().getTime() <= finalTime && o.getEndTime().getTime() > finalTime)
+                            .findFirst().get();
+                    String formula = deviceAdjustValue.getValue();
+                    if (StringUtils.isEmpty(formula)) {
+                        deviceData.put(key, measuredValue);
+                        continue;
+                    }
+
+                    Expression expression = AviatorEvaluator.compile(formula);
+                    Map<String, Object> env = new HashMap<>();
+                    if (formula.contains("aqi")) {
+                        Object aqiValue = null;
+                        if (aqiMap != null) {
+                            aqiValue = aqiMap.get(key);
+                        }
+                        env.put("aqi", ObjectUtils.isEmpty(aqiValue) ? 0F : Float.parseFloat((String) aqiValue));
+                    }
+                    if (formula.contains("vocs")) {
+                        Object vocsValue = ObjectUtils.isEmpty(deviceData.get(Constants.SENSOR_CODE_VOCS)) ? 0F : deviceData.get(Constants.SENSOR_CODE_VOCS);
+                        env.put("vocs", vocsValue);
+                    }
+                    if (formula.contains("cel")) {
+                        env.put("cel", Float.parseFloat((String) measuredValue));
+                    }
+                    //������
+                    measuredValue = expression.execute(env);
+                    //������������
+                    if (!Constants.SENSOR_CODE_TEMP.equals(measuredValue) && Float.parseFloat(measuredValue.toString()) < 0) {
+                        measuredValue = 0F;
+                    }
+                    deviceData.put(key, Double.parseDouble(String.format("%.4f", measuredValue)));
+                }
+            }
+        } catch (Exception e) {
+            log.error("param[0] deviceData:" + JSON.toJSONString(deviceData));
+            log.error(e.getMessage());
+        }
+        return deviceData;
+    }
+}
diff --git a/screen-api/src/main/java/com/moral/api/websocket/SingleDeviceServer.java b/screen-api/src/main/java/com/moral/api/websocket/SingleDeviceServer.java
index 748efc3..fa6fd33 100644
--- a/screen-api/src/main/java/com/moral/api/websocket/SingleDeviceServer.java
+++ b/screen-api/src/main/java/com/moral/api/websocket/SingleDeviceServer.java
@@ -1,12 +1,14 @@
 package com.moral.api.websocket;
 
 import com.moral.api.entity.Device;
+import com.moral.api.entity.MonitorPoint;
 import com.moral.api.entity.Sensor;
 import com.moral.api.entity.UnitConversion;
 import com.moral.constant.RedisConstants;
 import lombok.Data;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 import org.springframework.web.bind.annotation.PathVariable;
 
 import javax.websocket.*;
@@ -37,19 +39,32 @@
 
     private String mac;
 
-    private Map<String, Device> devicesInfo;
+    private Device deviceAlarmInfo;
 
     private List<UnitConversion> unitConversions;
+
+    private Map<String, Object> regionAqi;
 
     @OnOpen
     public void onOpen(Session session, @PathParam("mac") String mac) throws Exception {
         this.session = session;
         this.mac = mac;
-        this.devicesInfo = redisTemplate.opsForHash().entries(RedisConstants.DEVICE_INFO);
+        this.deviceAlarmInfo = (Device) redisTemplate.opsForHash().get(RedisConstants.DEVICE_INFO, mac);
         this.unitConversions = redisTemplate.opsForList().range(RedisConstants.UNIT_CONVERSION, 0, -1);
+        //���������������������������AQI������������������
+        Map<String, Object> deviceInfo = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.DEVICE, mac);
+        Map<String, Object> monitorPointMap = (Map<String, Object>) deviceInfo.get("monitorPoint");
+        String areaCode = String.valueOf(monitorPointMap.get("areaCode"));
+        String cityCode = String.valueOf(monitorPointMap.get("cityCode"));
+        try {
+            this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, areaCode);
+            if (ObjectUtils.isEmpty(this.regionAqi))
+                this.regionAqi = (Map<String, Object>) redisTemplate.opsForHash().get(RedisConstants.AQI_DATA, cityCode);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
         sockets.add(this);
-        System.out.println(mac);
-}
+    }
 
     @OnClose
     public void onClose() {
diff --git a/screen-common/src/main/java/com/moral/anno/FieldName.java b/screen-common/src/main/java/com/moral/anno/FieldName.java
new file mode 100644
index 0000000..5d3d49b
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/anno/FieldName.java
@@ -0,0 +1,16 @@
+package com.moral.anno;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+* @Description: ������������������������������������������������������������������������������
+        * @Param:
+        * @return:
+        * @Author: ���������
+        * @Date: 2021/8/24
+        */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface FieldName {
+    String value() default "";
+}
diff --git a/screen-common/src/main/java/com/moral/pojo/CompareFieldResult.java b/screen-common/src/main/java/com/moral/pojo/CompareFieldResult.java
new file mode 100644
index 0000000..8cd9e16
--- /dev/null
+++ b/screen-common/src/main/java/com/moral/pojo/CompareFieldResult.java
@@ -0,0 +1,33 @@
+package com.moral.pojo;
+
+import lombok.Data;
+
+/**
+ * @ClassName CompareFieldResult
+ * @Description ���������������������������������������bean
+ * @Author ���������
+ * @Date 2021/8/24 14:00
+ * @Version TODO
+ **/
+@Data
+public class CompareFieldResult {
+    /*
+    * ������������
+    * */
+    private String fieldName;
+
+    /*
+    * ���������������fieldName���������������
+    * */
+    private String fieldAnnoName;
+
+    /*
+    * ���������������
+    * */
+    private String oldData;
+
+    /*
+    * ���������������
+    * */
+    private String newData;
+}
diff --git a/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java b/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
index f52b66c..7c12510 100644
--- a/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
+++ b/screen-job/src/main/java/com/moral/api/mapper/HistoryHourlyMapper.java
@@ -18,3 +18,5 @@
     void insertHistoryHourly(List<HistoryHourly> list);
 
 }
+
+
diff --git a/screen-manage/src/main/java/com/moral/api/entity/ManageAccount.java b/screen-manage/src/main/java/com/moral/api/entity/ManageAccount.java
index 30706e1..08aa2b2 100644
--- a/screen-manage/src/main/java/com/moral/api/entity/ManageAccount.java
+++ b/screen-manage/src/main/java/com/moral/api/entity/ManageAccount.java
@@ -10,6 +10,7 @@
 import java.util.Date;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.moral.anno.FieldName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -46,21 +47,25 @@
     /**
      * ������������
      */
+    @FieldName("������������")
     private String userName;
 
     /**
      * ������
      */
+    @FieldName("������")
     private String email;
 
     /**
      * ���������
      */
+    @FieldName("���������")
     private String mobile;
 
     /**
      * ������
      */
+    @FieldName("������")
     private String wechat;
 
     /**
diff --git a/screen-manage/src/main/java/com/moral/api/entity/Menu.java b/screen-manage/src/main/java/com/moral/api/entity/Menu.java
index 1054e55..1131ef8 100644
--- a/screen-manage/src/main/java/com/moral/api/entity/Menu.java
+++ b/screen-manage/src/main/java/com/moral/api/entity/Menu.java
@@ -4,11 +4,11 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
-import java.io.Serializable;
+
 import java.util.Date;
 import java.util.List;
 
+import com.moral.anno.FieldName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -35,26 +35,31 @@
     /**
      * ���������
      */
+    @FieldName("������������")
     private String name;
 
     /**
      * url������
      */
+    @FieldName("url")
     private String url;
 
     /**
      * ������������
      */
+    @FieldName("������url")
     private String icon;
 
     /**
      * ���������
      */
+    @FieldName("���������id")
     private Integer parentId;
 
     /**
      * ���������������������������
      */
+    @FieldName("������������")
     @TableField(value="`order`")
     private Integer order;
 
diff --git a/screen-manage/src/main/java/com/moral/api/entity/User.java b/screen-manage/src/main/java/com/moral/api/entity/User.java
index 397231c..3270af6 100644
--- a/screen-manage/src/main/java/com/moral/api/entity/User.java
+++ b/screen-manage/src/main/java/com/moral/api/entity/User.java
@@ -9,6 +9,7 @@
 import java.io.Serializable;
 import java.util.Date;
 
+import com.moral.anno.FieldName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -51,6 +52,7 @@
     /**
      * ������������
      */
+    @FieldName("������������")
     private String userName;
 
     /**
@@ -61,16 +63,19 @@
     /**
      * ������
      */
+    @FieldName("������")
     private String email;
 
     /**
      * ���������
      */
+    @FieldName("������")
     private String mobile;
 
     /**
      * ������
      */
+    @FieldName("������")
     private String wechat;
 
     /**
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
index d17e139..8aa5319 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
@@ -25,9 +25,11 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.moral.api.config.mybatis.wrapper.NullFilterWrapper;
 import com.moral.api.service.ManageMenuService;
+import com.moral.api.util.CompareFieldUtils;
 import com.moral.api.util.LogUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
+import com.moral.pojo.CompareFieldResult;
 import com.moral.util.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -89,7 +91,8 @@
         //������������������
         QueryWrapper<ManageAccount> wrapper = new QueryWrapper<>();
         wrapper.eq("account", account);
-        wrapper.eq("is_delete",Constants.NOT_DELETE);
+        wrapper.eq("is_delete", Constants.NOT_DELETE);
+        wrapper.select("id", "password");
         ManageAccount manageAccount = manageAccountMapper.selectOne(wrapper);
         if (ObjectUtils.isEmpty(manageAccount)) {
             loginDTO.setCode(ResponseCodeEnum.ACCOUNT_NOT_EXIST.getCode());
@@ -192,17 +195,11 @@
                     }
             );
         }
+        //������������������
+        insertLog(manageAccount);
         //������������������
         accountDTO.setCode(ResponseCodeEnum.SUCCESS.getCode());
         accountDTO.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
-
-        //������������������
-        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-        StringBuilder content = new StringBuilder();
-        content.append("������������������").append(manageAccount.getUserName() + ";")
-                .append("account���" + manageAccount.getAccount() + ";");
-        logUtils.saveOperationForManage(request, content.toString(), Constants.INSERT_OPERATE_TYPE);
-
         return accountDTO;
     }
 
@@ -337,12 +334,7 @@
         accountDTO.setCode(ResponseCodeEnum.SUCCESS.getCode());
         accountDTO.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
         //������������������
-        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-        StringBuilder content = new StringBuilder();
-        content.append("������������������").append(existManageAccount.getUserName() + ";")
-                .append("������:" + existManageAccount.getAccount() + ";");
-        logUtils.saveOperationForManage(request, content.toString(), Constants.DELETE_OPERATE_TYPE);
-
+        deleteLog(existManageAccount);
         return accountDTO;
     }
 
@@ -375,9 +367,8 @@
 
         //������ManageAccount���
         manageAccountMapper.updateById(manageAccount);
-
         //������������������
-        insertUpdateLog(accountUpdateForm, oldManageAccount);
+        updateLog(oldManageAccount,manageAccount);
         //������token
         TokenUtils.destoryToken(manageAccount.getId());
         //������������������
@@ -428,4 +419,51 @@
     }
 
 
+    /**
+    * @Description: ������������������������
+            * @Param: [oldAccount, newAccount]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/8/25
+            */
+    private void updateLog(ManageAccount oldAccount,ManageAccount newAccount){
+        List<CompareFieldResult> results = CompareFieldUtils.compare(ManageAccount.class, oldAccount, newAccount);
+        StringBuilder content = new StringBuilder("���������������������"+";");
+        content.append("���������"+oldAccount.getAccount()+";");
+        //������������������
+        if(!ObjectUtils.isEmpty(newAccount.getPassword()))
+            content.append("���������������");
+        String resultContent = CompareFieldUtils.resultsConvertContent(results,content.toString());
+        logUtils.saveOperationForManage(resultContent, Constants.UPDATE_OPERATE_TYPE);
+    }
+
+    /**
+    * @Description: ������������������������
+            * @Param: [account]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/8/25
+            */
+    private void insertLog(ManageAccount manageAccount){
+        StringBuilder content = new StringBuilder();
+        content.append("������������������������").append(manageAccount.getUserName() + ";")
+                .append("account���" + manageAccount.getAccount() + ";");
+        logUtils.saveOperationForManage(content.toString(), Constants.INSERT_OPERATE_TYPE);
+    }
+
+
+    /**
+    * @Description: ������������������������
+            * @Param: [manageAccount]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/8/25
+            */
+    private void deleteLog(ManageAccount manageAccount){
+        StringBuilder content = new StringBuilder();
+        content.append("������������������").append(manageAccount.getUserName() + ";")
+                .append("������:" + manageAccount.getAccount() + ";");
+        logUtils.saveOperationForManage( content.toString(), Constants.DELETE_OPERATE_TYPE);
+    }
 }
+
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java
index 204f902..ce9f9a0 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/MenuServiceImpl.java
@@ -17,8 +17,11 @@
 import com.moral.api.service.GroupService;
 import com.moral.api.service.MenuService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.util.CompareFieldUtils;
+import com.moral.api.util.LogUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
+import com.moral.pojo.CompareFieldResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -47,6 +50,8 @@
     GroupService groupService;
     @Autowired
     GroupMenuMapper groupMenuMapper;
+    @Autowired
+    LogUtils logUtils;
 
 
     @Override
@@ -122,9 +127,10 @@
             dto.setMsg(ResponseCodeEnum.MENU_IS_EXIST.getMsg());
             return dto;
         }
-
         //������������������
         menuMapper.insert(menu);
+        //������������
+        insertLog(menu);
         //������������������
         dto.setMenu(menu);
         dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
@@ -167,6 +173,18 @@
         deleteGroupMenuWrapper.in("menu_id", allMenuIds);
         deleteGroupMenuWrapper.set("is_delete", Constants.DELETE);
         groupMenuMapper.update(null, deleteGroupMenuWrapper);
+        //������������
+        StringBuilder content = new StringBuilder();
+        if (existMenu.getParentId().equals(0))
+            content.append("���������������������" + existMenu.getName() + ";");
+        else
+            content.append("���������������������" + existMenu.getName() + ";");
+        if (!ObjectUtils.isEmpty(childrenIds)) {
+            for (Integer childrenId : childrenIds) {
+                content.append("������������������" + menuMapper.selectById(childrenId).getName() + ";");
+            }
+        }
+        logUtils.saveOperationForManage(content.toString(), Constants.DELETE_OPERATE_TYPE);
         //������������������
         dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
         dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
@@ -196,6 +214,8 @@
         menuMapper.updateById(menu);
         //������������������������
         menu = menuMapper.selectById(menu.getId());
+        //������������
+        updateLog(oldMenu, menu);
         //������������������
         dto.setMenu(menu);
         dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
@@ -383,4 +403,64 @@
         });
     }
 
+    /**
+     * @Description: ������������������������
+     * @Param: [oldMenu, newMenu]
+     * @return: void
+     * @Author: ���������
+     * @Date: 2021/8/24
+     */
+    private void updateLog(Menu oldMenu, Menu newMenu) {
+        List<CompareFieldResult> compareResult = CompareFieldUtils.compare(Menu.class, oldMenu, newMenu);
+        for (CompareFieldResult result : compareResult) {
+            //parentId���������������
+            if (result.getFieldName().equals("parentId")) {
+                //���������id������������������
+                String oldData = result.getOldData();
+                String newData = result.getNewData();
+
+                if (!oldData.equals("0"))
+                    oldData = menuMapper.selectById(Integer.parseInt(oldData)).getName();
+                else
+                    oldData = "null";
+
+                if (!newData.equals("0"))
+                    newData = menuMapper.selectById(Integer.parseInt(newData)).getName();
+                else
+                    newData = "null";
+
+                result.setNewData(newData);
+                result.setOldData(oldData);
+                result.setFieldAnnoName("���������");
+            }
+        }
+        String content = CompareFieldUtils.resultsConvertContent(compareResult, "���������������������");
+        logUtils.saveOperationForManage(content, Constants.UPDATE_OPERATE_TYPE);
+    }
+
+    /**
+     * @Description: ������������������������
+     * @Param: [menu]
+     * @return: void
+     * @Author: ���������
+     * @Date: 2021/8/24
+     */
+    private void insertLog(Menu menu) {
+        StringBuilder content = new StringBuilder();
+        //������������������������������������������
+        if (menu.getParentId() == null) {
+            content.append("������������������������;");
+        } else {
+            content.append("������������������������;");
+            //���������������id������������������
+            Menu parentMenu = menuMapper.selectById(menu.getParentId());
+            content.append("������������" + parentMenu.getName() + ";");
+        }
+        content.append("���������" + menu.getName() + ";");
+        if (menu.getUrl() != null)
+            content.append("url���" + menu.getUrl() + ";");
+        content.append("���������" + menu.getOrder() + ";");
+        logUtils.saveOperationForManage(content.toString(), Constants.INSERT_OPERATE_TYPE);
+    }
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceHistoryServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceHistoryServiceImpl.java
index 2c884a9..ea69baa 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceHistoryServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceHistoryServiceImpl.java
@@ -94,6 +94,7 @@
                     QueryWrapper<ManageAccount> wapper_manageAccount = new QueryWrapper<>();
                     wapper_manageAccount.eq("is_delete",Constants.NOT_DELETE);
                     wapper_manageAccount.in("id",operateIdList);
+                    wapper_manageAccount.select("id", "user_name");
                     List<ManageAccount> manageAccounts = manageAccountMapper.selectList(wapper_manageAccount);
                     for (ManageAccount manageAccount:manageAccounts) {
                         Map<String,Object> operateMap = new HashMap<>();
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
index bfca277..6962fd1 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/SpecialDeviceServiceImpl.java
@@ -137,6 +137,7 @@
                     QueryWrapper<ManageAccount> wapper_manageAccount = new QueryWrapper<>();
                     wapper_manageAccount.eq("is_delete",Constants.NOT_DELETE);
                     wapper_manageAccount.in("id",operateIdList);
+                    wapper_manageAccount.select("id", "user_name");
                     List<ManageAccount> manageAccounts = manageAccountMapper.selectList(wapper_manageAccount);
                     for (ManageAccount manageAccount:manageAccounts) {
                         Map<String,Object> operateMap = new HashMap<>();
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/UserServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
index 054185d..711180c 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/UserServiceImpl.java
@@ -18,9 +18,13 @@
 import com.moral.api.pojo.form.user.UserUpdateForm;
 import com.moral.api.service.UserService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.moral.api.util.CompareFieldUtils;
+import com.moral.api.util.LogUtils;
 import com.moral.constant.Constants;
 import com.moral.constant.ResponseCodeEnum;
+import com.moral.pojo.CompareFieldResult;
 import com.moral.util.ConvertUtils;
+import com.moral.util.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -29,6 +33,7 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.logging.SimpleFormatter;
 
 /**
  * <p>
@@ -51,6 +56,8 @@
     UserGroupMapper userGroupMapper;
     @Autowired
     GroupMenuMapper groupMenuMapper;
+    @Autowired
+    LogUtils logUtils;
 
     @Override
     public UserQueryDTO queryUsers(UserQueryForm form) {
@@ -150,6 +157,12 @@
         //������
         userMapper.updateById(user);
 
+        //������������������������
+        user = userMapper.selectById(user.getId());
+
+        //������������
+        updatelog(oldUser,user);
+
         //������������������
         dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
         dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
@@ -208,6 +221,8 @@
         organization.setAdminUserId(user.getId());
         organization.setId(organizationId);
         organizationMapper.updateById(organization);
+        //������������������
+        insertLog(user,organizationId);
         //������������������
         dto.setCode(ResponseCodeEnum.SUCCESS.getCode());
         dto.setMsg(ResponseCodeEnum.SUCCESS.getMsg());
@@ -246,4 +261,49 @@
         return dto;
     }
 
+    /**
+    * @Description: ������������������������
+            * @Param: [user, organizationId]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/8/24
+            */
+    private void insertLog(User user,Integer organizationId) {
+        StringBuilder content = new StringBuilder("���������������������;");
+        content.append("���������admin;");
+        //������������admin���������������
+        Organization organization = organizationMapper.selectById(organizationId);
+        content.append("���������"+organization.getName()+";");
+        content.append("���������"+user.getAccount()+";");
+        content.append("���������������"+user.getUserName()+";");
+        content.append("���������������"+ DateUtils.dateToDateString(user.getExpireTime(),"yyyy-MM-dd")+";");
+        if(user.getEmail()!=null)
+            content.append("���������"+user.getEmail()+";");
+        if(user.getMobile()!=null)
+            content.append("���������"+user.getMobile()+";");
+        if(user.getWechat()!=null)
+            content.append("���������"+user.getWechat()+";");
+        logUtils.saveOperationForManage(content.toString(), Constants.INSERT_OPERATE_TYPE);
+    }
+
+
+    /**
+    * @Description: ������������������������
+            * @Param: [oldUser, newUser]
+            * @return: void
+            * @Author: ���������
+            * @Date: 2021/8/24
+            */
+    private void updatelog(User oldUser,User newUser){
+        List<CompareFieldResult> results = CompareFieldUtils.compare(User.class, oldUser, newUser);
+        StringBuilder content = new StringBuilder("���������������������;");
+        content.append("���������������"+organizationMapper.selectById(oldUser.getOrganizationId()).getName()+";");
+        //������������������
+        if(newUser.getPassword()!=null)
+            content.append("���������������;");
+        String resultContent = CompareFieldUtils.resultsConvertContent(results,content.toString());
+        logUtils.saveOperationForManage(resultContent, Constants.UPDATE_OPERATE_TYPE);
+    }
+
+
 }
diff --git a/screen-manage/src/main/java/com/moral/api/service/impl/VersionServiceImpl.java b/screen-manage/src/main/java/com/moral/api/service/impl/VersionServiceImpl.java
index 7af8572..636d821 100644
--- a/screen-manage/src/main/java/com/moral/api/service/impl/VersionServiceImpl.java
+++ b/screen-manage/src/main/java/com/moral/api/service/impl/VersionServiceImpl.java
@@ -168,6 +168,7 @@
         Integer id = form.getId();
         //������������������������������������������������������������
         QueryWrapper<OrganizationUnitAlarm> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("id");
         queryWrapper.eq("is_delete", Constants.NOT_DELETE);
         queryWrapper.eq("version_id", id);
         List<OrganizationUnitAlarm> organizationUnitAlarms = organizationUnitAlarmMapper.selectList(queryWrapper);
@@ -347,5 +348,5 @@
         return dto;
     }
 
-
 }
+
diff --git a/screen-manage/src/main/java/com/moral/api/util/CompareFieldUtils.java b/screen-manage/src/main/java/com/moral/api/util/CompareFieldUtils.java
new file mode 100644
index 0000000..976444c
--- /dev/null
+++ b/screen-manage/src/main/java/com/moral/api/util/CompareFieldUtils.java
@@ -0,0 +1,98 @@
+package com.moral.api.util;
+
+import com.moral.anno.FieldName;
+import com.moral.pojo.CompareFieldResult;
+import lombok.extern.slf4j.Slf4j;
+
+import java.beans.IntrospectionException;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName ComparePropertyUtils
+ * @Description TODO
+ * @Author ���������
+ * @Date 2021/8/24 13:34
+ * @Version TODO
+ **/
+@Slf4j
+public class CompareFieldUtils {
+
+    /**
+    * @Description: ���������������������������������������
+            * @Param: [t, oldObject, newObject]
+            * @return: java.util.List<com.moral.pojo.CompareFieldResult>
+            * @Author: ���������
+            * @Date: 2021/8/24
+            */
+    public static <T> List<CompareFieldResult> compare(T t, Object oldObject, Object newObject) {
+        List<CompareFieldResult> results = new ArrayList<>();
+        try {
+            T oldObj = (T) oldObject;
+            T newObj = (T) newObject;
+            //������class������
+            Class<?> TClass = oldObject.getClass();
+            //������������������
+            Field[] fields = TClass.getDeclaredFields();
+            for (Field field : fields) {
+                //���������������������Id
+                if ("serialVersionUID".equals(field.getName())) {
+                    continue;
+                }
+                //������������fieldName���������������
+                FieldName annotation = field.getAnnotation(FieldName.class);
+                if(annotation==null)
+                    continue;
+                //���������������������
+                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), TClass);
+                //������������������get������
+                Method readMethod = pd.getReadMethod();
+                //���������������������������
+                Object oldDataObj = readMethod.invoke(oldObj);
+                Object newDataObj = readMethod.invoke(newObj);
+                //������������������null������������������������������
+                if(newDataObj==null)
+                    continue;
+                //������������������������������������������������
+                if(oldDataObj!=null&&oldDataObj.toString().equals(newDataObj.toString()))
+                    continue;
+                //������������������
+                CompareFieldResult result = new CompareFieldResult();
+                result.setFieldName(field.getName());
+                result.setFieldAnnoName(annotation.value());
+                result.setNewData(newDataObj.toString());
+                if(oldDataObj==null)
+                    result.setOldData("null");
+                else
+                    result.setOldData(oldDataObj.toString());
+                results.add(result);
+            }
+        }catch (IntrospectionException e) {
+            log.error(e.getMessage());
+        } catch (IllegalAccessException e) {
+            log.error(e.getMessage());
+        } catch (InvocationTargetException e) {
+            log.error(e.getMessage());
+        }
+        return results;
+    }
+
+    /**
+    * @Description: ���������������������������content
+            * @Param: [results, content] content������������������������������������������������������������������������������������������������
+            * @return: java.lang.String
+            * @Author: ���������
+            * @Date: 2021/8/24
+            */
+    public static String resultsConvertContent(List<CompareFieldResult> results,String content){
+        StringBuilder contentReulst = new StringBuilder(content+";");
+        for (CompareFieldResult result : results) {
+            contentReulst.append(result.getFieldAnnoName()+"���"+result.getOldData()+"->"+result.getNewData()+";");
+        }
+        return contentReulst.toString();
+    }
+}
diff --git a/screen-manage/src/main/java/com/moral/api/util/LogUtils.java b/screen-manage/src/main/java/com/moral/api/util/LogUtils.java
index d87cc42..9d363a3 100644
--- a/screen-manage/src/main/java/com/moral/api/util/LogUtils.java
+++ b/screen-manage/src/main/java/com/moral/api/util/LogUtils.java
@@ -14,6 +14,7 @@
 import org.springframework.web.context.request.ServletRequestAttributes;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Scanner;
 
 /**
  * @ClassName LogUtils
@@ -71,7 +72,6 @@
     public void saveLoginForManage(HttpServletRequest request,String content,ManageAccount account,String userName){
         ManageLog log = new ManageLog();
         String ip = WebUtils.getIpAddr(request);
-
         log.setAccountId(account.getId());
         log.setAccount(account.getAccount());
         log.setUserName(userName);
@@ -80,4 +80,6 @@
         log.setType(Constants.LOGIN_OPERTATE_TYPE);
         manageLogMapper.insert(log);
     }
+
+
 }
diff --git a/screen-manage/src/main/resources/mapper/ManageMenuMapper.xml b/screen-manage/src/main/resources/mapper/ManageMenuMapper.xml
index fecfa44..9b8457e 100644
--- a/screen-manage/src/main/resources/mapper/ManageMenuMapper.xml
+++ b/screen-manage/src/main/resources/mapper/ManageMenuMapper.xml
@@ -32,7 +32,7 @@
         join
         manage_role_menu mrm
         on
-        mm.`id` = mrm.`menu_id` and mrm.`is_delete`=0
+        mm.`id` = mrm.`menu_id` and mrm.`is_delete`= '0'
         join
         manage_role mr
         on
@@ -41,7 +41,7 @@
             #{role.id}
         </foreach>
         where
-        mm.`is_delete`=0
+        mm.`is_delete`= '0'
     </select>
 
     <select id="getManageMenuByName" resultMap="BaseResultMap">
diff --git a/screen-manage/src/main/resources/mapper/ManageRoleMapper.xml b/screen-manage/src/main/resources/mapper/ManageRoleMapper.xml
index b7521d2..6e7155a 100644
--- a/screen-manage/src/main/resources/mapper/ManageRoleMapper.xml
+++ b/screen-manage/src/main/resources/mapper/ManageRoleMapper.xml
@@ -22,18 +22,18 @@
         FROM
         manage_role mr
         JOIN manage_account_role mar
-        ON mar.role_id=mr.id AND mar.is_delete = 0
+        ON mar.role_id=mr.id AND mar.is_delete = '0'
         JOIN manage_account ma
         ON ma.id=mar.account_id and ma.id = #{accountId}
         where
-        mr.is_delete=0
+        mr.is_delete='0'
     </select>
 
     <select id="getAll" resultMap="BaseResultMap">
         select
         <include refid="Base_Column_List"></include>
         from manage_role mr
-        where mr.is_delete = 0
+        where mr.is_delete = '0'
     </select>
 
     <select id="getManageRoleByName" resultMap="BaseResultMap">
@@ -41,7 +41,7 @@
         <include refid="Base_Column_List"></include>
         from manage_role mr
         where name = #{name}
-        and mr.is_delete = 0
+        and mr.is_delete = '0'
     </select>
 
     <select id="getManageRoleById" resultMap="BaseResultMap">
@@ -49,7 +49,7 @@
         <include refid="Base_Column_List"></include>
         from manage_role mr
         where mr.id = #{id}
-        and mr.is_delete = 0
+        and mr.is_delete = '0'
     </select>
 
     <select id="getManageRoleByNameFuzzy" resultMap="BaseResultMap">
@@ -57,7 +57,7 @@
         <include refid="Base_Column_List"></include>
         from manage_role mr
         where mr.name like concat('%',#{name},'%')
-        and mr.is_delete = 0
+        and mr.is_delete = '0'
     </select>
 
     <insert id="insertOne" parameterType="com.moral.api.entity.ManageRole">

--
Gitblit v1.8.0