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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:38