From 0f98ec728d0403b1726273d94dc00f06993888b6 Mon Sep 17 00:00:00 2001
From: chenjiantian <214228265@qq.com>
Date: 星期四, 16 十二月 2021 18:36:01 +0800
Subject: [PATCH] 灯模块

---
 ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java |  139 +++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 125 insertions(+), 14 deletions(-)

diff --git a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java
index 3e16e33..dd3e51b 100644
--- a/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java
+++ b/ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java
@@ -1,58 +1,169 @@
 package com.sandu.ximon.admin.service;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.HexUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.sandu.common.execption.BusinessException;
+import com.sandu.common.quartz.ExecutionJob;
+import com.sandu.common.quartz.service.QuartzService;
 import com.sandu.common.service.impl.BaseServiceImpl;
+import com.sandu.ximon.admin.constant.Constants;
 import com.sandu.ximon.admin.dto.SingleLightOrderDto;
+import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils;
+import com.sandu.ximon.admin.param.LightTaskParam;
+import com.sandu.ximon.admin.quartz.LightTimerJob;
 import com.sandu.ximon.admin.utils.TaskOrderUtil;
 import com.sandu.ximon.dao.domain.LightTask;
 import com.sandu.ximon.dao.domain.LightTaskQuartz;
 import com.sandu.ximon.dao.mapper.LightTaskQuartzMapper;
-import org.quartz.CronScheduleBuilder;
-import org.quartz.DateBuilder;
+import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @author chenjiantian
  * @date 2021/12/15 17:46
  */
 @Service
+@AllArgsConstructor
 public class LightTaskQuartzService extends BaseServiceImpl<LightTaskQuartzMapper, LightTaskQuartz> {
+
+    @Resource
+    private QuartzService quartzService;
 
     /**
      * 娣诲姞瀹氭椂鍣ㄤ换鍔�
      *
      * @param lightTask 璺伅浠诲姟瀹炰綋绫伙紝涓�涓矾鐏换鍔℃湁澶氫釜瀹氭椂鍣ㄤ换鍔�
      */
-    public boolean addLightTaskQuartz(LightTask lightTask) {
+    public List<LightTaskQuartz> addLightTaskQuartz(LightTask lightTask) {
+        List<LightTaskQuartz> list = buildLightTaskQuartzList(lightTask);
+
+        boolean saveBatch = saveBatch(list);
+        if (!saveBatch) {
+            throw new BusinessException("淇濆瓨瀹氭椂浠诲姟澶辫触");
+        }
+
+        runLightTaskQuartz(list);
+
+        return list;
+    }
+
+    /**
+     * 鏍规嵁璺伅浠诲姟淇℃伅鐢熸垚璺伅瀹氭椂鍣ㄥ垪琛�
+     * @param lightTask 璺伅浠诲姟淇℃伅
+     * @return 璺伅瀹氭椂鍣ㄥ垪琛�
+     */
+    private List<LightTaskQuartz> buildLightTaskQuartzList(LightTask lightTask) {
         List<LightTaskQuartz> list = new ArrayList<>();
 
         // 娣诲姞寮�鐏畾鏃跺櫒
-        String openOrder = lightTask.getOpenOrder();
-        SingleLightOrderDto singleLightOrder = TaskOrderUtil.parseLightOrder(openOrder);
+        SingleLightOrderDto openLightOrder = TaskOrderUtil.parseLightOrder(lightTask.getOpenOrder());
+        SingleLightOrderDto closeLightOrder = TaskOrderUtil.parseLightOrder(lightTask.getCloseOrder());
+        String[] controlOrderArray = StrUtil.split(lightTask.getControlOrder(), LightTaskParam.REQUEST_ORDER_LENGTH);
         Integer[] weekArrays = TaskOrderUtil.parseLightWeek(lightTask.getWeek());
-        if (singleLightOrder == null) {
+        if (openLightOrder == null || closeLightOrder == null) {
             throw new BusinessException("瑙f瀽鍗曠伅鍛戒护澶辫触");
         }
-        if(ArrayUtil.isEmpty(weekArrays)) {
+        if (ArrayUtil.isEmpty(weekArrays)) {
             throw new BusinessException("璇疯缃槦鏈�");
         }
-        String cron = TaskOrderUtil.getHourAndMinuteOnGivenDaysOfWeek(singleLightOrder.getHour(), singleLightOrder.getMinute(), weekArrays);
 
-        LightTaskQuartz lightTaskQuartz = new LightTaskQuartz();
-        lightTaskQuartz.setTaskId(lightTask.getTaskId());
-        lightTaskQuartz.setCronExpression(cron);
+        StringBuilder sb = new StringBuilder();
+        String weekHex = SupplementUtils.suppleZero(HexUtil.toHex(lightTask.getWeek()), 2);
 
+        // 鎷兼帴寮�鐏懡浠�
+        sb.append(weekHex);
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getHour()), 2));
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getMinute()), 2));
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(openLightOrder.getBrightness()), 2));
 
-        return false;
+        // 鎷兼帴鍏崇伅鍛戒护
+        sb.append(weekHex);
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getHour()), 2));
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getMinute()), 2));
+        sb.append(SupplementUtils.suppleZero(HexUtil.toHex(closeLightOrder.getBrightness()), 2));
+
+        // 鏂板寮�鐏畾鏃跺櫒
+        LightTaskQuartz openLightTaskQuartz = new LightTaskQuartz();
+        openLightTaskQuartz.setTaskId(lightTask.getTaskId());
+        openLightTaskQuartz.setCronExpression(TaskOrderUtil.getHourAndMinuteOnGivenDaysOfWeek(openLightOrder.getHour(), openLightOrder.getMinute(), weekArrays));
+        openLightTaskQuartz.setQuartzName(lightTask.getTaskName());
+        list.add(openLightTaskQuartz);
+
+        // 鏂板鍏崇伅鐏畾鏃跺櫒
+        LightTaskQuartz closeLightTaskQuartz = new LightTaskQuartz();
+        closeLightTaskQuartz.setTaskId(lightTask.getTaskId());
+        closeLightTaskQuartz.setCronExpression(TaskOrderUtil.getHourAndMinuteOnGivenDaysOfWeek(closeLightOrder.getHour(), closeLightOrder.getMinute(), weekArrays));
+        closeLightTaskQuartz.setQuartzName(lightTask.getTaskName());
+        list.add(closeLightTaskQuartz);
+
+        // 鎷兼帴浜害鎺х伅鍛戒护
+        for (String controlOrderStr : controlOrderArray) {
+            SingleLightOrderDto controlLightOrder = TaskOrderUtil.parseLightOrder(controlOrderStr);
+            if (controlLightOrder != null) {
+                sb.append(weekHex);
+                sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getHour()), 2));
+                sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getMinute()), 2));
+                sb.append(SupplementUtils.suppleZero(HexUtil.toHex(controlLightOrder.getBrightness()), 2));
+
+                LightTaskQuartz controlLightTaskQuartz = new LightTaskQuartz();
+                controlLightTaskQuartz.setTaskId(lightTask.getTaskId());
+                controlLightTaskQuartz.setCronExpression(TaskOrderUtil.getHourAndMinuteOnGivenDaysOfWeek(controlLightOrder.getHour(), controlLightOrder.getMinute(), weekArrays));
+                controlLightTaskQuartz.setQuartzName(lightTask.getTaskName());
+                list.add(controlLightTaskQuartz);
+            }
+        }
+
+        String lightOrder = sb.toString();
+
+        for (LightTaskQuartz lightTaskQuartz : list) {
+            lightTaskQuartz.setFramePayload(lightOrder);
+        }
+        return list;
     }
 
-    public static void main(String[] args) {
-        System.out.println(CronScheduleBuilder.atHourAndMinuteOnGivenDaysOfWeek(0, 1, DateBuilder.SUNDAY).build().getCalendarName());
+    /**
+     * 鎵ц瀹氭椂鍣ㄤ换鍔�
+     * @param list 瀹氭椂鍣ㄥ垪琛�
+     */
+    public void runLightTaskQuartz(List<LightTaskQuartz> list){
+        for (LightTaskQuartz taskQuartz : list) {
+            Map<String, Object> build = MapUtil.<String, Object>builder()
+                    .put("taskId", taskQuartz.getTaskId())
+                    .put("taskName", taskQuartz.getQuartzName())
+                    .put("quartzId", taskQuartz.getId())
+                    .put("cron", taskQuartz.getCronExpression()).build();
+            quartzService.addJob(LightTimerJob.class, taskQuartz.getId(), taskQuartz.getCronExpression(), build);
+        }
     }
 
+    public List<LightTaskQuartz> updateLightTaskQuartz(LightTask lightTask) {
 
+        Long taskId = lightTask.getTaskId();
+        // 鍒犻櫎鏃т换鍔�
+        removeLightTaskQuartz(CollectionUtil.toList(taskId));
+
+        List<LightTaskQuartz> list = addLightTaskQuartz(lightTask);
+
+        return list;
+    }
+
+    public boolean removeLightTaskQuartz(List<Long> taskIdList) {
+        List<Long> delTaskQuartzIdList = list(Wrappers.lambdaQuery(LightTaskQuartz.class).in(LightTaskQuartz::getTaskId, taskIdList).select(LightTaskQuartz::getId))
+                .stream().map(LightTaskQuartz::getId).collect(Collectors.toList());
+        for (Long delTaskQuartzId : delTaskQuartzIdList) {
+            quartzService.deleteJob(LightTimerJob.class,delTaskQuartzId);
+        }
+
+        return removeByIds(delTaskQuartzIdList);
+    }
 }

--
Gitblit v1.9.3