订单事件
本页面介绍订单相关的事件类型及处理示例。
事件列表
| 事件标识 | 说明 | payload |
|---|---|---|
| ORDER_CREATE_SUCCESS | 订单创建成功 | 订单号 |
| ORDER_CANCEL | 订单取消 | 订单号 |
| ORDER_PAY_SUCCESS | 订单支付成功 | 订单号 |
| ORDER_DELIVERY_PART | 订单部分发货成功 | 订单号 |
| ORDER_DELIVERY_ALL | 订单全部发货成功 | 订单号 |
| ORDER_CONFIRM_RECEIPT | 订单确认收货 | 订单号 |
| ORDER_COMMENT | 订单评价 | 订单号 |
| ORDER_REFUND_APPLY | 订单申请退款成功 | 退款订单号 |
| ORDER_REFUND_AGREE | 订单同意退款 | 退款订单号 |
| ORDER_REFUND_REFUSE | 订单拒绝退款 | 退款订单号 |
| ORDER_REFUND_CANCEL | 订单取消退款 | 退款订单号 |
| ORDER_RETURN_COMPLETE | 订单退货完成 | 退款订单号 |
事件数据结构
所有订单事件的payload通常是订单号(String类型):
json
{
"eventKey": "ORDER_PAY_SUCCESS",
"payload": "202401010001",
"timestamp": 1704067200000
}ORDER_CREATE_SUCCESS - 订单创建成功
用户提交订单成功时触发。
触发时机
- 用户在前端确认下单
- 订单数据写入数据库后
处理示例
javascript
// 接口路径: /custom/event/order-create
// 处理 ORDER_CREATE_SUCCESS 事件
var event = payload.event;
var orderNo = event.payload;
log.info("处理订单创建事件: orderNo={}", orderNo);
// 查询订单详情
var order = db.selectOne(`
SELECT o.*, m.mer_name, u.nickname, u.phone
FROM eb_store_order o
LEFT JOIN eb_merchant m ON o.mer_id = m.id
LEFT JOIN eb_user u ON o.uid = u.uid
WHERE o.order_id = ?
`, orderNo);
// 查询订单商品
var products = db.select(`
SELECT product_id, product_name, sku, cart_num, price
FROM eb_store_order_info
WHERE order_no = ?
`, orderNo);
// 发送新订单通知给商户
http.post(env.get('DINGTALK_WEBHOOK'), {
body: {
msgtype: 'text',
text: {
content: '【新订单通知】\n' +
'订单号:' + orderNo + '\n' +
'下单用户:' + order.nickname + '\n' +
'订单金额:¥' + (order.total_price / 100).toFixed(2)
}
}
});
return { success: true };ORDER_PAY_SUCCESS - 订单支付成功
订单支付完成时触发。
触发时机
- 微信/支付宝支付成功回调
- 余额支付成功
处理示例:同步ERP
javascript
// 接口路径: /custom/erp/order-sync
// 处理 ORDER_PAY_SUCCESS 事件
var event = payload.event;
var orderNo = event.payload;
log.info("处理订单支付成功事件: orderNo={}", orderNo);
// 查询订单详情
var order = db.selectOne(`
SELECT o.*, u.phone, u.nickname
FROM eb_store_order o
LEFT JOIN eb_user u ON o.uid = u.uid
WHERE o.order_id = ?
`, orderNo);
if (!order) {
log.error("订单不存在: {}", orderNo);
return { success: false, message: "订单不存在" };
}
// 查询订单商品
var products = db.select(`
SELECT product_id, product_name, sku, cart_num as num, price
FROM eb_store_order_info
WHERE order_no = ?
`, orderNo);
// 查询收货地址
var address = db.selectOne(`
SELECT * FROM eb_store_order_address
WHERE order_no = ?
`, orderNo);
// 转换为ERP格式
var erpOrder = {
sourceOrderNo: order.order_id,
sourceSystem: "MISEB",
customerId: "MISEB_" + order.uid,
customerName: order.nickname,
customerPhone: order.phone,
payAmount: order.pay_price / 100,
payType: order.pay_type,
payTime: order.pay_time,
shippingAddress: {
name: address.real_name,
phone: address.user_phone,
province: address.province,
city: address.city,
district: address.district,
detail: address.detail
},
items: products.map(p => ({
skuCode: "MISEB_" + p.product_id,
productName: p.product_name,
spec: p.sku,
quantity: p.num,
price: p.price / 100
}))
};
// 调用ERP接口
var result = http.post(env.get('ERP_API_URL') + '/order/create', {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
},
body: erpOrder,
timeout: 10000
});
if (result.code == 0 || result.code == 200) {
// 记录ERP订单号
db.update(`
UPDATE eb_store_order
SET mark = CONCAT(IFNULL(mark,''), ' ERP:', ?)
WHERE order_id = ?
`, result.data?.erpOrderId, orderNo);
log.info("订单同步ERP成功: orderNo={}, erpOrderId={}", orderNo, result.data?.erpOrderId);
return { success: true, erpOrderId: result.data?.erpOrderId };
} else {
log.error("订单同步ERP失败: orderNo={}, error={}", orderNo, result.message);
return { success: false, message: result.message };
}ORDER_DELIVERY_ALL - 订单全部发货成功
商户发货且全部商品发出时触发。
处理示例:发送发货通知
javascript
// 接口路径: /custom/notify/shipping
// 处理 ORDER_DELIVERY_ALL 事件
var event = payload.event;
var orderNo = event.payload;
log.info("处理发货事件: orderNo={}", orderNo);
// 查询订单和物流信息
var order = db.selectOne(`
SELECT o.order_id, o.uid, u.phone, u.nickname
FROM eb_store_order o
LEFT JOIN eb_user u ON o.uid = u.uid
WHERE o.order_id = ?
`, orderNo);
// 查询物流信息
var logistics = db.selectOne(`
SELECT delivery_name, delivery_id
FROM eb_store_order
WHERE order_id = ?
`, orderNo);
// 发送短信通知
if (order.phone) {
http.post(env.get('SMS_API_URL') + '/send', {
headers: {
'Authorization': 'Bearer ' + env.get('SMS_API_KEY')
},
body: {
phone: order.phone,
template: 'order_shipped',
params: {
orderNo: orderNo,
expressName: logistics.delivery_name,
expressNo: logistics.delivery_id
}
}
});
log.info("发货短信已发送: phone={}", order.phone);
}
return { success: true };ORDER_CONFIRM_RECEIPT - 订单确认收货
用户确认收货时触发。
处理示例:计算分销佣金
javascript
// 接口路径: /custom/distribution/calc-commission
// 处理 ORDER_CONFIRM_RECEIPT 事件
var event = payload.event;
var orderNo = event.payload;
log.info("处理确认收货事件: orderNo={}", orderNo);
// 查询订单
var order = db.selectOne(`
SELECT * FROM eb_store_order WHERE order_id = ?
`, orderNo);
// 查询用户的推荐人
var user = db.selectOne(`
SELECT uid, spread_uid FROM eb_user WHERE uid = ?
`, order.uid);
if (user.spread_uid > 0) {
// 计算佣金(假设10%)
var commission = Math.floor(order.pay_price * 0.1);
// 记录佣金
db.insert(`
INSERT INTO eb_user_brokerage_record
(uid, link_id, link_type, type, title, price, status, create_time)
VALUES (?, ?, 'order', 1, '订单佣金', ?, 1, NOW())
`, user.spread_uid, order.id, commission);
// 更新用户佣金余额
db.update(`
UPDATE eb_user
SET brokerage_price = brokerage_price + ?
WHERE uid = ?
`, commission, user.spread_uid);
log.info("佣金计算完成: spreadUid={}, commission={}", user.spread_uid, commission);
}
return { success: true };ORDER_CANCEL - 订单取消
订单被取消时触发(用户取消、商户取消、超时关闭)。
处理示例:恢复库存&同步ERP
javascript
// 接口路径: /custom/erp/order-cancel
// 处理 ORDER_CANCEL 事件
var event = payload.event;
var orderNo = event.payload;
log.info("处理订单取消事件: orderNo={}", orderNo);
// 查询订单状态
var order = db.selectOne(`
SELECT order_id, status, refund_status FROM eb_store_order
WHERE order_id = ?
`, orderNo);
// 同步取消到ERP
var result = http.post(env.get('ERP_API_URL') + '/order/cancel', {
headers: {
'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
},
body: {
sourceOrderNo: orderNo,
sourceSystem: "MISEB",
cancelReason: "用户取消订单"
}
});
log.info("ERP订单取消同步: orderNo={}, result={}", orderNo, result);
return { success: true };ORDER_REFUND_APPLY - 订单申请退款成功
用户申请退款成功时触发。
处理示例:退款审核通知
javascript
// 接口路径: /custom/notify/refund-apply
// 处理 ORDER_REFUND_APPLY 事件
var event = payload.event;
var refundOrderNo = event.payload; // 注意:这里是退款订单号
log.info("处理退款申请事件: refundOrderNo={}", refundOrderNo);
// 查询退款订单
var refund = db.selectOne(`
SELECT r.*, o.mer_id, m.mer_name, m.alert_phone
FROM eb_store_refund_order r
LEFT JOIN eb_store_order o ON r.order_no = o.order_id
LEFT JOIN eb_merchant m ON o.mer_id = m.id
WHERE r.refund_order_no = ?
`, refundOrderNo);
// 发送钉钉通知给商户
http.post(env.get('DINGTALK_WEBHOOK'), {
body: {
msgtype: 'text',
text: {
content: '【退款申请通知】\n' +
'商户:' + refund.mer_name + '\n' +
'退款单号:' + refundOrderNo + '\n' +
'退款金额:¥' + (refund.refund_price / 100).toFixed(2) + '\n' +
'退款原因:' + refund.refund_reason_wap + '\n' +
'请及时处理!'
}
}
});
return { success: true };ORDER_REFUND_AGREE - 订单同意退款
商户同意退款时触发。
处理示例:同步退款到ERP
javascript
// 接口路径: /custom/erp/refund-sync
// 处理 ORDER_REFUND_AGREE 事件
var event = payload.event;
var refundOrderNo = event.payload;
log.info("处理退款同意事件: refundOrderNo={}", refundOrderNo);
// 查询退款订单
var refund = db.selectOne(`
SELECT * FROM eb_store_refund_order
WHERE refund_order_no = ?
`, refundOrderNo);
// 同步到ERP
var result = http.post(env.get('ERP_API_URL') + '/refund/create', {
headers: {
'Authorization': 'Bearer ' + env.get('ERP_API_KEY')
},
body: {
sourceRefundNo: refundOrderNo,
sourceOrderNo: refund.order_no,
refundAmount: refund.refund_price / 100,
refundReason: refund.refund_reason_wap
}
});
log.info("ERP退款同步: refundOrderNo={}, result={}", refundOrderNo, result);
return { success: true };数据库表参考
eb_store_order 订单主表
| 字段 | 说明 |
|---|---|
| order_id | 订单号 |
| uid | 用户ID |
| mer_id | 商户ID |
| total_price | 订单总价(分) |
| pay_price | 实付金额(分) |
| pay_type | 支付方式 |
| pay_time | 支付时间 |
| status | 订单状态 |
| delivery_name | 快递公司 |
| delivery_id | 快递单号 |
eb_store_order_info 订单商品表
| 字段 | 说明 |
|---|---|
| order_no | 订单号 |
| product_id | 商品ID |
| product_name | 商品名称 |
| sku | 规格 |
| cart_num | 数量 |
| price | 单价(分) |
eb_store_refund_order 退款订单表
| 字段 | 说明 |
|---|---|
| refund_order_no | 退款订单号 |
| order_no | 原订单号 |
| refund_price | 退款金额(分) |
| refund_reason_wap | 退款原因 |
| refund_status | 退款状态 |
