我需要在事件系统中获取与Activity关联的组件。
我尝试使用以下方式获取组件ID:
public void OnActivityInstanceFinishPost(ActivityInstance activityInstance, string finishMessage, string nextActivity, string dynamicAssignee)
{
if (activityInstance.ProcessInstance.ProcessDefinition.Title.Equals("Component Process IESE"))
{
if (activityInstance.ActivityDefinition.Title.Equals("Create or Edit Component"))
{
WFE workflow = tdse.GetWFE();
try
{
Component comp = (Component)activityInstance.ProcessInstance.Item;
XMLReadFilter filter = new XMLReadFilter();
String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080");
ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter);
}
catch (Exception e)
{ }
}
}
}
我们尝试不同的选择:
Component comp = (Component)activityInstance.ProcessInstance.Item;
但是此解决方案返回null。
然后我在互联网上找到了下一个解决方案:
XMLReadFilter filter = new XMLReadFilter();
String processHistoryId = activityInstance.ProcessInstance.ID.Replace("131076", "131080");
ProcessHistory hist = (ProcessHistory)tdse.GetObject(activityInstance.ProcessInstance.ID, EnumOpenMode.OpenModeView, Constants.URINULL, filter);
Component comp = hist.Item as Component;
但ProcessHistory对象为null。
如何确定与activityInstance相关联的组件?
谢谢。
答案 0 :(得分:5)
在回顾了Guskermitt所需的功能之后,我向他展示了一种更简洁的方式来做他需要做的事情。简而言之,在这种情况下不需要EventSystem。
他的目标是在组件获得批准后发送电子邮件,方法如下:
2#
[ProgId("WfHelper")]
[ComVisible(true)]
public class Helper
{
public void SendMail(string workItemId)
{
var session = new Session();
.
.
.
4#
dim helper
set helper = CreateObject("WfHelper")
call helper.SendMail(CurrentWorkItem.ID)
set helper = nothing
FinishActivity “Email has been sent"
答案 1 :(得分:3)
ActivityInstance
有WorkItems
属性(继承自Activity
),其中包含对Component
的引用。
答案 2 :(得分:2)
OnActivityInstanceFinishPost表示您的活动已完成。因此,没有更多的工作项与之相关联。但是,您将获取流程实例和与之关联的工作项。如果您在那里获得null,那么它表明您的工作流程已完成且组件已移出工作流程。通过查看代码,很可能您的ProcessInstance已完成(它不会为null,但它不会有任何与之关联的项目。)
我怀疑您已阅读此帖http://www.tridiondeveloper.com/autopublishing-on-workflow-finish建议查看历史记录。您是否通过CM GUI查看历史记录,那里是历史项目?如果不是,那就是为什么你得到null。工作流程过程在完成后移动到历史记录。因此,在查看历史记录之前,请仔细检查您确实在最后一个工作流程活动中。
通过查看代码,错误似乎是您尝试使用activityInstance.ProcessInstance.ID获取历史对象。 GetObject()应该返回一个项目,但是你对ProcessHistory的强制转换应该会中断,然后你会悄悄地吃掉异常。您需要传递历史记录ID,而不是ProcessInstance ID,如下所示:
ProcessHistory hist = (ProcessHistory)tdse.GetObject(processHistoryId, EnumOpenMode.OpenModeView, Constants.URINULL, filter);