Skip to content

营销事件

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

事件列表

事件标识说明payload
MARKETING_COUPON_RECEIVE领取优惠券优惠券领取记录ID
MARKETING_COUPON_USE使用优惠券优惠券使用记录ID
MARKETING_GROUP_JOIN参与拼团成功拼团记录数据对象
MARKETING_GROUP_SUCCESS拼团完成拼团ID
MARKETING_GROUP_FAIL拼团失败拼团ID
MARKETING_SECKILL_SUCCESS参与秒杀成功秒杀订单号

事件数据结构

营销事件的payload类型各不相同,需要根据事件类型区分:

json
// 优惠券事件
{
  "eventKey": "MARKETING_COUPON_RECEIVE",
  "payload": 12345,  // 领取记录ID
  "timestamp": 1704067200000
}

// 拼团事件
{
  "eventKey": "MARKETING_GROUP_JOIN",
  "payload": {       // 拼团记录对象
    "groupId": 100,
    "orderId": "202401010001",
    "userId": 12345
  },
  "timestamp": 1704067200000
}

MARKETING_COUPON_RECEIVE - 领取优惠券

用户领取优惠券时触发。

处理示例:优惠券领取统计

javascript
// 接口路径: /custom/marketing/coupon-receive
// 处理 MARKETING_COUPON_RECEIVE 事件

var event = payload.event;
var couponUserId = event.payload;  // 优惠券领取记录ID

log.info("处理优惠券领取事件: couponUserId={}", couponUserId);

// 查询领取记录
var couponUser = db.selectOne(`
    SELECT cu.*, c.name as coupon_name, c.money, u.nickname, u.phone
    FROM eb_store_coupon_user cu
    LEFT JOIN eb_store_coupon c ON cu.coupon_id = c.id
    LEFT JOIN eb_user u ON cu.uid = u.uid
    WHERE cu.id = ?
`, couponUserId);

// 更新优惠券领取统计
db.update(`
    UPDATE eb_store_coupon
    SET receive_count = receive_count + 1
    WHERE id = ?
`, couponUser.coupon_id);

// 发送领取通知(可选)
log.info("优惠券领取: user={}, coupon={}, amount={}",
    couponUser.nickname, couponUser.coupon_name, couponUser.money / 100);

return { success: true };

MARKETING_GROUP_JOIN - 参与拼团成功

用户参与拼团下单成功时触发。

处理示例:拼团进度通知

javascript
// 接口路径: /custom/marketing/group-join
// 处理 MARKETING_GROUP_JOIN 事件

var event = payload.event;
var groupData = event.payload;  // 拼团记录对象

log.info("处理参与拼团事件: groupId={}, orderId={}",
    groupData.groupId, groupData.orderId);

// 查询拼团信息
var group = db.selectOne(`
    SELECT gbr.*, gb.people as need_people,
           p.store_name as product_name
    FROM eb_group_buy_record gbr
    LEFT JOIN eb_group_buy gb ON gbr.group_buy_id = gb.id
    LEFT JOIN eb_store_product p ON gb.product_id = p.id
    WHERE gbr.id = ?
`, groupData.groupId);

// 查询当前参团人数
var joinCount = db.selectInt(`
    SELECT COUNT(*) FROM eb_group_buy_record
    WHERE group_id = ? AND status IN (1, 2)
`, group.group_id);

// 通知团长拼团进度
var leader = db.selectOne(`
    SELECT u.phone, u.nickname
    FROM eb_group_buy_record gbr
    LEFT JOIN eb_user u ON gbr.uid = u.uid
    WHERE gbr.group_id = ? AND gbr.is_leader = 1
`, group.group_id);

if (leader.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: leader.phone,
            template: 'group_join_notify',
            params: {
                productName: group.product_name,
                current: joinCount,
                need: group.need_people
            }
        }
    });
}

// 差1人成团时发送催促通知
if (joinCount == group.need_people - 1) {
    log.info("拼团即将成功: groupId={}, 还差1人", group.group_id);
    // 可以发送推送通知给潜在用户
}

return { success: true };

MARKETING_GROUP_SUCCESS - 拼团完成

拼团人数达标,拼团成功时触发。

处理示例:拼团成功通知

javascript
// 接口路径: /custom/marketing/group-success
// 处理 MARKETING_GROUP_SUCCESS 事件

var event = payload.event;
var groupId = event.payload;

log.info("处理拼团成功事件: groupId={}", groupId);

// 查询拼团成员
var members = db.select(`
    SELECT gbr.*, u.phone, u.nickname, o.order_id
    FROM eb_group_buy_record gbr
    LEFT JOIN eb_user u ON gbr.uid = u.uid
    LEFT JOIN eb_store_order o ON gbr.order_id = o.id
    WHERE gbr.group_id = ?
`, groupId);

// 查询商品信息
var group = db.selectOne(`
    SELECT gb.*, p.store_name
    FROM eb_group_buy gb
    LEFT JOIN eb_store_product p ON gb.product_id = p.id
    WHERE gb.id = (
        SELECT group_buy_id FROM eb_group_buy_record WHERE group_id = ? LIMIT 1
    )
`, groupId);

// 发送成功通知给所有成员
for (member in members) {
    if (member.phone) {
        http.post(env.get('SMS_API_URL') + '/send', {
            body: {
                phone: member.phone,
                template: 'group_success',
                params: {
                    productName: group.store_name,
                    orderNo: member.order_id
                }
            }
        });
    }
}

// 同步到运营后台
http.post(env.get('DINGTALK_WEBHOOK'), {
    body: {
        msgtype: 'text',
        text: {
            content: '【拼团成功】\n' +
                '商品:' + group.store_name + '\n' +
                '拼团人数:' + members.length + '人\n' +
                '团ID:' + groupId
        }
    }
});

log.info("拼团成功通知已发送: groupId={}, memberCount={}", groupId, members.length);

return { success: true };

MARKETING_GROUP_FAIL - 拼团失败

拼团超时未成团时触发。

处理示例:拼团失败退款

javascript
// 接口路径: /custom/marketing/group-fail
// 处理 MARKETING_GROUP_FAIL 事件

var event = payload.event;
var groupId = event.payload;

log.info("处理拼团失败事件: groupId={}", groupId);

// 查询拼团成员
var members = db.select(`
    SELECT gbr.*, u.phone, u.nickname, o.order_id, o.pay_price
    FROM eb_group_buy_record gbr
    LEFT JOIN eb_user u ON gbr.uid = u.uid
    LEFT JOIN eb_store_order o ON gbr.order_id = o.id
    WHERE gbr.group_id = ?
`, groupId);

// 发送失败通知
for (member in members) {
    if (member.phone) {
        http.post(env.get('SMS_API_URL') + '/send', {
            body: {
                phone: member.phone,
                template: 'group_fail',
                params: {
                    orderNo: member.order_id,
                    refundAmount: (member.pay_price / 100).toFixed(2)
                }
            }
        });
    }
}

// 记录失败日志
db.insert(`
    INSERT INTO group_fail_log (group_id, member_count, fail_time)
    VALUES (?, ?, NOW())
`, groupId, members.length);

log.info("拼团失败处理完成: groupId={}, memberCount={}", groupId, members.length);

return { success: true };

MARKETING_SECKILL_SUCCESS - 参与秒杀成功

用户秒杀下单成功时触发。

处理示例:秒杀订单处理

javascript
// 接口路径: /custom/marketing/seckill-success
// 处理 MARKETING_SECKILL_SUCCESS 事件

var event = payload.event;
var seckillOrderNo = event.payload;

log.info("处理秒杀成功事件: orderNo={}", seckillOrderNo);

// 查询秒杀订单
var order = db.selectOne(`
    SELECT o.*, u.phone, u.nickname,
           s.title as seckill_title, s.price as seckill_price
    FROM eb_store_order o
    LEFT JOIN eb_user u ON o.uid = u.uid
    LEFT JOIN eb_store_seckill s ON o.activity_id = s.id
    WHERE o.order_id = ? AND o.activity_type = 'seckill'
`, seckillOrderNo);

// 更新秒杀销量
db.update(`
    UPDATE eb_store_seckill
    SET sales = sales + 1
    WHERE id = ?
`, order.activity_id);

// 发送秒杀成功通知
if (order.phone) {
    http.post(env.get('SMS_API_URL') + '/send', {
        body: {
            phone: order.phone,
            template: 'seckill_success',
            params: {
                productName: order.seckill_title,
                orderNo: seckillOrderNo,
                price: (order.pay_price / 100).toFixed(2)
            }
        }
    });
}

log.info("秒杀订单处理完成: orderNo={}", seckillOrderNo);

return { success: true };

下一步

成都艾唯特软件有限公司