From e6ca7ead72de88017eb786fbfc5d8450b8164878 Mon Sep 17 00:00:00 2001
From: zhanzhiqin <895896009@qq.com>
Date: 星期一, 26 九月 2022 18:28:54 +0800
Subject: [PATCH] fix

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightSetCalendarParam.java                                     |   20 ++
 ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/LightTimeSynchronizationSchedule.java                       |   83 +++++++++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightSetCalendarReqInnerFrame.java |   34 ++++
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java                          |    3 
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java                                            |  166 ++++++++++++++++++++++
 dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java                                                            |    1 
 ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightController.java                                      |   27 +++
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/amqp/processor/LightDataProcessor.java                   |    8 
 ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightOperationReportInnerFrame.java |   68 +++++++++
 9 files changed, 399 insertions(+), 11 deletions(-)

diff --git a/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java b/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
index 5e05ea8..a82ada4 100644
--- a/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
+++ b/dao/src/main/java/com/sandu/ximon/dao/enums/MenuEnum.java
@@ -26,6 +26,7 @@
     GROUP_LIST("鍒嗙粍鍒楄〃"),
     LIGHT_TASK_LIST("璺伅浠诲姟鍒楄〃"),
     LIGHT_DATA("鍗曠伅鐩戞帶鏁版嵁"),
+    LIGHT_SETCALENDAR("鍗曠伅璁剧疆鏃ュ巻"),
     LIGHT_ERROR_LIST("鍗曠伅鏁呴殰鍒楄〃"),
     LED_LIST("LED灞忓垪琛�"),
     LED_PROGRAM_LIST("鑺傜洰鍒楄〃"),
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 b093af9..284a5e9 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
@@ -3,10 +3,11 @@
 import com.sandu.common.domain.CommonPage;
 import com.sandu.common.domain.ResponseVO;
 import com.sandu.common.object.BaseConditionVO;
+import com.sandu.common.security.annotation.AnonymousAccess;
 import com.sandu.common.util.ResponseUtil;
-import com.sandu.ximon.admin.param.LightControlParam;
-import com.sandu.ximon.admin.param.LightPowerSettingParam;
-import com.sandu.ximon.admin.param.LightRemarkParam;
+import com.sandu.common.util.SpringContextHolder;
+import com.sandu.ximon.admin.param.*;
+import com.sandu.ximon.admin.schedule.LightTimeSynchronizationSchedule;
 import com.sandu.ximon.admin.security.PermissionConfig;
 import com.sandu.ximon.admin.service.LightEnergyDataService;
 import com.sandu.ximon.admin.service.LightReportDataService;
@@ -178,4 +179,24 @@
 
         return ResponseUtil.success(reportDataList);
     }
+
+    /**
+     * 璁剧疆鏃ュ巻锛堝悓蹇冭烦鍖呬腑鐨�6瀛楄妭鏃ユ湡鏃堕棿锛�
+     */
+    @PostMapping("/SetCalendar")
+    public ResponseVO<Object> SetCalendar(@RequestBody @Validated LightSetCalendarParam lightSetCalendarParam) {
+        if (!permissionConfig.check(MenuEnum.LIGHT_SETCALENDAR.getCode())) {
+            return ResponseUtil.fail("缂哄皯瀵瑰簲鐢ㄦ埛鏉冮檺");
+        }
+
+        return ResponseUtil.success(lightService.SetCalendar(lightSetCalendarParam.getLightId(), lightSetCalendarParam.getAddress()));
+    }
+
+    @AnonymousAccess
+    @GetMapping("/test")
+    public ResponseVO<Object> test() {
+        SpringContextHolder.getBean(LightTimeSynchronizationSchedule.class).UserSubjectRefund();
+
+        return ResponseUtil.success(null);
+    }
 }
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 22cf2fc..32ddc22 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
@@ -49,9 +49,13 @@
             }
 
         } else if (A5LightReportEnum.Time_Synchronized.getCode().equals(functionCode)) {
-//            log.info("璇锋眰鏃堕棿鍚屾");
+            log.info("璇锋眰鏃堕棿鍚屾");
             A5LightTimeSyncReportInnerFrame syncRespInnerFrame = new A5LightTimeSyncReportInnerFrame().transformFrame(frame.getPayload());
-//            log.info(syncRespInnerFrame.toString());
+            log.info(syncRespInnerFrame.toString());
+            if (syncRespInnerFrame.isValidate()) {
+                SpringContextHolder.getBean(LightService.class).timeSynchronizationInitiative(deviceName, syncRespInnerFrame.getDestinationAddress());
+            }
+
         } else if (A5LightReportEnum.Error_Code.getCode().equals(functionCode)) {
             log.info("鏁呴殰鐮佷笂鎶�");
             A5LightErrorCodeReportInnerFrame codeRespInnerFrame = new A5LightErrorCodeReportInnerFrame().transformFrame(frame.getPayload());
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightOperationReportInnerFrame.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightOperationReportInnerFrame.java
new file mode 100644
index 0000000..67fff58
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/report/A5LightOperationReportInnerFrame.java
@@ -0,0 +1,68 @@
+package com.sandu.ximon.admin.manager.iot.frame.inner.report;
+
+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;
+import lombok.Data;
+import lombok.ToString;
+
+/**
+ * @author ZZQ
+ * @date 2022/3/14 16:36
+ * 鍗曠伅鎿嶄綔鎸囦护鍝嶅簲甯�
+ */
+@Data
+@ToString(callSuper = true)
+public class A5LightOperationReportInnerFrame extends BaseResponseInnerFrame<A5LightOperationReportInnerFrame> {
+    //MAC鍦板潃
+    private String address;
+
+    private String state;
+
+    @Override
+    public A5LightOperationReportInnerFrame transformFrame(String hex) {        //  闀垮害涓嶄竴鑷存椂锛岃繑鍥瀗ull
+        if (StrUtil.isBlank(hex)) {
+            return null;
+        }
+        // MQTT閫氫俊鏂瑰紡(1)
+        setConnectType(hex.substring(0, 2));
+        //  鍔熻兘鐮�(1)
+        setFunctionCode(hex.substring(2, 4));
+        //  璐熻嵎闀垮害(2)
+        setPayloadLength(hex.substring(4, 8));
+        //MAC鍦板潃
+        setAddress(hex.substring(8, 12));
+        //纭欢浜や簰鍝嶅簲缁撴灉
+        setState(returnState(hex.substring(12, 14)));
+
+        setCrc32(hex.substring(hex.length() - 8));
+        //  鏍¢獙CRC32
+        String frame = hex.substring(2, hex.length() - 8);
+        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
+        return this;
+    }
+
+    public String returnState(String stateCode) {
+        String State = "";
+        switch (stateCode) {
+            case "00":
+                State = "鎿嶄綔鎴愬姛";
+                break;
+            case "01":
+                State = "鏍¢獙鐮侀敊璇�";
+                break;
+            case "02":
+                State = "闀垮害閿欒";
+                break;
+            case "03":
+                State = "鍐橣lash澶辫触閿欒";
+                break;
+            case "FF":
+                State = "鍏朵粬閿欒";
+                break;
+            default:
+                State = "鏈煡閿欒";
+        }
+        return State;
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightSetCalendarReqInnerFrame.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightSetCalendarReqInnerFrame.java
new file mode 100644
index 0000000..2b1f192
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightSetCalendarReqInnerFrame.java
@@ -0,0 +1,34 @@
+package com.sandu.ximon.admin.manager.iot.frame.inner.request;
+
+import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
+import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightDataEnum;
+import com.sandu.ximon.admin.manager.iot.rrpc.enums.C3ChargingEnum;
+import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
+import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
+
+/**
+ * 鍗曠伅璁剧疆鏃ュ巻
+ *
+ * @author ZZQ
+ * @date 2022/3/3 16:43
+ */
+public class A5LightSetCalendarReqInnerFrame implements IRequestInnerFrame {
+    private final String payload;
+
+    public A5LightSetCalendarReqInnerFrame(String lightAddress, int year, int month, int day, int hour, int min, int sec) {
+
+        payload = lightAddress + hex10To16(year) + hex10To16(month) + hex10To16(day) + hex10To16(hour) + hex10To16(min) + hex10To16(sec);
+    }
+
+    @Override
+    public String getEncodeFrame() {
+        String functionCode = A5LightDataEnum.SetCalendar.getCode();
+        String payloadLength = "0008";
+        String frame = functionCode + payloadLength + payload;
+        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
+    }
+
+    private String hex10To16(int value) {
+        return String.format("%02X", value);
+    }
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java
index 0d9694d..06987c8 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java
@@ -14,10 +14,13 @@
     //  鍏夋劅鎺у埗
     LightSensorControl("04"),
 
+
     //璁剧疆瀹氭椂鎺х伅鍙傛暟
     LightTimer("23"),
     // 娓呴櫎鍗曠伅绱鏁版嵁
     LightReset("25"),
+    //璁剧疆鏃ュ巻锛堝悓蹇冭烦鍖呬腑鐨�6瀛楄妭鏃ユ湡鏃堕棿锛�
+    SetCalendar("28"),
     LIGHT_HEART_BEAT("LightReportData:light_heart_beat/");
 
     A5LightDataEnum(String code) {
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightSetCalendarParam.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightSetCalendarParam.java
new file mode 100644
index 0000000..1a87541
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightSetCalendarParam.java
@@ -0,0 +1,20 @@
+package com.sandu.ximon.admin.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author ZZQ
+ * @date 2022/3/3 18:07
+ */
+@Data
+public class LightSetCalendarParam {
+    @NotNull(message = "鍗曠伅ID涓嶈兘涓虹┖")
+    private Long lightId;
+
+    /**
+     * 鐏ご鍦板潃
+     */
+    private String address;
+}
diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/LightTimeSynchronizationSchedule.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/LightTimeSynchronizationSchedule.java
new file mode 100644
index 0000000..4227472
--- /dev/null
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/schedule/LightTimeSynchronizationSchedule.java
@@ -0,0 +1,83 @@
+package com.sandu.ximon.admin.schedule;
+
+import com.alibaba.fastjson.JSONObject;
+import com.sandu.common.util.SpringContextHolder;
+import com.sandu.ximon.admin.service.LightService;
+import com.sandu.ximon.admin.service.LightTaskPoleRelationService;
+import com.sandu.ximon.dao.domain.Light;
+import com.sandu.ximon.dao.domain.LightTask;
+import com.sandu.ximon.dao.domain.LightTaskPoleRelation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+/**
+ * 鍗曠伅鍚屾鏃堕棿瀹氭椂
+ */
+
+@Component
+@Slf4j
+@AllArgsConstructor
+@EnableScheduling
+public class LightTimeSynchronizationSchedule {
+    private final LightService lightService;
+    private final LightTaskPoleRelationService lightTaskPoleRelationService;
+
+    //姣忓ぉ02:00 寮�濮嬫墽琛�
+    @Scheduled(cron = "0 0 2 * * ? ")
+    public void UserSubjectRefund() {
+        //鎵�鏈夊崟鐏暟鎹�
+        List<Light> lightList = lightService.list();
+
+        //鍗曠伅浠诲姟
+        List<LightTaskPoleRelation> lightTaskPoleRelationList =
+                lightTaskPoleRelationService.list();
+
+        /**
+         * 鍘婚櫎鏃犳晥鏁版嵁
+         */
+        lightTaskPoleRelationList = lightTaskPoleRelationList.stream().filter(bean -> bean.getDeviceScheduled() != null).collect(Collectors.toList());
+
+        Map<String, LightTask> map = new HashMap<>();
+        for (LightTaskPoleRelation bean : lightTaskPoleRelationList) {
+            LightTask lightTask = JSONObject.parseObject(bean.getDeviceScheduled(), LightTask.class);
+            map.put(bean.getDeviceCode() + bean.getLightAddress(), lightTask);
+        }
+
+        for (Light light : lightList) {
+            if (map.get(light.getDeviceCode() + "0001") != null) {
+                /**
+                 * 鍙傛暟1锛氬崟鐏俊鎭�
+                 * 鍙傛暟2锛氬崟鐏换鍔�
+                 */
+                lightService.timeSynchronization(light, "0001", map.get(light.getDeviceCode() + "0001"));
+            } else {
+                /**
+                 * 鍙傛暟1锛氬崟鐏俊鎭�
+                 * 鍙傛暟2锛氫换鍔′负null
+                 */
+                lightService.timeSynchronization(light, "0001", null);
+            }
+
+            if (map.get(light.getDeviceCode() + "0002") != null) {
+                /**
+                 * 鍙傛暟1锛氬崟鐏俊鎭�
+                 * 鍙傛暟2锛氬崟鐏换鍔�
+                 */
+                lightService.timeSynchronization(light, "0002", map.get(light.getDeviceCode() + "0002"));
+            } else {
+                /**
+                 * 鍙傛暟1锛氬崟鐏俊鎭�
+                 * 鍙傛暟2锛氫换鍔′负null
+                 */
+                lightService.timeSynchronization(light, "0002", null);
+            }
+        }
+    }
+}
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
index 04b7579..f0238af 100644
--- 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
@@ -3,6 +3,7 @@
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.HexUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
@@ -14,8 +15,11 @@
 import com.sandu.ximon.admin.dto.LightTaskDto;
 import com.sandu.ximon.admin.manager.iot.frame.A5Frame;
 import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightHeartbeatReportInnerFrame;
+import com.sandu.ximon.admin.manager.iot.frame.inner.report.A5LightOperationReportInnerFrame;
 import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightBrightnessReqInnerFrame;
+import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightSetCalendarReqInnerFrame;
 import com.sandu.ximon.admin.manager.iot.frame.inner.response.A5LightBrightnessRespInnerFrame;
+import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame;
 import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
 import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
 import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
@@ -25,7 +29,6 @@
 import com.sandu.ximon.admin.redis.DeviceRedisKey;
 import com.sandu.ximon.admin.redis.LightKey;
 import com.sandu.ximon.admin.security.SecurityUtils;
-import com.sandu.ximon.admin.utils.RedisUtils;
 import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils;
 import com.sandu.ximon.admin.vo.ControlLightCommandVO;
 import com.sandu.ximon.admin.vo.EquipmentInfomation;
@@ -43,10 +46,7 @@
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -63,7 +63,6 @@
     private final LightReportDataService lightReportDataService;
     private final PoleBindingService bindingService;
     private final PoleService poleService;
-    private final RedisUtils redisUtils;
 
     /**
      * 褰曞叆褰撳墠璁惧鐮佺殑璺伅鏁版嵁
@@ -961,4 +960,159 @@
     }
 
 
+
+    /**
+     * 璁剧疆鏃ュ巻锛堝悓蹇冭烦鍖呬腑鐨�6瀛楄妭鏃ユ湡鏃堕棿锛�
+     *
+     * @return
+     */
+    public String SetCalendar(Long lightId, String address) {
+        Calendar cal = Calendar.getInstance();
+        //鑾峰彇褰撳墠鏃堕棿
+        int year = cal.get(Calendar.YEAR);
+        int month = cal.get(Calendar.MONTH);
+        int day = cal.get(Calendar.DATE);
+        int hour = cal.get(Calendar.HOUR_OF_DAY);
+        int min = cal.get(Calendar.MINUTE);
+        int sec = cal.get(Calendar.SECOND);
+
+        if (!"0001".equals(address) && !"0002".equals(address)) {
+            throw new BusinessException("鐏ご鍦板潃閿欒锛�");
+        }
+
+        Light one = getById(lightId);
+        if (one == null) {
+            System.out.println("鍗曠伅涓嶅瓨鍦紒");
+        }
+
+        A5LightSetCalendarReqInnerFrame setCalendarReqInnerFrame =
+                new A5LightSetCalendarReqInnerFrame(address, year, month, day, hour, min, sec);
+
+        A5Frame a5Frame = new A5Frame(A5OrderEnum.REQUEST_LIGHT_DATA.getCode(), setCalendarReqInnerFrame);
+        System.out.println(a5Frame + "            -----a5Frame");
+
+        CommonFrame commonFrame;
+
+        commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(one.getDeviceCode(), a5Frame);
+        StoreOperationRecordsUtils.storeInnerFrameData(one.getDeviceCode(), "鍗曠伅甯�-璁剧疆鏃ュ巻", a5Frame, commonFrame);
+
+        System.out.println(commonFrame + "            -----commonFrame");
+
+        A5LightOperationReportInnerFrame operationReportInnerFrame = new A5LightOperationReportInnerFrame().transformFrame(commonFrame.getPayload());
+        if (operationReportInnerFrame.isValidate()) {
+            return operationReportInnerFrame.getState();
+        } else {
+            throw new BusinessException("鏁版嵁鏍¢獙閿欒锛岃閲嶆柊璇锋眰");
+        }
+    }
+
+    /**
+     * 鍗曠伅涓诲姩鍚屾鏃堕棿璇锋眰
+     */
+    public void timeSynchronizationInitiative(String deviceCode, String lightAddress) {
+        //鍗曠伅淇℃伅
+        Light light = getLight(deviceCode);
+        if (light == null) {
+            log.error("鍗曠伅涓诲姩鍚屾鏃堕棿璇锋眰寮傚父锛屽崟鐏俊鎭笉瀛樺湪锛�");
+        }
+        //鍗曠伅浠诲姟淇℃伅
+        LightTaskPoleRelation lightTaskPoleRelation = SpringContextHolder.getBean(LightTaskPoleRelationService.class)
+                .getOne(Wrappers.lambdaQuery(LightTaskPoleRelation.class)
+                        .eq(LightTaskPoleRelation::getDeviceCode, deviceCode).eq(LightTaskPoleRelation::getLightAddress, lightAddress));
+
+        LightTask lightTask = null;
+        //鐏ご娌℃湁浠诲姟
+        if (lightTaskPoleRelation != null) {
+            if (lightTaskPoleRelation.getDeviceScheduled() != null) {
+                lightTask = JSONObject.parseObject(lightTaskPoleRelation.getDeviceScheduled(), LightTask.class);
+            }
+        }
+
+        timeSynchronization(light, lightAddress, lightTask);
+
+    }
+
+    /**
+     * 鍗曠伅鏃堕棿鍚屾
+     *
+     * @param light     鍗曠伅淇℃伅瀹炰綋
+     * @param lightTask 鍗曠伅浠诲姟瀹炰綋锛堜负绌烘爣璇嗗崟鐏病鏈夊畾鏃朵换鍔★級
+     */
+    public void timeSynchronization(Light light, String lightAddress, LightTask lightTask) {
+        new Thread(new Runnable() {
+            @Override
+            public void run() {
+                //鑾峰彇褰撳墠鏃堕棿鏃躲�佸垎
+                Calendar cal = Calendar.getInstance();
+
+                if (lightTask != null) {
+                    String closeOrder = lightTask.getCloseOrder();
+                    String openOrder = lightTask.getOpenOrder();
+                    String controlOrder = lightTask.getControlOrder() == null ? null : lightTask.getControlOrder();
+
+                    List<String> timeList = new ArrayList<>();
+                    timeList.add(openOrder.substring(0, 4));
+                    timeList.add(closeOrder.substring(0, 4));
+                    if (controlOrder != null && controlOrder.length() % 7 == 0) {
+                        for (int i = 0; i < controlOrder.length() / 7; i++) {
+                            timeList.add(controlOrder.substring(i * 7, i * 7 + 4));
+                        }
+                    } else {
+                        log.error("鎺х伅鎸囦护涓嶆纭紝鏁版嵁闀垮害涓嶄负7鐨勫�嶆暟锛�");
+                        return;
+                    }
+                    //鏃堕棿鎺掑簭
+                    timeList = timeList.stream().sorted().collect(Collectors.toList());
+
+                    int count = 0;
+                    boolean haveTime = false;
+
+                    while (!haveTime && count <= 144) {
+                        haveTime = judgeTime(cal, timeList);
+                        cal.add(Calendar.MINUTE, 10);
+                        count++;
+                    }
+                    if (haveTime) {
+                        try {
+                            long longTime = cal.getTimeInMillis() - System.currentTimeMillis();
+                            log.error("鐫$湢鏃堕棿锛堟绉掞級锛�" + longTime);
+                            Thread.sleep(longTime);
+                            SetCalendar(light.getLightId(), lightAddress);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                    } else {
+                        log.error("鐏潌ID涓猴細" + light.getLightId() + "锛岀伅澶村湴鍧�涓猴細" + lightAddress + "娌℃湁鎵惧埌鍙悓姝ョ殑鏃堕棿锛岃妫�鏌ヤ换鍔★紒");
+                    }
+
+                } else {
+                    SetCalendar(light.getLightId(), lightAddress);
+                }
+            }
+        }).start();
+    }
+
+    /**
+     * 鍒ゆ柇鏃堕棿鏄惁鍙互鎵ц鍚屾鎸囦护
+     *
+     * @param time
+     * @param timeList
+     * @return true 鍙互鎵ц  ,false  涓嶅彲鎵ц
+     */
+    private boolean judgeTime(Calendar time, List<String> timeList) {
+        int hour = time.get(Calendar.HOUR_OF_DAY);
+        int min = time.get(Calendar.MINUTE);
+        int allMin = hour * 60 + min;
+        for (String value : timeList) {
+            int targetHour = Integer.valueOf(value.substring(0, 2));
+            int targetMin = Integer.valueOf(value.substring(2, 4));
+            int allTargetMin = targetHour * 60 + targetMin;
+            if (allMin >= allTargetMin - 10 && allMin <= allTargetMin + 10) {
+                return false;
+            } else {
+                continue;
+            }
+        }
+        return true;
+    }
 }

--
Gitblit v1.9.3