105 lines
4.0 KiB
PHP
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);
|
|
}
|
|
}
|