从机会创建销售订单时填充自定义字段

Populate custom field while creating sale order from opportunity

我在 SO 屏幕 (SO301000) 上创建了自定义字段联系人。现在我需要在用户从商机屏幕 (CR304000) 创建销售订单时填充这些字段。新的自定义字段联系人基于机会中的客户 select。我可以看到,当我根据设计从商机创建销售订单时,客户会自动填充。但是,我怎样才能对自定义字段执行相同的操作。

我已经尝试扩展现有的 CreateSalesOrder 方法,但似乎没有帮助。

联系人查找(它根据 SO 中的客户 select 刷新,但当我从机会创建 SO 时不会刷新)

[PXDBInt()]

[PXUIField(DisplayName = "Contact", Visibility = PXUIVisibility.Visible)]
[PXSelector(typeof(Search2<Contact.contactID,
 LeftJoin<BAccount2, On<BAccount2.bAccountID, Equal<Contact.bAccountID>>>>),
 DescriptionField = typeof(Contact.displayName), Filterable = true, DirtyRead = true)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXFormula(typeof(Default<SOOrder.customerID>))]
[PXRestrictor(typeof(Where<Contact.contactType, NotEqual<ContactTypesAttribute.bAccountProperty>,
  And<Where<BAccount2.bAccountID, Equal<Current<SOOrder.customerID>>,
    Or<Current<SOOrder.customerID>, IsNull>>>>), PX.Objects.CR.Messages.ContactBAccountDiff)]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), PX.Objects.CR.Messages.ContactInactive,
     typeof(Contact.displayName))]

public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }

联系人查找(当我从商机创建 SO 时它按要求工作,但不会根据客户 selection 刷新)

[PXDBInt()]

[PXDBChildIdentity(typeof(Contact.contactID))]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), "Contact '{0}' is inactive or closed.", new[] { typeof(Contact.displayName) })]
[PXSelector(typeof(Search2<Contact.contactID, LeftJoin<BAccount, On<BAccount.bAccountID, Equal<Contact.bAccountID>>>, Where<Contact.contactType, Equal<ContactTypesAttribute.person>, Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>>), DescriptionField = typeof(Contact.displayName), Filterable = true)]
[PXUIField(DisplayName = "Contact")]


public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }

在这里找到类似的答案:

可以从 CROpportunity 转换为 SOOrder 这样的东西...

public class CROpportunityMaintExtension : PXGraphExtension<OpportunityMaint>
{
    [PXOverride]
    public virtual void DoCreateSalesOrder(Action del)
    {
        PXGraph.InstanceCreated.AddHandler<SOOrderEntry>(graph =>
        {
            graph.RowInserting.AddHandler<SOOrder>((cache, args) =>
            {
                var soOrder = (SOOrder)args.Row;
                CROpportunity opportunity = PXResult<CROpportunity>.Current;

                // Copy logic here...

            });
        });

        del();
    }
}