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 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 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<>();
|
|
// 添加开灯定时器
|
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 (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<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);
|
}
|
}
|