task = $task; $this->orderTime = $task['order_time']; $this->userIds = json_decode($task['shift_ids'], true) ?? []; $this->getPromotes(); $this->getShiftUsers(); $this->statShiftPayAmount(); } public function handle() { if ($this->fromPromote['id'] == 0 && count($this->userIds) == 0) { throw new Exception('官方渠道玩家不能全部迁移'); } $this->getNoticeCommonWords(); $model = new Model(); $model->startTrans(); $hasError = false; foreach ($this->users as $user) { $amount = $this->payAmountItems[$user['id']] ?? 0; $status = $this->updateMend($user['id'], $amount); if (!$status) { $hasError = true; break; } $this->generateNotice($user, $amount); } if ($hasError) { $model->rollback(); throw new Exception('系统异常,修改补链记录失败'); } $this->saveNotices(); $status = $this->shiftUser(); if (!$status) { $model->rollback(); throw new Exception('系统异常,修改用户推广员失败'); } try { $this->shiftPlayer(); $this->shiftSpend(); $this->shiftDeposit(); $this->shiftBindSpend(); $this->shiftUserDataCount(); $model->commit(); } catch (\Exception $e) { $model->rollback(); throw new \Exception('系统异常: ' . $e->getMessage()); } } public function handleReplenish() { $model = new Model(); $model->startTrans(); $hasError = false; foreach ($this->payAmountItems as $userId => $amount) { $status = $this->updateMend($userId, $amount); if (!$status) { $hasError = true; break; } } if ($hasError) { $model->rollback(); throw new Exception('系统异常,修改补链记录失败'); } try { $this->shiftSpend(); $this->shiftDeposit(); $this->shiftBindSpend(); $model->commit(); } catch (\Exception $e) { $model->rollback(); throw new \Exception('系统异常: ' . $e->getMessage()); } } private function getPromotes() { $toPromoteId = $this->task['to_promote_id']; $fromPromoteId = $this->task['from_promote_id']; $toPromote = M('promote', 'tab_')->where(['id' => $toPromoteId])->find(); $fromPromote = M('promote', 'tab_')->where(['id' => $fromPromoteId])->find(); $this->toPromote = $toPromote ?? ['id' => 0, 'account' => C('OFFICIEL_CHANNEL'), 'company_id' => 0]; $this->fromPromote = $fromPromote ?? ['id' => 0, 'account' => C('OFFICIEL_CHANNEL'), 'company_id' => 0]; } private function getNoticeCommonWords() { $belongs = PromoteCompanyService::$belongs; $formConpany = M('promote_company', 'tab_')->field(['company_name', 'company_belong'])->where(['id' => $this->fromPromote['company_id']])->find(); $toConpany = M('promote_company', 'tab_')->field(['company_name', 'company_belong'])->where(['id' => $this->toPromote['company_id']])->find(); $this->fromWord = $this->fromPromote['account'] . ($formConpany ? '(' . $belongs[$formConpany['company_belong']] . '-' . $formConpany['company_name'] . ')' : ''); $this->toWord = $this->toPromote['account'] . ($toConpany ? '(' . $belongs[$toConpany['company_belong']] . '-' . $toConpany['company_name'] . ')' : ''); } private function getShiftUsers() { $map = $this->getShiftCommonMap(true); $this->users = M('user', 'tab_')->field(['id', 'account', 'nickname'])->where($map)->select(); } private function getSpendMap() { $map = $this->getShiftCommonMap(); $map['pay_time'] = ['egt', $this->orderTime]; // $map['is_check'] = ['in','1,2']; $map['settle_check'] = 0; $map['selle_status'] = 0; $map['pay_status'] = 1; return $map; } private function statShiftPayAmount() { $spendMap = $this->getSpendMap(); $payAmountRows = M('spend', 'tab_') ->field(['user_id', 'sum(pay_amount) pay_amount']) ->where($spendMap) ->group('user_id') ->select(); foreach ($payAmountRows as $row) { $this->payAmountItems[$row['user_id']] = round(floatval($row['pay_amount']), 2); } } private function updateMend($userId, $amount) { if (count($this->userIds) == 0) { return true; } return M('mend', 'tab_') ->where(['task_id' => $this->task['id'], 'user_id' => $userId]) ->save(['status' => 1, 'pay_amount' => ['exp', 'pay_amount+' . $amount], 'update_time' => time()]); } private function generateNotice($user, $amount) { if ($amount > 500) { $userWord = '玩家账号' . $user['account']; $content = $userWord . ', 从' . $this->fromWord . '换绑到' . $this->toWord . ',换绑金额超过500,达到' . $amount . '元'; $this->notices[] = [ 'type' => 'shift-player', 'title' => '换绑额度超500', 'content' => $content, 'admin_ids' => '31', 'create_time' => time(), 'target' => $user['account'], 'start_time' => time(), 'end_time' => time() + 7*24*3600, ]; } } private function saveNotices() { if (count($this->notices) > 0) { M('admin_notice', 'tab_')->addAll($this->notices); } } private function shiftUser() { $map = $this->getShiftCommonMap(true); return M('user', 'tab_')->where($map)->save([ 'promote_id' => $this->toPromote['id'], 'promote_account' => $this->toPromote['account'] ]); } private function shiftPlayer() { $map = $this->getShiftCommonMap(); $updateData = [ 'promote_id' => $this->toPromote['id'], 'promote_account' => $this->toPromote['account'] ]; M('user_play', 'tab_')->where($map)->save($updateData); M('user_play_info', 'tab_')->where($map)->save($updateData); } private function shiftSpend() { $toPromote = $this->toPromote; $spendMap = $this->getSpendMap(); [$hasGameIds, $hasNotGameIds] = $this->getPromoteGameIds($toPromote); unset($spendMap['pay_status']); $updateData = [ 'promote_id' => $toPromote['id'], 'promote_account' => $toPromote['account'], 'market_admin_id' => $toPromote['admin_id'], ]; if (count($hasGameIds) > 0) { $spendMap['game_id'] = ['in', $hasGameIds]; M('spend', 'tab_')->where($spendMap)->save(array_merge($updateData, ['is_check' => 1])); } if (count($hasNotGameIds) > 0) { $spendMap['game_id'] = ['in', $hasNotGameIds]; M('spend', 'tab_')->where($spendMap)->save(array_merge($updateData, ['is_check' => 2])); } } private function getPromoteGameIds($promote) { $service = new PromoteService(); $toTopPromote = $service->getTopPromote($promote); $hasGameIds = $toTopPromote['game_ids'] == '' ? [] : explode(',', $toTopPromote['game_ids']); $hasNotGameIds = M('game', 'tab_')->where(['game_id' => ['not in', $hasGameIds]])->getField('id', true); $hasNotGameIds = $hasNotGameIds ?? []; return [$hasGameIds, $hasNotGameIds]; } private function getShiftCommonMap($isUserTable = false) { $map = ['promote_id' => $this->fromPromote['id']]; if (count($this->userIds) > 0) { $userColumn = $isUserTable ? 'id' : 'user_id'; $map[$userColumn] = ['in', $this->userIds]; } return $map; } private function shiftDeposit() { $map = $this->getShiftCommonMap(); $map['create_time'] = ['egt', $this->orderTime]; $toPromote = $this->toPromote; M('deposit', 'tab_')->where($map)->save([ 'promote_id' => $toPromote['id'], 'promote_account' => $toPromote['account'], 'market_admin_id' => $toPromote['admin_id'], ]); } private function shiftBindSpend() { $map = $this->getShiftCommonMap(); $map['pay_time'] = ['egt', $this->orderTime]; $toPromote = $this->toPromote; M('bind_spend', 'tab_')->where($map)->save([ 'promote_id' => $toPromote['id'], 'promote_account' => $toPromote['account'] ]); } private function shiftUserDataCount() { $map = $this->getShiftCommonMap(); $map['create_time'] = ['egt', $this->orderTime]; M('user_play_data_count', 'tab_')->where($map)->save(['promote_id' => $this->toPromote['id']]); } }