营销事件
本页面介绍营销相关的事件类型及处理示例。
事件列表
| 事件标识 | 说明 | 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 };