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.service.QuartzService; import com.sandu.common.service.impl.BaseServiceImpl; 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 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 { @Resource private QuartzService quartzService; /** * 添加定时器任务 * * @param lightTask 路灯任务实体类,一个路灯任务有多个定时器任务 */ public List addLightTaskQuartz(LightTask lightTask) { List list = buildLightTaskQuartzList(lightTask); boolean saveBatch = saveBatch(list); if (!saveBatch) { throw new BusinessException("保存定时任务失败"); } runLightTaskQuartz(list); return list; } /** * 根据路灯任务信息生成路灯定时器列表 * @param lightTask 路灯任务信息 * @return 路灯定时器列表 */ private List buildLightTaskQuartzList(LightTask lightTask) { List list = new ArrayList<>(); // 添加开灯定时器 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.parseLightCronWeek2List(lightTask.getWeek()).toArray(new Integer[0]); if (openLightOrder == null || closeLightOrder == null) { throw new BusinessException("解析单灯命令失败"); } if (ArrayUtil.isEmpty(weekArrays)) { throw new BusinessException("请设置星期"); } 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)); // 拼接关灯命令 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; } /** * 执行定时器任务 * @param list 定时器列表 */ public void runLightTaskQuartz(List list){ for (LightTaskQuartz taskQuartz : list) { Map build = MapUtil.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 updateLightTaskQuartz(LightTask lightTask) { Long taskId = lightTask.getTaskId(); // 删除旧任务 removeLightTaskQuartz(CollectionUtil.toList(taskId)); List list = addLightTaskQuartz(lightTask); return list; } public boolean removeLightTaskQuartz(List taskIdList) { List 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); } }