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

如何修改Create Purchase Order代码以保留Sales Order同Inventory ID多行结构?

解决Sales Order转Purchase Order时保留多行结构的问题

我之前在Acumatica中处理过完全相同的需求——默认情况下,系统会把同一个Inventory ID的SO行数量合并生成单条PO行,要让PO严格对应SO的多行录入结构,我们需要修改PO生成的核心逻辑,下面是具体的实现方案:

1. 扩展SOOrderEntry图,重写PO生成方法

核心思路是:不再用InventoryID作为PO行的合并依据,而是用SO订单编号+行号作为唯一标识,确保每一行SO都生成独立的PO行。

public class SOOrderEntryExt : PXGraphExtension<SOOrderEntry>
{
    public delegate IEnumerable CreatePurchaseOrderDelegate(PXAdapter adapter);

    [PXOverride]
    public IEnumerable CreatePurchaseOrder(PXAdapter adapter, CreatePurchaseOrderDelegate baseMethod)
    {
        // 获取用户选中的所有SO行
        var selectedSOLines = Base.Transactions.Select()
            .Where(line => line.Selected == true)
            .Cast<SOLine>()
            .ToList();

        // 用唯一键标记已处理的行,避免重复
        var processedLineKeys = new HashSet<string>();

        foreach (var soLine in selectedSOLines)
        {
            // 生成唯一行键:SO订单号+行号,确保每行SO都被单独处理
            string lineUniqueKey = $"{soLine.OrderNbr}-{soLine.LineNbr}";
            
            if (!processedLineKeys.Contains(lineUniqueKey))
            {
                processedLineKeys.Add(lineUniqueKey);
                // 为当前SO行单独创建PO行
                GenerateIndividualPOLine(soLine);
            }
        }

        return adapter.Get();
    }

    private void GenerateIndividualPOLine(SOLine soLine)
    {
        // 初始化PO处理图
        var poGraph = PXGraph.CreateInstance<POOrderEntry>();

        // 创建PO头(如果需要将多行SO合并到同一个PO,这里可以先判断是否已有对应PO,否则新建)
        var poOrder = poGraph.Order.Insert(new POOrder
        {
            OrderType = "PO", // 按需调整你的PO类型
            VendorID = soLine.VendorID, // 从SO行取供应商,或用系统默认
            Status = POOrderStatus.Open,
            Description = $"Generated from SO {soLine.OrderNbr}"
        });

        // 创建对应PO行,完全复制SO行的关键信息
        var poLine = poGraph.Transactions.Insert(new POLine
        {
            InventoryID = soLine.InventoryID,
            OrderQty = soLine.OrderQty,
            UOM = soLine.UOM,
            CuryUnitPrice = soLine.CuryUnitPrice,
            WarehouseID = soLine.WarehouseID,
            ReqDate = soLine.RequestDate,
            // 添加SO关联信息,方便后续追溯
            SOOrderNbr = soLine.OrderNbr,
            SOLineNbr = soLine.LineNbr
        });

        // 保存PO
        poGraph.Save.Press();
    }
}

2. 关键逻辑说明

  • 替换合并依据:把原来的InventoryID合并键改成SO订单号+行号,确保每行SO都能生成独立的PO行。
  • 灵活调整PO生成方式:如果需要把同一SO的多行合并到同一个PO里(而不是每行一个PO),可以在GenerateIndividualPOLine方法里先查询是否已有对应SO的PO,再添加行,而不是每次新建PO。

3. 测试验证步骤

部署自定义代码后,按以下步骤验证:

  • 创建一个Sales Order,添加2行相同InventoryID但不同数量的记录;
  • 选中这两行,点击「Create Purchase Order」按钮;
  • 打开生成的Purchase Order,确认两行独立存在,数量没有被合并。

注意事项

  • 字段完整性:确保复制了SO行中所有业务必需的字段(比如折扣、备注、项目代码等),避免PO行信息缺失;
  • 现有逻辑兼容:如果你的系统已有自定义PO生成逻辑,需要把这段代码和现有逻辑整合,避免冲突;
  • 业务规则适配:如果有PO审批、供应商匹配等规则,要确保生成的PO符合系统要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:33:17