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 }; });
代码解释
- 上下文判断:先过滤掉非编辑操作,避免创建记录时的空指针问题
- 数据收集:把旧记录的apply子列表数据整理成对象,方便快速查找对比
- 差异检测:
- 新记录里存在但旧记录没有的行:新增的应用
- 新旧记录都存在但
apply状态或amount不同:状态/金额变更 - 旧记录里剩下未被删除的条目:取消的应用
- 自定义操作:在每个差异分支里,你可以替换成自己需要执行的逻辑(比如调用
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
相关产品推荐
相关产品推荐

