Orchard(2) 解決Workflow存檔Activity Record重建的問題

一.前言

  在1.8,1.9等版本,每當打開Workflow Editor,存檔時會將Workflow Activity Record的記錄刪除,再重新建立新的記錄,導致目前在正執行的Workflow產生錯誤,有鑑於此若要發揮Orchard的Workflow真正功用,此缺陷務必解決。

二.解法

  打開Orchard Workflow模組的Controler目錄下的AdminController.cs,找到

Orchard(2) 解決Workflow存檔Activity Record重建的問題

將workflowDefinitionRecord.ActivityRecords.Clear();的程式Mark,點掉。改寫如下

[HttpPost, ActionName("Edit")]
[FormValueRequired("submit.Save")]
public ActionResult EditPost(int id, string localId, string data) {
if (!Services.Authorizer.Authorize(StandardPermissions.SiteOwner,
         T("Not authorized to edit workflows")))
return new HttpUnauthorizedResult();

var workflowDefinitionRecord = _workflowDefinitionRecords.Get(id);

if (workflowDefinitionRecord == null) {
return HttpNotFound();
}

workflowDefinitionRecord.Enabled = true;

var state = FormParametersHelper.FromJsonString(data);
var activitiesIndex = new Dictionary<string, ActivityRecord>();

// Ezra Modified Start
//workflowDefinitionRecord.ActivityRecords.Clear();

foreach (var activity in state.Activities)
{
ActivityRecord activityRecord;
int activityId;

if (!((string)activity.ClientId).Contains("jsPlumb") &&
int.TryParse(((string)activity.ClientId).Split('_').Last(), out activityId))
{
activityRecord = workflowDefinitionRecord.ActivityRecords.First(a => a.Id == activityId);

activityRecord.X = activity.Left;
activityRecord.Y = activity.Top;
activityRecord.Start = activity.Start;
activityRecord.State = FormParametersHelper.ToJsonString(activity.State);
}
else
{
activityRecord = new ActivityRecord
{
Name = activity.Name,
X = activity.Left,
Y = activity.Top,
Start = activity.Start,
State = FormParametersHelper.ToJsonString(activity.State),
WorkflowDefinitionRecord = workflowDefinitionRecord
};
}
activitiesIndex.Add((string)activity.ClientId, activityRecord);
}
//Get deleted activities
var delWaitingActivityRecords =
                     from orgActivityRecord in workflowDefinitionRecord.ActivityRecords
join newActivityRecord in activitiesIndex.Values.ToList()
                     on orgActivityRecord.Id equals newActivityRecord.Id
                     into joinActivityRecords
from delActivityRecord in joinActivityRecords.DefaultIfEmpty()
where delActivityRecord == null
select orgActivityRecord;

// Check deleted activities is awaiting activity
var checkRecords = (from ar in _awaitingActivityRecords.Table
where delWaitingActivityRecords.Contains(ar.ActivityRecord)
select ar).ToList();
if (checkRecords != null && checkRecords.Count() > 0)
{
// Cancel current hibernet transaction
Services.TransactionManager.Cancel();
Services.Notifier.Error(T("Can't delete {0} activity there are awaiting activity! ",
                               delWaitingActivityRecords.ElementAt(0).Name));
return RedirectToAction("Edit", new { id, localId });
}

workflowDefinitionRecord.ActivityRecords.Clear();
foreach (var activityRecord in activitiesIndex.Values)
{
workflowDefinitionRecord.ActivityRecords.Add(activityRecord);
}

workflowDefinitionRecord.TransitionRecords.Clear();

foreach (var connection in state.Connections)
{
workflowDefinitionRecord.TransitionRecords.Add(new TransitionRecord
{
SourceActivityRecord = activitiesIndex[(string)connection.SourceId],
DestinationActivityRecord = activitiesIndex[(string)connection.TargetId],
SourceEndpoint = connection.SourceEndpoint,
WorkflowDefinitionRecord = workflowDefinitionRecord
});
}

// Ezra Modified End

Services.Notifier.Information(T("Workflow saved successfully"));

return RedirectToAction("Edit", new { id, localId });
}

如此一來,Workflow Editor在儲存時便不會重建Activity Record。
PS:記得要在Controller的Constructor Injection

private readonly IRepository<AwaitingActivityRecord> _awaitingActivityRecords;
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!