Casos de uso de script do lado do servidor
Os casos de uso para scripts do lado do servidor incluem saída em log, obtenção de objetos do usuário e modificação de valores de data/hora.
Acessar o bloco de anotações do fluxo de trabalho a partir de regras de negócios
Um item do catálogo foi solicitado e o fluxo de trabalho anexado contém uma atividade de script de execução que preenche um valor no bloco de anotações. Em uma regra de negócios em execução no item solicitado, você deseja recuperar ou definir valores do bloco de anotações.
Pré-requisitos
Função necessária: administrador
Access Workflow Scratchpad em Regras de negócio.
Tipo: Regra de negócio.
Tabela: sc_req_item (Item solicitado).
Descrição: Um item do catálogo foi solicitado, o fluxo de trabalho anexado contém uma atividade de script de execução que preenche um valor no bloco de anotações. Em uma regra de negócios em execução no item solicitado, você deseja recuperar ou definir valores do bloco de anotações.
Parâmetros: n/a.
//the run script activity sets a value in the scratchpad
workflow.scratchpad.important_msg = "scratch me";
//get the workflow script include helper
var workflow = new Workflow();
//get the requested items workflow context
//this will get all contexts so you will need to get the proper one if you have multiple workflows for a record
var context = workflow.getContexts(current);
//make sure we have a valid context
if (context.next()) {
//get a value from the scratchpad
var msg = context.scratchpad.important_msg;
//msg now equals "scratch me", that was set in the run script activity
//add or modify a scratchpad value
context.scratchpad.status = "completed";
//we need to save the context record to save the scratchpad
context.update();
}Atribua um item do catálogo a um grupo com base em uma tarefa de plano de entrega
Atribua um item do catálogo de serviços ao grupo de banco de dados se ele usar um plano de entrega que tenha uma tarefa de catálogo atribuída ao grupo de desktop.
Pré-requisitos
Função necessária: administrador
Nome: Atribuir item do catálogo ao grupo com base na tarefa do plano de entrega.
Tipo: Regra de atribuição.
Descrição: Esta regra de atribuição atribui um item do catálogo de serviços ao grupo de banco de dados se ele usar um plano de entrega que tenha uma tarefa de catálogo atribuída ao grupo de desktop.
Script:
//Return catalog items that have no group but do have a delivery plan assigned var ri = new GlideRecord ( "sc_cat_item" ) ;
ri.addQuery("group", "=", null);
ri.addQuery("delivery_plan", "!=", null);
ri.query();
while(ri.next()) {
gs.log("Found an item");
//Return tasks that point to the same delivery plan as the above item
var dptask = new GlideRecord("sc_cat_item_delivery_task");
dptask.addQuery("delivery_plan", "=", ri. delivery_plan);
dptask.query();
while(dptask.next()) {
gs.log("Found a task");
var gp = dptask.group.getDisplayValue();
gs.log(gp);
//If the task is assigned to desktop, assign the item's group to desktop
if (dptask.group.getDisplayValue() == "Desktop") {
ri.group.setDisplayValue("Desktop");
gs.log("updating " + ri.getDisplayValue());
ri.update();
break; } } }Calculando durações
Muitas vezes, você pode precisar fornecer aos usuários uma maneira de especificar quando uma tarefa ou processo deve vencer. Usando a inclusão de script DurationCalculator, você pode calcular a data de vencimento usando uma duração simples ou uma duração relativa.
10am-5pm on Monday (6 hours) + 8am-12pm on Tuesday (4 hours)Para obter informações sobre cronogramas, que você pode usar como entradas para métodos DurationCalculator, consulte Criação e uso de cronogramas .
Este script demonstra como usar DurationCalculator para calcular uma data de vencimento.
/**
* Demonstrate the use of DurationCalculator to compute a due date.
*
* You must have a start date and a duration. Then you can compute a
* due date using the constraints of a schedule.
*/
gs.include('DurationCalculator');
executeSample();
/**
* Function to house the sample script.
*/function executeSample(){
// First we need a DurationCalculator object.var dc =new DurationCalculator();
// --------------- No schedule examples ------------------
// Simple computation of a due date without using a schedule. Seconds// are added to the start date continuously to get to a due date.
dc.setStartDateTime("5/1/2012");if(!dc.calcDuration(2*24*3600)){// 2 days
gs.log("*** Error calculating duration");return;}
gs.log("calcDuration no schedule: "+ dc.getEndDateTime());// "2012-05-03 00:00:00" two days later
// Start in the middle of the night (2:00 am) and compute a due date 1 hour in the future// Without a schedule this yields 3:00 am.
dc.setStartDateTime("5/3/2012 02:00:00");if(!dc.calcDuration(3600)){
gs.log("*** Error calculating duration");return;}
gs.log("Middle of night + 1 hour (no schedule): "+ dc.getEndDateTime());// No scheduled start date, just add 1 hour
// -------------- Add a schedule to the date calculator ---------------------
addSchedule(dc);
// Start in the middle of the night and compute a due date 1 hour in the future.// Since we start at 2:00 am the computation adds the 1 hour from the start// of the day, 8:00am to get to 9:00am
dc.setStartDateTime("5/3/2012 02:00:00");if(!dc.calcDuration(3600)){//
gs.log("*** Error calculating duration");return;}
gs.log("Middle of night + 1 hour (with 8-5 schedule): "+ dc.getEndDateTime());// 9:00 am
// Start in the afternoon and add hours beyond quiting time. Our schedule says the work day// ends at 5:00pm, if the duration extends beyond that, we roll over to the next work day.// In this example we are adding 4 hours to 3:00pm which gives us 10:00 am the next day.
dc.setStartDateTime("5/3/2012 15:00:00");if(!dc.calcDuration(4*3600)){//
gs.log("*** Error calculating duration");return;}
gs.log("Afternoon + 4 hour (with 8-5 schedule): "+ dc.getEndDateTime());// 10:00 am.
// This is a demo of adding 2 hours repeatedly and examine the result. This// is a good way to visualize the result of a due date calculation.
dc.setStartDateTime("5/3/2012 15:00:00");// for(var i=2; i<24; i+=1){if(!dc.calcDuration(i*3600)){//
gs.log("*** Error calculating duration");return;}
gs.log("add "+ i +" hours gives due date: "+ dc.getEndDateTime());}
// Setting the timezone causes the schedule to be interpreted in the specified timezone.// Run the same code as above with different timezone. Note that the 8 to 5 workday is// offset by the two hours as specified in our timezone.
dc.setTimeZone("GMT-2");
dc.setStartDateTime("5/3/2012 15:00:00");for(var i=2; i<24; i+=1){if(!dc.calcDuration(i*3600)){//
gs.log("*** Error calculating duration");return;}
gs.log("add "+ i +" hours gives due date (GMT-2): "+ dc.getEndDateTime());}}
/**
* Add a specific schedule to the DurationCalculator object.
*
* @param durationCalculator An instance of DurationCalculator
*/function addSchedule(durationCalculator){// Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.var scheduleName ="8-5 weekdays excluding holidays";var grSched =new GlideRecord('cmn_schedule');
grSched.addQuery('name', scheduleName);
grSched.query();if(!grSched.next()){
gs.log('*** Could not find schedule "'+ scheduleName +'"');return;}
durationCalculator.setSchedule(grSched.getUniqueValue(),"GMT");}Duração simples versus duração relativa
Quanto trabalho é necessário para concluir uma tarefa pode ser expresso como uma "duração relativa".
A duração relativa determina a data e a hora de vencimento esperadas em relação à hora de início. Exemplos de durações relativas incluem "Próximo dia útil até 16h" ou "2 dias úteis até 10:30".
- Se for segunda-feira às 12h: Próximo dia útil às 16h: Terça-feira às 16h
- Se for sexta-feira às 14h: Próximo dia útil às 16h: Na segunda-feira seguinte às 16h
Para obter mais informações sobre durações relativas, consulte Define a relative duration.
Calculando uma duração simples
Este exemplo de regra de negócio e script demonstra como calcular uma duração simples.
var dur =new DurationCalculator();
dur.setSchedule(current.schedule);
dur.setStartDateTime("");
if(current.duration_type==""){
dur.calcDuration(current.duration.getGlideObject().getNumericValue()/1000);}else{
dur.calcRelativeDuration(current.duration_type);}
current.end_date_time= dur.getEndDateTime();
current.work_seconds= dur.getSeconds();Este script demonstra como usar DurationCalculator para calcular uma duração simples.
/**
* Sample script demonstrating use of DurationCalculator to compute simple durations
*
*/
gs.include('DurationCalculator');
executeSample();
/**
* Function to house the sample script.
*/
function executeSample(){
// First we need a DurationCalculator object.
var dc =new DurationCalculator();
// Compute a simple duration without any schedule. The arguments
// can also be of type GlideDateTime, such as fields from a GlideRecord.
var dur = dc.calcScheduleDuration("5/1/2012","5/2/2012");
gs.log("calcScheduleDuration no schedule: "+ dur);
// 86400 seconds (24 hours)
// The above sample is useful in limited cases. We almost always want to
// use some schedule in a duration computation, let's load a schedule.
addSchedule(dc);
// Compute a duration using the schedule. The schedule
// specifies a nine hour work day. The output of this is 32400 seconds, or
// a nine hour span.
dur = dc.calcScheduleDuration("5/23/2012 12:00","5/24/2012 12:00");
gs.log("calcScheduleDuration with schedule: "+ dur);
// 32400 seconds (9 hours)
// Compute a duration that spans a weekend and holiday. Even though this
// spans three days, it only spans 9 work hours based on the schedule.
dur = dc.calcScheduleDuration("5/25/2012 12:00","5/29/2012 12:00");
gs.log("calcScheduleDuration with schedule spaning holiday: "+ dur);
// 32400 seconds (9 hours)
// Use the current date time in a calculation. The output of this is
// dependent on when you run it.
var now =new Date();
dur = dc.calcScheduleDuration("5/15/2012",new GlideDateTime());
gs.log("calcScheduleDuration with schedule to now: "+ dur);
// Different on every run.}
/**
* Add a specific schedule to the DurationCalculator object.
*
* @param durationCalculator An instance of DurationCalculator
*/
function addSchedule(durationCalculator){
// Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.
var scheduleName ="8-5 weekdays excluding holidays";
var grSched =new GlideRecord('cmn_schedule');
grSched.addQuery('name', scheduleName);
grSched.query();if(!grSched.next()){
gs.log('*** Could not find schedule "'+ scheduleName +'"');
return;}
durationCalculator.setSchedule(grSched.getUniqueValue());}Calculando uma duração relativa
Um exemplo de script de cálculo de duração relativa.
// Next day at 4pm if before 10am
var days =1;
if(calculator.isAfter(calculator.startDateTime,"10:00:00"))
days++;
calculator.calcRelativeDueDate(calculator.startDateTime, days,"16:00:00");Este script demonstra como usar DurationCalculator para calcular uma duração relativa.
/**
* Sample use of relative duration calculation.
*
*/
gs.include('DurationCalculator');
executeSample();
/**
* Function to house the sample script.
*/
function executeSample(){
// First we need a DurationCalculator object. We will also use
// the out-of-box relative duration "2 bus days by 4pm"
var dc =new DurationCalculator();
var relDur ="3bf802c20a0a0b52008e2859cd8abcf2";
// 2 bus days by 4pm if before 10am
addSchedule(dc);
// Since our start date is before 10:00am our result is two days from
// now at 4:00pm.
dc.setStartDateTime("5/1/2012 09:00:00");
if(!dc.calcRelativeDuration(relDur)){
gs.log("*** calcRelativeDuration failed");
return;}
gs.log("Two days later 4:00pm: "+ dc.getEndDateTime());
// Since our start date is after 10:00am our result is three days from
// now at 4:00pm.
dc.setStartDateTime("5/1/2012 11:00:00");
if(!dc.calcRelativeDuration(relDur)){
gs.log("*** calcRelativeDuration failed");
return;}
gs.log("Three days later 4:00pm: "+ dc.getEndDateTime());}
/**
* Add a specific schedule to the DurationCalculator object.
*
* @param durationCalculator An instance of DurationCalculator
*/
function addSchedule(durationCalculator){
// Load the "8-5 weekdays excluding holidays" schedule into our duration calculator.
var scheduleName ="8-5 weekdays excluding holidays";
var grSched =new GlideRecord('cmn_schedule');
grSched.addQuery('name', scheduleName);
grSched.query();
if(!grSched.next()){
gs.log('*** Could not find schedule "'+ scheduleName +'"');
return;}
durationCalculator.setSchedule(grSched.getUniqueValue(),"GMT");}Como implementar uma duração relativa
Você pode implementar uma duração relativa criando a tabela cmn_relative_duration e DurationCalculator inclusão de script.
Antes de Iniciar
Procedimento
- Crie a tabela cmn_relative_duration.
- Crie a inclusão de script DurationCalculator.
- Crie uma entrada de duração relativa de amostra (por exemplo, "Próximo dia útil às 16h").
- Adicione os campos necessários às tabelas de ANS para oferecer suporte a durações relativas.
- Modifique o cálculo de duração para ANS.
- Modifique o cálculo do temporizador de porcentagem de ANS para ANS (deve usar work_seconds).
- Adicione campos de programação ao Fluxo de trabalho: Programação e Fuso horário (selecionados com base no campo da tabela de fluxo de trabalho).
- Adicione campos de suporte de duração à atividade Tarefa de fluxo de trabalho.
- Implementar script de cálculo de duração para a atividade da tarefa.
A tabela Duração relativa e os métodos DurationCalculator
A tabela cmn_relative_duration oferece suporte à definição de um prazo como uma duração de tempo ou uma duração relativa.
Esta tabela consiste em dois campos: "Nome" e "script". O campo "script" contém o script de cálculo de duração relativa. Este script inclui a variável "calculadora", que é usada para calcular a data de vencimento.
A inclusão de script DurationCalculator pode ser usada para executar os cálculos de duração. Os métodos a seguir estão disponíveis nesta inclusão de script.
| Método | Descrição |
|---|---|
| SetSchedSchedID(cadeia de caracteres schedID, [cadeia de caracteres de fuso horário]) | Define a programação e o fuso horário a serem usados para calcular a data de vencimento. |
| SetStartDateTime (início GlideDateTime) | Define a hora de início dos cálculos de duração. Se "start" estiver em branco, usará a data/hora atual. |
| CalcDuration (int segundos) | Calcula a data e a hora de término. Após a conclusão, as propriedades this.endDateTime e this.seconds serão definidas para indicar os resultados do cálculo. |
| CalcRelativeDuration(cadeia de caracteres relativeDurationID) | Calcula a duração usando o script de duração relativa especificado. Após a conclusão, as propriedades this.endDateTime e this.seconds serão definidas para indicar os resultados do cálculo. |
| GetEndDateTime() | Obtém a propriedade this.endDateTime que foi definida por calcDuration/calcRelativeDuration indicando a data e a hora de término da duração. |
| getSeconds() | Obtém a propriedade this.seconds que foi definida por calcDuration/calcRelativeDuration, indicando o número total de segundos de trabalho a serem executados para a duração. Nota: Este é o tempo total de trabalho, não o tempo total entre as horas de início e término e pode ser usado para determinar porcentagens do tempo de trabalho |
| GetTotalSeconds() | Obtém a propriedade this.totalSeconds que foi definida por calcDuration/calcRelativeDuration, indicando o número total de segundos entre as horas de início e término da duração. |
As seguintes funções são usadas em scripts de duração relativa:
| Função | Descrição |
|---|---|
| IsAfter booliano(GlideDateTime dt, hora da cadeia de caracteres) | "Hora" do dia após a hora do dia especificada por "dt"? dt, se estiver em branco, usa a data/hora atual. a hora está em "hh:mm:ss" no formato de 24 horas. |
| CalcRelativeDueDate(início GlideDateTime, int dias, cadeia de caracteres endTime) | Calcula a data de vencimento começando em "início" e adicionando "dias" usando a programação e o fuso horário. Quando encontrarmos o dia em que o trabalho vence, defina a hora como "endTime" desse dia. Após a conclusão, as propriedades this.endDateTime e this.seconds serão definidas para indicar os resultados do cálculo. Se a hora de término estiver em branco, use o fim do dia útil de término. |
Obtenha um objeto de usuário
Em uma regra de negócio ou outro script de servidor, o. gs.getUser() o método retorna um objeto de usuário. O objeto de usuário é uma representação interna do usuário conectado no momento e fornece informações sobre o usuário e várias funções de utilitário.
Por Que e Quando Desempenhar Esta Tarefa
Procedimento
Saída de log
GSLog é uma inclusão de script que simplifica o registro em log e a depuração de script implementando níveis de saída de log, selecionáveis por valores sys_properties identificados por chamador.
Nível de log
Os logs podem estar no nível de depuração, informação, aviso, aviso, erro, ou crit (após o bsd syslog.h e seguidores). O nível de registro em log padrão é AVISO, portanto, os níveis devem ser escolhidos de acordo.
Onde usar
Use para qualquer script do lado do servidor em que você deseja implementar o registro em log de eventos.
Para obter a referência de API, consulte GSLog() .
Para obter mais informações, consulte Scripts de depuração
Modifique um valor do campo GlideDateTime
Este exemplo demonstra como modificar um GlideDateTime valor do campo usando um script do lado do servidor.
//You first need a GlideDateTime object
//this can be from instantiating a new object "var gdt = new GlideDateTime()"
//or getting the object from a GlideDateTime field
//getting the field value (for example: var gdt = current.start_date) only returns the string value, not the object
//to get the object use var gdt = current.start_date.getGlideObject();
//now gdt is a GlideDateTime object
var gdt = current.start_date.getGlideObject();
//All methods can use negative values to subtract intervals
//add 1 hour (60 mins * 60 secs)
gdt.addSeconds(3600);
//add 1 day
gdt.addDaysLocalTime(1);
//subtract 1 day
gdt.addDaysLocalTime(-1);
//add 3 weeks
gdt.addWeeksLocalTime(3);
//subtract 6 months
gdt.addMonthsLocalTime(-6);
//add 1 year, representing the date and time using the UTC timezone instead of the local user's timezone.
gdt.addYearsUTC(1);
//set the value of the GlideDateTime object to the current session timezone/format
GlideSession.get().setTimeZoneName('US/Eastern');
gdt.setDisplayValue('2018-2-28 00:00:00');
gs.info('In ' + GlideSession.get().getTimeZoneName() + ": " + gdt.getDisplayValue());
Consulte também:
Usando filas personalizadas para processar eventos
Você pode usar filas personalizadas para aplicações que criam um grande volume de eventos ou eventos que demoram muito tempo para serem processados. Esta tarefa mostra como criar uma fila personalizada, seu processo de monitoramento e usar um script para enviar eventos para a fila.
Antes de Iniciar
Função necessária: administrador