fixed bug with "Running Tasks"

This commit is contained in:
vfedosevich 2013-05-17 16:06:02 +03:00
parent 9a10d75492
commit b9cde075d6
7 changed files with 584 additions and 434 deletions

View file

@ -814,3 +814,47 @@ GO
UPDATE ScheduleTasks SET TaskType = RTRIM(TaskType) + '.Code' UPDATE ScheduleTasks SET TaskType = RTRIM(TaskType) + '.Code'
WHERE SUBSTRING(RTRIM(TaskType), LEN(RTRIM(TaskType)) - 3, 4) <> 'Code' WHERE SUBSTRING(RTRIM(TaskType), LEN(RTRIM(TaskType)) - 3, 4) <> 'Code'
GO GO
IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'GetRunningSchedules')
DROP PROCEDURE GetRunningSchedules
GO
CREATE PROCEDURE [dbo].[GetRunningSchedules]
(
@ActorID int
)
AS
SELECT
S.ScheduleID,
S.TaskID,
ST.TaskType,
ST.RoleID,
S.PackageID,
S.ScheduleName,
S.ScheduleTypeID,
S.Interval,
S.FromTime,
S.ToTime,
S.StartTime,
S.LastRun,
S.LastFinish,
S.NextRun,
S.Enabled,
1 AS StatusID,
S.PriorityID,
S.MaxExecutionTime,
S.WeekMonthDay,
ISNULL(0, (SELECT TOP 1 SeverityID FROM AuditLog WHERE ItemID = S.ScheduleID AND SourceName = 'SCHEDULER' ORDER BY StartDate DESC)) AS LastResult,
U.Username,
U.FirstName,
U.LastName,
U.FullName,
U.RoleID,
U.Email
FROM Schedule AS S
INNER JOIN Packages AS P ON S.PackageID = P.PackageID
INNER JOIN ScheduleTasks AS ST ON S.TaskID = ST.TaskID
INNER JOIN UsersDetailed AS U ON P.UserID = U.UserID
WHERE (U.UserID = @ActorID OR U.OwnerID = @ActorID) AND S.LastRun > S.LastFinish
GO

View file

@ -1296,7 +1296,7 @@ namespace WebsitePanel.EnterpriseServer
public static IDataReader GetServiceItemTypes() public static IDataReader GetServiceItemTypes()
{ {
return SqlHelper.ExecuteReader ( return SqlHelper.ExecuteReader(
ConnectionString, ConnectionString,
CommandType.StoredProcedure, CommandType.StoredProcedure,
"GetServiceItemTypes" "GetServiceItemTypes"
@ -1851,6 +1851,13 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@taskId", taskId)); new SqlParameter("@taskId", taskId));
} }
public static IDataReader GetRunningSchedules(int actorId)
{
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure,
ObjectQualifier + "GetRunningSchedules",
new SqlParameter("@actorId", actorId));
}
public static DataSet GetSchedules(int actorId, int packageId) public static DataSet GetSchedules(int actorId, int packageId)
{ {
return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure, return SqlHelper.ExecuteDataset(ConnectionString, CommandType.StoredProcedure,
@ -2565,11 +2572,11 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@ProhibitSendReceivePct", prohibitSendReceivePct), new SqlParameter("@ProhibitSendReceivePct", prohibitSendReceivePct),
new SqlParameter("@HideFromAddressBook", hideFromAddressBook), new SqlParameter("@HideFromAddressBook", hideFromAddressBook),
new SqlParameter("@MailboxPlanType", mailboxPlanType), new SqlParameter("@MailboxPlanType", mailboxPlanType),
new SqlParameter("@AllowLitigationHold",enabledLitigationHold), new SqlParameter("@AllowLitigationHold", enabledLitigationHold),
new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning), new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning),
new SqlParameter("@RecoverableItemsSpace",recoverabelItemsSpace), new SqlParameter("@RecoverableItemsSpace", recoverabelItemsSpace),
new SqlParameter("@LitigationHoldUrl",litigationHoldUrl), new SqlParameter("@LitigationHoldUrl", litigationHoldUrl),
new SqlParameter("@LitigationHoldMsg",litigationHoldMsg) new SqlParameter("@LitigationHoldMsg", litigationHoldMsg)
); );
return Convert.ToInt32(outParam.Value); return Convert.ToInt32(outParam.Value);
@ -2607,8 +2614,8 @@ namespace WebsitePanel.EnterpriseServer
new SqlParameter("@AllowLitigationHold", enabledLitigationHold), new SqlParameter("@AllowLitigationHold", enabledLitigationHold),
new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning), new SqlParameter("@RecoverableItemsWarningPct", recoverabelItemsWarning),
new SqlParameter("@RecoverableItemsSpace", recoverabelItemsSpace), new SqlParameter("@RecoverableItemsSpace", recoverabelItemsSpace),
new SqlParameter("@LitigationHoldUrl",litigationHoldUrl), new SqlParameter("@LitigationHoldUrl", litigationHoldUrl),
new SqlParameter("@LitigationHoldMsg",litigationHoldMsg) new SqlParameter("@LitigationHoldMsg", litigationHoldMsg)
); );
} }
@ -2691,7 +2698,7 @@ namespace WebsitePanel.EnterpriseServer
public static int GetItemIdByOrganizationId(string id) public static int GetItemIdByOrganizationId(string id)
{ {
object obj =SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetItemIdByOrganizationId", object obj = SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetItemIdByOrganizationId",
new SqlParameter("@OrganizationId", id)); new SqlParameter("@OrganizationId", id));
return (obj == null || DBNull.Value == obj) ? 0 : (int)obj; return (obj == null || DBNull.Value == obj) ? 0 : (int)obj;
@ -2737,7 +2744,7 @@ namespace WebsitePanel.EnterpriseServer
GetFilterSqlParam("@Email", email), GetFilterSqlParam("@Email", email),
}; };
return (int) SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetCRMUsersCount", sqlParams); return (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetCRMUsersCount", sqlParams);
} }
@ -2749,7 +2756,7 @@ namespace WebsitePanel.EnterpriseServer
return new SqlParameter(paramName, value); return new SqlParameter(paramName, value);
} }
public static IDataReader GetCrmUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count ) public static IDataReader GetCrmUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count)
{ {
SqlParameter[] sqlParams = new SqlParameter[] SqlParameter[] sqlParams = new SqlParameter[]
{ {
@ -2772,7 +2779,7 @@ namespace WebsitePanel.EnterpriseServer
public static IDataReader GetCRMOrganizationUsers(int itemId) public static IDataReader GetCRMOrganizationUsers(int itemId)
{ {
return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "GetCRMOrganizationUsers", return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, "GetCRMOrganizationUsers",
new SqlParameter[] {new SqlParameter("@ItemID", itemId)}); new SqlParameter[] { new SqlParameter("@ItemID", itemId) });
} }
public static void CreateCRMUser(int itemId, Guid crmId, Guid businessUnitId) public static void CreateCRMUser(int itemId, Guid crmId, Guid businessUnitId)
@ -2802,8 +2809,7 @@ namespace WebsitePanel.EnterpriseServer
public static int GetCrmUserCount(int itemId) public static int GetCrmUserCount(int itemId)
{ {
return (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetOrganizationCRMUserCount", return (int)SqlHelper.ExecuteScalar(ConnectionString, CommandType.StoredProcedure, "GetOrganizationCRMUserCount",
new SqlParameter[] new SqlParameter[] { new SqlParameter("@ItemID", itemId) });
{ new SqlParameter("@ItemID",itemId)});
} }
public static void DeleteCrmOrganization(int organizationId) public static void DeleteCrmOrganization(int organizationId)
@ -3594,8 +3600,8 @@ namespace WebsitePanel.EnterpriseServer
reader.Read(); reader.Read();
providerId = (int) reader["ProviderID"]; providerId = (int)reader["ProviderID"];
groupId = (int) reader["GroupID"]; groupId = (int)reader["GroupID"];
} }

View file

@ -54,6 +54,12 @@ namespace WebsitePanel.EnterpriseServer
DataProvider.GetScheduleTask(SecurityContext.User.UserId, taskId)); DataProvider.GetScheduleTask(SecurityContext.User.UserId, taskId));
} }
public static List<ScheduleInfo> GetRunningSchedules()
{
return ObjectUtils.CreateListFromDataReader<ScheduleInfo>(
DataProvider.GetRunningSchedules(SecurityContext.User.UserId));
}
public static DataSet GetSchedules(int packageId) public static DataSet GetSchedules(int packageId)
{ {
DataSet ds = DataProvider.GetSchedules(SecurityContext.User.UserId, packageId); DataSet ds = DataProvider.GetSchedules(SecurityContext.User.UserId, packageId);

View file

@ -320,8 +320,22 @@ namespace WebsitePanel.EnterpriseServer
// remove tasks // remove tasks
foreach (string taskId in completedTasks) foreach (string taskId in completedTasks)
{
BackgroundTask task = GetTask(taskId);
if (task != null)
{
// update last finish time
SchedulerJob schedule = SchedulerController.GetScheduleComplete(task.ItemId);
if (schedule != null)
{
schedule.ScheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
}
}
tasks.Remove(taskId); tasks.Remove(taskId);
} }
}
public static int PackageId public static int PackageId
{ {
@ -449,6 +463,14 @@ namespace WebsitePanel.EnterpriseServer
// nope // nope
} }
// update last finish time
SchedulerJob schedule = SchedulerController.GetScheduleComplete(task.ItemId);
if (schedule != null)
{
schedule.ScheduleInfo.LastFinish = DateTime.Now;
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
}
// remove it from stack // remove it from stack
tasks.Remove(taskId); tasks.Remove(taskId);
} }
@ -467,17 +489,37 @@ namespace WebsitePanel.EnterpriseServer
{ {
List<BackgroundTask> list = new List<BackgroundTask>(); List<BackgroundTask> list = new List<BackgroundTask>();
// try to get user first int effectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : SecurityContext.User.UserId;
UserInfo user = UserController.GetUser(userId); Dictionary<int, BackgroundTask> scheduledTasks = GetScheduledTasks();
if (user == null)
return list; // prohibited user
// get user tasks List<ScheduleInfo> scheduleList = SchedulerController.GetRunningSchedules();
foreach (BackgroundTask task in tasks.Values)
foreach (var scheduleInfo in scheduleList)
{ {
if(task.EffectiveUserId == userId && !task.Completed) if (effectiveUserId == userId && scheduleInfo.LastRun > scheduleInfo.LastFinish)
list.Add(task); {
if (scheduledTasks.ContainsKey(scheduleInfo.ScheduleId) && !scheduledTasks[scheduleInfo.ScheduleId].Completed)
{
list.Add(scheduledTasks[scheduleInfo.ScheduleId]);
} }
else
{
list.Add(new BackgroundTask
{
TaskId = "",
ItemId = scheduleInfo.ScheduleId,
StartDate = scheduleInfo.LastRun,
TaskName = scheduleInfo.ScheduleName,
UserId = SecurityContext.User.UserId,
Source = "RUN_SCHEDULE",
Severity = 0,
ItemName = scheduleInfo.ScheduleName,
Completed = false
});
}
}
}
return list; return list;
} }
@ -508,7 +550,7 @@ namespace WebsitePanel.EnterpriseServer
string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName); string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName);
if (taskHandlers != null) if (taskHandlers != null)
{ {
foreach(string taskHandler in taskHandlers) foreach (string taskHandler in taskHandlers)
{ {
try try
{ {

View file

@ -13,8 +13,9 @@
<asp:TemplateField HeaderText="gvTasksName"> <asp:TemplateField HeaderText="gvTasksName">
<ItemStyle Width="40%"></ItemStyle> <ItemStyle Width="40%"></ItemStyle>
<ItemTemplate> <ItemTemplate>
<asp:hyperlink id="lnkTaskName" runat="server"> <asp:hyperlink id="lnkTaskName" runat="server" Visible="false">
</asp:hyperlink> </asp:hyperlink>
<asp:Literal ID="litTaskName" runat="server" Visible="false"></asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:BoundField DataField="ItemName" HeaderText="gvTasksItemName"></asp:BoundField> <asp:BoundField DataField="ItemName" HeaderText="gvTasksItemName"></asp:BoundField>
@ -26,15 +27,16 @@
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField HeaderText="gvTasksProgress"> <asp:TemplateField HeaderText="gvTasksProgress">
<ItemTemplate> <ItemTemplate>
<div class="ProgressBarContainer"> <asp:Panel ID="pnlProgressBarContainer" runat="server" class="ProgressBarContainer" Visible="false">
<asp:Panel id="pnlProgressIndicator" runat="server" CssClass="ProgressBarIndicator"></asp:Panel> <asp:Panel id="pnlProgressIndicator" runat="server" CssClass="ProgressBarIndicator"></asp:Panel>
</div> </asp:Panel>
<asp:Literal ID="litProgressIndicator" runat="server" Visible="false">In Progress</asp:Literal>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
<asp:TemplateField HeaderText="gvTasksActions"> <asp:TemplateField HeaderText="gvTasksActions">
<ItemTemplate> <ItemTemplate>
<asp:LinkButton ID="cmdStop" runat="server" CommandName="stop" <asp:LinkButton ID="cmdStop" runat="server" CommandName="stop"
CausesValidation="false" Text="Stop" OnClientClick="return confirm('Do you really want to terminate this task?');"></asp:LinkButton> CausesValidation="false" Text="Stop" OnClientClick="return confirm('Do you really want to terminate this task?');" Visible="false"></asp:LinkButton>
</ItemTemplate> </ItemTemplate>
</asp:TemplateField> </asp:TemplateField>
</Columns> </Columns>

View file

@ -66,13 +66,34 @@ namespace WebsitePanel.Portal
// find controls // find controls
HyperLink lnkTaskName = (HyperLink)e.Row.FindControl("lnkTaskName"); HyperLink lnkTaskName = (HyperLink)e.Row.FindControl("lnkTaskName");
Literal litTaskName = (Literal)e.Row.FindControl("litTaskName");
Literal litTaskDuration = (Literal)e.Row.FindControl("litTaskDuration"); Literal litTaskDuration = (Literal)e.Row.FindControl("litTaskDuration");
Panel pnlProgressBarContainer = (Panel)e.Row.FindControl("pnlProgressBarContainer");
Panel pnlProgressIndicator = (Panel)e.Row.FindControl("pnlProgressIndicator"); Panel pnlProgressIndicator = (Panel)e.Row.FindControl("pnlProgressIndicator");
Literal litProgressIndicator = (Literal)e.Row.FindControl("litProgressIndicator");
LinkButton cmdStop = (LinkButton)e.Row.FindControl("cmdStop"); LinkButton cmdStop = (LinkButton)e.Row.FindControl("cmdStop");
if (String.IsNullOrEmpty(task.TaskId))
{
litTaskName.Visible = true;
litProgressIndicator.Visible = true;
// bind controls
litTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
}
else
{
lnkTaskName.Visible = true;
pnlProgressBarContainer.Visible = true;
cmdStop.Visible = true;
// bind controls // bind controls
lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details"); lnkTaskName.NavigateUrl = EditUrl("TaskID", task.TaskId, "view_details");
lnkTaskName.Text = GetAuditLogTaskName(task.Source, task.TaskName);
// stop button
cmdStop.CommandArgument = task.TaskId;
}
// duration // duration
TimeSpan duration = (TimeSpan)(DateTime.Now - task.StartDate); TimeSpan duration = (TimeSpan)(DateTime.Now - task.StartDate);
@ -86,9 +107,6 @@ namespace WebsitePanel.Portal
if (task.IndicatorMaximum > 0) if (task.IndicatorMaximum > 0)
percent = task.IndicatorCurrent * 100 / task.IndicatorMaximum; percent = task.IndicatorCurrent * 100 / task.IndicatorMaximum;
pnlProgressIndicator.Width = Unit.Percentage(percent); pnlProgressIndicator.Width = Unit.Percentage(percent);
// stop button
cmdStop.CommandArgument = task.TaskId;
} }
protected void gvTasks_RowCommand(object sender, GridViewCommandEventArgs e) protected void gvTasks_RowCommand(object sender, GridViewCommandEventArgs e)

View file

@ -1,7 +1,6 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// This code was generated by a tool. // This code was generated by a tool.
// Runtime Version:2.0.50727.42
// //
// Changes to this file may cause incorrect behavior and will be lost if // Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. // the code is regenerated.
@ -10,10 +9,43 @@
namespace WebsitePanel.Portal { namespace WebsitePanel.Portal {
public partial class Tasks { public partial class Tasks {
protected System.Web.UI.Timer tasksTimer;
protected System.Web.UI.UpdatePanel tasksUpdatePanel; /// <summary>
protected System.Web.UI.WebControls.GridView gvTasks; /// tasksTimer control.
protected System.Web.UI.WebControls.ObjectDataSource odsTasks; /// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.Timer tasksTimer;
/// <summary>
/// tasksUpdatePanel control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.UpdatePanel tasksUpdatePanel;
/// <summary>
/// gvTasks control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.GridView gvTasks;
/// <summary>
/// odsTasks control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.ObjectDataSource odsTasks;
} }
} }