ljw 2025-12-24 13:29:20 +08:00
commit 7f1c44c489
2 changed files with 90 additions and 108 deletions

View File

@ -1,7 +1,9 @@
package com.njzscloud.common.sichen.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import com.njzscloud.common.core.ex.ExceptionMsg;
import com.njzscloud.common.core.ex.Exceptions;
import com.njzscloud.common.core.utils.R;
import com.njzscloud.common.mp.support.PageParam;
@ -11,6 +13,7 @@ import com.njzscloud.common.sichen.pojo.param.ModifyTaskParam;
import com.njzscloud.common.sichen.pojo.param.SearchTaskParam;
import com.njzscloud.common.sichen.pojo.param.SearchTaskResult;
import com.njzscloud.common.sichen.service.CombineStoreService;
import com.njzscloud.common.sichen.support.CronExpression;
import com.njzscloud.common.sichen.support.TaskInfo;
import com.njzscloud.common.sichen.support.TaskStore;
import com.njzscloud.common.sichen.util.TaskUtil;
@ -19,6 +22,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -96,6 +102,30 @@ public class TaskController {
}
}
/**
*
*/
@GetMapping("/check_expression")
public R<?> detail(@RequestParam("expression") String expression) {
CronExpression cronExpression;
try {
cronExpression = new CronExpression(expression);
} catch (ParseException e) {
return R.failed(ExceptionMsg.CLI_ERR_MSG, "表达式错误:{}", e.getMessage());
}
Date timePoint = new Date();
int i = 0;
ArrayList<String> list = new ArrayList<>();
while (i < 10) {
i++;
Date nextValidTimeAfter = cronExpression.getNextValidTimeAfter(timePoint);
String format = DateUtil.format(nextValidTimeAfter, "yyyy-MM-dd HH:mm:ss");
list.add(format);
timePoint = nextValidTimeAfter;
}
return R.success(list);
}
/**
*
*/

View File

@ -19,173 +19,132 @@ package com.njzscloud.common.sichen.support;
import java.text.ParseException;
import java.util.*;
/**
* Provides a parser and evaluator for unix-like cron expressions. Cron
* expressions provide the ability to specify complex time combinations such as
* &quot;At 8:00am every Monday through Friday&quot; or &quot;At 1:30am every
* last Friday of the month&quot;.
* Unix Cron Cron
* 8:00 1:30
*
* <P>
* Cron expressions are comprised of 6 required fields and one optional field
* separated by white space. The fields respectively are described as follows:
* Cron 6 1
*
* <table cellspacing="8">
* <tr>
* <th align="left">Field Name</th>
* <th align="left"></th>
* <th align="left">&nbsp;</th>
* <th align="left">Allowed Values</th>
* <th align="left"></th>
* <th align="left">&nbsp;</th>
* <th align="left">Allowed Special Characters</th>
* <th align="left"></th>
* </tr>
* <tr>
* <td align="left"><code>Seconds</code></td>
* <td align="left"><code>Seconds</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>0-59</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * /</code></td>
* </tr>
* <tr>
* <td align="left"><code>Minutes</code></td>
* <td align="left"><code>Minutes</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>0-59</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * /</code></td>
* </tr>
* <tr>
* <td align="left"><code>Hours</code></td>
* <td align="left"><code>Hours</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>0-23</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * /</code></td>
* </tr>
* <tr>
* <td align="left"><code>Day-of-month</code></td>
* <td align="left"><code>Day-of-month</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>1-31</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * ? / L W</code></td>
* </tr>
* <tr>
* <td align="left"><code>Month</code></td>
* <td align="left"><code>Month</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>0-11 or JAN-DEC</code></td>
* <td align="left"><code>0-11 JAN-DEC</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * /</code></td>
* </tr>
* <tr>
* <td align="left"><code>Day-of-Week</code></td>
* <td align="left"><code>Day-of-Week</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>1-7 or SUN-SAT</code></td>
* <td align="left"><code>1-7 SUN-SAT</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * ? / L #</code></td>
* </tr>
* <tr>
* <td align="left"><code>Year (Optional)</code></td>
* <td align="left"><code>Year</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>empty, 1970-2199</code></td>
* <td align="left"><code>1970-2199</code></td>
* <td align="left">&nbsp;</th>
* <td align="left"><code>, - * /</code></td>
* </tr>
* </table>
* <P>
* The '*' character is used to specify all values. For example, &quot;*&quot;
* in the minute field means &quot;every minute&quot;.
* '*' 使 "*"
* <P>
* The '?' character is allowed for the day-of-month and day-of-week fields. It
* is used to specify 'no specific value'. This is useful when you need to
* specify something in one of the two fields, but not the other.
* '?' Day-of-monthDay-of-Week使
*
* <P>
* The '-' character is used to specify ranges For example &quot;10-12&quot; in
* the hour field means &quot;the hours 10, 11 and 12&quot;.
* '-' 使 "10-12" 10 11 12
* <P>
* The ',' character is used to specify additional values. For example
* &quot;MON,WED,FRI&quot; in the day-of-week field means &quot;the days Monday,
* Wednesday, and Friday&quot;.
* ',' 使 "MON,WED,FRI"
* <P>
* The '/' character is used to specify increments. For example &quot;0/15&quot;
* in the seconds field means &quot;the seconds 0, 15, 30, and 45&quot;. And
* &quot;5/15&quot; in the seconds field means &quot;the seconds 5, 20, 35, and
* 50&quot;. Specifying '*' before the '/' is equivalent to specifying 0 is
* the value to start with. Essentially, for each field in the expression, there
* is a set of numbers that can be turned on or off. For seconds and minutes,
* the numbers range from 0 to 59. For hours 0 to 23, for days of the month 0 to
* 31, and for months 0 to 11 (JAN to DEC). The &quot;/&quot; character simply helps you turn
* on every &quot;nth&quot; value in the given set. Thus &quot;7/6&quot; in the
* month field only turns on month &quot;7&quot;, it does NOT mean every 6th
* month, please note that subtlety.
* '/' 使 "0/15" 0 15 30 45
* "5/15" 5 20 35 50 '/' '*' 0
* 0-59 0-23
* 1-31 0-11 JAN DEC'/' n
* 使 "7/6" 7 6
* <P>
* The 'L' character is allowed for the day-of-month and day-of-week fields.
* This character is short-hand for &quot;last&quot;, but it has different
* meaning in each of the two fields. For example, the value &quot;L&quot; in
* the day-of-month field means &quot;the last day of the month&quot; - day 31
* for January, day 28 for February on non-leap years. If used in the
* day-of-week field by itself, it simply means &quot;7&quot; or
* &quot;SAT&quot;. But if used in the day-of-week field after another value, it
* means &quot;the last xxx day of the month&quot; - for example &quot;6L&quot;
* means &quot;the last friday of the month&quot;. You can also specify an offset
* from the last day of the month, such as "L-3" which would mean the third-to-last
* day of the calendar month. <i>When using the 'L' option, it is important not to
* specify lists, or ranges of values, as you'll get confusing/unexpected results.</i>
* 'L' Day-of-monthDay-of-Week使last
* 使 "L" 1 31
* 2 28 使 "L"7SAT
* 使 "6L"
* "L-3"
* <i>使 'L' </i>
* <P>
* The 'W' character is allowed for the day-of-month field. This character
* is used to specify the weekday (Monday-Friday) nearest the given day. As an
* example, if you were to specify &quot;15W&quot; as the value for the
* day-of-month field, the meaning is: &quot;the nearest weekday to the 15th of
* the month&quot;. So if the 15th is a Saturday, the trigger will fire on
* Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the
* 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th.
* However if you specify &quot;1W&quot; as the value for day-of-month, and the
* 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not
* 'jump' over the boundary of a month's days. The 'W' character can only be
* specified when the day-of-month is a single day, not a range or list of days.
* 'W' Day-of-month使
* "15W" 15 15
* 14 15 16 15
* 15 "1W" 1 3
* 'W' 使
*
* <P>
* The 'L' and 'W' characters can also be combined for the day-of-month
* expression to yield 'LW', which translates to &quot;last weekday of the
* month&quot;.
* 'L' 'W' Day-of-month使 "LW"
* <P>
* The '#' character is allowed for the day-of-week field. This character is
* used to specify &quot;the nth&quot; XXX day of the month. For example, the
* value of &quot;6#3&quot; in the day-of-week field means the third Friday of
* the month (day 6 = Friday and &quot;#3&quot; = the 3rd one in the month).
* Other examples: &quot;2#1&quot; = the first Monday of the month and
* &quot;4#5&quot; = the fifth Wednesday of the month. Note that if you specify
* &quot;#5&quot; and there is not 5 of the given day-of-week in the month, then
* no firing will occur that month. If the '#' character is used, there can
* only be one expression in the day-of-week field (&quot;3#1,6#3&quot; is
* not valid, since there are two expressions).
* '#' Day-of-Week使 n
* 使 "6#3" 6 "#3"
* "2#1" "4#5"
* "#5" 5
* 使 '#' "3#1,6#3"
* <P>
* <!--The 'C' character is allowed for the day-of-month and day-of-week fields.
* This character is short-hand for "calendar". This means values are
* calculated against the associated calendar, if any. If no calendar is
* associated, then it is equivalent to having an all-inclusive calendar. A
* value of "5C" in the day-of-month field means "the first day included by the
* calendar on or after the 5th". A value of "1C" in the day-of-week field
* means "the first day included by the calendar on or after Sunday".-->
* <!--'C' Day-of-monthDay-of-Week使calendar
* 使
* 使 "5C" 5 5
* 使 "1C" -->
* <P>
* The legal characters and the names of months and days of the week are not
* case sensitive.
*
*
* <p>
* <b>NOTES:</b>
* <b></b>
* <ul>
* <li>Support for specifying both a day-of-week and a day-of-month value is
* not complete (you'll need to use the '?' character in one of these fields).
* </li>
* <li>Overflowing ranges is supported - that is, having a larger number on
* the left hand side than the right. You might do 22-2 to catch 10 o'clock
* at night until 2 o'clock in the morning, or you might have NOV-FEB. It is
* very important to note that overuse of overflowing ranges creates ranges
* that don't make sense and no effort has been made to determine which
* interpretation CronExpression chooses. An example would be
* "0 0 14-6 ? * FRI-MON". </li>
* <li> Day-of-monthDay-of-Week
* 使 '?' </li>
* <li> 使 22-2 10 2
* 使 NOV-FEB 11 2 使
* CronExpression "0 0 14-6 ? * FRI-MON" </li>
* </ul>
* </p>
*
* @author Sharada Jambula, James House
* @author Contributions from Mads Henderson
* @author Refactoring from CronTrigger to CronExpression by Aaron Craven
* @author ··
* @author ·
* @author · CronTrigger CronExpression
* <p>
* Borrowed from quartz v2.3.1
* Quartz v2.3.1
*/
public final class CronExpression {
@ -1160,13 +1119,6 @@ public final class CronExpression {
return integer;
}
////////////////////////////////////////////////////////////////////////////
//
// Computation Functions
//
/// /////////////////////////////////////////////////////////////////////////
public Date getTimeAfter(Date afterTime) {
// Computation is based on Gregorian year only.