什么是覆盖项目分配过程的最佳方式

时间:2017-12-12 14:28:45

标签: acumatica

关于项目运行分配'进程 - 我有一个自定义,我想在分配过程中添加条件,这样它就不会执行,除非满足这些条件。我已经在“分配规则”中添加了一个复选框用户字段。屏幕(PM207500),我希望使用该字段(与其他标准结合使用)来确定是否实际执行该PMTask行的分配。

我已按照以下方式覆盖PMAllocator.Execute方法,但它似乎无法正常工作。以下是我在PMAllocator图表的扩展中提出的代码:

    [PXOverride]
    public virtual void Execute(List<PMTask> tasks)
    {
        Base.PreselectAccountGroups();
        if (Base.PreSelectTasksTransactions(tasks))
        {
            foreach (PMTask task in tasks)
            {
                //Get the allocation id for the task...
                var pmalloc = (PMAllocation)PXSelect<PMAllocation,
                                            Where<PMAllocation.allocationID, Equal<Required<PMAllocation.allocationID>>>>.Select(Base, task.AllocationID);
                //if (pmalloc == null) return;

                //Get the cache extension / user field...
                var pmallocext = PXCache<PMAllocation>.GetExtension<PMAllocationExt>(pmalloc);

                if (pmallocext.UsrRunAfterProjectCompletion == true)
                {
                    //Get the project...
                    var pmproj = (PMProject)PXSelect<PMProject,
                                            Where<PMProject.contractID, Equal<Required<PMProject.contractID>>>>.Select(Base, task.ProjectID);

                    if (pmproj.ExpireDate > DateTime.Today || pmproj.ExpireDate == null)
                    {
                        //do nothing..
                    }
                    else
                    {
                        Base.Execute(task, false);
                    }

                }
                else
                {
                    Base.Execute(task, false);
                }
            }
        }
    }

但我不确定这是否是正确的做法。它似乎是在增加额外的分配线。如果我没有在这里明确地调用它,我甚至不确定是否没有调用基本执行方法。

有人能指出实现这个目标的最佳方法吗?

1 个答案:

答案 0 :(得分:0)

当您仅使用[PXOverride]时 - 将在您之前调用基本执行(...)方法。 要替换基本方法,您应指定其他参数 - 委托。在你的情况下,它可以是这样的:

public delegate void ExecuteDelegate(List<PMTask> tasks);
[PXOverride]
public virtual void Execute(List<PMTask> tasks, ExecuteDelegate BaseExecute)
{
 ... your code
}