SuiteScript2.0销售订单提交时自动添加折扣行需求及代码咨询
我来帮你完善这个SuiteScript 2.0用户事件脚本,实现销售订单提交时为每个库存商品添加折扣行的功能。先梳理下需求和完整实现代码:
需求概述
- 脚本类型:SuiteScript 2.0 用户事件脚本(User Event Script)
- 绑定对象:销售订单(Sales Order)
- 触发时机:
beforeSubmit(订单提交前) - 核心逻辑:为订单内的每一条库存商品行,新增对应的折扣子列表行
完整实现代码
/** * @NApiVersion 2.x * @NScriptType UserEventScript * @NModuleScope SameAccount */ define(['N/record', 'N/search'], function(record, search) { function beforeSubmit(scriptContext) { // 仅在创建或编辑订单时执行(可根据需求调整触发类型) if (scriptContext.type !== scriptContext.UserEventType.CREATE && scriptContext.type !== scriptContext.UserEventType.EDIT) { return; } var salesOrder = scriptContext.newRecord; var existingDiscount = salesOrder.getValue('discountitem'); // 若订单未设置全局折扣项,则执行逐行添加折扣逻辑 if (!existingDiscount) { log.debug('No global discount set, starting line-item discount addition'); // 加载预定义的折扣商品搜索 var discountSearch = search.load({ id: 'customsearch_cg_ue_discount_in_order' }); // 获取搜索结果(这里默认取第一个折扣商品,可根据需求调整范围) var searchResults = discountSearch.run().getRange({ start: 0, end: 1 }); if (searchResults.length === 0) { log.error('No discount items found from saved search'); return; } var discountItemId = searchResults[0].getValue({name: 'internalid'}); var discountItemName = searchResults[0].getValue({name: 'itemid'}); log.debug('Using discount item', `${discountItemName} (ID: ${discountItemId})`); // 遍历订单中的所有商品行 var lineCount = salesOrder.getLineCount({sublistId: 'item'}); for (var i = 0; i < lineCount; i++) { salesOrder.selectLine({ sublistId: 'item', line: i }); var itemType = salesOrder.getCurrentSublistValue({ sublistId: 'item', fieldId: 'itemtype' }); // 仅为库存商品添加折扣行(可根据需求修改商品类型判断) if (itemType === 'InvtPart') { var originalItemId = salesOrder.getCurrentSublistValue({ sublistId: 'item', fieldId: 'item' }); var originalQuantity = salesOrder.getCurrentSublistValue({ sublistId: 'item', fieldId: 'quantity' }); // 在原商品行后插入折扣行 salesOrder.insertLine({ sublistId: 'item', line: i + 1 }); salesOrder.selectLine({ sublistId: 'item', line: i + 1 }); // 设置折扣行的各项参数 salesOrder.setCurrentSublistValue({ sublistId: 'item', fieldId: 'item', value: discountItemId }); salesOrder.setCurrentSublistValue({ sublistId: 'item', fieldId: 'quantity', value: originalQuantity }); // 示例:每件商品折扣5元,负数表示折扣,可按业务需求调整金额或百分比 salesOrder.setCurrentSublistValue({ sublistId: 'item', fieldId: 'rate', value: -5.00 }); salesOrder.setCurrentSublistValue({ sublistId: 'item', fieldId: 'description', value: `Discount for item: ${originalItemId}` }); salesOrder.commitLine({sublistId: 'item'}); // 插入新行后,更新行总数和循环计数器,避免遗漏或重复处理 lineCount++; i++; } salesOrder.commitLine({sublistId: 'item'}); } } } return { beforeSubmit: beforeSubmit }; });
关键逻辑说明
- 触发条件控制:先判断订单操作类型(创建/编辑),避免在删除、复制等操作时不必要的执行
- 全局折扣检查:如果订单已设置全局折扣项,则跳过逐行添加逻辑,防止折扣重复计算
- 折扣商品获取:通过预定义的保存搜索获取可用折扣商品,逻辑灵活可配置,不需要硬编码折扣项ID
- 商品类型过滤:仅为库存商品(
InvtPart)添加折扣行,可根据业务需求修改判断条件(比如支持非库存商品) - 行操作处理:使用
insertLine在原商品行后插入折扣行,同时调整循环计数器和行总数,保证所有商品行都能被正确处理
注意事项
- 确保保存的搜索
customsearch_cg_ue_discount_in_order包含internalid和itemid字段,且返回正确的折扣商品数据 - 折扣金额(
rate字段)的设置需根据业务需求调整,支持固定金额(负数)或百分比折扣 - 测试时需验证脚本权限:确保脚本拥有销售订单的读/写权限,以及保存搜索的读取权限
- 若订单存在大量行项目,需注意脚本执行时长限制,必要时优化循环逻辑或拆分处理
内容的提问来源于stack exchange,提问作者Kaul Shishir
相关产品推荐
相关产品推荐

