NetSuite RESTlet写入性能较差

编辑:我已经编辑了实际数字,并将其替换为伪装,因为我被告知共享性能数据违反NetSuite的TOS。

我正在使用RESTlet将我们的记账系统与NetSuite集成在一起,总体来说,它运行得很好,只有一个明显的例外:性能。我已经了解到,从性能角度来看,nlip iLoadRecord是撒旦自己的孩子,所以我尽可能避免使用它,更倾向于使用搜索API,现在我的Read RESTlet非常快。然而,每当我要求休息程序写任何东西时,它都像乌龟卡在冰冷的焦油里一样慢。我通常在慢和真他妈的慢秒之间分析nlipiSubmitRecord本身。在我看来,这太疯狂了。如果NetSuite的性能总是这么差,没有人会使用NetSuite。我将在下面包括几个代码示例。任何关于加快NetSuite RESTlet写入性能的提示都将不胜感激。

在第一个函数中,ReceivedInvoice是传入的数据,findCurrencyCode和findCustomerByCustomerNumber很好地执行了执行这些操作的函数。我刚刚看到了一个几乎令人难以置信的天哪,对于一张只有一行项目的简单发票来说,它慢了秒,几乎所有的时间都过去了,我一直在等待nlip iSubmitRecord完成。

var createdInvoice = nlapiCreateRecord('invoice');

createdInvoice.setFieldValue('customform', Number(receivedInvoice.transactionType));
createdInvoice.setFieldValue('memo', receivedInvoice.message);
createdInvoice.setFieldValue('duedate', receivedInvoice.dateDue);

createdInvoice.setFieldValue('currency', findCurrencyCode(receivedInvoice.currencyUnit));
createdInvoice.setFieldValue('location', Number(receivedInvoice.location));
createdInvoice.setFieldValue('postingperiod', findPostingPeriod(receivedInvoice.datePosted));
var customer = findCustomerByCustomerNumber(receivedInvoice.customerNumber);

createdInvoice.setFieldValue('entity', customer.customerId );
createdInvoice.setFieldValue('custbody_end_user', customer.customerId );
createdInvoice.setFieldValue('department', customer.departmentId);

var itemCount = receivedInvoice.items.length;
for(var i = 0; i < itemCount; i++)
{
  createdInvoice.selectNewLineItem('item');
  createdInvoice.setCurrentLineItemValue('item', 'item',receivedInvoice.items[i].item);
  createdInvoice.setCurrentLineItemValue('item', 'quantity', receivedInvoice.items[i].quantity);
  createdInvoice.setCurrentLineItemValue('item', 'rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'custcol_list_rate',receivedInvoice.items[i].price);
  createdInvoice.setCurrentLineItemValue('item', 'amount',receivedInvoice.items[i].totalAmount);
  createdInvoice.setCurrentLineItemValue('item', 'description',receivedInvoice.items[i].description);
  createdInvoice.commitLineItem('item');
}

var recordNumber = nlapiSubmitRecord(createdInvoice,false,true);

在这个示例中,我认为在动态模式下打开记录是在犯下性能异端邪说,但我不确定如何获得可能的行项目。只需在动态模式下打开新记录,就会以大约慢秒的速度计时。同样,提交是消耗时间最多的地方(通常在OH亲爱的可怕的秒左右),尽管这一次在我处理行项目时消耗了相当多的时间,这可能是因为我在动态模式下打开了记录。

var customerPayment = nlapiCreateRecord('customerpayment',{recordmode: 'dynamic'});

customerPayment.setFieldValue('customer', parseInt(customerId));
customerPayment.setFieldValue('payment', paymentAmount);
customerPayment.setFieldValue('paymentmethod', paymentMethod);
customerPayment.setFieldValue('checknum', transactionId);
customerPayment.setFieldValue('currency', currency);
customerPayment.setFieldValue('account', account);

var applyCount = customerPayment.getLineItemCount('apply');

if(applyCount>0)
{
    for(var i=1;i<=applyCount;i++)
    {
        var thisInvoice = customerPayment.getLineItemValue('apply','refnum',i);

        if(thisInvoice == invoiceToPay)
        {
            customerPayment.selectLineItem('apply', i);
            customerPayment.setCurrentLineItemValue('apply','apply','T');
            customerPayment.setCurrentLineItemValue('apply', 'amount',paymentAmount);
            customerPayment.commitLineItem('apply');
        }
    }

}
nlapiSubmitRecord(customerPayment,false,true);

解决方案

几点想法:

  1. (只是发泄一下)将您的会计系统与NetSuite集成听起来很奇怪。NetSuite是一个会计系统,通常是使用它的组织的会计记录系统。如果您不使用NetSuite进行记账,您可能需要考虑它的价格实用程序,然后停止使用它。
  2. 当我将外部系统与NetSuite集成时,我通常会尝试将其设置为异步。为此,我将原始信息放入一个定制记录中,然后启动一个计划的脚本来处理排队的更新。这可以让我的API快速返回。当我处理队列时,我会将错误存储在队列记录中,以便在出现问题时可以修复数据或代码并重新提交。
  3. 事务提交缓慢的一个明显的主要来源(除了缓慢的UE脚本之外)是您的图书的状态。我有一个创业客户,他做得很好,但他们从来没有结账,而且他们使用IIRC平均成本计算。每次他们保存一项发布交易时,NetSuite都会重新计算整个时间段(对于一个非常繁忙的网站来说,这段时间大约是两年的记录)。当他们开始关闭时,交易保存时间大幅下降。当他们转换到标准成本计算时,事务保存时间再次下降(我想后进先出会比平均快,比标准慢,但YMMV)

还要注意您的代码。

开具发票的正常方式是

nlapiTransformRecord('customer', customer.customerId, 'invoice'); nlapiTransformRecord('customer', customer.customerId, 'invoice', {recordmode:'dynamic'});

我从未测试过这是否会影响提交时间,但它可能会有所帮助,因为NS会从稍微好一点的地方开始保存(抓住救命稻草,但对于NS,有时不明显的更改会带来速度上的好处)

也不确定如何在动态模式下更改自定义表单。知道表单后,您还可以将其添加到初始化默认设置中:

{recordmode:'dynamic', customform:receivedInvoice.transactionType}

相关文章