Acumatica销售订单界面自定义代码问题:税区豁免时禁止自动覆盖
我来帮你完善这段Acumatica销售订单的自定义代码,刚好能实现你要的逻辑:当用户覆盖默认送货地址后,系统自动根据新地址的邮编更新税区,但如果当前订单的税区是Exempt(豁免)状态,就跳过这个自动更新操作。
完整实现代码
using System; using PX.Data; using PX.Objects.CS; namespace PX.Objects.SO { public class SOOrderEntry_Extension : PXGraphExtension<SOOrderEntry> { #region Event Handlers // 监听送货邮编变更事件 protected void _(Events.FieldUpdated<SOOrder.shipPostalCode> e) { ProcessTaxZoneUpdate(e.Row as SOOrder); } // 监听送货地址切换事件(用户选择不同的送货地址时触发) protected void _(Events.FieldUpdated<SOOrder.shipAddressID> e) { SOOrder order = e.Row as SOOrder; if (order == null) return; // 获取选中的送货地址对象 Address shipAddress = PXSelect<Address, Where<Address.addressID, Equal<Required<Address.addressID>>>> .Select(Base, order.ShipAddressID); if (shipAddress != null) { // 更新订单的送货邮编(确保后续逻辑能拿到最新邮编) order.ShipPostalCode = shipAddress.PostalCode; ProcessTaxZoneUpdate(order); } } // 封装税区更新的核心逻辑 private void ProcessTaxZoneUpdate(SOOrder order) { if (order == null) return; // 关键判断:如果当前税区是Exempt,直接跳过更新 if (!string.IsNullOrEmpty(order.TaxZoneID) && order.TaxZoneID.Equals("EXEMPT", StringComparison.OrdinalIgnoreCase)) { return; } // 根据送货邮编查询匹配的税区(根据你的系统配置调整查询条件) TaxZone matchedTaxZone = PXSelect<TaxZone, Where<TaxZone.postalCode, Equal<Required<TaxZone.postalCode>>>> .Select(Base, order.ShipPostalCode); // 如果找到匹配的税区且与当前税区不同,才执行更新 if (matchedTaxZone != null && !string.Equals(order.TaxZoneID, matchedTaxZone.TaxZoneID, StringComparison.OrdinalIgnoreCase)) { order.TaxZoneID = matchedTaxZone.TaxZoneID; Base.Caches[typeof(SOOrder)].Update(order); } } #endregion } }
关键逻辑说明
- 豁免税区判断:核心判断逻辑是检查订单当前的
TaxZoneID是否为EXEMPT(这里请根据你系统中实际的豁免税区ID调整,比如如果你的豁免税区ID是"TAXEXEMPT",就修改对应的值),如果是则直接终止后续操作,保留豁免状态。 - 双场景触发:同时监听了
ShipPostalCode(用户直接修改邮编)和ShipAddressID(用户切换送货地址)两个事件,确保所有地址变更的场景都能覆盖到。 - 税区匹配逻辑:通过
PXSelect查询与送货邮编关联的税区,如果你的税区是通过州/省、国家来关联的,可以修改Where条件(比如TaxZone.state等于地址的State)。 - 安全更新:只有当找到匹配的税区且与当前税区不一致时,才执行更新操作,避免不必要的缓存刷新。
注意事项
- 确保你的Acumatica系统中已经正确配置了税区与邮编的关联关系,否则匹配逻辑会失效。
- 如果豁免税区的ID是动态的(比如用户可以自定义),可以通过查询
TaxZone表中IsExempt字段为true的记录来动态获取,而不是硬编码ID。
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

