From ea94079e74182be590b9fff356c97f522d9a7828 Mon Sep 17 00:00:00 2001
From: MercuryZ <zdmisif@126.com>
Date: 星期二, 18 十月 2022 09:26:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightService.java |  402 ++++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 240 insertions(+), 162 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 2f08bb8..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,25 +16,28 @@
 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;
@@ -43,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;
 
@@ -62,6 +65,7 @@
     private final LightReportDataService lightReportDataService;
     private final PoleBindingService bindingService;
     private final PoleService poleService;
+    private final RedisUtils redisUtils;
 
     /**
      * 褰曞叆褰撳墠璁惧鐮佺殑璺伅鏁版嵁
@@ -198,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;
     }
 
     /**
@@ -304,151 +312,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;
     }
 
 
@@ -636,7 +499,7 @@
      *
      * @return
      */
-    public BigDecimal jisuan(LightTaskDto Task) {
+    public BigDecimal jisuan(LightTaskDto Task, LightTaskPoleRelation bean) {
         final BigDecimal[] bigDecimalResult = {new BigDecimal(0.00)};
         /**
          * 鑺傝兘鐜囪绠楀紑濮�
@@ -758,9 +621,10 @@
      * 涓�澶╃殑鑳借��
      *
      * @param
+     * @param bean
      * @return
      */
-    public BigDecimal jisuanEnergy(LightTaskDto Task) {
+    public BigDecimal jisuanEnergy(LightTaskDto Task, LightTaskPoleRelation bean) {
         //瀛樻斁鑳借��
         final BigDecimal[] bigEnergy = {new BigDecimal(0.00)};
 
@@ -779,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());
         //鑾峰彇鍒板崟鐏换鍔$殑鑺傝兘鐜�
@@ -1009,14 +885,14 @@
     /**
      * 鑾峰彇鐢ㄦ埛鎵�鏈夌殑璁惧鐮�
      */
-    public CommonPage<String> listDeviceCode(int pageNo, int pageSize, String keyword, String deviceCode,String orderBy) {
+    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,orderBy);
+            PageHelper.startPage(pageNo, pageSize, orderBy);
             list = baseMapper.listCode(null, keyword, deviceCode);
         }
 
@@ -1053,4 +929,206 @@
         });
         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