Skip to content

商品事件

本页面介绍商品相关的事件类型及处理示例。

事件列表

事件标识说明payload
PRODUCT_CREATE_SUCCESS商品创建成功商品ID
PRODUCT_UPDATE商品更新商品ID
PRODUCT_ON_SHELF商品上架成功商品ID
PRODUCT_OFF_SHELF商品下架成功商品ID

事件数据结构

所有商品事件的payload商品ID(Long类型):

json
{
  "eventKey": "PRODUCT_CREATE_SUCCESS",
  "payload": 12345,
  "timestamp": 1704067200000
}

PRODUCT_CREATE_SUCCESS - 商品创建成功

商户发布新商品审核通过后触发。

触发时机

  • 商户发布商品审核通过
  • 平台直接发布商品成功

处理示例:同步商品到ERP

javascript
// 接口路径: /custom/erp/product-sync
// 处理 PRODUCT_CREATE_SUCCESS 事件

var event = payload.event;
var productId = event.payload;

log.info("处理商品创建事件: productId={}", productId);

// 查询商品详情
var product = db.selectOne(`
    SELECT p.*, m.mer_name, c.name as category_name
    FROM eb_store_product p
    LEFT JOIN eb_merchant m ON p.mer_id = m.id
    LEFT JOIN eb_store_category c ON p.category_id = c.id
    WHERE p.id = ?
`, productId);

if (!product) {
    log.error("商品不存在: {}", productId);
    return { success: false, message: "商品不存在" };
}

// 查询SKU信息
var skus = db.select(`
    SELECT attr_value_id, sku, price, cost, ot_price, stock, image
    FROM eb_store_product_attr_value
    WHERE product_id = ?
`, productId);

// 转换为ERP格式
var erpProduct = {
    sourceProductId: "MISEB_" + productId,
    sourceSystem: "MISEB",
    name: product.store_name,
    merchantId: product.mer_id,
    merchantName: product.mer_name,
    categoryName: product.category_name,
    mainImage: product.image,
    unit: product.unit_name,
    skus: skus.map(s => ({
        skuId: "MISEB_" + s.attr_value_id,
        skuName: s.sku,
        price: s.price / 100,
        costPrice: s.cost / 100,
        stock: s.stock,
        image: s.image
    }))
};

// 调用ERP接口
var result = http.post(env.get('ERP_API_URL') + '/product/create', {
    headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
    },
    body: erpProduct,
    timeout: 10000
});

if (result.code == 0 || result.code == 200) {
    log.info("商品同步ERP成功: productId={}, erpProductId={}", productId, result.data?.productId);
    return { success: true, erpProductId: result.data?.productId };
} else {
    log.error("商品同步ERP失败: productId={}, error={}", productId, result.message);
    return { success: false, message: result.message };
}

PRODUCT_UPDATE - 商品更新

商品信息修改时触发。

触发时机

  • 商户编辑商品信息
  • 商户修改商品价格
  • 商户修改商品库存

处理示例:同步商品变更到WMS

javascript
// 接口路径: /custom/wms/product-update
// 处理 PRODUCT_UPDATE 事件

var event = payload.event;
var productId = event.payload;

log.info("处理商品更新事件: productId={}", productId);

// 查询商品详情
var product = db.selectOne(`
    SELECT id, store_name, stock, mer_id
    FROM eb_store_product
    WHERE id = ?
`, productId);

// 查询SKU库存
var skus = db.select(`
    SELECT attr_value_id, sku, stock, price
    FROM eb_store_product_attr_value
    WHERE product_id = ?
`, productId);

// 同步到WMS
var result = http.post(env.get('WMS_API_URL') + '/product/sync', {
    headers: {
        'Authorization': 'Bearer ' + env.get('WMS_API_KEY')
    },
    body: {
        sourceProductId: "MISEB_" + productId,
        name: product.store_name,
        totalStock: product.stock,
        skuList: skus.map(s => ({
            skuId: "MISEB_" + s.attr_value_id,
            skuName: s.sku,
            stock: s.stock,
            price: s.price / 100
        }))
    }
});

log.info("WMS商品同步: productId={}, result={}", productId, result);

return { success: true };

PRODUCT_ON_SHELF - 商品上架成功

商品上架销售时触发。

触发时机

  • 商户手动上架商品
  • 定时任务自动上架

处理示例:推送到分销平台

javascript
// 接口路径: /custom/distribution/product-push
// 处理 PRODUCT_ON_SHELF 事件

var event = payload.event;
var productId = event.payload;

log.info("处理商品上架事件: productId={}", productId);

// 查询商品详情
var product = db.selectOne(`
    SELECT p.*, m.mer_name
    FROM eb_store_product p
    LEFT JOIN eb_merchant m ON p.mer_id = m.id
    WHERE p.id = ?
`, productId);

// 检查是否开启分销
if (product.is_brokerage != 1) {
    log.info("商品未开启分销,跳过推送: productId={}", productId);
    return { success: true, message: "未开启分销" };
}

// 推送到分销平台
var result = http.post(env.get('DISTRIBUTION_API_URL') + '/product/publish', {
    headers: {
        'Authorization': 'Bearer ' + env.get('DISTRIBUTION_API_KEY')
    },
    body: {
        productId: "MISEB_" + productId,
        name: product.store_name,
        price: product.price / 100,
        image: product.image,
        commissionRate: product.brokerage_rate,
        merchantName: product.mer_name
    }
});

log.info("分销平台推送: productId={}, result={}", productId, result);

return { success: true };

PRODUCT_OFF_SHELF - 商品下架成功

商品下架时触发。

触发时机

  • 商户手动下架商品
  • 库存为0自动下架
  • 平台强制下架

处理示例:同步下架到其他平台

javascript
// 接口路径: /custom/sync/product-off
// 处理 PRODUCT_OFF_SHELF 事件

var event = payload.event;
var productId = event.payload;

log.info("处理商品下架事件: productId={}", productId);

// 查询商品信息
var product = db.selectOne(`
    SELECT id, store_name, stock, mer_id
    FROM eb_store_product
    WHERE id = ?
`, productId);

// 通知ERP下架
http.post(env.get('ERP_API_URL') + '/product/offline', {
    headers: {
        'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
    },
    body: {
        sourceProductId: "MISEB_" + productId,
        reason: product.stock <= 0 ? "库存不足" : "商户下架"
    }
});

// 通知分销平台下架
http.post(env.get('DISTRIBUTION_API_URL') + '/product/offline', {
    headers: {
        'Authorization': 'Bearer ' + env.get('DISTRIBUTION_API_KEY')
    },
    body: {
        productId: "MISEB_" + productId
    }
});

// 发送下架通知给商户
var merchant = db.selectOne(`
    SELECT mer_name, alert_phone FROM eb_merchant WHERE id = ?
`, product.mer_id);

if (merchant.alert_phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: merchant.alert_phone,
            template: 'product_off_shelf',
            params: {
                productName: product.store_name
            }
        }
    });
}

log.info("商品下架同步完成: productId={}", productId);

return { success: true };

库存预警处理

虽然没有专门的库存变更事件,但可以在商品更新事件中检查库存:

javascript
// 接口路径: /custom/alert/stock-warning
// 处理 PRODUCT_UPDATE 事件,检查库存

var event = payload.event;
var productId = event.payload;

// 查询SKU库存
var lowStockSkus = db.select(`
    SELECT pav.*, p.store_name, m.mer_name, m.alert_phone
    FROM eb_store_product_attr_value pav
    LEFT JOIN eb_store_product p ON pav.product_id = p.id
    LEFT JOIN eb_merchant m ON p.mer_id = m.id
    WHERE pav.product_id = ?
    AND pav.stock < 10
    AND pav.stock > 0
`, productId);

if (lowStockSkus.length > 0) {
    // 构建告警信息
    var alertMessages = lowStockSkus.map(sku =>
        `【${sku.store_name}】规格【${sku.sku}】库存仅剩${sku.stock}件`
    );

    // 发送钉钉告警
    http.post(env.get('DINGTALK_WEBHOOK'), {
        body: {
            msgtype: 'text',
            text: {
                content: '【库存预警】\n' + alertMessages.join('\n')
            }
        }
    });

    log.warn("库存预警: productId={}, lowStockCount={}", productId, lowStockSkus.length);
}

return { success: true };

数据库表参考

eb_store_product 商品表

字段说明
id商品ID
store_name商品名称
mer_id商户ID
category_id分类ID
image主图
price价格(分)
ot_price原价(分)
stock总库存
is_show上架状态
is_brokerage是否开启分销

eb_store_product_attr_value SKU表

字段说明
idSKU ID
product_id商品ID
sku规格名称
price价格(分)
cost成本价(分)
stockSKU库存
imageSKU图片

下一步

成都艾唯特软件有限公司