一、背景
【tapd】:https://www.tapd.cn/20060141/prong/stories/view/1120060141001316092
1. 往期直播有收到用户在直播间评论区反馈想定向听某些商品讲解,评论区无法实时采集用户意愿数据,只能事后分析用于改善下一场直播,无法用于优化当前直播间讲解策略,需有功能承载该场景诉求;
2. 直播间商品初始排序无法人为干预管控,直播开播前运营需手动调整直播间商品展示排序,目前调整排序交互是拖动,效率比较低,严重影响操作效率,需优化;
二、需求拆分
工程:afterpay_offline_marking_server
分支:rel_liveAsk_1316092
2.1 直播间商品求讲解功能
2.1.1 用户端
![](https://doc.oa.fenqile.com/uploader/f/PVUU9nb7RXTYEeCC.jpg?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3MTY0MzQ3NzEsImZpbGVHVUlEIjoibGJFRHRtV1BTa0JJRUcxUyIsImlhdCI6MTcxNjQzNDE3MSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjoxMDAwMDAwMDc3NX0.K_N1hyVTeFodO-sK2P8AQWRCgt1AAKvL4FngoFTW_eI)
实现解析
模块 | 设计 | 内容 | 备注 |
用户点击商品求讲解 | 网关 | 新增【商品求讲解】功能接口网关:/route0002/ecLive/incrProductAskCount.json入参:liveId + skuId + 登录态 | |
用户明细记录 | 异步将明细写入Kakfa,上报给大数据 | ||
统计计数 | Redis实现Key: AskCountNum : liveId + skuIdValue: askCount有效期:7s(正常情况5S就会删除一次) | ||
数据落库 | 延时队列每5s将Redis中的数据同步到数据表(直播商品属性统计表) | t_live_sku_attribute_statis_record |
2.1.2 管理端
![](https://doc.oa.fenqile.com/uploader/f/BSKlWlvQQ61xYFQc.jpg?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjE3MTY0MzQ3NzEsImZpbGVHVUlEIjoibGJFRHRtV1BTa0JJRUcxUyIsImlhdCI6MTcxNjQzNDE3MSwiaXNzIjoidXBsb2FkZXJfYWNjZXNzX3Jlc291cmNlIiwidXNlcklkIjoxMDAwMDAwMDc3NX0.K_N1hyVTeFodO-sK2P8AQWRCgt1AAKvL4FngoFTW_eI)
实现解析
模块 | 设计 | 内容 | 备注 |
直播选品统计页展示 | 网关 | 新增【查询直播选品统计详情】功能接口网关:oa/mix/live/queryLiveSelectStatis.json入参:liveId + skuId + 登录态 | |
查询选品信息(已有) | rc_oa_gateway/mix/selection/selectGoodsAdminQuery.json | ||
查询已讲解次数 + 求讲解人数 | 查询统计表 | t_live_sku_attribute_statis_record | |
商品求讲解趋势图 | 接入大数据实现 | 通过大数据侧明细实现 | |
直播选品讲解/取消讲解 | 更新库表【讲解中的商品】 | 更新直播间管理表 | t_live_event_record |
更新【已讲解次数】、【求讲解次数】 | 更新统计表 | t_live_sku_attribute_statis_record | |
更新缓存【讲解中商品】、【求讲解次数】 | Key见上述缓存设计 |
2.1.3 缓存设计
- 商品求讲解统计
Key: AskCountNum_liveId + skuId
Value: askCount
2.1.4 延时队列设计
- RocketMQ
Topic: LIVE_SKU_ASK_COUNT_STATIS_TOPIC
Group: LIVE_SKU_ASK_COUNT_STATIS_TOPIC_GROUP
2.1.5 库表设计
- 直播商品属性统计表
CREATE TABLE `t_live_sku_attribute_statis_record` (
`Fid` int(11) NOT NULL AUTO_INCREMENT COMMENT ‘自增主键’,
`Flive_activity_id` varchar(32) NOT NULL DEFAULT ” COMMENT ‘直播间ID’,
`Fsku_id` varchar(32) NOT NULL DEFAULT ” COMMENT ‘商品ID’,
`Fextend_info` varchar(128) NOT NULL DEFAULT ” COMMENT ‘扩展信息’,
`Fversion` int(11) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘版本号’,
`Fcreate_time` datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘创建时间’,
`Fmodify_time` datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘修改时间’,
`Fask_count` int(20) NOT NULL DEFAULT ‘0’ COMMENT ‘求讲解人数’,
`Fexplained_count` int(20) NOT NULL DEFAULT ‘0’ COMMENT ‘已讲解次数’,
`Fjg_auto_test_id` varchar(256) NOT NULL DEFAULT ”,
PRIMARY KEY (`Fid`) USING BTREE,
UNIQUE KEY `idx_unique_live_sku` (`Flive_activity_id`,`Fsku_id`),
KEY `idx_modify_time` (`Fmodify_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’直播|直播商品属性统计表|breakyang|20240116′;
- 直播商品属性用户明细表(在大数据侧建表)
CREATE TABLE ec_live_db.t_live_sku_use_record(
`Fid` int(20) NOT NULL AUTO_INCREMENT COMMENT ‘自增主键’,
`Flive_activity_id` varchar(32) NOT NULL DEFAULT ‘0’ COMMENT ‘直播ID’,
`Fsku_id` varchar(32) NOT NULL DEFAULT ” COMMENT ‘商品ID’,
`Fuid` int(20) NOT NULL DEFAULT ‘0’ COMMENT ‘用户Uid’,
`Fextend` varchar(256) NOT NULL DEFAULT ” COMMENT ‘扩展信息’,
`Fmodify_time` datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘修改时间’,
`Fcreate_time` datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘创建时间’,
`Fversion` int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘版本号’,
PRIMARY KEY (`Fid`),
KEY `idx_Fcreate_time` (`Fcreate_time`)
KEY `idx_sku_live_activity` (`Fsku_id`、`Flive_activity_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’直播|直播商品属性统计流水表
|breakyang|20240116′;
2.1.5 接口文档
轮询讲解中商品接口:
接口名称 | 直播间ID获取直播间信息接口 | ||||
gateway | /route0002/ecLive/queryLiveInfo.json | ||||
接口 | |||||
方法 | queryLiveInfo | ||||
group | * | ||||
版本号 | 1.0.0 | ||||
超时时间 | 3000ms | ||||
是否登录 | 是 | ||||
入参 | 字段名 | 字段类型 | 是否必传 | 描述 | |
live_activity_id | String | 是 | 直播间ID | ||
出参 | |||||
result | int | 是 | 0-成功 | ||
res_info | String | 是 | ok | ||
result_rows | 是 | ||||
live_activity_id | String | 是 | 直播间ID | ||
live_activity_name | String | 是 | 直播间名称 | ||
event_base_id | String | 是 | 促销ID | ||
select_id | String | 是 | 选品池ID | ||
live_state | int | 是 | 1-未开播,2-直播中,3-已结束 | ||
explaining_sku_info | String | 是 | 讲解中的商品信息 | ||
update_time | String | 是 | 直播间商品列表更新时间 | ||
couponActivityEventInfo | JSONObject | 否 | 直播活动信息 | ||
直播间商品接口:(无改动)
新增【商品求讲解】功能接口
接口名称 | 商品求讲解接口 | ||||
gateway | /route0002/ecLive/incrProductAskCount.json | ||||
接口 | com.fenqile.afterpay.offline.marketing.cgi.live.CgiLiveSkuAskService | ||||
方法 | increaseProductAskCount | ||||
group | * | ||||
版本号 | 1.0.0 | ||||
超时时间 | 3000ms | ||||
是否登录 | 是 | ||||
入参 | 字段名 | 字段类型 | 是否必传 | 描述 | |
live_activity_id | String | 是 | 直播间ID | ||
sku_id | String | 是 | 商品ID | ||
登录态 | |||||
出参 | 无 |
新增【查询直播选品统计详情】接口
接口名称 | 查询直播选品统计详情功能接口 | ||||
gateway | rc_oa_gateway/mix/live/queryLiveSelectStatis.json | ||||
接口 | com.fenqile.afterpay.offline.marketing.cgi.live.CgiLiveEventRecordQueryService | ||||
方法 | queryLiveSelectorStatis | ||||
group | * | ||||
版本号 | 1.0.0 | ||||
超时时间 | 3000ms | ||||
是否登录 | 是 | ||||
入参 | 字段名 | 字段类型 | 是否必传 | 描述 | |
登录态 | |||||
live_activity_id | String | 是 | 直播间ID | ||
select_id | String | 是 | 选品ID | ||
query_scene | Integer | 是 | 查询场景2 – smart选品明细 | ||
出参 | 字段名 | 字段类型 | |||
sort | int | 序号 | |||
sku_id | String | skuId | |||
sku_pic | List<String> | 商品图片 | |||
mart_amount | String | 商品市场价 | |||
stock | String | 可销售库存 | |||
is_product_up_down | String | 状态 | |||
is_product_up_down_desc | String | 状态描述 | |||
short_product_name | |||||
ask_count | int | 求讲解人数 | |||
explained_count | int | 已讲解次数 |
{
// 已讲解次数
“explained_count”: 10,
// 求讲解次数
“ask_count”: 52,
“mart_amount”: “10”,
“category_concat_name”: “测试类目-测试类目-测试类目01”,
“category_id_2”: 2380,
“category_id_1”: 80,
“order_cnt_30_new”: 0,
“sku_pic”: [
“https://coss-ec.fenqile.com/ecproduct201/M00/ex/20230920135058-fcd2ee07-c50b-456d-aab9-572fcded1a26.png”
],
“operate_list”: [
1,
2
],
“self_pop”: 2,
“category_name_2”: “测试类目”,
“category_name_1”: “测试类目”,
“product_id”: “P202309207375402”,
“stock”: 999999,
“category_id_3”: 2134,
“is_product_up_down”: 0,
“amount”: “9”,
“discounted_amount”: 0.0,
“self_pop_desc”: “POP”,
“brand_name”: “阿玛尼(ARMANI)”,
“sku_id”: “MES202309207855022”,
“category_name_3”: “测试类目01”,
“sku_key_1”: “3”,
“sort”: 1,
“product_name”: “单品促销测试0”,
“sku_key_concat_name”: “3,d,a”,
“brand_id”: 53,
“extend”: {},
“merch_name”: “测试一号店铺”,
“is_product_up_down_desc”: “下架”,
“sku_key_2”: “d”,
“sku_key_3”: “a”,
“merch_id”: “MC201601210278193”
}
改动【商品讲解/取消讲解】接口
接口名称 | 商品讲解/取消讲解接口 | ||||
gateway | oa/mix/live/explaining_goods.json | ||||
接口 | com.fenqile.afterpay.offline.marketing.oa.cgi.live.CgiLiveEventRecordApplyService | ||||
方法 | explainGoods | ||||
group | * | ||||
版本号 | 1.0.0 | ||||
超时时间 | 3000ms | ||||
是否登录 | 是 | ||||
入参 | 字段名 | 字段类型 | 是否必传 | 描述 | |
登录态 | |||||
live_activity_id | String | 是 | 直播间ID | ||
explain_action | Integer | 是 | 1 – 讲解2 – 取消讲解 | ||
explaining_sku_info | String | 是 | 操作的商品 | ||
出参 | 字段名 | 字段类型 |