gpt4 book ai didi

javascript - 在 NetSuite 中打印 PDF,并选择多个交易记录

转载 作者:行者123 更新时间:2023-12-03 00:42:36 25 4
gpt4 key购买 nike

有没有办法将许多交易的选择打印到一个 PDF 文档中?我只看到两个选项似乎有明显的缺点:

1) 将各个记录加载到每个自己的 nlobjTemplateRenderer 对象中,然后在渲染为 PDF 之前将它们全部在标签内缝合在一起。交易数量限制为少于 50 笔,具体取决于在 Suitelet 中使用时采取的其他操作。

2) 根据所选记录的内部 ID 进行搜索,并将搜索结果传递到 nlobjTemplateRenderer 对象中。这种基于现有文档的方法并不让我相信它会在单个文档中完全正确地显示带有行数据作为结果列的记录。

看起来我最好的选择是#1,但是将所需的交易分成 5-10 条记录的组,并与小组一起重复调用 Suitelet,以期满足 nlapiRequestURL 的 45 秒超时限制然后将所有结果拼接在一起并返回最终的 PDF 文档。我几乎看到了如下的基本形式:

// initial called function that will return completed PDF document file
function buildPdfFromRecords() {
var pdfBuilder = [];
var selectedIDs = [];
var chunks = chunkify(selectedIDs, 10);
for (var c = 0; c < chunks.length; c++) {
var param = { id_list : JSON.stringify(chunks[s]) };
var result = nlapiRequestURL(url, param).getBody();
pdfBuilder.push(result);
}
var finalXML = "<pdfset>" + pdfBuilder.join("") + "</pdfset>";
var pdfDoc = nlapiXMLToPDF(finalXML);
}

// function in suitelet called by url to handle individual groups of record internal IDs
// to mitigate scripting governance limits
function handleRecordIdListRequest(request, reponse) {
var idList = JSON.parse(request.getParameter("id_list"));
var templateXML = nlapiLoadRecord("template.txt").getValue();
var pdfBuilder = [];
for (var i = 0; i < idList.length; i++) {
var transRecord = nlapiLoadRecord("recordtype", idList[i]);
var renderer = nlapiCreateTemplateRenderer();
renderer.setTemplate(templateXML);
renderer.addRecord("record", transRecord);
pdfBuilder.push(renderer.renderToString());
}
response.write(pdfBuilder.join(""));
}

如果这确实是最好的方法,那就这样吧,但我希望有一个我没有看到的更优雅的解决方案。

最佳答案

您可以将许多部分拼接在一起来完成此任务。

  1. 在 Suitelet 的后处理程序中,使用 N/task 库来安排 Map/Reduce 任务。 task.submit 方法返回一个taskId,您可以使用它来监视作业的进度。一旦你的 UI 有了 taskId,它就可以定期检查任务是否已完成。完成后,您可以显示生成的 .pdf。您还可以让用户知道 pdf 可能需要几分钟才能生成,并在完成后通过电子邮件发送给他们。下面是一个使用参数安排计划脚本的代码片段:

  const mrTask = task.create({
taskType:task.TaskType.SCHEDULED_SCRIPT,
scriptId:'customscript_knsi_batch_products',
deploymentId: deploymentId,
params: {
custscript_knsi_batch_operator:user.id,
custscript_knsi_batch_sourcing: sourcingId
}
});

try{
const taskId = mrTask.submit();
context.response.setHeader({name:'content-type', value:'application/json'});
context.response.write(JSON.stringify({
success:true,
message:'queued as task: '+ taskId
}));
}catch(e){
log.error({
title:'triggering '+ sourcingId +' for '+ user.email,
details:(e.message || e.toString()) + (e.getStackTrace ? (' \n \n' + e.getStackTrace().join(' \n')) : '')
});
context.response.setHeader({name:'content-type', value:'application/json'});
context.response.write(JSON.stringify({
success:false,
message:'An error occured scheduling this script\n'+e.message
}));

  • 使用 Map/Reduce 脚本,其中您的映射方法会生成并返回每个交易的 pdf 文件 URL。您只有一个键,以便所有映射阶段的结果合并到一个reduce中。
  • 在reduce步骤中,您可以根据需要生成打开和关闭的pdf文件,并将其引用放入映射的pdf数组中。
  • 使用 pdfset 将所有单独的 pdf 绑定(bind)到一个 pdf 中:
  • function renderSet(opts){
    var tpl = ['<?xml version="1.0"?>','<pdfset>'];

    opts.files.forEach(function(id, idx){
    const partFile = file.load({id:id});
    var pdf_fileURL = xml.escape({xmlText:partFile.url});
    tpl.push("<pdf src='" + pdf_fileURL + "'/>");
    });

    tpl.push("</pdfset>");

    log.debug({title:'bound template', details:xml.escape({xmlText:tpl.join('\n')})});

    return render.xmlToPdf({
    xmlString: tpl.join('\n')
    });
    }

    关于javascript - 在 NetSuite 中打印 PDF,并选择多个交易记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382843/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com