2021与蓝度共同重构项目,服务端
liuhaonan
2022-06-21 dc3bcb72bc0e69202911908782ba24eeec8ab305
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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 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.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<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);
    }
}