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

如何在NetSuite中拆分Suitelet脚本为自定义模块与XML模板

NetSuite XML生成脚本重构实现

一、自定义XML生成模块(处理核心逻辑)

负责加载发票数据、渲染XML模板并生成文件对象,专注于业务逻辑实现:

// 自定义XML生成模块
var TEMPLATE_FILE_ID = "36530"; // 替换为实际XML模板文件ID

define(["N/file", "N/render", "N/record", "N/search", "SuiteScripts/pts_helper1"],
    function (file, render, record, search, util) {

        function generateXml(invoiceId) {
            // 加载目标发票记录
            var invoiceRecord = record.load({
                type: record.Type.INVOICE,
                id: invoiceId
            });

            // 加载XML模板文件
            var xmlTemplateFile = file.load({
                id: TEMPLATE_FILE_ID
            });
        
            // 组装模板所需的业务数据(可按需扩展字段)
            const customData = {
                invoiceId: invoiceId,
                tranId: invoiceRecord.getValue({ fieldId: 'tranid' }),
                customerName: invoiceRecord.getText({ fieldId: 'entity' }),
                totalAmount: invoiceRecord.getValue({ fieldId: 'total' })
            };

            // 使用模板渲染器生成XML内容
            var renderer = render.create();
            renderer.templateContent = xmlTemplateFile.getContents();
            renderer.addCustomDataSource({
                format: render.DataSource.OBJECT,
                alias: "customData",
                data: customData
            });
            var xmlContent = renderer.renderAsString();

            // 创建XML文件对象并返回
            var xmlFile = file.create({
                name: `Invoice_${invoiceId}.xml`,
                fileType: file.Type.XML,
                contents: xmlContent
            });

            return xmlFile;
        }

        return {
            generateXml: generateXml
        }
    });

二、XML模板文件(定义输出结构)

独立维护XML的格式与节点结构,通过占位符绑定业务数据:

<?xml version="1.0" encoding="ISO-8859-1"?>
<InvoiceDocument>
    <InvoiceHeader>
        <INVOICE_ID>${customData.invoiceId}</INVOICE_ID>
        <TRANSACTION_NUMBER>${customData.tranId}</TRANSACTION_NUMBER>
        <CUSTOMER_NAME>${customData.customerName}</CUSTOMER_NAME>
        <TOTAL_AMOUNT>${customData.totalAmount}</TOTAL_AMOUNT>
    </InvoiceHeader>
    <!-- 可按需添加更多XML节点,如明细行、税信息等 -->
</InvoiceDocument>

三、Suitelet脚本(处理请求与响应)

作为入口层,负责接收请求参数、调用核心模块、返回最终XML响应:

/**
 *@NApiVersion 2.1
 *@NScriptType Suitelet
 */
define(["SuiteScripts/mp_ptc_module"], function(customXML) {

    function onRequest(context) {
        try {
            // 从请求参数获取发票ID(支持动态传参,默认值为测试用ID)
            var recId = context.request.parameters.recId || 1057613;
            
            // 调用自定义模块生成XML文件
            var xmlFile = customXML.generateXml(recId);
            
            // 将XML文件直接作为响应返回
            context.response.writeFile({ 
                file: xmlFile, 
                isInline: true 
            });
        } catch (e) {
            log.error("XML生成失败", e);
            context.response.write(`生成XML出错:${e.message}`);
        }
    }

    return {
        onRequest: onRequest
     }
});

重构说明

  • 职责分离:模块、模板、入口脚本各司其职,便于维护与扩展
  • 动态适配:支持从请求参数接收发票ID,避免硬编码限制
  • 格式合规:修正原XML模板的标签闭合错误,保证输出内容符合XML规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:05:18