Periodické vlastní akce
Vlastní akce je možné spouštět v pravidelném časovém intervalu. Systém
spouští periodické vlastní akce každou hodinu.
Pro funkčnost automatických akcí je nutné mít zapnutá
Vlastní programová rozšíření.
Upozornění:
Špatnou definicí vlastní akce může být nenávratně poškozena databáze ALVAO,
proto akce vždy vytvářejte a testujte v testovacím prostředí, např. na kopii
produkční databáze.
Příprava nové periodické akce
V aplikaci vytvořte nový skript podle šablony IPeriodicAction a vhodně jej pojmenujte podle funkčnosti, kterou akce provádí.
V nově vytvořeném skriptu nastavte v konstruktoru třídy hodnotu vlastnosti Name (název vlastní akce).
Příklad
U vyřešených požadavků je kontrolováno, zda
jim uplynula lhůta pro znovu otevření požadavku
žadatelem (dny) a mají vypnutý automatický
přechod do stavu Uzavřeno. V případě, že
nejsou tyto požadavky do 14 dnů uzavřené, jsou
uzavřeny automaticky.
1. část příkladu:
…
class AutoCloseInactiveTickets : IPeriodicAction
{
public string Name { get; set;}
public AutoCloseInactiveTickets()
{
Name = "Automatické uzavření vyřešených požadavků po uplynutí lhůty pro znovu otevření žadatelem";
}
}
…
Definice podmínek a vykonávaných operací pro periodickou akci
Ve vytvořené třídě akce implementujte rozhraní
IPeriodicAction a z něj metodu
OnPeriod.
V implementované metodě definujte jak podmínky pro vykonání operací, tak
samotné operace.
2. část příkladu:
…
class AutoCloseInactiveTickets : IPeriodicAction
{
…
public void OnPeriod(SqlConnection con)
{
try
{
string sql = @"
if object_id('tempdb..#list') is not null
drop table #list
create table #list (id int primary key clustered, done bit default 0)
-- získání všech požadavků, které jsou vyřešené, uplynula jim lhůta
pro znovu otevření požadavku žadatelem (dny) a mají vypnutý automatický přechod
do stavu Uzavřeno
insert #list (id)
select
t.iHdTicketId
from tHdTicket t
left join tHdSection s on s.iHdSectionId=t.liHdTicketHdSectionId
join TicketState ts on ts.TicketStateBehaviorId=3 AND
ts.TicketTypeId=s.TicketTypeId
where t.dHdTicketResolved is not null
and t.dHdTicketRemoved is null
and ClosedDate is null
and dateadd(day, isnull(s.nHdSectionUserReopenDays, 0),
t.dHdTicketResolved)<getutcdate()
-- zalogování do deníku a uzavření požadavků
declare @id int, @spid int
select @spid=iPersonId from tPerson where bPersonSystem=1
while(exists(select 1 from #list where done=0))
begin
select top 1 @id=id from #list where done=0
insert tAct
(liActHdTicketId,liActFromPersonId,liActKindId,CreatedByPersonId,dAct,sAct,mActNotice,bNoCharge,bWaitingForUser,dRecordCreated)
select @id,@spid,9,@spid,getutcdate(),N'Automatické uzavření
požadavku',N'Požadavek byl automaticky uzavřen',0,0,getutcdate()
exec spCloseHdTicket @id,@spid,1
if @@ROWCOUNT = 1
update tHdTicket set InternalTarget = null, InternalTargetDeadline = null where iHdTicketId = @id
update #list set done=1 where id=@id
end
select id from #list
truncate table #list
drop table #list
";
using (SqlCommand cmd = new SqlCommand(sql, con, null))
{
Global.Person SystemPerson = Global.Person.GetSystem(con, null);
using (SqlDataReader reader = cmd.ExecuteReader())
{
// spusteni akci na zaklade zmeny stavu pozadavku
HelpdeskWebService sdws = new HelpdeskWebService();
while (reader.Read())
{
int id = Int32.Parse(reader["id"].ToString());
try
{
sdws.OnTicketChanged(id, SystemPerson.Id,
"tHdTicket.TicketStateId");
}
catch (Exception)
{
//Výjimka se ignoruje
}
}
reader.Close();
}
}
}
catch (Exception ex)
{
throw ex;
}
}
…
}
…
Příklad ke stažení: Example_AutoCloseInactiveTickets.zip
Nenašli jste co jste hledali? Zeptejte se našeho týmu technické podpory.
|