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/service/LightService.java | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 160 insertions(+), 6 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 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