Files
huangjingfen/pro_v3.5.1/app/services/syj/SyjPromoteRewardTriggerServices.php
2026-05-03 14:44:12 +08:00

105 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
namespace app\services\syj;
use app\dao\syj\PromoteRewardTriggerDao;
use app\services\BaseServices;
use app\services\agent\AgentLevelServices;
use app\services\hjf\PointsRewardServices;
use app\services\user\UserServices;
use think\annotation\Inject;
use think\facade\Log;
class SyjPromoteRewardTriggerServices extends BaseServices
{
#[Inject]
protected PromoteRewardTriggerDao $dao;
public function triggerForTask(array $task): void
{
if ((int)sys_config('syj_reward_trigger_enable', 1) !== 1) {
return;
}
$taskId = (int)$task['id'];
$triggerNo = $task['reward_trigger_no'] ?: 'SYJ-TASK-' . $taskId;
if (!$this->dao->be(['task_id' => $taskId])) {
$this->dao->save([
'task_id' => $taskId,
'uid' => (int)$task['uid'],
'trigger_no' => $triggerNo,
'trigger_amount' => $task['base_amount'],
'brokerage_status' => 0,
'points_status' => 0,
'level_task_status' => 0,
'error_msg' => '',
]);
}
$status = [
'points_status' => 1,
'level_task_status' => 1,
'brokerage_status' => 1,
'error_msg' => '',
];
try {
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$uids = [(int)$task['uid']];
$user = $userServices->get((int)$task['uid'], ['uid', 'spread_uid', 'agent_level']);
$spreadUid = $user ? (int)($user['spread_uid'] ?? 0) : 0;
if ($spreadUid > 0) {
$uids[] = $spreadUid;
$spreadUser = $userServices->get($spreadUid, ['uid', 'spread_uid', 'agent_level']);
$twoUid = $spreadUser ? (int)($spreadUser['spread_uid'] ?? 0) : 0;
if ($twoUid > 0) {
$uids[] = $twoUid;
}
}
$preUpgradeLevels = [];
foreach (array_unique($uids) as $uid) {
if ($uid <= 0) continue;
$row = $userServices->get((int)$uid, ['uid', 'agent_level']);
$preUpgradeLevels[(int)$uid] = $row ? (int)($row['agent_level'] ?? 0) : 0;
}
/** @var AgentLevelServices $agentLevelServices */
$agentLevelServices = app()->make(AgentLevelServices::class);
$agentLevelServices->checkUserLevelFinish((int)$task['uid'], array_keys($preUpgradeLevels));
} catch (\Throwable $e) {
$status['level_task_status'] = 2;
$status['error_msg'] = '等级任务触发失败:' . $e->getMessage();
Log::error('[SYJ] 等级任务触发失败 task=' . $taskId . ' ' . $e->getMessage());
}
try {
/** @var PointsRewardServices $pointsRewardServices */
$pointsRewardServices = app()->make(PointsRewardServices::class);
$pointsRewardServices->reward((int)$task['uid'], $triggerNo, (int)$task['source_order_id'], $preUpgradeLevels ?? [], 1);
} catch (\Throwable $e) {
$status['points_status'] = 2;
$status['error_msg'] = trim($status['error_msg'] . ' 积分触发失败:' . $e->getMessage());
Log::error('[SYJ] 积分触发失败 task=' . $taskId . ' ' . $e->getMessage());
}
$this->dao->update(['task_id' => $taskId], $status + ['retry_count' => $this->dao->value(['task_id' => $taskId], 'retry_count')]);
}
public function retry(int $taskId): void
{
/** @var SyjPromoteTaskServices $taskServices */
$taskServices = app()->make(SyjPromoteTaskServices::class);
$task = $taskServices->getTask($taskId);
if (!$task) {
return;
}
$row = $this->dao->getOne(['task_id' => $taskId]);
if ($row) {
$this->dao->update(['task_id' => $taskId], ['retry_count' => (int)$row['retry_count'] + 1]);
}
$this->triggerForTask($task);
$taskServices->refreshRewardStatus($taskId);
}
}