Acumatica 覆盖机会创建 SO 操作

Acumatica Override Opportunity Create SO action

我需要修改机会屏幕上创建销售订单操作的行为。

我正在努力寻找可能的最佳/干扰最少的方法。我在下面有一段基本代码。

我需要做的改动比较简单。我需要填充新 SO 上存在的一些自定义字段。

最好的方法是什么?

public PXAction<CROpportunity> createSalesOrder;
[PXUIField(DisplayName = Messages.CreateSalesOrder, MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
public virtual IEnumerable CreateSalesOrder(PXAdapter adapter)
{
    foreach (CROpportunity opportunity in adapter.Get<CROpportunity>())
    {
        Customer customer = (Customer)PXSelect<Customer, Where<Customer.bAccountID, Equal<Current<CROpportunity.bAccountID>>>>
            .SelectSingleBound(this, new object[] { opportunity });
        if (customer == null)
        {
            throw new PXException(Messages.ProspectNotCustomer);
        }

        if (CreateOrderParams.AskExtFullyValid((graph, viewName) => { }, DialogAnswerType.Positive))
        {
            Actions.PressSave();
            PXLongOperation.StartOperation(this, delegate()
            {
                var grapph = PXGraph.CreateInstance<OpportunityMaint>();
                grapph.Opportunity.Current = opportunity;
                grapph.CreateOrderParams.Current = CreateOrderParams.Current;
                grapph.DoCreateSalesOrder(CreateOrderParams.Current);
            });
        }
        yield return opportunity;
    }

}

protected virtual void DoCreateSalesOrder(CreateSalesOrderFilter param)
{
    bool recalcAny = param.RecalculatePrices == true ||
                     param.RecalculateDiscounts == true ||
                     param.OverrideManualDiscounts == true ||
                     param.OverrideManualDocGroupDiscounts == true ||
                     param.OverrideManualPrices == true;

    var opportunity = this.Opportunity.Current;
    Customer customer = (Customer)PXSelect<Customer, Where<Customer.bAccountID, Equal<Current<CROpportunity.bAccountID>>>>.Select(this);

一个简单的覆盖应该可以实现您的目标。下面是一个示例,它在创建销售订单操作期间将自定义逻辑注入事件处理程序 SOOrder.RowInserted。然后让动作正常完成。此方法使用您的自定义逻辑扩展操作,同时保留操作的基本代码。

    public class OpportunityMaint_Extension : PXGraphExtension<OpportunityMaint>
{
    public delegate IEnumerable CreateSalesOrderDelegate(PXAdapter adapter);
    [PXOverride]
    public IEnumerable CreateSalesOrder(PXAdapter adapter, CreateSalesOrderDelegate baseMethod)
    {
        PXGraph.InstanceCreated.AddHandler<SOOrderEntry>((graph) =>
        {
            graph.RowInserted.AddHandler<SOOrder>((sender, e) =>
            {
                SOOrder order = (SOOrder)e.Row;
                SOOrderExt orderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(order);

                orderExt.UsrCustomOne = "Howdy";  //assign anything you want here
            });
        });

        return baseMethod(adapter);
    }
}

}