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

NetSuite SuiteScript获取JSON数据问题:检测客户付款apply子列表值变更

检测Customer Payment中「apply」子列表的变更并执行操作

看起来你已经在尝试用afterSubmit脚本监控客户付款的apply子列表变更了,我帮你完善这个逻辑——核心是对比**旧记录(oldRecord)和新记录(newRecord)**里的apply子列表数据,找出差异后再执行对应操作。

关键要点说明

  • 只有当脚本触发类型是edit或xedit时,oldRecord才会存在(创建记录时oldRecord为null),所以首先要判断上下文类型
  • apply子列表的核心字段通常是:internalid(关联的发票/账单ID)、apply(是否勾选应用)、amount(应用金额),这些是判断变更的关键

完整代码示例

define(['N/record', 'N/https', 'N/log'], function(record, https, log) {
    function afterSubmit(context) {
        // 只处理编辑操作,创建时无oldRecord无需对比
        if (context.type !== context.UserEventType.EDIT && context.type !== context.UserEventType.XEDIT) {
            log.debug({title: 'Skip', details: 'Only handle edit operations'});
            return;
        }

        var oldRec = context.oldRecord;
        var newRec = context.newRecord;

        // 获取apply子列表的行数
        var oldApplyCount = oldRec.getLineCount({sublistId: 'apply'});
        var newApplyCount = newRec.getLineCount({sublistId: 'apply'});

        // 收集旧记录的apply子列表数据:以关联单据ID为键,存储apply状态和金额
        var oldApplyData = {};
        for (var i = 0; i < oldApplyCount; i++) {
            var tranId = oldRec.getSublistValue({sublistId: 'apply', fieldId: 'internalid', line: i});
            var isApplied = oldRec.getSublistValue({sublistId: 'apply', fieldId: 'apply', line: i});
            var appliedAmount = oldRec.getSublistValue({sublistId: 'apply', fieldId: 'amount', line: i});
            
            oldApplyData[tranId] = {
                apply: isApplied,
                amount: appliedAmount
            };
        }

        // 遍历新记录的apply子列表,对比旧数据找变更
        for (var j = 0; j < newApplyCount; j++) {
            var newTranId = newRec.getSublistValue({sublistId: 'apply', fieldId: 'internalid', line: j});
            var newIsApplied = newRec.getSublistValue({sublistId: 'apply', fieldId: 'apply', line: j});
            var newAppliedAmount = newRec.getSublistValue({sublistId: 'apply', fieldId: 'amount', line: j});

            var oldEntry = oldApplyData[newTranId];
            if (!oldEntry) {
                // 新增的应用记录:之前没关联这个单据,现在应用了
                log.debug({title: 'New Applied Record', details: `Transaction ID: ${newTranId}, Amount: ${newAppliedAmount}`});
                // 这里执行新增应用后的操作,比如调用API、更新关联记录等
                // callYourCustomAction(newTranId, newAppliedAmount);
            } else {
                // 对比状态或金额变更
                if (oldEntry.apply !== newIsApplied) {
                    log.debug({title: 'Apply Status Changed', details: `Transaction ID: ${newTranId}, Old Status: ${oldEntry.apply}, New Status: ${newIsApplied}`});
                    // 执行状态变更后的操作
                }
                if (oldEntry.amount !== newAppliedAmount) {
                    log.debug({title: 'Applied Amount Changed', details: `Transaction ID: ${newTranId}, Old Amount: ${oldEntry.amount}, New Amount: ${newAppliedAmount}`});
                    // 执行金额变更后的操作
                }
                // 对比后从旧数据中移除,剩下的就是取消应用的记录
                delete oldApplyData[newTranId];
            }
        }

        // 剩下的oldApplyData就是被取消应用的记录
        for (var tranId in oldApplyData) {
            log.debug({title: 'Removed Applied Record', details: `Transaction ID: ${tranId}, Old Status: ${oldApplyData[tranId].apply}`});
            // 执行取消应用后的操作
        }
    }

    return {
        afterSubmit: afterSubmit
    };
});

代码解释

  1. 上下文判断:先过滤掉非编辑操作,避免创建记录时的空指针问题
  2. 数据收集:把旧记录的apply子列表数据整理成对象,方便快速查找对比
  3. 差异检测:
    • 新记录里存在但旧记录没有的行:新增的应用
    • 新旧记录都存在但apply状态或amount不同:状态/金额变更
    • 旧记录里剩下未被删除的条目:取消的应用
  4. 自定义操作:在每个差异分支里,你可以替换成自己需要执行的逻辑(比如调用https模块发送通知,或者更新其他关联记录)

调试技巧

  • 不要直接打印整个oldRec或newRec,可以针对性打印子列表的行数据,比如:
    log.debug({title: 'Old Apply Line 0', details: `ID: ${oldRec.getSublistValue({sublistId: 'apply', fieldId: 'internalid', line: 0})}, Apply: ${oldRec.getSublistValue({sublistId: 'apply', fieldId: 'apply', line: 0})}`});
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:34:42