NetSuite Restlet脚本实现销售订单Item Fulfillment时报错求助
NetSuite Restlet脚本实现销售订单Item Fulfillment时报错求助
看起来你在通过Restlet脚本从销售订单生成Item Fulfillment时,因为库存序列号的处理逻辑出错,导致了You have entered an Invalid Field Value <my_inventory_number_internal_id> for the following field: issueinventorynumber这个错误。我帮你梳理下核心问题,再给出修正后的完整代码:
问题根源分析
- 字段传值错误:你当前把
inventoryDetail保存后的内部ID传给了issueinventorynumber字段,但这个字段实际需要的是库存序列号(Inventory Number)的内部ID(也就是你传入的serialNumbers[i]),而不是Inventory Detail记录的ID。 - Item Fulfillment对象重复创建:你在商品行的循环里每次都调用
record.transform()创建新的Item Fulfillment,这会导致每次循环都覆盖之前的操作,最终只会处理最后一行商品,完全不符合预期。 - 动态模式与标准模式混用:原代码中混合使用了动态模式(
isDynamic: true)和标准模式的操作,容易引发字段赋值的兼容性问题。
修正后的完整代码
function createItemFulfillmentFromSalesOrder(wcOrderId, serialNumbers) { try { // 1. 加载目标销售订单(用标准模式更稳妥,避免动态模式的行选择问题) var salesOrder = record.load({ type: record.Type.SALES_ORDER, id: wcOrderId, isDynamic: false }); var itemCount = salesOrder.getLineCount({ sublistId: 'item' }); // 2. 只需要创建一次Item Fulfillment对象,不要放在循环里! var itemFulfillment = record.transform({ fromType: record.Type.SALES_ORDER, fromId: wcOrderId, toType: record.Type.ITEM_FULFILLMENT, isDynamic: false // 统一用标准模式,减少行操作的异常 }); for (var i = 0; i < itemCount; i++) { var soItemId = salesOrder.getSublistValue({ sublistId: 'item', fieldId: 'item', line: i }); var soItemQty = salesOrder.getSublistValue({ sublistId: 'item', fieldId: 'quantity', line: i }); // 处理库存明细:如果销售订单行没有关联库存明细,就新建 var inventoryDetailId = salesOrder.getSublistValue({ sublistId: 'item', fieldId: 'inventorydetail', line: i }); if (!inventoryDetailId) { var inventoryDetail = record.create({ type: record.Type.INVENTORY_DETAIL, isDynamic: false }); // 关联对应的商品 inventoryDetail.setValue({ fieldId: 'item', value: soItemId }); // 设置库存分配行:quantity对应销售订单行的数量,不要写死1 inventoryDetail.selectNewLine({ sublistId: 'inventoryassignment' }); inventoryDetail.setCurrentSublistValue({ sublistId: 'inventoryassignment', fieldId: 'quantity', value: soItemQty }); // 直接传入serialNumbers[i](库存序列号的内部ID),而非inventoryDetail的ID inventoryDetail.setCurrentSublistValue({ sublistId: 'inventoryassignment', fieldId: 'issueinventorynumber', value: serialNumbers[i] }); inventoryDetail.commitLine({ sublistId: 'inventoryassignment' }); inventoryDetailId = inventoryDetail.save({ ignoreMandatoryFields: false }); } // 把库存明细ID关联到Item Fulfillment的商品行 itemFulfillment.setSublistValue({ sublistId: 'item', fieldId: 'inventorydetail', line: i, value: inventoryDetailId }); } // 保存Item Fulfillment var fulfillmentId = itemFulfillment.save({ ignoreMandatoryFields: false }); return { success: true, fulfillmentId: fulfillmentId }; } catch (e) { return { success: false, errorMessage: e.message, errorDetails: e.stack }; } }
额外注意事项
- 确保
serialNumbers数组中的每个值,都是对应商品的库存序列号(Inventory Number)的内部ID,而不是序列号的显示文本(比如"SN123"这种文本是无效的,必须用NetSuite里该序列号记录的内部ID)。 - 如果销售订单行的商品数量大于1,要确保
inventoryassignment的quantity值和销售订单行的数量一致;如果需要拆分多个序列号,要添加多行inventoryassignment。 - 脚本中添加的try-catch块可以帮你快速排查后续可能出现的其他异常,建议保留。
备注:内容来源于stack exchange,提问作者Paula Sokolowicz
相关产品推荐
相关产品推荐

