如何覆盖从机会转换为销售订单的默认条款更新

How to override the default terms update from converting Opportunity to Sales Order

我在商机中添加了自定义字段 Terms 和 Ship via,当我将值传递给销售订单时。它被替换为默认条款和运送方式。

我正在使用以下代码将机会值传递给销售订单

public virtual IEnumerable CreateSalesOrder(PXAdapter adapter)
{

    PXGraph.InstanceCreated.AddHandler<SOOrderEntry>((graph) =>
    {
        graph.RowInserted.AddHandler<SOOrder>((cache, args) =>
        {
            var soOrder = (SOOrder)args.Row;
            var soOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExtNV>(soOrder);

            foreach (CROpportunity opportunity in adapter.Get())
            {
                OppertunityExtn extOpprow = PXCache<CROpportunity>.GetExtension<OppertunityExtn>(opportunity);
                soOrderExt.UsrOpportunityID = opportunity.OpportunityID;
                soOrderExt.UsrCustomerContact = opportunity.ContactID;
                soOrderExt.UsrIsEmbroidery = extOpprow.UsrIsEmbroidery;
                soOrderExt.UsrIsPromo = extOpprow.UsrIsPromo;
                soOrderExt.UsrIsBlank = extOpprow.UsrIsBlank;
                soOrderExt.UsrIsService = extOpprow.UsrIsService;
                soOrderExt.UsrIsDigital = extOpprow.UsrIsDigital;
                soOrderExt.UsrIsSample = extOpprow.UsrIsSample;
                soOrderExt.UsrIsScreenPrint = extOpprow.UsrIsScreenPrint;
                soOrderExt.UsrIsRushJob = extOpprow.UsrIsRushJob;
                soOrderExt.UsrHardDate = extOpprow.UsrHardDate;
                soOrderExt.UsrIsInHandsDate = extOpprow.UsrIsInHandsDate;
                soOrderExt.UsrEventDate = extOpprow.UsrEventDate;
                soOrderExt.UsrEventDescription = extOpprow.UsrEventDescription;
                soOrderExt.UsrShipDate = extOpprow.UsrShipDate;
                soOrderExt.UsrHoldUntil = extOpprow.UsrHoldUntil;
                soOrderExt.UsrExactQuantityNeeded = extOpprow.UsrExactQuantityNeeded;
                soOrderExt.UsrIsNewCustomer = extOpprow.UsrIsNewCustomer;
                soOrderExt.UsrBatchShip = extOpprow.UsrBatchShip;
                soOrderExt.UsrInternalRef = extOpprow.UsrInternalRef;
                soOrder.ShipVia = extOpprow.UsrShipVia;
                soOrder.TermsID = extOpprow.UsrTerms;
                soOrder.FreightAmt = extOpprow.UsrFreightEstimate;

            }
        });
        graph.RowPersisting.AddHandler<SOOrder>((cache, args) =>
            {
                var soOrder = (SOOrder)args.Row;
                foreach (CROpportunity opportunity in adapter.Get())
                {
                    OppertunityExtn extOpprow = PXCache<CROpportunity>.GetExtension<OppertunityExtn>(opportunity);
                    soOrder.TermsID = extOpprow.UsrTerms;
                }

            });
    });
    return Base.createSalesOrder.Press(adapter);
}

TermsID 在插入 SOOrder 行后被替换。您可以参考以下 OpportunityMaint.DoCreateSalesOrder 的代码。这就是为什么它被替换为客户级别设置的值。

您应该实现如下逻辑。您也可以对用户字段使用类似的方法。

public class OpportunityMaintPXExt : PXGraphExtension<OpportunityMaint>
{
    public override void Initialize()
    {
        PXGraph.InstanceCreated.AddHandler<SOOrderEntry>((graph) =>
        {
            graph.RowUpdating.AddHandler<SOOrder>((sender, e) =>
            {
                SOOrder soData = e.NewRow as SOOrder;
                if (soData != null)
                {
                    if (sender.GetStatus(soData) == PXEntryStatus.Inserted)
                    {
                        CROpportunity opData = Base.Opportunity.Current;
                        CROpportunityPXExt opDataExt = PXCache<CROpportunity>.GetExtension<CROpportunityPXExt>(opData);

                        soData.TermsID = opDataExt.UsrTermsID;
                        soData.ShipVia = opDataExt.UsrShipVia;
                    }
                }
            });
        });
    }
}