JS-скрипт для повторяющихся задач в ServiceNow - PullRequest
0 голосов
/ 07 июня 2019

Наша команда пытается разработать скрипт для повторяющихся задач в ServiceNow.У нас есть пользовательская таблица, в которой находятся start_date, end_date и интервал (number_of_days).Например, если дата начала выполнения задания 6/6/2019 и указанный интервал составляет 3 дня, мы хотим, чтобы сценарий выполнил задачу 9/9/2019, 12/06/2019, 6/15/ 2019 и т. Д.

Сначала мы подумали, что могли бы сделать что-то вроде ниже, где мы берем разницу в датах между началом и концом и, если есть остаток от 0, затем выполним задачу.Это прекрасно работает, например, если разность дат равна 10, а интервал равен 2 и хорошо делится.Однако, если разность дат равна, например, 15, а интервал остается равным 2, то это, очевидно, не сработает.

if(trigger=='recurring'){
            var milestone_start = performance_start;
            var milestone_end = performance_end;
            var dur = GlideDateTime.subtract(milestone_start, milestone_end);

            var duration = dur.getNumericValue();
            var durationSeconds = (duration/1000);
            var durationDays = (durationSeconds/(60*60*24));

            if(durationDays % days == 0){
                var runScript=new customTaskUtils();
                var x = runScript.applyTasks(case_sysID,milestoneGR.sys_id);
            }
        }

Есть мысли о том, как мы можем написать что-то подобное?

1 Ответ

0 голосов
/ 07 июня 2019

В сценарии чего-то не хватает сегодня, как вы узнаете, хотите ли вы выполнить сегодня или завтра?

Вам нужно проверить, является ли продолжительность четной или неравномерной. Если это неравномерно и% 2 возвращает 1, вы знаете, что должны выполнить задачу. И если оно четное и% 2 возвращает 0, вы должны выполнить тоже.

if (trigger == 'recurring') {
    var milestone_start = performance_start;
    var milestone_end = performance_end;
    var dur = GlideDateTime.subtract(milestone_start, milestone_end);

    var duration = dur.getNumericValue();
    var durationSeconds = (duration / 1000);
    var durationDays = (durationSeconds / (60 * 60 * 24));

    var isEven = (durationDays % days == 0);
    var daysSinceMilestoneStart = whichNumberIsTodayInInterval(milestone_start, milestone_end, new GlideDateTime())

    if (daysSinceMilestoneStart == -1) {
        return;
    }
    if (isEven && daysSinceMilestoneStart % 2 == 0) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else if (!isEven && !(daysSinceMilestoneStart % 2 == 0)) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else if (daysSinceMilestoneStart == 0) {
        var runScript = new customTaskUtils();
        var x = runScript.applyTasks(case_sysID, milestoneGR.sys_id);
    } else {
      // nothing
    }

    function whichNumberIsTodayInInterval(milestone_start, milestone_end, today) {
        if (milestone_start.before(today)) && milestone_end.after(today) {
            var dur = GlideDateTime.subtract(milestone_start, today);

            var duration = dur.getNumericValue();
            var durationSeconds = (duration / 1000);
            var daysSinceMilestoneStart = (durationSeconds / (60 * 60 * 24));
            return daysSinceMilestoneStart;
        }
        return -1;
    }
}   
...