2021与蓝度共同重构项目,服务端
chenjiantian
2021-12-16 0f98ec728d0403b1726273d94dc00f06993888b6
灯模块
已修改19个文件
已添加12个文件
已删除1个文件
977 ■■■■ 文件已修改
dao/src/main/java/com/sandu/ximon/dao/domain/LightTaskQuartz.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/LightTaskQuartzLog.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/LightTaskMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/mapper/LightTaskQuartzLogMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LightTaskQuartzLogMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/resources/mapper/LightTaskQuartzMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/quartz/ExecutionJob.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/quartz/dto/QuartzJobDto.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/quartz/service/QuartzService.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/quartz/service/QuartzServiceImpl.java 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sandu-common/src/main/resources/application.yml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/config/JobRunner.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/constant/Constants.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightTimerReqInnerFrame.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightTimerRespInnerFrame.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightTaskDelParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightTaskParam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/quartz/LightTimerJob.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskPoleRelationService.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzLogService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/TaskOrderUtil.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/main/resources/application-dev.yml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/test/java/com/sandu/ximon/admin/AdminApplicationTests.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ximon-admin/src/test/java/com/sandu/ximon/admin/QuartzTests.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
dao/src/main/java/com/sandu/ximon/dao/domain/LightTaskQuartz.java
@@ -44,7 +44,7 @@
    /**
     * å®šæ—¶å™¨å‘½ä»¤å¸§
     */
    private String order;
    private String framePayload;
    /**
     * åˆ›å»ºæ—¶é—´
dao/src/main/java/com/sandu/ximon/dao/domain/LightTaskQuartzLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,66 @@
package com.sandu.ximon.dao.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
 * è·¯ç¯ä»»åŠ¡å®šæ—¶å™¨æ‰§è¡Œæ—¥å¿—è¡¨
 * @TableName light_task_quartz_log
 */
@TableName(value ="light_task_quartz_log")
@Data
public class LightTaskQuartzLog implements Serializable {
    /**
     *
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * ä»»åŠ¡id
     */
    private Long taskId;
    /**
     * å®šæ—¶å™¨id
     */
    private Long quartzId;
    /**
     * ä»»åŠ¡åç§°
     */
    private String taskName;
    /**
     * å®šæ—¶å™¨cron
     */
    private String cronExpression;
    /**
     * å¸§è´Ÿè·
     */
    private String framePayload;
    /**
     * è¯·æ±‚æ—¶é—´
     */
    private Long time;
    /**
     * é”™è¯¯æ—¥å¿—
     */
    private String exceptionDetail;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    private LocalDateTime createTime;
    @TableField(exist = false)
    private static final long serialVersionUID = 1L;
}
dao/src/main/java/com/sandu/ximon/dao/mapper/LightTaskMapper.java
@@ -2,10 +2,12 @@
import com.sandu.ximon.dao.domain.LightTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.LightTask
 */
@Mapper
public interface LightTaskMapper extends BaseMapper<LightTask> {
}
dao/src/main/java/com/sandu/ximon/dao/mapper/LightTaskQuartzLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.sandu.ximon.dao.mapper;
import com.sandu.ximon.dao.domain.LightTaskQuartzLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * @Entity com.sandu.ximon.dao.domain.LightTaskQuartzLog
 */
@Mapper
public interface LightTaskQuartzLogMapper extends BaseMapper<LightTaskQuartzLog> {
}
dao/src/main/resources/mapper/LightTaskQuartzLogMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sandu.ximon.dao.mapper.LightTaskQuartzLogMapper">
    <resultMap id="BaseResultMap" type="com.sandu.ximon.dao.domain.LightTaskQuartzLog">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="taskId" column="task_id" jdbcType="BIGINT"/>
            <result property="quartzId" column="quartz_id" jdbcType="BIGINT"/>
            <result property="taskName" column="task_name" jdbcType="VARCHAR"/>
            <result property="cronExpression" column="cron_expression" jdbcType="VARCHAR"/>
            <result property="framePayload" column="frame_payload" jdbcType="VARCHAR"/>
            <result property="time" column="time" jdbcType="BIGINT"/>
            <result property="exceptionDetail" column="exception_detail" jdbcType="VARCHAR"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,task_id,quartz_id,
        task_name,cron_expression,frame_payload,
        time,exception_detail,create_time
    </sql>
</mapper>
dao/src/main/resources/mapper/LightTaskQuartzMapper.xml
@@ -10,14 +10,14 @@
            <result property="quartzName" column="quartz_name" jdbcType="VARCHAR"/>
            <result property="cronExpression" column="cron_expression" jdbcType="VARCHAR"/>
            <result property="pause" column="pause" jdbcType="TINYINT"/>
            <result property="order" column="order" jdbcType="VARCHAR"/>
            <result property="framePayload" column="frame_payload" jdbcType="VARCHAR"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,task_id,quartz_name,
        cron_expression,pause,order,
        cron_expression,pause,frame_payload,
        create_time,update_time
    </sql>
</mapper>
sandu-common/src/main/java/com/sandu/common/enums/ResponseStatusEnums.java
@@ -2,33 +2,35 @@
/**
 * @author yadong.zhang (yadong.zhang0415(a)gmail.com)
 * @website https://www.zhyd.me
 * @version 1.0
 * @website https://www.zhyd.me
 * @date 2018/4/16 16:26
 * @since 1.0
 */
public enum ResponseStatusEnums {
    /** æ“ä½œæˆåŠŸ*/
    /**
     * æ“ä½œæˆåŠŸ
     */
    SUCCESS(20000, "success"),
    FAIL(40000, "fail"),
    BAD_CREDENTIALS(40001, "用户名或密码不正确"),
    DISABLE_ACCOUNT(40002, "该账号已被禁止使用"),
    /** token ç›¸å…³ */
    TOKEN_INVALID(40011, "token失效"),
    /**
     * token ç›¸å…³
     */
    TOKEN_INVALID(40011, "token无效"),
    TOKEN_EXPIRED(40012, "token过期"),
    TOKEN_NONE(40013, "token为空"),
    SINGLE_LOGIN(40014, "该账号在其他设备登录,请重新登录"),
    TENANT_NONE(40015, "租户id为空"),
    TENANT_ERROR(40016, "租户值出错"),
    TENANT_EXPIRED(40017, "租户会员已过期"),
    FORBIDDEN(40030, "没有相关权限"),
    WECHAT_LOGIN_UNREGISTERED(40041, "该三方账号未注册,请到注册界面"),
    WECHAT_LOGIN_SET_PASSWORD(40042, "手机为首次登录,请设置登录密码"),
    /** æœåС噍异叏 */
    /**
     * æœåС噍异叏
     */
    SERVER_ERROR(50000, "api接口出错"),
    ;
sandu-common/src/main/java/com/sandu/common/quartz/ExecutionJob.java
@@ -11,6 +11,7 @@
    @Override
    protected void executeInternal(JobExecutionContext context) {
        System.out.println("执行任务");
        System.out.println(Thread.currentThread().toString());
    }
}
sandu-common/src/main/java/com/sandu/common/quartz/dto/QuartzJobDto.java
ÎļþÒÑɾ³ý
sandu-common/src/main/java/com/sandu/common/quartz/service/QuartzService.java
@@ -1,7 +1,8 @@
package com.sandu.common.quartz.service;
import com.sandu.common.quartz.dto.QuartzJobDto;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.Map;
/**
 * @author chenjiantian
@@ -11,37 +12,57 @@
    /**
     * å¢žåŠ ä¸€ä¸ªä»»åŠ¡job
     * @param quartzJobDto å®šæ—¶ä»»åŠ¡å®žä½“ç±»
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    ä»»åС唝䏀id
     * @param cron     cron表达式
     * @param jobData  å‚æ•°
     */
    void addJob(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto);
    void addJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData);
    /**
     * ä¿®æ”¹ä¸€ä¸ªä»»åŠ¡job
     * @param quartzJobDto å®šæ—¶ä»»åŠ¡å®žä½“ç±»
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    ä»»åС唝䏀id
     * @param cron     cron表达式
     * @param jobData  å‚æ•°
     */
    void updateJobCron(Class<? extends QuartzJobBean> jobClass,QuartzJobDto quartzJobDto);
    void updateJobCron(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData);
    /**
     * åˆ é™¤ä¸€ä¸ªä»»åŠ¡job
     * @param jobId å®šæ—¶ä»»åŠ¡id
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    å®šæ—¶ä»»åŠ¡id
     */
    void deleteJob(Class<? extends QuartzJobBean> jobClass,Long jobId);
    void deleteJob(Class<? extends QuartzJobBean> jobClass, Long jobId);
    /**
     * æš‚停一个任务job
     * @param jobId å®šæ—¶ä»»åŠ¡id
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    å®šæ—¶ä»»åŠ¡id
     */
    void pauseJob(Class<? extends QuartzJobBean> jobClass,Long jobId);
    void pauseJob(Class<? extends QuartzJobBean> jobClass, Long jobId);
    /**
     * æ¢å¤ä¸€ä¸ªä»»åŠ¡job
     * @param quartzJobDto å®šæ—¶ä»»åŠ¡å®žä½“ç±»
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    ä»»åС唝䏀id
     * @param cron     cron表达式
     * @param jobData  å‚æ•°
     */
    void resumeJob(Class<? extends QuartzJobBean> jobClass,QuartzJobDto quartzJobDto);
    void resumeJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData);
    /**
     * ç«‹å³æ‰§è¡Œä¸€ä¸ªä»»åŠ¡job
     * @param quartzJobDto å®šæ—¶ä»»åŠ¡å®žä½“ç±»
     *
     * @param jobClass å®žçŽ°çš„ä»»åŠ¡ç±»
     * @param jobId    ä»»åС唝䏀id
     * @param cron     cron表达式
     * @param jobData  å‚æ•°
     */
    void runJobNow(Class<? extends QuartzJobBean> jobClass,QuartzJobDto quartzJobDto);
    void runJobNow(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData);
}
sandu-common/src/main/java/com/sandu/common/quartz/service/QuartzServiceImpl.java
@@ -1,14 +1,16 @@
package com.sandu.common.quartz.service;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.quartz.ExecutionJob;
import com.sandu.common.quartz.dto.QuartzJobDto;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
/**
 * @author chenjiantian
@@ -24,20 +26,22 @@
    private Scheduler scheduler;
    @Override
    public void addJob(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void addJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            String simpleName = jobClass.getSimpleName();
            JobDetail jobDetail = JobBuilder.newJob(ExecutionJob.class)
                    .withIdentity(simpleName + quartzJobDto.getId())
            JobDetail jobDetail = JobBuilder.newJob(jobClass)
                    .withIdentity(simpleName + jobId)
                    .build();
            CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                    .withIdentity(simpleName + quartzJobDto.getId())
                    .withSchedule(CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression()))
                    .withIdentity(simpleName + jobId)
                    .startNow()
                    .withSchedule(CronScheduleBuilder.cronSchedule(cron))
                    .build();
            cronTrigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
            cronTrigger.getJobDataMap().putAll(jobData);
            ((CronTriggerImpl) cronTrigger).setStartTime(new Date());
            scheduler.scheduleJob(jobDetail, cronTrigger);
            log.info("添加定时器{}", simpleName + jobId);
        } catch (SchedulerException e) {
            log.error("创建定时任务失败", e);
            throw new BusinessException("创建定时任务失败");
@@ -45,17 +49,17 @@
    }
    @Override
    public void updateJobCron(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void updateJobCron(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
                trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            }
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzJobDto.getCronExpression());
            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
            trigger.getJobDataMap().put(QuartzJobDto.JOB_KEY, quartzJobDto);
            trigger.getJobDataMap().putAll(jobData);
            scheduler.rescheduleJob(triggerKey, trigger);
        } catch (SchedulerException e) {
@@ -70,6 +74,7 @@
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.pauseJob(jobKey);
            scheduler.deleteJob(jobKey);
            log.info("删除定时器{}", jobClass.getSimpleName() + jobId);
        } catch (SchedulerException e) {
            log.error("删除定时任务失败", e);
            throw new BusinessException("删除定时任务失败");
@@ -88,15 +93,15 @@
    }
    @Override
    public void resumeJob(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void resumeJob(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // å¦‚果不存在则创建一个定时任务
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
            }
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.resumeJob(jobKey);
        } catch (Exception e) {
            log.error("恢复定时任务失败", e);
@@ -105,17 +110,17 @@
    }
    @Override
    public void runJobNow(Class<? extends QuartzJobBean> jobClass, QuartzJobDto quartzJobDto) {
    public void runJobNow(Class<? extends QuartzJobBean> jobClass, Long jobId, String cron, Map<String, Object> jobData) {
        try {
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + quartzJobDto.getId());
            TriggerKey triggerKey = TriggerKey.triggerKey(jobClass.getSimpleName() + jobId);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            // å¦‚果不存在则创建一个定时任务
            if (trigger == null) {
                addJob(jobClass, quartzJobDto);
                addJob(jobClass, jobId, cron, jobData);
            }
            JobDataMap dataMap = new JobDataMap();
            dataMap.put(QuartzJobDto.JOB_KEY, quartzJobDto);
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + quartzJobDto.getId());
            dataMap.putAll(jobData);
            JobKey jobKey = JobKey.jobKey(jobClass.getSimpleName() + jobId);
            scheduler.triggerJob(jobKey, dataMap);
        } catch (Exception e) {
            log.error("定时任务执行失败", e);
sandu-common/src/main/java/com/sandu/common/security/JwtAuthenticationEntryPoint.java
@@ -37,7 +37,7 @@
        SecurityProperties properties = SpringContextHolder.getBean(SecurityProperties.class);
        if (!StringUtils.hasText(token)) {
            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_NONE.getCode(), ResponseStatusEnums.TOKEN_NONE.getMessage()));
            writeResponse(response, ResponseUtil.error(ResponseStatusEnums.TOKEN_INVALID.getCode(), ResponseStatusEnums.TOKEN_INVALID.getMessage()));
            return;
        }
sandu-common/src/main/resources/application.yml
@@ -6,3 +6,4 @@
    active: dev
#    active: "@profileActive@"
ximon-admin/src/main/java/com/sandu/ximon/admin/config/JobRunner.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.sandu.ximon.admin.config;
import com.sandu.ximon.admin.service.LightTaskQuartzService;
import com.sandu.ximon.dao.domain.LightTaskQuartz;
import lombok.AllArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
/**
 * @author chenjiantian
 * @date 2021/12/16 11:55
 */
@AllArgsConstructor
@Component
public class JobRunner implements ApplicationRunner {
    private final LightTaskQuartzService lightTaskQuartzService;
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("--------------------注入路灯定时任务---------------------");
        List<LightTaskQuartz> list = lightTaskQuartzService.list();
        lightTaskQuartzService.runLightTaskQuartz(list);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/constant/Constants.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.sandu.ximon.admin.constant;
/**
 * @author chenjiantian
 * @date 2021/12/16 11:42
 */
public class Constants {
    // ç¯å®šæ—¶å‘½ä»¤é•¿åº¦
    public final static int LIGHT_TIMER_ORDER_LENGTH = 8;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/AdminController.java
@@ -48,7 +48,7 @@
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("v1/admin")
@RequestMapping("/v1/admin")
public class AdminController {
    private final SecurityProperties properties;
ximon-admin/src/main/java/com/sandu/ximon/admin/controller/LightTaskController.java
@@ -1,15 +1,17 @@
package com.sandu.ximon.admin.controller;
import com.sandu.common.domain.ResponseVO;
import com.sandu.common.object.BaseConditionVO;
import com.sandu.common.util.ResponseUtil;
import com.sandu.ximon.admin.param.LightTaskDelParam;
import com.sandu.ximon.admin.param.LightTaskParam;
import com.sandu.ximon.admin.service.LightTaskService;
import com.sandu.ximon.dao.domain.LightTask;
import lombok.AllArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * è·¯ç¯ä»»åŠ¡ç›¸å…³æŽ§åˆ¶ç±»
@@ -34,5 +36,29 @@
        }
    }
    @GetMapping("/list")
    public ResponseVO<Object> listLightTask(BaseConditionVO conditionVO, @RequestParam(required = false) String keyword) {
        List<LightTask> taskList = lightTaskService.listLightTask(conditionVO.getPageNo(), conditionVO.getPageSize(), keyword);
        return ResponseUtil.successPage(taskList);
    }
    @PostMapping("/del")
    public ResponseVO<Object> delLightTask(@RequestBody @Validated LightTaskDelParam param) {
        boolean result = lightTaskService.delLightTask(param.getTaskIdList());
        if (result) {
            return ResponseUtil.success("删除成功");
        } else {
            return ResponseUtil.fail("删除失败");
        }
    }
    @PostMapping("/update/{taskId}")
    public ResponseVO<Object> updateLightTask(@PathVariable Long taskId, @RequestBody @Validated LightTaskParam param) {
        boolean result = lightTaskService.updateLightTask(taskId,param);
        if (result) {
            return ResponseUtil.success("编辑成功");
        } else {
            return ResponseUtil.fail("编辑失败");
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/request/A5LightTimerReqInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.request;
import cn.hutool.core.util.HexUtil;
import com.sandu.ximon.admin.dto.SingleLightOrderDto;
import com.sandu.ximon.admin.manager.iot.frame.inner.IRequestInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5LightDataEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.MQTTConnectTypeEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import com.sandu.ximon.admin.manager.iot.rrpc.util.SupplementUtils;
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A5->01->23
 * å®šæ—¶æŽ§ç¯
 * 0x00:关灯
 * å…¶å®ƒï¼šå¼€ç¯&亮度值"
 */
public class A5LightTimerReqInnerFrame implements IRequestInnerFrame {
    private final String payload;
    private final String functionCode = A5LightDataEnum.LightTimer.getCode();
    private final String payloadLength;
    /**
     * @param framePayload å¤šä¸ªè·¯ç¯å®šæ—¶æŒ‡ä»¤ï¼Œ
     */
    public A5LightTimerReqInnerFrame(String framePayload) {
        String destinationAddress = "FFFF";
        payload = destinationAddress + framePayload;
        this.payloadLength = SupplementUtils.suppleZero(Integer.toHexString((payload.length() / 2)).toUpperCase(), 4);
    }
    @Override
    public String getEncodeFrame() {
        String frame = functionCode + payloadLength + payload;
        return MQTTConnectTypeEnum.SYNCHRONIZATION.getCode() + frame.toUpperCase() + CRC32Utils.getCRC32(frame.toUpperCase());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/frame/inner/response/A5LightTimerRespInnerFrame.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.sandu.ximon.admin.manager.iot.frame.inner.response;
import cn.hutool.core.util.StrUtil;
import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils;
import lombok.Data;
import lombok.ToString;
/**
 * @author chenjiantian
 * @date 2021/12/6 14:46
 * A5-81-23灯定时任务 åº”ç­”
 */
@Data
@ToString(callSuper = true)
public class A5LightTimerRespInnerFrame extends BaseResponseInnerFrame<A5LightTimerRespInnerFrame> {
    /**
     * ç›®æ ‡åœ°å€ 2
     */
    private String destinationAddress;
    /**
     * å“åº”状态 1
     */
    private String responseStatus;
    @Override
    public A5LightTimerRespInnerFrame transformFrame(String hex) {
        if (StrUtil.isBlank(hex)) {
            return null;
        }
        // MQTT通信方式(1)
        setConnectType(hex.substring(0, 2));
        //  åŠŸèƒ½ç (1)
        setFunctionCode(hex.substring(2, 4));
        //  è´Ÿè·é•¿åº¦(2)
        setPayloadLength(hex.substring(4, 8));
        setDestinationAddress(hex.substring(8, 12));
        setResponseStatus(hex.substring(12, 14));
        setCrc32(hex.substring(14, 22));
        //  æ ¡éªŒCRC32
        String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getResponseStatus();
        this.setValidate(CRC32Utils.validateFrame(frame, getCrc32()));
        return this;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/manager/iot/rrpc/enums/A5LightDataEnum.java
@@ -14,6 +14,8 @@
    //  å…‰æ„ŸæŽ§åˆ¶
    LightSensorControl("04"),
    //设置定时控灯参数
    LightTimer("23"),
    // æ¸…除单灯累计数据
    LightReset("25");
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightTaskDelParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.sandu.ximon.admin.param;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
 * @author chenjiantian
 * è·¯ç¯ä»»åŠ¡
 */
@Data
public class LightTaskDelParam {
    @NotEmpty(message = "任务id不能为空")
    private List<Long> taskIdList;
}
ximon-admin/src/main/java/com/sandu/ximon/admin/param/LightTaskParam.java
@@ -13,6 +13,8 @@
 */
@Data
public class LightTaskParam {
    public static final int REQUEST_ORDER_LENGTH = 7;
    /**
     * ä»»åŠ¡åç§°
     */
@@ -29,13 +31,13 @@
    /**
     * å¼€ç¯å‘½ä»¤
     */
    @Length(min = 6, max = 6, message = "开灯命令长度错误")
    @Length(min = REQUEST_ORDER_LENGTH, max = REQUEST_ORDER_LENGTH, message = "开灯命令长度错误")
    private String openOrder;
    /**
     * å…³é—­ç¯å‘½ä»¤
     */
    @Length(min = 6, max = 6, message = "关灯命令长度错误")
    @Length(min = REQUEST_ORDER_LENGTH, max = REQUEST_ORDER_LENGTH, message = "关灯命令长度错误")
    private String closeOrder;
    /**
     * ç¯æŽ§å‘½ä»¤
ximon-admin/src/main/java/com/sandu/ximon/admin/quartz/LightTimerJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package com.sandu.ximon.admin.quartz;
import cn.hutool.core.collection.CollectionUtil;
import com.sandu.common.util.SpringContextHolder;
import com.sandu.common.util.ThrowableUtil;
import com.sandu.ximon.admin.service.*;
import com.sandu.ximon.dao.domain.LightTaskQuartz;
import com.sandu.ximon.dao.domain.LightTaskQuartzLog;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.List;
/**
 * @author chenjiantian
 * @date 2021/12/15 10:28
 * è®¾ç½®å®šæ—¶æŽ§ç¯çš„定时任务
 */
public class LightTimerJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("执行任务" + Thread.currentThread().toString());
        long quartzId = context.getMergedJobDataMap().getLong("quartzId");
        String taskName = context.getMergedJobDataMap().getString("taskName");
        long taskId = context.getMergedJobDataMap().getLong("taskId");
        String cron = context.getMergedJobDataMap().getString("cron");
        LightTaskQuartzLog log = new LightTaskQuartzLog();
        log.setCronExpression(cron);
        log.setTaskId(taskId);
        log.setTaskName(taskName);
        log.setQuartzId(quartzId);
        PoleService poleService = SpringContextHolder.getBean(PoleService.class);
        LightTaskPoleRelationService lightTaskPoleRelationService = SpringContextHolder.getBean(LightTaskPoleRelationService.class);
        LightTaskQuartzService lightTaskQuartzService = SpringContextHolder.getBean(LightTaskQuartzService.class);
        LightTaskService lightTaskService = SpringContextHolder.getBean(LightTaskService.class);
        LightTaskQuartzLogService lightTaskQuartzLogService = SpringContextHolder.getBean(LightTaskQuartzLogService.class);
        long startTime = System.currentTimeMillis();
        try {
            // ä»»åŠ¡ç»‘å®šçš„ç¯æ†
            List<Long> poleIdList = lightTaskPoleRelationService.listPoleIdByTaskId(taskId);
            // ç¯æ†çš„设备码
            List<String> deviceCodeList = poleService.listDeviceCodeByIds(poleIdList);
            if (CollectionUtil.isNotEmpty(deviceCodeList)) {
                LightTaskQuartz lightTaskQuartz = lightTaskQuartzService.getById(quartzId);
                if (lightTaskQuartz != null) {
                    for (String deviceCode : deviceCodeList) {
                        // å®šæ—¶ç»™æ¯ä¸ªè®¾å¤‡å—发送灯控请求
                        lightTaskService.sendTimeRRpc(lightTaskQuartz.getFramePayload(), deviceCode);
                    }
                    log.setFramePayload(lightTaskQuartz.getFramePayload());
                }
            }
            long times = System.currentTimeMillis() - startTime;
            log.setTime(times);
        } catch (Exception e) {
            log.setExceptionDetail(ThrowableUtil.getStackTrace(e));
            long times = System.currentTimeMillis() - startTime;
            log.setTime(times);
        } finally {
            lightTaskQuartzLogService.save(log);
        }
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskPoleRelationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.LightTaskPoleRelation;
import com.sandu.ximon.dao.mapper.LightTaskPoleRelationMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author chenjiantian
 * @date 2021/12/16 14:15
 */
@Service
public class LightTaskPoleRelationService extends BaseServiceImpl<LightTaskPoleRelationMapper, LightTaskPoleRelation> {
    /**
     * æ‰¹é‡ä¿å­˜ä»»åŠ¡å’Œç¯æ†çš„å…³ç³»
     *
     * @param taskId     ä»»åŠ¡id
     * @param poleIdList ç¯æ†id
     * @return è¿”回是否成功
     */
    public boolean updateLightTaskPoleRelation(Long taskId, List<Long> poleIdList) {
        remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).eq(LightTaskPoleRelation::getTaskId, taskId));
        if (CollectionUtil.isEmpty(poleIdList)) {
            return true;
        }
        List<LightTaskPoleRelation> batchSave = new ArrayList<>();
        for (Long poleId : poleIdList) {
            LightTaskPoleRelation lightTaskPoleRelation = new LightTaskPoleRelation();
            lightTaskPoleRelation.setPoleId(poleId);
            lightTaskPoleRelation.setTaskId(taskId);
            batchSave.add(lightTaskPoleRelation);
        }
        return saveBatch(batchSave);
    }
    public List<Long> listPoleIdByTaskId(Long taskId) {
        if (taskId == null) {
            return null;
        }
        return list(Wrappers.lambdaQuery(LightTaskPoleRelation.class).eq(LightTaskPoleRelation::getTaskId, taskId).select(LightTaskPoleRelation::getPoleId))
                .stream().map(LightTaskPoleRelation::getPoleId).collect(Collectors.toList());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.sandu.ximon.admin.service;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.dao.domain.LightTaskQuartzLog;
import com.sandu.ximon.dao.mapper.LightTaskQuartzLogMapper;
import org.springframework.stereotype.Service;
/**
 * @author chenjiantian
 * @date 2021/12/16 15:12
 */
@Service
public class LightTaskQuartzLogService extends BaseServiceImpl<LightTaskQuartzLogMapper,LightTaskQuartzLog> {
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskQuartzService.java
@@ -1,58 +1,169 @@
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);
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/LightTaskService.java
@@ -1,15 +1,31 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.sandu.common.execption.BusinessException;
import com.sandu.common.service.impl.BaseServiceImpl;
import com.sandu.ximon.admin.manager.iot.frame.FrameBuilder;
import com.sandu.ximon.admin.manager.iot.frame.IRequestFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.request.A5LightTimerReqInnerFrame;
import com.sandu.ximon.admin.manager.iot.frame.inner.response.A5LightTimerRespInnerFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.dto.WrapResponseCommonFrame;
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService;
import com.sandu.ximon.admin.param.LightTaskParam;
import com.sandu.ximon.admin.security.SecurityUtils;
import com.sandu.ximon.dao.domain.LightTask;
import com.sandu.ximon.dao.domain.LightTaskPoleRelation;
import com.sandu.ximon.dao.domain.LightTaskQuartz;
import com.sandu.ximon.dao.mapper.LightTaskMapper;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
/**
 * @author chenjiantian
@@ -20,16 +36,17 @@
@AllArgsConstructor
public class LightTaskService extends BaseServiceImpl<LightTaskMapper, LightTask> {
    private final static int ORDER_LENGTH = 6;
    private final LightTaskQuartzService lightTaskQuartzService;
    private final PoleService poleService;
    private final LightTaskPoleRelationService lightTaskPoleRelationService;
    /**
     * æ–°å¢žè·¯ç¯ä»»åŠ¡
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean addLightTask(LightTaskParam param) {
        if(StrUtil.length(param.getControlOrder()) % ORDER_LENGTH != 0){
        if (StrUtil.length(param.getControlOrder()) % LightTaskParam.REQUEST_ORDER_LENGTH != 0) {
            throw new BusinessException("灯控命令格式不正确");
        }
        LightTask lightTask = new LightTask();
@@ -40,10 +57,137 @@
        lightTask.setOpenOrder(param.getOpenOrder());
        lightTask.setControlOrder(param.getControlOrder());
        lightTask.setCreateUser(SecurityUtils.getUsername());
        if(!save(lightTask)) {
        if (!save(lightTask)) {
            throw new BusinessException("保存路灯任务失败");
        }
        boolean result = lightTaskQuartzService.addLightTaskQuartz(lightTask);
        return false;
        List<LightTaskQuartz> list = lightTaskQuartzService.addLightTaskQuartz(lightTask);
        if (CollectionUtil.isEmpty(list)) {
            throw new BusinessException("添加定时任务失败");
        }
        // æ·»åŠ ç»‘å®šç¯æ†
        if (!lightTaskPoleRelationService.updateLightTaskPoleRelation(lightTask.getTaskId(), param.getPoleIdList())) {
            throw new BusinessException("绑定灯杆失败");
        }
        List<Long> poleIdList = param.getPoleIdList();
        if (CollectionUtil.isNotEmpty(poleIdList)) {
            List<String> deviceCodeList = poleService.listDeviceCodeByIds(poleIdList);
            if (CollectionUtil.isEmpty(deviceCodeList)) {
                throw new BusinessException("找不到灯杆mac,无法发送定时任务");
            }
            // èŽ·å–å®šæ—¶ç¯æŽ§å‘½ä»¤
            String framePayload = list.get(0).getFramePayload();
            // rrpc å‘生定时命令
            for (String deviceCode : deviceCodeList) {
                sendTimeRRpc(framePayload, deviceCode);
            }
        }
        return true;
    }
    /**
     * å‘送灯控请求
     *
     * @param framePayload ç¯æŽ§å‚æ•°
     * @param deviceCode   è®¾å¤‡å—
     * @return è¿”回帧
     */
    public A5LightTimerRespInnerFrame sendTimeRRpc(String framePayload, String deviceCode) {
        IRequestFrame requestFrame = FrameBuilder.builderA5().innerFrame(new A5LightTimerReqInnerFrame(framePayload))
                .orderType(A5OrderEnum.REQUEST_LIGHT_DATA.getCode()).build();
        WrapResponseCommonFrame<A5LightTimerRespInnerFrame> responseCommonFrame = MainBoardInvokeSyncService.getInstance()
                .sendRRPC(deviceCode, requestFrame, A5LightTimerRespInnerFrame.class);
        System.out.println("发送结果");
        A5LightTimerRespInnerFrame responseInnerFrame = responseCommonFrame.getResponseInnerFrame();
        System.out.println(responseInnerFrame.getResponseStatus());
        return responseInnerFrame;
    }
    public List<LightTask> listLightTask(int pageNo, int pageSize, String keyword) {
        LambdaQueryWrapper<LightTask> wrapper = Wrappers.lambdaQuery(LightTask.class);
        if (StrUtil.isNotBlank(keyword)) {
            wrapper.like(LightTask::getTaskName, keyword);
        }
        Long clientId = SecurityUtils.getClientId();
        if (clientId != null) {
            wrapper.eq(LightTask::getClientId, clientId);
        }
        PageHelper.startPage(pageNo, pageSize);
        return list(wrapper);
    }
    @Transactional(rollbackFor = Exception.class)
    public boolean updateLightTask(Long taskId, LightTaskParam param) {
        if (StrUtil.length(param.getControlOrder()) % LightTaskParam.REQUEST_ORDER_LENGTH != 0) {
            throw new BusinessException("灯控命令格式不正确");
        }
        LightTask lightTask = getById(taskId);
        if (lightTask == null) {
            throw new BusinessException("找不到路灯任务");
        }
        lightTask.setTaskName(param.getTaskName());
        lightTask.setWeek(param.getWeek());
        lightTask.setControlOrder(param.getControlOrder());
        lightTask.setOpenOrder(param.getOpenOrder());
        lightTask.setCloseOrder(param.getCloseOrder());
        lightTask.setUpdateTime(LocalDateTime.now());
        if (!updateById(lightTask)) {
            throw new BusinessException("编辑任务失败");
        }
        List<LightTaskQuartz> list = lightTaskQuartzService.updateLightTaskQuartz(lightTask);
        if (CollectionUtil.isEmpty(list)) {
            throw new BusinessException("编辑定时任务失败");
        }
        // æ·»åŠ ç»‘å®šç¯æ†
        if (!lightTaskPoleRelationService.updateLightTaskPoleRelation(lightTask.getTaskId(), param.getPoleIdList())) {
            throw new BusinessException("绑定灯杆失败");
        }
        List<Long> poleIdList = param.getPoleIdList();
        if (CollectionUtil.isNotEmpty(poleIdList)) {
            List<String> deviceCodeList = poleService.listDeviceCodeByIds(poleIdList);
            if (CollectionUtil.isEmpty(deviceCodeList)) {
                throw new BusinessException("找不到灯杆mac,无法发送定时任务");
            }
            // èŽ·å–å®šæ—¶ç¯æŽ§å‘½ä»¤
            String framePayload = list.get(0).getFramePayload();
            // rrpc å‘生定时命令
            for (String deviceCode : deviceCodeList) {
                sendTimeRRpc(framePayload, deviceCode);
            }
        }
        return true;
    }
    @Transactional(rollbackFor = Exception.class)
    public boolean delLightTask(List<Long> taskIdList) {
        List<LightTask> lightTaskList = listByIds(taskIdList);
        if (CollectionUtil.isEmpty(lightTaskList)) {
            throw new BusinessException("找不到任务信息");
        }
        // åˆ é™¤ä»»åŠ¡
        if (!removeByIds(taskIdList)) {
            throw new BusinessException("删除任务失败");
        }
        // åˆ é™¤ç»‘定灯杆
        if (!lightTaskPoleRelationService.remove(Wrappers.lambdaQuery(LightTaskPoleRelation.class).in(LightTaskPoleRelation::getTaskId, taskIdList))) {
            throw new BusinessException("删除绑定灯杆失败");
        }
        // åˆ é™¤å®šæ—¶å™¨
        if (!lightTaskQuartzService.removeLightTaskQuartz(taskIdList)) {
            throw new BusinessException("删除定时器失败");
        }
        return true;
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/service/PoleService.java
@@ -1,5 +1,7 @@
package com.sandu.ximon.admin.service;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.aliyuncs.iot.model.v20180120.BatchGetDeviceStateResponse;
import com.aliyuncs.iot.model.v20180120.QueryDeviceDetailResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -35,6 +37,7 @@
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * ç¯æ†ç›¸å…³
@@ -277,4 +280,12 @@
        }
        return setMac;
    }
    public List<String> listDeviceCodeByIds(List<Long> poleIdList) {
        if(CollectionUtil.isEmpty(poleIdList)){
            return null;
        }
        return list(Wrappers.lambdaQuery(Pole.class).in(Pole::getId, poleIdList).select(Pole::getDeviceCode))
                .stream().map(Pole::getDeviceCode).filter(StrUtil::isNotEmpty).collect(Collectors.toList());
    }
}
ximon-admin/src/main/java/com/sandu/ximon/admin/utils/TaskOrderUtil.java
@@ -3,6 +3,7 @@
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.sandu.ximon.admin.constant.Constants;
import com.sandu.ximon.admin.dto.SingleLightOrderDto;
import com.sandu.ximon.dao.enums.WeekEnums;
import org.quartz.DateBuilder;
@@ -18,13 +19,13 @@
public class TaskOrderUtil {
    public static SingleLightOrderDto parseLightOrder(String lightOrder) {
        if (StrUtil.length(lightOrder) != 6) {
        if (StrUtil.length(lightOrder) != 7) {
            return null;
        }
        SingleLightOrderDto singleLightOrderDto = new SingleLightOrderDto();
        singleLightOrderDto.setHour(NumberUtil.parseInt(lightOrder.substring(0, 2)));
        singleLightOrderDto.setMinute(NumberUtil.parseInt(lightOrder.substring(2, 4)));
        singleLightOrderDto.setBrightness(NumberUtil.parseInt(lightOrder.substring(4, 6)));
        singleLightOrderDto.setBrightness(NumberUtil.parseInt(lightOrder.substring(4, 7)));
        return singleLightOrderDto;
    }
ximon-admin/src/main/resources/application-dev.yml
@@ -33,5 +33,7 @@
    storage: local
  common:
    urlPrefix: http://localhost:8080/file/
  quartz:
    enable: true
ximon-admin/src/test/java/com/sandu/ximon/admin/AdminApplicationTests.java
@@ -1,5 +1,6 @@
package com.sandu.ximon.admin;
import cn.hutool.crypto.SecureUtil;
import com.sandu.ximon.admin.service.PoleService;
import org.junit.jupiter.api.Test;
import org.quartz.*;
@@ -18,7 +19,11 @@
    @Test
    void contextLoads() {
        System.out.println(passwordEncoder.encode("666666"));
        //ae8b5aa26a3ae31612eec1d1f6ffbce9
        String encode = SecureUtil.md5("66666");
        String encode2 = passwordEncoder.encode(encode);
        System.out.println(encode);
        System.out.println(encode2);
    }
    @Test
ximon-admin/src/test/java/com/sandu/ximon/admin/QuartzTests.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.sandu.ximon.admin;
import cn.hutool.core.collection.ListUtil;
import com.sandu.common.quartz.service.QuartzServiceImpl;
import com.sandu.ximon.admin.param.LightTaskParam;
import com.sandu.ximon.admin.service.LightTaskService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
@SpringBootTest
@Slf4j
class QuartzTests {
    @Resource
    private QuartzServiceImpl quartzService;
    @Resource
    private LightTaskService lightTaskService;
    @Test
    void addLightTask() {
        LightTaskParam lightTaskParam = new LightTaskParam();
        lightTaskParam.setTaskName("日常任务");
        lightTaskParam.setPoleIdList(ListUtil.toList(1L));
        lightTaskParam.setWeek(126);
        lightTaskParam.setOpenOrder("1630100");
        lightTaskParam.setCloseOrder("0600000");
        lightTaskParam.setControlOrder("00000500300020");
        System.out.println(lightTaskService.addLightTask(lightTaskParam));
    }
}