SyncLive.php
5.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php
namespace addons\groupon\library\traits\model\app;
use addons\groupon\library\Wechat;
use addons\groupon\model\LiveGoods;
use addons\groupon\model\LiveLink;
use think\Cache;
trait SyncLive
{
public static function autoSyncLive()
{
$is_sync = Cache::get('live_sync');
if (!$is_sync) {
// 同步直播间
self::syncLive();
// 设置缓存
Cache::set('live_sync', 'yes', 240); // 缓存 4分钟
}
}
public static function autoSyncLiveLink($live)
{
$is_sync = Cache::get('live_link_sync');
if (!$is_sync) {
// 同步直播间
self::syncLiveLink($live);
// 设置缓存
Cache::set('live_link_sync', 'yes', 240); // 缓存 4分钟
}
}
// 同步直播间
public static function syncLive()
{
// 拉取直播间
$rooms = (new Wechat('wxMiniProgram'))->live();
$room_ids = array_column($rooms, 'roomid');
// 查询现有直播间
$lives = self::where('room_id', 'in', $room_ids)->with('goods')->limit(20)->select();
foreach ($rooms as $key => $room) {
$liveModel = null;
foreach ($lives as $k => $live) {
if ($live['room_id'] == $room['roomid']) {
$liveModel = $live;
break;
}
}
$data['name'] = $room['name'] ?? '';
$data['room_id'] = $room['roomid'];
$data['cover_img'] = $room['cover_img'] ?? '';
$data['live_status'] = $room['live_status'] ?? '';
$data['starttime'] = $room['start_time'] ?? '';
$data['endtime'] = $room['end_time'] ?? '';
$data['anchor_name'] = $room['anchor_name'] ?? '';
$data['anchor_img'] = $room['anchor_img'] ?? '';
$data['share_img'] = $room['share_img'] ?? '';
if ($liveModel) {
$data['updatetime'] = time();
(new self)->where('id', $liveModel['id'])->update($data);
// 更新商品信息
self::syncGoods($liveModel['id'], $room['goods'], $liveModel['goods']);
} else {
$liveModel = new self();
$liveModel->save($data);
// 添加商品信息
if ($room['goods']) {
self::syncGoods($liveModel['id'], $room['goods']);
}
}
}
return true;
}
public static function syncGoods($live_id, $roomGoods, $modelGoods = [])
{
foreach ($roomGoods as $key => $goods) {
$data = [
'live_id' => $live_id,
'name' => $goods['name'],
'url' => $goods['url'],
'cover_img' => $goods['cover_img'],
];
$price = self::getLiveGoodsPrice($goods);
$data = array_merge($data, $price);
if (isset($modelGoods[$key])) {
(new LiveGoods())->where('id', $modelGoods[$key]['id'])->update($data);
} else {
$liveGoodsModel = new LiveGoods();
$liveGoodsModel->save($data);
}
}
// 删除多余的
if (count($modelGoods) > count($roomGoods)) {
foreach ($modelGoods as $key => $goods) {
if ($key < count($roomGoods)) {
continue;
}
// 删除
$goods->delete();
}
}
}
public static function syncLiveLink ($live) {
$modelLink = $live->links;
$liveReplay = (new Wechat('wxMiniProgram'))->liveReplay([
'room_id' => $live['room_id']
]);
foreach ($liveReplay as $key => $media) {
$data = [
'live_id' => $live['id'],
'media_url' => $media['media_url'],
'create_time' => $media['create_time'],
'expire_time' => $media['expire_time'],
];
if (isset($modelLink[$key])) {
(new LiveLink())->where('id', $modelLink[$key]['id'])->update($data);
} else {
$liveGoodsModel = new LiveLink();
$liveGoodsModel->data($data)->save();
}
}
// 删除多余的
if (count($modelLink) > count($liveReplay)) {
foreach ($modelLink as $key => $link) {
if ($key < count($liveReplay)) {
continue;
}
// 删除
$link->delete();
}
}
}
public static function getLiveGoodsPrice($goods)
{
$price = [];
if ($goods['price_type'] == 1) {
// 一口价
$price['max_price'] = 0;
$price['origin_price'] = 0;
$price['price'] = round($goods['price'] / 100, 2);
} else if ($goods['price_type'] == 2) {
// 价格区间
$price['origin_price'] = 0;
$price['price'] = round($goods['price'] / 100, 2);
$price['max_price'] = round($goods['price2'] / 100, 2);
} else if ($goods['price_type'] == 3) {
// 原价现价
$price['max_price'] = 0;
$price['origin_price'] = round($goods['price'] / 100, 2);
$price['price'] = round($goods['price2'] / 100, 2);
}
return $price;
}
}