You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:54:42