From dda268997ca8f8a364f7c19b45d7a43a50a98efe Mon Sep 17 00:00:00 2001
From: liuhaonan <31457034@qq.com>
Date: 星期二, 25 十月 2022 18:00:11 +0800
Subject: [PATCH] changes
---
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java | 493 +++++++++++++++++++++++++++++++++++-------------------
1 files changed, 317 insertions(+), 176 deletions(-)
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 d4e9300..998120c 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,8 @@
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+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,26 +16,30 @@
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;
import com.sandu.ximon.admin.param.LightControlParam;
import com.sandu.ximon.admin.param.LightPowerSettingParam;
import com.sandu.ximon.admin.param.LightRemarkParam;
+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;
+import com.sandu.ximon.admin.vo.RedisDeviceStatus;
import com.sandu.ximon.dao.bo.LightBo;
import com.sandu.ximon.dao.bo.PoleTaskLightPowerBo;
-import com.sandu.ximon.dao.domain.Light;
-import com.sandu.ximon.dao.domain.LightReportData;
-import com.sandu.ximon.dao.domain.Pole;
-import com.sandu.ximon.dao.domain.PoleBinding;
+import com.sandu.ximon.dao.domain.*;
import com.sandu.ximon.dao.enums.DeviceRespStatusEnums;
+import com.sandu.ximon.dao.enums.OrderByEnums;
import com.sandu.ximon.dao.mapper.LightMapper;
import com.sandu.ximon.dao.mapper.LightTaskMapper;
import lombok.AllArgsConstructor;
@@ -42,8 +48,6 @@
import java.math.BigDecimal;
import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -61,6 +65,7 @@
private final LightReportDataService lightReportDataService;
private final PoleBindingService bindingService;
private final PoleService poleService;
+ private final RedisUtils redisUtils;
/**
* 褰曞叆褰撳墠璁惧鐮佺殑璺伅鏁版嵁
@@ -72,7 +77,7 @@
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);
+ log.info("redis鏌ヤ笉鍒拌矾鐏暟鎹� 鏁伴噺:{}={}", count, deviceName);
// 褰撳墠璺伅琛ㄦ病鏈夊綍鍏ヨ澶囧悧
if (count == 0) {
Light light = new Light();
@@ -80,15 +85,15 @@
light.setLightPercent(heartBeatDataPackage.getLightPercent());
light.setLight2Percent(heartBeatDataPackage.getLight2Percent());
save(light);
+ log.info("鏂板璺伅");
}
redisService.set(LightKey.REPORT_MAC.key(deviceName), 1, LightKey.REPORT_MAC.expireSeconds());
- log.info("鏂板璺伅");
} else {
Light light = new Light();
light.setLightPercent(heartBeatDataPackage.getLightPercent());
light.setLight2Percent(heartBeatDataPackage.getLight2Percent());
- update(light, Wrappers.lambdaUpdate(Light.class).eq(Light::getDeviceCode, deviceName));
- log.info("鏇存柊璺伅浜害");
+ boolean update = update(light, Wrappers.lambdaUpdate(Light.class).eq(Light::getDeviceCode, deviceName));
+ log.info("鏇存柊璺伅浜害 {}", update);
}
}
@@ -97,10 +102,43 @@
*
* @return 杩斿洖缁勫悎鏁版嵁dto
*/
- public List<LightBo> listLight(int pageNo, int pageSize, String keyword) {
+ public List<LightBo> listLight(int pageNo, int pageSize, String keyword, Integer order, Integer seq) {
Long clientId = SecurityUtils.getClientId();
- PageHelper.startPage(pageNo, pageSize);
+ //鎺掑簭瀛楁
+ String orderByResult = "light_id";
+ //姝e簭銆佸�掑彊
+ String orderBySeq = OrderByEnums.ASC.getCode();
+ if (order != null) {
+ switch (order) {
+ case 1:
+ orderByResult = OrderByEnums.LIGHT_POLE_NAME.getCode();
+ break;
+ case 2:
+ orderByResult = OrderByEnums.LIGHT_UPDATE_TIME.getCode();
+ break;
+ case 3:
+ orderByResult = OrderByEnums.LIGHT_CREATE_TIME.getCode();
+ break;
+ default:
+ }
+ }
+ if (seq != null) {
+ switch (seq) {
+ case 1:
+ orderBySeq = OrderByEnums.ASC.getCode();
+ break;
+ case 2:
+ orderBySeq = OrderByEnums.DESC.getCode();
+ break;
+ default:
+ break;
+ }
+ }
+ //鎺掑簭鏂瑰紡
+ String orderBy = orderByResult + " " + orderBySeq;
+
+ PageHelper.startPage(pageNo, pageSize, orderBy);
List<LightBo> listLight = baseMapper.listLight(clientId, keyword);
@@ -164,13 +202,17 @@
*/
public Light getLight(String deviceCode) {
Light one = getOne(Wrappers.<Light>lambdaQuery().eq(Light::getDeviceCode, deviceCode));
- Object o = redisService.get(LightKey.REPORT_MAC.key(deviceCode));
- if (o != null) {
- one.setOnlineStatus(1);
+ if (one == null) {
+ return null;
} else {
- one.setOnlineStatus(0);
+ Object o = redisService.get(LightKey.REPORT_MAC.key(deviceCode));
+ if (o != null) {
+ one.setOnlineStatus(1);
+ } else {
+ one.setOnlineStatus(0);
+ }
+ return one;
}
- return one;
}
/**
@@ -272,151 +314,6 @@
return resultList;
}
- /**
- * 鍗曠伅鑺傝兘鐜�
- *
- * @return
- */
- public List controlEnergySaving() {
- //鑾峰彇鍒版鍦ㄦ墽琛岀殑浠诲姟鍒楄〃
- List<LightTaskDto> lightTaskDtos = SpringContextHolder.getBean(LightTaskService.class).listTask();
- LocalDateTime now = LocalDateTime.now();
-
- List<LightTaskDto> list1 = new ArrayList<>();
- List<LightTaskDto> list2 = new ArrayList<>();
- List<LightTaskDto> list3 = new ArrayList<>();
- List<LightTaskDto> list4 = new ArrayList<>();
- List<LightTaskDto> list5 = new ArrayList<>();
- List<LightTaskDto> list6 = new ArrayList<>();
- List<LightTaskDto> list7 = new ArrayList<>();
-
- for (LightTaskDto lightTaskDto : lightTaskDtos) {
- List<Integer> weekList = lightTaskDto.getWeekList();
- for (Integer one : weekList) {
- switch (one) {
- case 1:
- list1.add(lightTaskDto);
- break;
- case 2:
- list2.add(lightTaskDto);
- break;
- case 4:
- list3.add(lightTaskDto);
- break;
- case 8:
- list4.add(lightTaskDto);
- break;
- case 16:
- list5.add(lightTaskDto);
- break;
- case 32:
- list6.add(lightTaskDto);
- break;
- case 64:
- list7.add(lightTaskDto);
- break;
- default:
- }
- }
- }
-
-
- //鑾峰彇褰撳墠鏄熸湡鍑� 1-7
-
- int currentWeekValue = now.getDayOfWeek().getValue();
- Map map;
- List<Map> temp = new ArrayList<>();
- //鑾峰彇鏃ユ湡 绮剧‘鍒板ぉ
- LocalDateTime localDateTime = now.with(LocalTime.MIN);
-
-
- for (int i = 1; i < 8; i++) {
- currentWeekValue--;
- if (currentWeekValue < 1) {
- currentWeekValue = 7;
- }
- map = new LinkedHashMap();
- map.put("time", localDateTime.minusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- map.put("value", getlist(currentWeekValue));
- temp.add(map);
- }
-
-
- return temp;
- }
-
-
- /**
- * 鍗曠伅鑳借��
- *
- * @return
- */
- public List controlEnergy() {
- //鑾峰彇鍒版鍦ㄦ墽琛岀殑浠诲姟鍒楄〃
- List<LightTaskDto> lightTaskDtos = SpringContextHolder.getBean(LightTaskService.class).listTask();
- LocalDateTime now = LocalDateTime.now();
-
- List<LightTaskDto> list1 = new ArrayList<>();
- List<LightTaskDto> list2 = new ArrayList<>();
- List<LightTaskDto> list3 = new ArrayList<>();
- List<LightTaskDto> list4 = new ArrayList<>();
- List<LightTaskDto> list5 = new ArrayList<>();
- List<LightTaskDto> list6 = new ArrayList<>();
- List<LightTaskDto> list7 = new ArrayList<>();
-
- for (LightTaskDto lightTaskDto : lightTaskDtos) {
- List<Integer> weekList = lightTaskDto.getWeekList();
- System.out.println(weekList + "===========================");
- for (Integer one : weekList) {
- switch (one) {
- case 1:
- list1.add(lightTaskDto);
- break;
- case 2:
- list2.add(lightTaskDto);
- break;
- case 4:
- list3.add(lightTaskDto);
- break;
- case 8:
- list4.add(lightTaskDto);
- break;
- case 16:
- list5.add(lightTaskDto);
- break;
- case 32:
- list6.add(lightTaskDto);
- break;
- case 64:
- list7.add(lightTaskDto);
- break;
- default:
- }
- }
- }
-
- Integer currentWeekValue = now.getDayOfWeek().getValue();
- Map map;
- List<Map> temp = new ArrayList<>();
- //鑾峰彇褰撳墠鏃ユ湡 鏍煎紡涓簓yyy-MM-dd
- LocalDateTime localDateTime = now.with(LocalTime.MIN);
-
-
- for (int i = 1; i < 8; i++) {
- currentWeekValue--;
- if (currentWeekValue < 1) {
- currentWeekValue = 7;
- }
- map = new LinkedHashMap();
- map.put("time", localDateTime.minusDays(i).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
- map.put("value", getlistEnergy(currentWeekValue));
- temp.add(map);
- }
-
-
- return temp;
- }
-
public BigDecimal getlist(Integer week) {
@@ -488,9 +385,6 @@
public BigDecimal getlistEnergy(Integer week) {
- Long clientId = SecurityUtils.getClientId();
-// List<LightBo> listLight = baseMapper.listLight(clientId, null);
-// List<String> deviceCodeList = listLight.stream().map(LightBo::getDeviceCode).collect(Collectors.toList());
//鑾峰彇鍒版鍦ㄦ墽琛岀殑浠诲姟鍒楄〃
List<LightTaskDto> lightTaskDtos = SpringContextHolder.getBean(LightTaskService.class).listTask();
@@ -605,12 +499,11 @@
*
* @return
*/
- public BigDecimal jisuan(LightTaskDto Task) {
+ public BigDecimal jisuan(LightTaskDto Task, LightTaskPoleRelation bean) {
final BigDecimal[] bigDecimalResult = {new BigDecimal(0.00)};
/**
* 鑺傝兘鐜囪绠楀紑濮�
*/
- //TODO
//鑾峰彇鏄ㄥぉ鐨勬槦鏈熸暟
LocalDateTime now = LocalDateTime.now();
LocalDateTime yesterday = now.minusDays(1);
@@ -619,10 +512,10 @@
//鍒ゆ柇Task.getWeekList()鏄惁鍖呭惈鏄ㄥぉ鐨勬槦鏈熸暟 涓嶅寘鍚洿鎺ヨ繑鍥�0 涓嶈繘琛岃绠�
if (Task.getWeekList() != null && !Task.getWeekList().isEmpty()) {
if (!Task.getWeekList().contains(week)) {
- return BigDecimal.ZERO;
+ return new BigDecimal(1);
}
} else {
- return BigDecimal.ZERO;
+ return new BigDecimal(1);
}
@@ -727,10 +620,11 @@
/**
* 涓�澶╃殑鑳借��
*
- * @param list
+ * @param
+ * @param bean
* @return
*/
- public BigDecimal jisuanEnergy(LightTaskDto Task) {
+ public BigDecimal jisuanEnergy(LightTaskDto Task, LightTaskPoleRelation bean) {
//瀛樻斁鑳借��
final BigDecimal[] bigEnergy = {new BigDecimal(0.00)};
@@ -749,9 +643,21 @@
}
/**
- * 鑺傝兘鐜囪绠楀紑濮�
+ * 鑳借�楄绠楀紑濮�
*/
- List<PoleTaskLightPowerBo> poleTaskLightPowerBos = SpringContextHolder.getBean(LightTaskMapper.class).listLightTaskByTaskId(Task.getTaskId());
+// List<PoleTaskLightPowerBo> poleTaskLightPowerBos = SpringContextHolder.getBean(LightTaskMapper.class).listLightTaskByTaskId(Task.getTaskId());
+ List<PoleTaskLightPowerBo> poleTaskLightPowerBos = new ArrayList<>();
+ PoleTaskLightPowerBo poleTaskLightPowerBo = new PoleTaskLightPowerBo();
+ Light one = getOne(Wrappers.lambdaQuery(Light.class).eq(Light::getDeviceCode, bean.getDeviceCode()));
+
+ if (one != null) {
+ if ("0001".equals(bean.getLightAddress())) {
+ poleTaskLightPowerBo.setPower1(one.getPower1());
+ } else {
+ poleTaskLightPowerBo.setPower2(one.getPower2());
+ }
+ }
+ poleTaskLightPowerBos.add(poleTaskLightPowerBo);
ControlLightCommandVO startTime = parseSwitchLightCommand(Task.getOpenOrder());
ControlLightCommandVO endTime = parseSwitchLightCommand(Task.getCloseOrder());
//鑾峰彇鍒板崟鐏换鍔$殑鑺傝兘鐜�
@@ -870,7 +776,7 @@
// BigDecimal hour = BigDecimal.valueOf((v2.getHour() - v1.getHour()));
// BigDecimal hour;
if (v1.getBrightness() == 0) {
- return BigDecimal.ZERO;
+ return new BigDecimal(1);
}
double hour;
double min;
@@ -962,16 +868,31 @@
}
/**
+ * 鐢ㄦ埛鎷ユ湁鐨勮矾鐏�(鐢ㄤ簬棣栭〉鏁版嵁缁熻)
+ *
+ * @return
+ */
+ public List<LightBo> listLightOnHome() {
+ List<LightBo> listLight;
+ if (SecurityUtils.getClientId() != null) {
+ listLight = baseMapper.listLight(SecurityUtils.getUserId(), null);
+ } else {
+ listLight = baseMapper.listLight(null, null);
+ }
+ return listLight;
+ }
+
+ /**
* 鑾峰彇鐢ㄦ埛鎵�鏈夌殑璁惧鐮�
*/
- public CommonPage<String> listDeviceCode(int pageNo, int pageSize, String keyword, String deviceCode) {
+ public CommonPage<String> listDeviceCode(int pageNo, int pageSize, String keyword, String deviceCode, String orderBy) {
List<String> list;
if (SecurityUtils.getClientId() != null) {
PageHelper.startPage(pageNo, pageSize);
list = baseMapper.listCode(SecurityUtils.getUserId(), keyword, deviceCode);
} else {
- PageHelper.startPage(pageNo, pageSize);
+ PageHelper.startPage(pageNo, pageSize, orderBy);
list = baseMapper.listCode(null, keyword, deviceCode);
}
@@ -986,8 +907,228 @@
lights.forEach(light -> {
light.setPower1(lightPowerSettingParam.getPower1());
light.setPower2(lightPowerSettingParam.getPower2());
+ //瀛樺湪闈�0鍔熺巼 鍗充负瀛樺湪璇ョ伅澶�
+ if (lightPowerSettingParam.getPower1() != null || lightPowerSettingParam.getPower1() != 0) {
+ light.setLight1(1);
+ } else if (lightPowerSettingParam.getPower1() == 0) {
+ //鎵嬪姩璁剧疆鐏ご鍔熺巼涓�0 鍗充笉瀛樺湪璇ョ伅澶�
+ light.setLight1(0);
+ } else {
+ light.setLight1(0);
+ }
+ //瀛樺湪闈�0鍔熺巼 鍗充负瀛樺湪璇ョ伅澶�
+ if (lightPowerSettingParam.getPower2() != null || lightPowerSettingParam.getPower2() != 0) {
+ light.setLight2(1);
+ } else if (lightPowerSettingParam.getPower2() == 0) {
+ //鎵嬪姩璁剧疆鐏ご鍔熺巼涓�0 鍗充笉瀛樺湪璇ョ伅澶�
+ light.setLight2(0);
+ } else {
+ light.setLight2(0);
+ }
light.setLightCount(lightPowerSettingParam.getLightCount());
});
return updateBatchById(lights);
}
+
+
+ /**
+ * 鍚慠edis涓瓨鍏ヨ澶囩姸鎬�
+ */
+ public void setCacheData() {
+
+ List<String> collect = list().stream().map(Light::getDeviceCode).collect(Collectors.toList());
+// collect.forEach(
+// code -> {
+// redisUtils.delete(DeviceRedisKey.LIGHT_DEVICE + code);
+// }
+// );
+ List<List<String>> split = CollectionUtil.split(collect, 100);
+
+ List<BatchGetDeviceStateResponse.DeviceStatus> deviceStatuses = new ArrayList<>();
+ List<RedisDeviceStatus> statusList = new ArrayList<>();
+ for (List<String> splist : split) {
+ deviceStatuses = MainBoardInvokeSyncService.getInstance().batchGetDeviceState(splist);
+ if (deviceStatuses != null) {
+ for (BatchGetDeviceStateResponse.DeviceStatus deviceStatus : deviceStatuses) {
+ RedisDeviceStatus device = new RedisDeviceStatus();
+ device.setDeviceId(deviceStatus.getDeviceName());
+ if ("ONLINE".equals(deviceStatus.getStatus())) {
+ device.setStatus(0);
+ } else if ("OFFLINE".equals(deviceStatus.getStatus())) {
+ device.setStatus(1);
+ } else if ("UNACTIVE".equals(deviceStatus.getStatus())) {
+ device.setStatus(0);
+ } else if ("DISABLE".equals(deviceStatus.getStatus())) {
+ device.setStatus(0);
+ } else {
+ device.setStatus(2);
+ }
+ statusList.add(device);
+ }
+
+ }
+ }
+
+ statusList.forEach(status -> {
+ redisUtils.set(DeviceRedisKey.LIGHT_DEVICE + status.getDeviceId(), JSON.toJSONString(status));
+ });
+
+ }
+
+
+ /**
+ * 璁剧疆鏃ュ巻锛堝悓蹇冭烦鍖呬腑鐨�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 % 100, month + 1, 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("鍗曠伅涓诲姩鍚屾鏃堕棿璇锋眰寮傚父锛屽崟鐏俊鎭笉瀛樺湪锛�");
+ return;
+ }
+ //鍗曠伅浠诲姟淇℃伅
+ 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