在装运设置选项卡上的 SOOrder 屏幕上覆盖装运电子邮件

Overriding Shipping Email on SOOrder screen on Shipment Settings tab

我在 SOOrder 摘要上创建了自定义联系人字段,以便用户可以 select 基于客户 selected 的客户联系人。

这是 SOOrder 扩展上的自定义联系人字段定义-

[PXDBInt]
[PXUIField(DisplayName = "Contact", Visibility = PXUIVisibility.Visible)]
[PXDefault(PersistingCheck = PXPersistingCheck.Nothing)]
[PXSelector(typeof(Search2<Contact.contactID,
 LeftJoin<BAccount2, On<BAccount2.bAccountID, Equal<Contact.bAccountID>>>,
 Where<Contact.contactType, Equal<ContactTypesAttribute.person>,
       Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>>),
 DescriptionField = typeof(Contact.displayName), Filterable = true)]
[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(Where2<Where2<
     Where<Contact.contactType, Equal<ContactTypesAttribute.person>,
      Or<Contact.contactType, Equal<ContactTypesAttribute.lead>>>,
     And<
      Where<BAccount2.type, IsNull,
       Or<BAccount2.type, Equal<BAccountType.customerType>,
        Or<BAccount2.type, Equal<BAccountType.prospectType>,
        Or<BAccount2.type, Equal<BAccountType.combinedType>>>>>>>,
  And<WhereEqualNotNull<BAccount2.bAccountID, SOOrder.customerID>>>), "Contact '{0}' ({1}) has sales order for another business account.", typeof(Contact.displayName), typeof(Contact.contactID))]
[PXRestrictor(typeof(Where<Contact.isActive, Equal<True>>), PX.Objects.CR.Messages.ContactInactive, typeof(Contact.displayName))]
[PXDBChildIdentity(typeof(Contact.contactID))]
public virtual int? UsrCustContactID { get; set; }
public abstract class usrCustContactID : IBqlField { }

现在,每当用户 select 任何联系人时,我都会在 SOOrder 屏幕的“发货设置”选项卡上使用来自自定义联系人字段的 selected 联系人的电子邮件覆盖电子邮件。我已经为它写了下面的代码,但它似乎不起作用。

protected virtual void SOOrder_UsrCustContactID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
{
 SOOrderEntry graph = PXGraph.CreateInstance<SOOrderEntry>();

 SOOrderExtension ext = PXCache<SOOrder>.GetExtension<SOOrderExtension>(Base.Document.Current);

 Contact custContact = PXSelect<Contact,
  Where<Contact.contactID, Equal<Required<Contact.contactID>>>>.Select(graph, ext.UsrCustContactID);

 if (custContact != null && !string.IsNullOrEmpty(custContact.EMail))
 {
  graph.Document.Current = Base.Document.Current;

  Base.Shipping_Contact.Current.OverrideContact = true;
  Base.Shipping_Contact.Current.Email = custContact.EMail;

  graph.Shipping_Contact.Current = Base.Shipping_Contact.Current;

  graph.Shipping_Contact.Current.OverrideContact = true;
  graph.Shipping_Contact.Current.Email = custContact.EMail;

  Base.Shipping_Contact.Update(graph.Shipping_Contact.Current);
  
  graph.Actions.PressSave();
 }
}

这里有两个问题。

  1. 它确实显示了当我 select 联系人时填充的电子邮件,但是当我保存时,它会覆盖来自客户的默认电子邮件。

  2. 如果我正在创建新的销售订单和 select 联系人。在保存时,如果我错过任何必填字段或任何其他错误(例如 Avalara 错误),它会再次覆盖客户的默认字段。

求推荐。

要将客户联系电子邮件复制到送货地址电子邮件字段,您的 SOOrder_UsrCustContactID_FieldUpdated 处理程序应按如下方式实施:

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    protected void SOOrder_UsrCustContactID_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
    {
        var contact = PXSelectorAttribute.Select<SOOrderExtension.usrCustContactID>(
            sender, e.Row) as Contact;
        if (contact != null)
        {
            var shippingContact = (SOShippingContact)Base.Shipping_Contact.Select();
            shippingContact.OverrideContact = true;
            shippingContact = Base.Shipping_Contact.Update(shippingContact);
            shippingContact = (SOShippingContact)Base.Shipping_Contact.Select();
            shippingContact.Email = contact.EMail;
        }
    }
}

注意,Update 方法在我们设置 OverrideContact[ 后调用 Shipping_Contact 数据视图=30=] 到 true,然后是来自 Shipping_Contact[= 的附加 select 30=] 视图。第二次调用Select方法是绝对必须的,因为当OverrideContact设置为true时,系统会创建一个新实例SOShippingContact DAC 并将其插入缓存。从缓存中获取新的 SOShippingContact 实例的最简单方法是通过 [=] 上的 Select 方法44=]数据查看.