2021与蓝度共同重构项目,服务端
Van333
2022-12-29 727a69f859060093e685582fa10e5de82dcc138a
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java
@@ -1,58 +1,168 @@
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 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);
        Integer[] weekArrays = TaskOrderUtil.parseLightWeek(lightTask.getWeek());
        if (singleLightOrder == null) {
        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)) {
        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);
    }
}