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

SuiteScript 2.X:提交特殊订单PO后如何更新销售订单

问题:提交Special Order PO后销售订单佣金值不更新

我的佣金计算脚本在创建/编辑销售订单、报价时运行正常,但现在需要处理一个特殊场景:创建Special Order PO时可以编辑cost estimate(对应字段amount/rate),提交PO后系统会回到销售订单页面,此时编辑后的cost estimate会同步到销售订单,进而影响利润率。

我需要实现:

  • 提交Special Order PO后:
    • 通过createdfrom字段加载关联的销售订单
    • 执行佣金分配逻辑
    • 保存销售订单
    • 用户回到销售订单页面时能看到更新后的佣金值

当前调试代码(部署在采购订单上)

/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */

define(['N/record', 'N/currentRecord','N/log'], (record,currentRecord,log)=>{
    
    const UpdateSO = (context)=>{
        if(context.type == context.UserEventType.DELETE) {
            return true;
        }
    //begin UpdateSO
            const newPO = context.newRecord,
                  salesOrderId = newPO.getValue({ fieldId: 'createdfrom' });
                   
           if(!salesOrderId) { return true; }
           
            const salesOrderRecord = record.load({ type: record.Type.SALES_ORDER, id: salesOrderId,isDynamic: true}),
                  lineItemCount = salesOrderRecord.getLineCount("item");
                   
                  //log.debug('salesOrderRecord',salesOrderRecord);
                  //log.debug('Count',lineItemCount);
                   
            for(let i=0; i<lineItemCount; i++){
             
            const lineNum = salesOrderRecord.selectLine({ sublistId: 'item', line: i });
            //log.debug('lineNum',lineNum);
            
            var lAmnt = salesOrderRecord.getSublistValue({ sublistId: 'item', line: i, fieldId: 'amount'});
            var lCost = salesOrderRecord.getSublistValue({ sublistId: 'item', line: i, fieldId: 'costestimate'});
            var GP = Math.trunc(((lAmnt-lCost)/lAmnt)*100).toFixed(2);
            
             var ioutput = "item# "+i+", amount: "+lAmnt+", cost: "+lCost+", GP: "+GP;
             log.debug('line value',ioutput);
            
            if (GP <= 9.99) { 
                     salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 1 });
                     log.debug('commission value '+i,1);
                     }
                      
                    if (GP >= 10.00 && GP < 15.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 2 });
                      log.debug('commission value '+i,2);
                     }
                      
                   if (GP >= 15.00 && GP < 20.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 3 });
                      log.debug('commission value '+i,3);
                     }
                      
                    if (GP >= 20.00 && GP < 25.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 4 });
                      log.debug('commission value '+i,4);
                     }
                      
                     if (GP >= 25.00 && GP < 30.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 5 });
                      log.debug('commission value '+i,5);
                     }
                      
                     if (GP >= 30.00 && GP < 35.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 6 });
                      log.debug('commission value '+i,6);
                     }
                      
                     if (GP >= 35.00 && GP < 40.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 7 });
                      log.debug('commission value '+i,7);
                     }
                      
                     if (GP >= 40.00 && GP < 45.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 8 });
                      log.debug('commission value '+i,8);
                     }
                      
                     if (GP >= 45.00) { 
                      salesOrderRecord.setCurrentSublistValue({ sublistId: 'item', line: i, fieldId: 'custcol3', value: 9 });
                      log.debug('commission value '+i,9);
                     }
                     
         } //end for
         
        salesOrderRecord.save({ type: record.Type.SALES_ORDER, id: salesOrderId, ignoreMandatoryFields: true});
        log.debug('save complete','order saved');
                   
   //end UpdateSO        
    }
    

    return {
        afterSubmit: UpdateSO
    };
    
});

当前问题

创建PO后,脚本能加载销售订单并设置新值,但回到销售订单页面看不到变更,怀疑是record.save方法使用有误,当前的save代码是:

salesOrderRecord.save({ type: record.Type.SALES_ORDER, id: salesOrderId, ignoreMandatoryFields: true});

问题分析与修改方案

核心问题点

  1. record.save参数错误:NetSuite 2.x API中,已加载的记录对象调用save()时不需要传入type和id参数,多余参数会导致保存失败。
  2. 动态模式子列表操作遗漏:使用isDynamic: true加载记录时,设置子列表行值后必须调用commitLine()提交修改,否则变更不会被保存。
  3. GP计算精度问题:Math.trunc()+toFixed(2)会将GP转为字符串,后续数值比较可能出现精度偏差。

修改后的完整代码

/**
 * @NApiVersion 2.1
 * @NScriptType UserEventScript
 * @NModuleScope SameAccount
 */

define(['N/record', 'N/log'], (record, log) => {
    
    const UpdateSO = (context) => {
        if (context.type === context.UserEventType.DELETE) {
            return;
        }

        const newPO = context.newRecord;
        const salesOrderId = newPO.getValue({ fieldId: 'createdfrom' });
           
        if (!salesOrderId) {
            log.debug('无关联销售订单', 'PO未关联销售订单,终止执行');
            return;
        }
           
        const salesOrderRecord = record.load({ 
            type: record.Type.SALES_ORDER, 
            id: salesOrderId,
            isDynamic: true
        });
        const lineItemCount = salesOrderRecord.getLineCount({ sublistId: 'item' });
                   
        for (let i = 0; i < lineItemCount; i++) {
            // 选择子列表行
            salesOrderRecord.selectLine({ sublistId: 'item', line: i });
            
            const lAmnt = salesOrderRecord.getSublistValue({ sublistId: 'item', line: i, fieldId: 'amount'});
            const lCost = salesOrderRecord.getSublistValue({ sublistId: 'item', line: i, fieldId: 'costestimate'});
            
            // 避免除以0异常
            if (lAmnt <= 0) {
                log.debug('金额异常', `行号${i}的金额为0,跳过佣金计算`);
                salesOrderRecord.commitLine({ sublistId: 'item' });
                continue;
            }
            
            // 保留数值类型计算精度,仅日志格式化
            const GP = ((lAmnt - lCost) / lAmnt) * 100;
            const formattedGP = GP.toFixed(2);
            
            log.debug('行项目数据', `行号${i},金额: ${lAmnt}, 成本: ${lCost}, 利润率: ${formattedGP}%`);
            
            // 优化佣金值判断逻辑
            let commissionValue;
            if (GP <= 9.99) {
                commissionValue = 1;
            } else if (GP < 15.00) {
                commissionValue = 2;
            } else if (GP < 20.00) {
                commissionValue = 3;
            } else if (GP < 25.00) {
                commissionValue = 4;
            } else if (GP < 30.00) {
                commissionValue = 5;
            } else if (GP < 35.00) {
                commissionValue = 6;
            } else if (GP < 40.00) {
                commissionValue = 7;
            } else if (GP < 45.00) {
                commissionValue = 8;
            } else {
                commissionValue = 9;
            }
            
            salesOrderRecord.setCurrentSublistValue({ 
                sublistId: 'item', 
                fieldId: 'custcol3', 
                value: commissionValue 
            });
            log.debug('佣金值设置', `行号${i},佣金值: ${commissionValue}`);
            
            // 提交当前行修改(动态模式必填步骤)
            salesOrderRecord.commitLine({ sublistId: 'item' });
        }
        
        // 修正save方法调用
        const savedSOId = salesOrderRecord.save({ 
            ignoreMandatoryFields: true 
        });
        log.debug('销售订单保存完成', `保存的销售订单ID: ${savedSOId}`);
    };

    return {
        afterSubmit: UpdateSO
    };
});

关键修改说明

  • 移除未使用的currentRecord依赖
  • 修正record.save()参数:仅保留ignoreMandatoryFields
  • 动态模式下添加commitLine()提交子列表行修改
  • 优化佣金判断为else if结构,提升可读性
  • 添加金额为0的异常处理,避免除以0错误
  • 调整GP计算逻辑,保留数值精度,仅在日志中格式化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 12:06:01