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

基于PXCustomSelectorAttribute实现销售订单客户选择器动态过滤

修正步骤

  • 首先打开你注释的特性传参代码,将当前订单类型的BQL表达式传入自定义特性
  • 在GetRecords方法中从当前图的SOOrder缓存获取当前行的订单类型值,不要用硬编码的变量接收
  • 优化查询逻辑,避免全量拉取客户数据后再过滤,提升选择器加载速度

完整修改后代码

namespace PX.Objects.SO
{
    [PXNonInstantiatedExtension]
    public class SO_SOOrder_ExistingColumn : PXCacheExtension<PX.Objects.SO.SOOrder>
    {
        #region CustomerID  
        [PXMergeAttributes(Method = MergeMethod.Append)]
        // 传入当前上下文的订单类型Bql参数
        [CustomercustomersAttribute(typeof(Current<SOOrder.orderType>))]
        public int? CustomerID { get; set; }
        #endregion
    }

    public class CustomercustomersAttribute : PXCustomSelectorAttribute
    {
        public Type OrderTypeField { get; set; }

        public CustomercustomersAttribute(Type orderTypeField) : base(typeof(Customer.acctCD))
        {
            OrderTypeField = orderTypeField;
            this.DescriptionField = typeof(Customer.acctName);
        }

        public CustomercustomersAttribute() : base(typeof(Customer.acctCD))
        {
            this.DescriptionField = typeof(Customer.acctName);
        }

        protected virtual IEnumerable GetRecords()
        {
            // 从当前图获取SOOrder缓存的当前行
            SOOrder currentOrder = _Graph.Caches<SOOrder>()?.Current as SOOrder;
            string currentOrderType = currentOrder?.OrderType;

            // 按需构造查询,避免全量拉取数据提升性能
            PXResultset<Customer> customerSet;
            if (currentOrderType == "QT")
            {
                // 报价单类型不过滤信用冻结客户
                customerSet = PXSelect<Customer>.Select(_Graph);
            }
            else
            {
                // 其他订单类型仅返回活跃客户
                customerSet = PXSelect<Customer, Where<Customer.status, Equal<CustomerStatus.active>>>.Select(_Graph);
            }

            foreach (Customer pc in customerSet)
            {
                yield return pc;
            }
        }
    }
}

说明

你原来的代码中定义的orderType、orderType2变量没有实际从上下文取值,所以无法判断当前订单类型。通过从_Graph中获取SOOrder缓存的当前行,就能拿到实时的订单类型值,再根据这个值调整查询逻辑即可。
如果是新增订单还没保存的场景,Current也能拿到界面上已经填入的订单类型值,不需要依赖数据已持久化。

内容的提问来源于stack exchange,提问作者JvD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:45:04