| | |
| | | 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("解析单灯命令失败"); |
| | | } |
| | | 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); |
| | | } |
| | | } |