mcpField
S
sfcc-business-manager

sfcc-business-manager

github.com/finsilabs其他6078 次安装5 天前更新
代码仓库

关于 sfcc-business-manager

sfcc-business-manager 是面向 SFCC 管理人员和开发者的操作指南,介绍如何通过 Business Manager 管理目录、站点设置、促销和作业。还涵盖 XML 批量导入导出及作业故障排查。

主要功能

  1. 01管理目录与产品数据
  2. 02配置站点偏好设置
  3. 03通过 XML 导入库存和价格
  4. 04配置并运行导入作业
  5. 05查看作业日志并排查问题

适用场景

  1. 01为新 SFCC 站点初始化目录
  2. 02从 ERP 或 PIM 导入产品数据
  3. 03为自定义 cartridge 设置站点偏好
  4. 04排查导入作业失败及错误日志

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/finsilabs/awesome-ecommerce-skills --skill sfcc-business-manager

安装后在 Claude Code 中输入/sfcc-business-manager确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

tile.json
evals/catalog-xml-structure-and-variation-prod/
criteria.json
task.md
evals/import-job-automation-via-webdav-and-job/
criteria.json
task.md
evals/site-preferences-xml-and-cartridge-acces/
criteria.json
task.md

详细介绍

SFCC Business Manager

概述

Business Manager(BM)是 SFCC 管理界面,可通过 https://{instance}.dx.commercecloud.salesforce.com/on/demandware.store/Sites-Site/default/ViewApplication-DisplayWelcomePage 访问。它控制 SFCC 安装的各个方面:目录和商品管理、站点首选项、促销引擎、内容资源、A/B 测试和作业计划。批量数据操作通过 Import & Export 框架使用 XML 导入/导出,该框架通过计划作业处理 IMPEX 目录中的文件。

何时使用此技能

  • 为新的 SFCC 站点执行初始目录设置时
  • 通过 XML 从 ERP 或 PIM 系统导入商品、价格或库存时
  • 为 API 客户端注册配置 OCAPI 设置时
  • 为自定义 cartridge 配置设置站点首选项时
  • 跨站点管理促销、优惠券活动和 A/B 测试时
  • 在 Business Manager 中诊断作业失败或查看导入错误日志时

核心说明

  1. 导航到 Business Manager 的关键区域

    Business Manager URL 遵循以下模式:{instanceUrl}/on/demandware.store/Sites-Site/default/{Controller-Action}:

    # Site Selection (global)
    /on/demandware.store/Sites-Site/default/ViewApplication-DisplayWelcomePage
    
    # Catalog Management (site-specific)
    /on/demandware.store/Sites-{SiteID}/default/ViewCategories-Start
    
    # Site Preferences
    /on/demandware.store/Sites-{SiteID}/default/ViewSitePreference-StartGroups
    
    # OCAPI Settings
    /on/demandware.store/Sites-Site/default/ViewApplicationApiSettings-Start
    
    # Import & Export
    /on/demandware.store/Sites-{SiteID}/default/ViewJobSchedule-Start
    
    # Job Execution
    /on/demandware.store/Sites-Site/default/ViewJobSchedule-Start
    
  2. 通过 XML 目录导入商品

    SFCC 目录 XML 遵循 Demandware 的 catalog.xsd 架构。商品作为目录对象导入:

    <?xml version="1.0" encoding="UTF-8"?>
    <catalog xmlns="http://www.demandware.com/xml/impex/catalog/2006-10-31" catalog-id="your-catalog">
    
      
      <category category-id="electronics">
        <display-name xml:lang="x-default">Electronics</display-name>
        <display-name xml:lang="en-US">Electronics</display-name>
        <online-flag>true</online-flag>
        <parent>root</parent>
      </category>
    
      
      <product product-id="PROD-001">
        <ean>1234567890123</ean>
        <upc>123456789012</upc>
        <display-name xml:lang="x-default">Wireless Headphones Pro</display-name>
        <display-name xml:lang="en-US">Wireless Headphones Pro</display-name>
        <long-description xml:lang="x-default">Premium wireless headphones with ANC</long-description>
        <online-flag>true</online-flag>
        <available-flag>true</available-flag>
        <searchable-flag>true</searchable-flag>
        <tax-class-id>standard</tax-class-id>
        <brand>AudioPro</brand>
        <manufacturer-sku>AP-WH-001</manufacturer-sku>
        <classification-category catalog-id="your-catalog">electronics</classification-category>
        <images>
          <image-group view-type="large">
            <image path="products/PROD-001-large.jpg"/>
          </image-group>
          <image-group view-type="small">
            <image path="products/PROD-001-small.jpg"/>
          </image-group>
        </images>
        <custom-attributes>
          <custom-attribute attribute-id="color">Black</custom-attribute>
          <custom-attribute attribute-id="batteryLife">30</custom-attribute>
        </custom-attributes>
      </product>
    
      
      <product product-id="SHIRT-MASTER">
        <display-name xml:lang="x-default">Classic Cotton Shirt</display-name>
        <online-flag>true</online-flag>
        <classification-category catalog-id="your-catalog">apparel</classification-category>
        <variations>
          <attributes>
            <variation-attribute attribute-id="color" variation-attribute-id="color">
              <display-name xml:lang="x-default">Color</display-name>
              <variation-attribute-values>
                <variation-attribute-value value="Blue">
                  <display-value xml:lang="x-default">Blue</display-value>
                </variation-attribute-value>
                <variation-attribute-value value="Red">
                  <display-value xml:lang="x-default">Red</display-value>
                </variation-attribute-value>
              </variation-attribute-values>
            </variation-attribute>
            <variation-attribute attribute-id="size" variation-attribute-id="size">
              <display-name xml:lang="x-default">Size</display-name>
              <variation-attribute-values>
                <variation-attribute-value value="S"><display-value xml:lang="x-default">S</display-value></variation-attribute-value>
                <variation-attribute-value value="M"><display-value xml:lang="x-default">M</display-value></variation-attribute-value>
                <variation-attribute-value value="L"><display-value xml:lang="x-default">L</display-value></variation-attribute-value>
              </variation-attribute-values>
            </variation-attribute>
          </attributes>
          <variants>
            <variant product-id="SHIRT-BLUE-S"/>
            <variant product-id="SHIRT-BLUE-M"/>
            <variant product-id="SHIRT-RED-M"/>
          </variants>
        </variations>
      </product>
    
      
      <product product-id="SHIRT-BLUE-S">
        <display-name xml:lang="x-default">Classic Cotton Shirt - Blue / S</display-name>
        <online-flag>true</online-flag>
        <variation-attribute-values>
          <variation-attribute-value attribute-id="color">Blue</variation-attribute-value>
          <variation-attribute-value attribute-id="size">S</variation-attribute-value>
        </variation-attribute-values>
      </product>
    
      
      <category-assignment category-id="electronics" product-id="PROD-001">
        <primary-flag>true</primary-flag>
      </category-assignment>
    </catalog>
    
  3. 导入库存和价格

    
    <?xml version="1.0" encoding="UTF-8"?>
    <inventory xmlns="http://www.demandware.com/xml/impex/inventory/2007-05-31">
      <inventory-list>
        <header list-id="your-inventory-list">
          <default-in-stock>false</default-in-stock>
          <description>Main Inventory</description>
        </header>
        <records>
          <record product-id="PROD-001">
            <allocation>150.00</allocation>
            <allocation-timestamp>2026-03-12T00:00:00.000Z</allocation-timestamp>
            <perpetual>false</perpetual>
            <preorderable>false</preorderable>
            <backorderable>false</backorderable>
          </record>
          <record product-id="SHIRT-BLUE-S">
            <allocation>42.00</allocation>
            <perpetual>false</perpetual>
          </record>
        </records>
      </inventory-list>
    </inventory>
    
    
    <?xml version="1.0" encoding="UTF-8"?>
    <pricebooks xmlns="http://www.demandware.com/xml/impex/pricebook/2006-10-31">
      <pricebook>
        <header pricebook-id="usd-m-list-prices">
          <currency>USD</currency>
          <display-name xml:lang="x-default">USD List Prices</display-name>
          <online-flag>true</online-flag>
        </header>
        <price-tables>
          <price-table product-id="PROD-001">
            <amount quantity="1">149.99</amount>
          </price-table>
          <price-table product-id="SHIRT-BLUE-S">
            <amount quantity="1">39.99</amount>
          </price-table>
        </price-tables>
      </pricebook>
    </pricebooks>
    
  4. 为自定义 cartridge 设置配置站点首选项

    站点首选项是在 Business Manager → Administration → Site Development → System Object Types → SitePreferences 中定义的自定义属性:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <metadata xmlns="http://www.demandware.com/xml/impex/metadata/2006-10-31">
      <type-extension type-id="SitePreferences">
        <custom-attribute-definitions>
          <attribute-definition attribute-id="myIntegration_apiEndpoint">
            <display-name xml:lang="x-default">My Integration API Endpoint</display-name>
            <type>string</type>
            <mandatory-flag>false</mandatory-flag>
            <externally-managed-flag>false</externally-managed-flag>
            <min-length>0</min-length>
            <max-length>255</max-length>
          </attribute-definition>
          <attribute-definition attribute-id="myIntegration_enabledFlag">
            <display-name xml:lang="x-default">My Integration Enabled</display-name>
            <type>boolean</type>
            <mandatory-flag>false</mandatory-flag>
          </attribute-definition>
        </custom-attribute-definitions>
        <group-definitions>
          <attribute-group group-id="MyIntegration">
            <display-name xml:lang="x-default">My Integration Settings</display-name>
            <attribute attribute-id="myIntegration_apiEndpoint"/>
            <attribute attribute-id="myIntegration_enabledFlag"/>
          </attribute-group>
        </group-definitions>
      </type-extension>
    </metadata>
    

    在 cartridge ISML/控制器中访问:

    // In SFCC ISML controller (server-side JS)
    var Site = require('dw/system/Site');
    var currentSite = Site.getCurrent();
    
    var apiEndpoint = currentSite.getCustomPreferenceValue('myIntegration_apiEndpoint');
    var isEnabled = currentSite.getCustomPreferenceValue('myIntegration_enabledFlag');
    
  5. 配置并运行导入作业

    SFCC 导入作业在 Business Manager → Administration → Operations → Jobs 中配置。作业使用放置在 /IMPEX/src/ 中或通过 Jobs API 上传的 XML Feed 文件:

    // Upload an XML file to IMPEX via OCAPI WebDAV before triggering job
    const importFile = fs.readFileSync('./catalog.xml');
    
    // Upload via WebDAV (SFCC exposes IMPEX as WebDAV)
    const webdavUrl = `${instanceUrl}/on/demandware.servlet/webdav/Sites/Impex/src/catalog-import.xml`;
    
    await fetch(webdavUrl, {
      method: "PUT",
      headers: {
        Authorization: `Basic ${Buffer.from(`${clientId}:${clientSecret}`).toString("base64")}`,
        "Content-Type": "application/xml",
      },
      body: importFile,
    });
    
    // Trigger the import job via Jobs API
    const jobResponse = await fetch(
      `${instanceUrl}/s/-/dw/data/v23_2/jobs/sfcc-site-archive-import/executions`,
      {
        method: "POST",
        headers: {
          Authorization: `Bearer ${adminToken}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          parameters: [
            { name: "ImportFile", value: "catalog-import.xml" },
            { name: "catalogID", value: "your-catalog" },
          ],
        }),
      }
    );
    

示例

导出订单以与 ERP 同步


// Paginated order export via OCAPI Data API
async function exportOrdersSince(sinceDate: string) {
  const token = await getAdminToken();
  const instanceUrl = process.env.SFCC_INSTANCE_URL!;
  const siteId = process.env.SFCC_SITE_ID!;

  let start = 0;
  const count = 100;
  const allOrders = [];

  while (true) {
    const response = await fetch(
      `${instanceUrl}/s/${siteId}/dw/data/v23_2/order_search`,
      {
        method: "POST",
        headers: {
          Authorization: `Bearer ${token}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          query: {
            filtered_query: {
              query: { match_all_query: {} },
              filter: {
                range_filter: {
                  field: "creation_date",
                  from: sinceDate,
                },
              },
            },
          },
          select: "(**)",
          count,
          start,
          sorts: [{ field: "creation_date", sort_order: "asc" }],
        }),
      }
    );

    const { hits, total } = await response.json();
    allOrders.push(...(hits ?? []));
    start += count;
    if (start >= total) break;
  }

  return allOrders;
}
通过 OCAPI 创建促销
async function createPromotion(promo: {
  id: string;
  name: string;
  discountPercent: number;
  startDate: string;
  endDate: string;
}) {
  const token = await getAdminToken();
  const instanceUrl = process.env.SFCC_INSTANCE_URL!;
  const siteId = process.env.SFCC_SITE_ID!;

  await fetch(
    `${instanceUrl}/s/${siteId}/dw/data/v23_2/promotions/${promo.id}`,
    {
      method: "PUT",
      headers: {
        Authorization: `Bearer ${token}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        id: promo.id,
        name: { default: promo.name },
        enabled: true,
        start_date: promo.startDate,
        end_date: promo.endDate,
        discount: {
          type: "percentage",
          value: promo.discountPercent,
        },
        promotion_class: "order",
      }),
    }
  );
}

最佳实践

  • 上传前根据 Demandware 架构验证 XML 导入文件——XSD 文件位于 Business Manager 的 Administration → Site Development → System Object Types 下;无效 XML 会静默失败,且不会提供逐行错误消息
  • 为并发导入使用唯一的作业 ID——SFCC 的每个作业定义都以单线程方式运行;如果需要并行导入目录和库存,请使用多个作业定义
  • 始终在目录 XML 中包含 catalog-id——目录 ID 不匹配或缺失会导致商品导入到错误的目录,或导入彻底失败
  • 先在暂存环境测试导入,再导入生产环境——目录导入没有批量“撤销”功能;请先使用小规模子集进行测试
  • 在 BM → Administration → Operations → Jobs 中监控作业日志——失败的作业会将日志写入 /IMPEX/log/;自动导入后请立即下载并检查日志
  • 对所有本地化字符串使用 <display-name xml:lang="x-default">——必须使用 x-default 区域设置;缺少该设置会导致所有区域设置出现显示问题
  • 通过导入 XML 设置站点首选项,而非手动设置——将所有自定义站点首选项值记录在提交到版本控制的 XML 文件中,以确保环境一致性

常见问题

问题解决方案
已导入商品,但在店面中不可见检查商品的 online-flag 是否为 true、类别分配是否已设置 primary-flag,以及站点目录是否已分配给当前站点
导入作业已完成,但日志显示“0 records processed”确认文件已上传到正确的 IMPEX 路径,并且作业的 ImportFile 参数与文件名完全一致,包括扩展名
自定义站点首选项未显示在 BM UI 中确保已通过 BM → Administration → Site Development → Import & Export 导入 system-objecttype-extensions.xml,并已清除缓存
导入成功,但库存未更新检查 XML 中的 inventory-list list-id 是否与 BM → Merchant Tools → Products and Catalogs 中分配给站点的库存列表相匹配
OCAPI Data API 在触发作业时返回 403客户端 ID 必须具有针对 jobs 资源的 Data API 权限;请在 BM → Administration → Site Development → OCAPI Settings → Data 中确认
显示默认目录价格,而非已导入的价格簿价格在 BM → Merchant Tools → Pricing → Pricebooks 中将价格簿分配给站点客户组;已导入的价格簿在分配前不会生效

相关技能

  • @sfcc-cartridge-development
  • @sfcc-ocapi-scapi
  • @catalog-management
  • @product-import-export
  • @promotion-engine

评论

支持 Markdown