代码提交
This commit is contained in:
@@ -108,93 +108,33 @@ class WorkbenchMomentsJob
|
||||
public function execute2()
|
||||
{
|
||||
try {
|
||||
// 每日重置发送次数(允许10分钟误差)
|
||||
$now = time();
|
||||
$todayStart = strtotime(date('Y-m-d 00:00:00'));
|
||||
if ($now - $todayStart >= 0 && $now - $todayStart <= 600) {
|
||||
$cacheKey = 'moments_settings_reset_' . date('Ymd');
|
||||
if (!Cache::has($cacheKey)) {
|
||||
Db::table('ck_kf_moments_settings')->where('sendNum', '<>', 0)
|
||||
->update(['sendNum' => 0, 'updateTime' => $now]);
|
||||
Cache::set($cacheKey, 1, 7200); // 2小时缓存,防止重复重置
|
||||
}
|
||||
}
|
||||
// 获取所有工作台
|
||||
$kfMoments = KfMoments::where(['isSend' => 0, 'isDel' => 0])->where('sendTime', '<=', time() + 120)->order('id desc')->select();
|
||||
// 1) 每日重置
|
||||
$this->resetDailyCountersIfNeeded();
|
||||
|
||||
// 2) 获取发送窗口内的任务
|
||||
[$nowTs, $kfMoments] = $this->getWindowTasks();
|
||||
foreach ($kfMoments as $val) {
|
||||
$sendData = json_decode($val->sendData,true);
|
||||
$endTime = strtotime($sendData['endTime']);
|
||||
if ($endTime <= time() + 1800){
|
||||
$endTime = time() + 3600;
|
||||
$sendData['endTime'] = date('Y-m-d H:i:s', $endTime);
|
||||
}
|
||||
switch ($sendData['momentContentType']) {
|
||||
case 1:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
case 2:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
case 3:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
break;
|
||||
case 4:
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
default:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
}
|
||||
$companyId = (int)($val['companyId'] ?? 0);
|
||||
$userId = (int)($val['userId'] ?? 0);
|
||||
|
||||
// 2.1) 数据规范化
|
||||
$sendData = json_decode($val->sendData, true);
|
||||
$sendData = $this->normalizeSendData($sendData);
|
||||
|
||||
// 2.2) 账号额度过滤
|
||||
$items = $sendData['jobPublishWechatMomentsItems'] ?? [];
|
||||
if (empty($items)) { continue; }
|
||||
$allowed = $this->filterAccountsByQuota($companyId, $userId, $items);
|
||||
if (empty($allowed)) { continue; }
|
||||
$sendData['jobPublishWechatMomentsItems'] = $allowed;
|
||||
|
||||
// 3) 下发
|
||||
$moments = new Moments();
|
||||
$moments->addJob($sendData);
|
||||
KfMoments::where(['id' => $val['id']])->update(['isSend' => 1]);
|
||||
|
||||
// 统计发送次数(ck_kf_moments_settings)
|
||||
try {
|
||||
$nowTs = time();
|
||||
$companyId = (int)($val['companyId'] ?? 0);
|
||||
$userId = (int)($val['userId'] ?? 0);
|
||||
$items = $sendData['jobPublishWechatMomentsItems'] ?? [];
|
||||
foreach ($items as $it) {
|
||||
$wechatId = (int)($it['wechatAccountId'] ?? 0);
|
||||
if ($wechatId <= 0) { continue; }
|
||||
|
||||
$cond = [
|
||||
'companyId' => $companyId,
|
||||
'userId' => $userId,
|
||||
'wechatId' => $wechatId,
|
||||
];
|
||||
|
||||
$setting = Db::table('ck_kf_moments_settings')->where($cond)->find();
|
||||
if ($setting) {
|
||||
Db::table('ck_kf_moments_settings')
|
||||
->where('id', $setting['id'])
|
||||
->update([
|
||||
'sendNum' => Db::raw('sendNum + 1'),
|
||||
'updateTime' => $nowTs,
|
||||
]);
|
||||
} else {
|
||||
Db::table('ck_kf_moments_settings')->insert([
|
||||
'companyId' => $companyId,
|
||||
'userId' => $userId,
|
||||
'wechatId' => $wechatId,
|
||||
'max' => 5,
|
||||
'sendNum' => 1,
|
||||
'createTime' => $nowTs,
|
||||
'updateTime' => $nowTs,
|
||||
]);
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $statE) {
|
||||
Log::error('朋友圈发送统计失败: ' . $statE->getMessage());
|
||||
}
|
||||
// 4) 统计
|
||||
$this->incrementSendStats($companyId, $userId, $allowed);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::error("朋友圈同步任务异常: " . $e->getMessage());
|
||||
@@ -202,6 +142,118 @@ class WorkbenchMomentsJob
|
||||
}
|
||||
}
|
||||
|
||||
protected function resetDailyCountersIfNeeded()
|
||||
{
|
||||
$now = time();
|
||||
$todayStart = strtotime(date('Y-m-d 00:00:00'));
|
||||
if ($now - $todayStart >= 0 && $now - $todayStart <= 600) {
|
||||
$cacheKey = 'moments_settings_reset_' . date('Ymd');
|
||||
if (!Cache::has($cacheKey)) {
|
||||
Db::table('ck_kf_moments_settings')->where('sendNum', '<>', 0)
|
||||
->update(['sendNum' => 0, 'updateTime' => $now]);
|
||||
Cache::set($cacheKey, 1, 7200);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function getWindowTasks()
|
||||
{
|
||||
$nowTs = time();
|
||||
$windowStart = $nowTs - 300;
|
||||
$windowEnd = $nowTs + 300;
|
||||
$kfMoments = KfMoments::where(['isSend' => 0, 'isDel' => 0])
|
||||
->whereBetween('sendTime', [$windowStart, $windowEnd])
|
||||
->order('id desc')->select();
|
||||
return [$nowTs, $kfMoments];
|
||||
}
|
||||
|
||||
protected function normalizeSendData(array $sendData)
|
||||
{
|
||||
$endTime = strtotime($sendData['endTime'] ?? '');
|
||||
if ($endTime <= time() + 1800) {
|
||||
$endTime = time() + 3600;
|
||||
$sendData['endTime'] = date('Y-m-d H:i:s', $endTime);
|
||||
}
|
||||
switch ($sendData['momentContentType'] ?? 1) {
|
||||
case 1:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
case 2:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
case 3:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
break;
|
||||
case 4:
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
default:
|
||||
$sendData['link'] = ['image' => ''];
|
||||
$sendData['picUrlList'] = [];
|
||||
$sendData['videoUrl'] = '';
|
||||
break;
|
||||
}
|
||||
return $sendData;
|
||||
}
|
||||
|
||||
protected function filterAccountsByQuota(int $companyId, int $userId, array $items)
|
||||
{
|
||||
$wechatIds = array_values(array_filter(array_map(function($it){ return (int)($it['wechatAccountId'] ?? 0); }, $items)));
|
||||
if (empty($wechatIds)) { return []; }
|
||||
$settings = Db::table('ck_kf_moments_settings')
|
||||
->where('companyId', $companyId)
|
||||
->where('userId', $userId)
|
||||
->whereIn('wechatId', $wechatIds)
|
||||
->column('id,max,sendNum', 'wechatId');
|
||||
$allowed = [];
|
||||
foreach ($items as $it) {
|
||||
$wid = (int)($it['wechatAccountId'] ?? 0);
|
||||
if ($wid <= 0) { continue; }
|
||||
if (isset($settings[$wid])) {
|
||||
$max = (int)$settings[$wid]['max'];
|
||||
$sent = (int)$settings[$wid]['sendNum'];
|
||||
if ($sent < ($max > 0 ? $max : 5)) { $allowed[] = $it; }
|
||||
} else {
|
||||
$allowed[] = $it;
|
||||
}
|
||||
}
|
||||
return $allowed;
|
||||
}
|
||||
|
||||
protected function incrementSendStats(int $companyId, int $userId, array $items)
|
||||
{
|
||||
try {
|
||||
$nowTs = time();
|
||||
foreach ($items as $it) {
|
||||
$wechatId = (int)($it['wechatAccountId'] ?? 0);
|
||||
if ($wechatId <= 0) { continue; }
|
||||
$cond = ['companyId' => $companyId, 'userId' => $userId, 'wechatId' => $wechatId];
|
||||
$setting = Db::table('ck_kf_moments_settings')->where($cond)->find();
|
||||
if ($setting) {
|
||||
Db::table('ck_kf_moments_settings')->where('id', $setting['id'])
|
||||
->update(['sendNum' => Db::raw('sendNum + 1'), 'updateTime' => $nowTs]);
|
||||
} else {
|
||||
Db::table('ck_kf_moments_settings')->insert([
|
||||
'companyId' => $companyId,
|
||||
'userId' => $userId,
|
||||
'wechatId' => $wechatId,
|
||||
'max' => 5,
|
||||
'sendNum' => 1,
|
||||
'createTime' => $nowTs,
|
||||
'updateTime' => $nowTs,
|
||||
]);
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
Log::error('朋友圈发送统计失败: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理内容发送
|
||||
|
||||
Reference in New Issue
Block a user