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});
问题分析与修改方案
核心问题点
record.save参数错误:NetSuite 2.x API中,已加载的记录对象调用save()时不需要传入type和id参数,多余参数会导致保存失败。- 动态模式子列表操作遗漏:使用
isDynamic: true加载记录时,设置子列表行值后必须调用commitLine()提交修改,否则变更不会被保存。 - 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
相关产品推荐
相关产品推荐

