'会长', 2 => '部门长', 3 => '组长', 4 => '推广员', ]; public function __construct() { $this->model = new PromoteModel(); } public function froze($id) { $data = [ 'status' => 2 ]; return $this->model->where("id=".$id)->save($data); } public function unfreeze($id) { $data = [ 'status' => 1 ]; return $this->model->where("id=".$id)->save($data); } public function resetPassword($id, $password = null) { if (!$password) { $password = $this->getRandomPassword(10, false); } $passwordSecret = $this->password($password, UC_AUTH_KEY); if ($this->model->where("id=".$id)->save(['password' => $passwordSecret])) { return $password; } } public function password($str, $key = 'ThinkUCenter') { return '' === $str ? '' : md5(sha1($str) . $key); } private function getRandomPassword($length, $special = true){ $chars = array( 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ); if($special){ $chars = array_merge($chars, array( '!', '@', '#', '$', '?', '|', '{', '/', ':', ';', '%', '^', '&', '*', '(', ')', '-', '_', '[', ']', '}', '<', '>', '~', '+', '=', ',', '.' )); } $charsLen = count($chars) - 1; shuffle($chars); $password = ''; for($i=0; $i<$length; $i++){ $password .= $chars[mt_rand(0, $charsLen)]; } return $password; } public function addShiftTask($params) { $fromPromoteId = isset($params['from_promote_id']) ? $params['from_promote_id'] : 0; $toPromoteId = isset($params['to_promote_id']) ? $params['to_promote_id'] : 0; $orderTime = isset($params['order_time']) ? $params['order_time'] : ''; $balanceCoinMode = isset($params['balance_coin_mode']) ? $params['balance_coin_mode'] : 0; $type = isset($params['type']) ? $params['type'] : 0; $shiftIds = isset($params['shift_ids']) && $params['shift_ids'] ? $params['shift_ids'] : []; $creatorId = isset($params['creator_id']) ? $params['creator_id'] : 0; $creatorType = isset($params['creator_type']) ? $params['creator_type'] : 0; $remark = isset($params['remark']) ? $params['remark'] : ''; if ($fromPromoteId == $toPromoteId) { return [ 'status' => false, 'msg'=>'相同推广帐号不可迁移' ]; } if ($orderTime == 0) { return [ 'status' => false, 'msg'=>'订单日期不能为空' ]; } /* if ($type == 1 && $balanceCoinMode == 0) { return [ 'status' => false, 'msg'=>'请选择平台币管理方式' ]; } */ if (count($shiftIds) > 15) { return [ 'status' => false, 'msg'=>'部分迁移时,迁移人数不能超过15' ]; } $shiftTask = M('shift_task', 'sys_')->field(['id'])->where(['type' => $type, 'status' => 0, 'from_promote_id' => $fromPromoteId])->find(); if ($shiftTask) { return [ 'status' => false, 'msg' => '含有类似未执行迁移任务,请稍后再试' ]; } $isFuture = false; if (strtotime($orderTime) > strtotime(date('Y-m-d 23:59:59'))) { $isFuture = true; } $data = [ 'from_promote_id' => $fromPromoteId, 'to_promote_id' => $toPromoteId, 'order_time' => strtotime($orderTime), 'balance_coin_mode' => $balanceCoinMode, 'create_time' => time(), 'creator_id' => $creatorId, 'creator_type' => $creatorType, 'status' => 0, 'type' => $type, 'remark' => $remark, 'shift_ids' => json_encode($shiftIds) ]; if (M('shift_task', 'sys_')->add($data)) { return [ 'status' => true, 'msg'=>'迁移任务创建成功' ]; } else { return [ 'status' => false, 'msg'=>'迁移失败' ]; } } public function shiftPromote($task) { $model = new Model(); $model->startTrans(); $coinRecordService = new PromoteCoinRecordService(); $promoteCoinService = new PromoteCoinService(); $shiftIds = json_decode($task['shift_ids'], true) ?? []; $toPromote = M('promote', 'tab_')->where(['id' => $task['to_promote_id']])->find(); $fromPromote = M('promote', 'tab_')->where(['id' => $task['from_promote_id']])->find(); $childrenMap = ['parent_id' => $fromPromote['id']]; if (count($shiftIds) > 0) { $childrenMap['id'] = ['in', $shiftIds]; } $count = M('promote', 'tab_')->where($childrenMap)->count(); if ($count == 0) { return ['status' => true, 'msg' => '推广帐号迁移成功,无子账号需要迁移']; } $topPromote = $this->getTopPromote($fromPromote); // $status = $this->shiftRemoveCoin($fromPromote, $task); /* if (!$status) { $model->rollback(); return ['status' => false, 'msg' => '系统异常, 处理推广员平台币失败']; } */ $firstMap = ['parent_id' => $fromPromote['id']]; $secondMap = ['chain' => ['like', $fromPromote['chain'] . $fromPromote['id'] . '/%']]; if (count($shiftIds) > 0) { $firstMap['id'] = ['in', $shiftIds]; $secondMap['parent_id'] = ['in', $shiftIds]; } M('promote', 'tab_')->where($firstMap)->save([ 'parent_id' => $toPromote['id'], 'parent_name' => $toPromote['account'], 'chain' => $toPromote['chain'] . $toPromote['id'] . '/', 'level' . $toPromote['level'] => $toPromote['id'] ]); M('promote', 'tab_')->where($secondMap)->save([ 'chain' => ['exp', 'REPLACE(chain, "/' . $fromPromote['id'] . '/","/' . $toPromote['id'] . '/")'], 'level' . $toPromote['level'] => $toPromote['id'] ]); $status = M('ShiftTask')->where('id=' . $task['id'])->save(['status' => 1, 'handle_time' => time()]); if (!$status) { $model->rollback(); return ['status' => false, 'msg' => '系统异常,修改迁移任务状态失败']; } $model->commit(); return ['status' => true, 'msg' => '推广帐号迁移成功']; } public function shiftRemoveCoin($promote, $task) { $shiftIds = json_decode($task['shift_ids'], true) ?? []; $topPromote = $this->getTopPromote($promote); $coinRecordService = new PromoteCoinRecordService(); $promoteCoinService = new PromoteCoinService(); $topBalanceCoin = $this->getBalanceCoin($topPromote['id'], 0); $topBalancePlus = 0; $map = ['chain' => $promote['chain'] . $chain['id'] . '/%']; if (count($shiftIds) > 0) { $map['id'] = ['in', $shiftIds]; } $subPromotes = M('promote', 'tab_')->field(['id', 'balance_coin', 'level'])->where($map)->select(); $subPromotes = index_by_column('id', $subPromotes); $ids = array_keys($subPromotes); // $ids[] = $promote['id']; if (count($ids) == 0) { return true; } $promoteCoins = []; $balances = M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => ['in', $ids]])->select(); if (count($balances) == 0) { return true; } $records = []; foreach ($balances as $balance) { if ($balance['num'] == 0) { continue; } $records[] = $coinRecordService->createRecord([ 'type' => 2, 'sub_type' => 7, 'ref_id' => 0, 'promote_id' => $balance['promote_id'], 'target_id' => $topPromote['id'], 'target_level' => $topPromote['level'], 'target_type' => 1, 'game_id' => $balance['game_id'], 'coin' => $balance['num'], 'balance_coin' => 0, 'description' => $balance['game_id'] > 0 ? '绑定币回收' : '迁移扣除', ]); if ($task['balance_coin_mode'] == 1 && $balance['game_id'] == 0) { $topBalanceCoin += $balance['num']; $topBalancePlus += $balance['num']; $records[] = $coinRecordService->createRecord([ 'type' => 1, 'sub_type' => 6, 'ref_id' => 0, 'promote_id' => $topPromote['id'], 'target_id' => $balance['promote_id'], 'target_type' => 1, 'target_level' => $subPromotes[$balance['promote_id']]['level'], 'game_id' => $balance['game_id'], 'coin' => $balance['num'], 'balance_coin' => $topBalanceCoin, 'description' => '迁移回收', ]); } } M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => ['in', $ids]])->save(['num' => 0]); M('Promote', 'tab_')->where(['id' => ['in', $ids]])->save(['balance_coin' => 0]); if (count($records) > 0) { M('PromoteCoinRecord', 'tab_')->addAll($records); } if ($topBalancePlus > 0) { return $this->incCoin($topPromote['id'], $topBalancePlus, 0); } return true; } public function shiftPlayer($task) { $toPromoteId = $task['to_promote_id']; $fromPromoteId = $task['from_promote_id']; $orderTime = $task['order_time']; $shiftIds = json_decode($task['shift_ids'], true) ?? []; $remark = $task['remark'] ?? ''; $creator = null; $opAccount = ''; if ($task['creator_type'] == 1) { $creator = M('promote', 'tab_')->where(['id' => $task['creator_id']])->find(); $opAccount = $creator ? $creator['account'] : ''; } else { $creator = M('ucenter_member', 'sys_')->where(['id' => $task['creator_id']])->find(); $opAccount = $creator ? $creator['username'] : ''; } $toPromote = M('promote', 'tab_')->where(['id' => $toPromoteId])->find(); $fromPromote = M('promote', 'tab_')->where(['id' => $fromPromoteId])->find(); $toPromote = $toPromote ?? ['id' => 0, 'account' => C('OFFICIEL_CHANNEL'), 'company_id' => 0]; $fromPromote = $fromPromote ?? ['id' => 0, 'account' => C('OFFICIEL_CHANNEL'), 'company_id' => 0]; if ($fromPromote['id'] == 0 && count($shiftIds) == 0) { return ['status' => false, 'msg' => '官方渠道玩家不能全部迁移']; } $map = []; $map['promote_id'] = $fromPromote['id']; $spendMap = $map; if (count($shiftIds) > 0) { $spendMap['user_id'] = $map['id'] = ['in', $shiftIds]; } $users = M('user', 'tab_')->field(['id', 'account', 'nickname'])->where($map)->select(); $spendMap['pay_time'] = ['egt', $orderTime]; // $spendMap['is_check'] = ['in','1,2']; $spendMap['settle_check'] = 0; $spendMap['selle_status'] = 0; $spendMap['pay_status'] = 1; $payAmountRows = M('spend', 'tab_') ->field(['user_id', 'sum(pay_amount) pay_amount']) ->where($spendMap) ->group('user_id') ->select(); $payAmountRows = index_by_column('user_id', $payAmountRows); $users = index_by_column('id', $users); $notices = []; $formConpany = M('promote_company', 'tab_')->field(['company_name', 'company_belong'])->where(['id' => $fromPromote['company_id']])->find(); $toConpany = M('promote_company', 'tab_')->field(['company_name', 'company_belong'])->where(['id' => $toPromote['company_id']])->find(); $belongs = PromoteCompanyService::$belongs; $mends = []; foreach ($users as $item) { $amount = isset($payAmountRows[$item['id']]) ? round(floatval($payAmountRows[$item['id']]['pay_amount']), 2) : 0; $mends[] = [ 'user_id' => $item['id'], 'user_account' => $item['account'], 'user_nickname' => $item['nickname'], 'promote_id' => $fromPromote['id'], 'promote_account' => $fromPromote['account'], 'promote_id_to' => $toPromote['id'], 'promote_account_to' => $toPromote['account'], 'remark' => $remark == '' ? ($task['creator_type'] == 0 ? '后台补链' : '玩家迁移') : $remark, 'order_time' => $orderTime, 'create_time' => time(), 'pay_amount' => $amount, 'op_id' => $creator ? $creator['id'] : 0, 'op_account' => $opAccount, 'op_type' => $task['creator_type'], 'bind_type' => 1, ]; if ($amount > 500) { $userWord = '玩家账号' . $item['account']; $fromWord = $fromPromote['account'] . ($formConpany ? '(' . $belongs[$formConpany['company_belong']] . '-' . $formConpany['company_name'] : ''); $toWord = $toPromote['account'] . ($toConpany ? '(' . $belongs[$toConpany['company_belong']] . '-' . $toConpany['company_name'] : ''); $content = $userWord . ', 从' . $fromWord . '换绑到' . $toWord . ',换绑金额超过500,达到' . $amount . '元'; $notices[] = [ 'type' => 'shift-player', 'title' => '换绑额度超500', 'content' => $content, 'admin_ids' => '31', 'create_time' => time(), 'target' => $item['account'], 'start_time' => time(), 'end_time' => time() + 7*24*3600, ]; } } $toTopPromote = $this->getTopPromote($toPromote); $hasGameIds = $toTopPromote['game_ids'] == '' ? [] : explode(',', $toTopPromote['game_ids']); $hasNotGameIds = M('game', 'tab_')->where(['game_id' => ['not in', $hasGameIds]])->getField('id', true); $hasNotGameIds = $hasNotGameIds ?? []; $model = new Model(); $model->startTrans(); $status = M('mend', 'tab_')->addAll($mends); if (!$status) { $model->rollback(); return ['status' => false, 'msg' => '系统异常,添加变更记录失败']; } if (count($notices) > 0) { M('admin_notice', 'tab_')->addAll($notices); } $updateData = [ 'promote_id' => $toPromote['id'], 'promote_account' => $toPromote['account'] ]; $updateMarket = [ 'market_admin_id' => $toPromote['admin_id'], ]; $map = $otherMap = ['promote_id' => $fromPromote['id']]; if (count($shiftIds) > 0) { $map['id'] = ['in', $shiftIds]; $otherMap['user_id'] = ['in', $shiftIds]; } $status = M('user', 'tab_')->where($map)->save($updateData); if (!$status) { $model->rollback(); return ['status' => false, 'msg' => '系统异常,修改用户推广员失败']; } M('user_play', 'tab_')->where($otherMap)->save($updateData); M('user_play_info', 'tab_')->where($otherMap)->save($updateData); unset($spendMap['pay_status']); $updateCheck = []; if (count($hasGameIds) > 0) { $spendMap['game_id'] = ['in', $hasGameIds]; M('spend', 'tab_')->where($spendMap)->save(array_merge($updateData, $updateMarket, ['is_check' => 1])); } if (count($hasNotGameIds) > 0) { $spendMap['game_id'] = ['in', $hasNotGameIds]; M('spend', 'tab_')->where($spendMap)->save(array_merge($updateData, $updateMarket, ['is_check' => 2])); } $bindMap = $otherMap; $bindMap['pay_time'] = ['egt', $orderTime]; M('bind_spend', 'tab_')->where($bindMap)->save($updateData); $orderMap = $otherMap; $orderMap['create_time'] = ['egt', $orderTime]; M('deposit', 'tab_')->where($orderMap)->save(array_merge($updateData, $updateMarket)); M('user_play_data_count', 'tab_')->where($orderMap)->save(['promote_id' => $toPromote['id']]); $status = M('shift_task', 'sys_')->where('id=' . $task['id'])->save(['status' => 1, 'handle_time' => time()]); if (!$status) { $model->rollback(); return ['status' => false, 'msg' => '系统异常,修改迁移任务失败']; } $model->commit(); return ['status' => true, 'msg' => '玩家迁移成功']; } public function cancelShift($params) { $promoteId = $params['promote_id']; $type = $params['type']; $status = M('ShiftTask')->where(['from_promote_id' => $promoteId, 'type' => $type, 'status' => 0])->save(['status' => 2, 'handle_time' => time()]); if ($status) { return ['status' => true, 'msg' => '取消成功']; } else { return ['status' => false, 'msg' => '取消失败']; } } public function shiftUserCoin($params) { $model = new Model(); $model->startTrans(); $promoteId = $params['from_promote_id']; $userId = $params['user_id']; $remark = $params['remark']; $num = $params['num']; $gameId = $params['game_id']; $isUseBind = $params['is_use_bind']; $promote = M('promote', 'tab_')->where(['id' => $promoteId])->find(); $user = M('user', 'tab_')->where(['id' => $userId])->find(); $userPlay = M('user_play', 'tab_')->where(['user_id' => $userId])->find(); $before_value = M('user_play', 'tab_')->where(['user_id' => $userId])->sum('bind_balance'); $game = M('game', 'tab_')->where(['id' => $gameId])->find(); $fromBalanceCoin = 0; if ($isUseBind) { $fromBalanceCoin = $this->getBalanceCoin($promoteId, $gameId); } else { $fromBalanceCoin = $this->getBalanceCoin($promoteId, 0); } if ($fromBalanceCoin < $num) { return [ 'msg' => '平台币不足', 'status' => false, ]; } $agentParams = []; $agentParams['game_name'] = $game['game_name']; $agentParams['game_appid'] = $game['game_appid']; $agentParams['game_id'] = $gameId; $agentParams['pay_order_number'] = ''; $agentParams['order_number'] = ''; $agentParams['promote_id'] = $promoteId; $agentParams['promote_account'] = $promote['account']; $agentParams['user_id'] = $userId; $agentParams['user_account'] = $user['account']; $agentParams['user_nickname'] = $user['nickname']; $agentParams['amount'] = $num; $agentParams['real_amount'] = $num; $agentParams['pay_status'] = 1; $agentParams['pay_type'] = 0; $agentParams['create_time'] = time(); $agentParams['zhekou'] = 10; $agentParams['pay_way'] = 4; $fromParams = []; $fromParams['game_id'] = $gameId; $fromParams['num'] = $num; $fromParams['promote_id'] = $promoteId; $fromParams['target_id'] = $userId; $fromParams['target_type'] = 2; $fromParams['target_level'] = 0; $fromParams['remark'] = $remark; $fromParams['description'] = $isUseBind ? '绑定币转账' : '通用币转账'; $agentService = new AgentService(); $transferLogService = new PromoteCoinTransferLogService(); $agentRefId = $agentService->addRecord($agentParams); $formRefId = $transferLogService->addRecord($fromParams); if ($formRefId == 0 || $agentRefId == 0) { $model->rollback(); return [ 'msg' => '系统异常', 'status' => false, ]; } $promoteCoinRecordService = new PromoteCoinRecordService(); $fromRecord = [ 'type' => 2, 'sub_type' => 4, 'promote_id' => $promoteId, 'ref_id' => $formRefId, 'target_id' => $userId, 'target_type' => 2, 'game_id' => $gameId, 'coin' => $num, 'balance_coin' => $fromBalanceCoin - $num, 'description' => $isUseBind ? '绑定币转账' : '通用币转账', 'remark' => $remark, ]; $promoteCoinRecordService->addRecord($fromRecord); $incStatus = M('user_play', 'tab_')->where(['game_id' => $gameId, 'user_id' => $userId])->setInc('bind_balance', $num); $decStatus = $this->decCoin($promoteId, $num, $isUseBind ? $gameId : 0); if (!$incStatus || !$decStatus) { $model->rollback(); return [ 'msg' => '系统异常', 'status' => false, ]; } $model->commit(); return [ 'msg' => '转帐成功', 'status' => true, ]; } public function shiftPromoteCoin($params) { $toPromoteId = $params['promote_id']; $fromPromoteId = $params['from_promote_id']; $remark = $params['remark']; $num = $params['num']; $gameId = $params['game_id'] ?? 0; $isUseBind = $params['is_use_bind']; $toPromote = M('promote', 'tab_')->where(['id' => $toPromoteId])->find(); $fromPromote = M('promote', 'tab_')->where(['id' => $fromPromoteId])->find(); $toBalanceCoin = $this->getBalanceCoin($toPromoteId, $gameId); $fromBalanceCoin = 0; if ($isUseBind && $gameId == 0) { return [ 'msg' => '请选择游戏', 'status' => false, ]; } if ($isUseBind) { $fromBalanceCoin = $this->getBalanceCoin($fromPromoteId, $gameId); } else { $fromBalanceCoin = $this->getBalanceCoin($fromPromoteId, 0); } if ($isUseBind && $gameId) { return [ 'msg' => '平台币不足', 'status' => false, ]; } if ($fromBalanceCoin < $num) { return [ 'msg' => '平台币不足', 'status' => false, ]; } $model = new Model(); $model->startTrans(); $params = []; $params['game_id'] = $gameId; $params['promote_id'] = $fromPromoteId; $params['num'] = $num; $params['target_type'] = 1; $params['target_id'] = $toPromoteId; $params['target_level'] = $toPromote['level']; $params['remark'] = $remark; $params['description'] = $isUseBind ? '绑定币转账' : '通用币转账'; $transferLogService = new PromoteCoinTransferLogService(); $refId = $transferLogService->addRecord($params); if ($refId == 0) { $model->rollback(); return [ 'msg' => '系统异常', 'status' => false, ]; } $promoteCoinRecordService = new PromoteCoinRecordService(); $fromRecord = [ 'type' => 2, 'sub_type' => 3, 'ref_id' => $refId, 'promote_id' => $fromPromoteId, 'target_id' => $toPromoteId, 'target_type' => 1, 'target_level' => $toPromote['level'], 'game_id' => $gameId, 'coin' => $num, 'balance_coin' => $fromBalanceCoin - $num, 'description' => '平台币转账', 'remark' => $remark, ]; $promoteCoinRecordService->addRecord($fromRecord); $toRecord = [ 'type' => 1, 'sub_type' => 3, 'ref_id' => $refId, 'promote_id' => $toPromoteId, 'target_id' => $fromPromote['id'], 'target_type' => 1, 'target_level' => $fromPromote['level'], 'game_id' => $gameId, 'coin' => $num, 'balance_coin' => $toBalanceCoin + $num, 'description' => '平台币转账', 'remark' => $remark, ]; $promoteCoinRecordService->addRecord($toRecord); $incStatus = $this->incCoin($toPromoteId, $num, $gameId); $decStatus = $this->decCoin($fromPromoteId, $num, $isUseBind ? $gameId : 0); if (!$incStatus || !$decStatus) { $model->rollback(); return [ 'msg' => '系统异常', 'status' => false, ]; } $model->commit(); return [ 'msg' => '转帐成功', 'status' => true, ]; } /** * 添加平台币(不主动产生流水) */ public function incCoin($promoteId, $num, $gameId = 0) { $status = M('Promote', 'tab_')->where(['id' => $promoteId])->setInc('balance_coin', $num); if (!$status) { return false; } $promoteBalance = M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => $gameId])->find(); if (empty($promoteBalance)) { $record = [ 'promote_id' => $promoteId, 'game_id' => $gameId, 'num' => $num, 'status' => 1 ]; return M('PromoteBalanceCoin', 'tab_')->add($record); } else { return M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => $gameId])->setInc('num', $num); } } /** * 减少平台币(不主动产生流水) */ public function decCoin($promoteId, $num, $gameId = 0) { $status = M('Promote', 'tab_')->where(['id' => $promoteId])->setDec('balance_coin', $num); if (!$status) { return false; } $promoteBalance = M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => $gameId])->find(); if (empty($promoteBalance)) { return false; } else { return M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => $gameId])->setDec('num', $num); } } /** * 清除绑定平台币(不主动产生流水) */ public function clearBindCoin($promoteId) { $num = M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => ['gt', 0]])->sum('num'); $num = intval($num); if ($num == 0) { return true; } $status = M('Promote', 'tab_')->where(['id' => $promoteId])->setDec('balance_coin', $num); if (!$status) { return false; } return M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => ['gt', 0]])->save(['num' => 0]); } /** * 管理员给推广员扣回平台币 */ public function adminDecCoin($promoteId, $num, $adminId, $gameId = 0) { $balanceCoin = $this->getBalanceCoin($promoteId, $gameId); $promote = M('promote', 'tab_')->where(['id' => $promoteId])->find(); $model = new Model(); $model->startTrans(); $log = []; $log['game_id'] = $gameId; $log['banlan_type'] = $gameId > 0 ? 2 : 1; $log['num'] = $num; $log['promote_id'] = $promote['id']; $log['source_id'] = 0; $log['type'] = 2; $log['op_id'] = $adminId; $promoteCoinService = new PromoteCoinService(); $refId = $promoteCoinService->addRecord($log); $promoteCoinRecordService = new PromoteCoinRecordService(); $record = [ 'type' => 2, 'sub_type' => 5, 'ref_id' => $refId, 'promote_id' => $promote['id'], 'target_id' => $adminId, 'target_type' => 3, 'target_level' => $promote['level'], 'game_id' => $gameId, 'coin' => $num, 'balance_coin' => $balanceCoin - $num, 'description' => '后台回收平台币', 'remark' => '', ]; $promoteCoinRecordService->addRecord($record); $status = $this->decCoin($promote['id'], $num, $gameId); if ($refId && $status) { $model->commit(); return true; } $model->rollback(); return false; } /** * 管理员给推广员添加平台币 */ public function adminIncCoin($promoteId, $num, $adminId, $gameId = 0) { $balanceCoin = $this->getBalanceCoin($promoteId, $gameId); $promote = M('promote', 'tab_')->where(['id' => $promoteId])->find(); $model = new Model(); $model->startTrans(); $log = []; $log['game_id'] = $gameId; $log['banlan_type'] = $gameId > 0 ? 2 : 1; $log['num'] = $num; $log['promote_id'] = $promote['id']; $log['source_id'] = 0; $log['type'] = 1; $log['op_id'] = $adminId; $promoteCoinService = new PromoteCoinService(); $refId = $promoteCoinService->addRecord($log); $status = $this->incCoin($promote['id'], $num, $gameId); $record = [ 'type' => 1, 'sub_type' => 8, 'ref_id' => $refId, 'promote_id' => $promote['id'], 'target_id' => $adminId, 'target_type' => 3, 'target_level' => $promote['level'], 'coin' => $num, 'game_id' => $gameId, 'balance_coin' => $balanceCoin + $num, 'description' => '后台发放平台币', 'remark' => '', ]; $promoteCoinRecordService = new PromoteCoinRecordService(); $promoteCoinRecordService->addRecord($record); if ($refId && $status) { $model->commit(); return true; } $model->rollback(); return false; } public function getBalanceCoin($promoteId, $gameId = 0) { $promoteBalance = M('PromoteBalanceCoin', 'tab_')->where(['promote_id' => $promoteId, 'game_id' => $gameId])->find(); $balanceCoin = 0; if (!empty($promoteBalance)) { $balanceCoin = $promoteBalance['num']; } return $balanceCoin; } public function getLevelByChain($chain) { $chain = trim($chain, '/'); return $chain == '' ? 1 : count(explode('/', $chain)); } public function getIdsByChain($chain) { $chain = trim($chain, '/'); return $chain == '' ? [] : explode('/', $chain); } public function isSub($promote, $parent) { $chainList = $this->getIdsByChain($promote['chain']); if (in_array($parent['id'], $chainList)) { return true; } return false; } public function isSubOrSelf($promote, $parent) { if ($promote['id'] == $parent['id']) { return true; } elseif ($this->isSub($promote, $parent)) { return true; } else { return false; } } /** * 获取最上级的推广员 */ public function getTopPromote($promote) { /* if ($promote['level'] == 1) { return $promote; } */ $chain = trim($promote['chain'], '/'); if ($chain == '') { return $promote; } else { $topPromoteId = explode('/', $chain)[0]; return M('promote', 'tab_')->where(['id' => $topPromoteId])->find(); } } /** * 获取所有下级推广员 */ public function getAllChildren($promote, $level = 0, $fields = '*') { $conditions = ['chain' => ['like', $promote['chain'] . $promote['id'] . '/%']]; if ($level != 0) { $conditions['level'] = $level; } return M('promote', 'tab_')->field($fields)->where($conditions)->select(); } public function subInSql($promote, $withSelf = true) { $conditions = [ 'chain' => ['like', $promote['chain'] . $promote['id'] . '/%'] ]; if ($withSelf != 0) { $conditions['_logic'] = 'or'; $conditions['id'] = $promote['id']; } return M('promote', 'tab_')->field(['id'])->where($conditions)->select(false); } public function getLevelName($level) { return self::$levels[$level] ?? '未知'; } public function checkAddPromote($params) { $account = isset($params['account']) ? trim($params['account']) : ''; $password = $params['password'] ?? ''; $repassword = $params['repassword'] ?? ''; $mobile = $params['mobile_phone'] ?? ''; $idcard = $params['idcard'] ?? ''; $realName = $params['real_name'] ?? ''; if ($account == '') { return [ 'status' => false, 'message' => '请输入推广员账号', ]; } if (strlen($account) > 15 || strlen($account) < 6) { return [ 'status' => false, 'message' => '账号长度为6-15个字符', ]; } if (!preg_match("/^[a-zA-Z0-9_\.]+$/", $account)) { return [ 'status' => false, 'message' => '账号只能为数字,字母和下划线', ]; } if ($mobile != '') { if (!preg_match("/^1[3456789]{1}\d{9}$/", $mobile)) { return [ 'status' => false, 'message' => '手机号格式错误', ]; } } if ($idcard != '') { if (!IdCard::isIdcard($idcard)) { return [ 'status' => false, 'message' => '身份证格式错误', ]; } } if ($realName != '') { if (mb_strlen($realName) < 2 || mb_strlen($realName) > 4) { return [ 'status' => false, 'message' => '姓名长度为2-4个字符', ]; } } if ($password == '') { return [ 'status' => false, 'message' => '请输入登录密码', ]; } if ($repassword != $password) { return [ 'status' => false, 'message' => '确认密码跟密码不一致', ]; } if (strlen($password) < 6) { return [ 'status' => false, 'message' => '密码长度必须大于6位', ]; } $promote = M('promote', 'tab_')->field(['id'])->where(['account' => $account])->find(); if ($promote) { return [ 'status' => false, 'message' => '渠道账号已存在', ]; } $promoteCompanyService = new PromoteCompanyService(); $verifyingPromotes = $promoteCompanyService->getVerifyingPromotes(); if ($promoteCompanyService->isExistVerifyingPromoteAccount([$account], $verifyingPromotes)) { return [ 'status' => false, 'message' => '渠道账号已存在', ]; } return [ 'status' => true, 'message' => '验证成功', ]; } public function addPromote($params, $parent = null) { $data = [ 'account' => $params['account'], 'password' => $this->password($params['password'], UC_AUTH_KEY), 'nickname' => $params['nickname'] ?? $params['account'], 'second_pwd' => $params['second_pwd'] ?? null, 'real_name' => $params['real_name'], 'email' => $params['email'], 'idcard' => $params['idcard'] ?? '', 'status' => $params['status'] ?? 0, 'mobile_phone' => $params['mobile_phone'], 'bank_name' => $params['bank_name'] ?? '', 'bank_card' => $params['bank_card'] ?? '', 'parent_id' => $parent ? $parent['id'] : 0, 'parent_name' => $parent ? $parent['account'] : C('OFFICIEL_CHANNEL'), 'admin_id' => $parent && $parent['admin_id'] > 0 ? $parent['admin_id'] : ($params['admin_id'] ?? 0), 'company_id' => $params['company_id'] ?? 0, 'invite_code' => $params['invite_code'] ?? '', 'create_time' => time(), 'company_belong' => $params['company_belong'] ?? 0, 'company_relation' => $params['company_relation'] ?? 0, 'settlement_type' => $params['settlement_type'] ?? 1, 'group_remark' => $params['group_remark'] ?? '', 'withdraw_show' => $params['withdraw_show'] ?? 0, 'withdraw_done' => $params['withdraw_done'] ?? 0, 'can_view_recharge'=>$params['can_view_recharge'] ?? 0, ]; if ($parent) { $data['chain'] = $parent['chain'] . $parent['id'] . '/'; $data['level'] = $this->getLevelByChain($data['chain']) + 1; } else { $data['chain'] = '/'; $data['level'] = 1; } $insert = M('promote', 'tab_')->add($data); // 如果是外团的,则自动加入市场总监审核列表 if ($data['level'] == 1 && in_array($data['company_belong'], [1, 2])) { $id = M('promote', 'tab_')->getLastInsID(); $info = M('sys_auth_group')->where(['title'=>'市场总监'])->find(); M('sys_auth_group')->where(['title'=>'市场总监'])->save(['data_president'=>$info['data_president'].",".$id]); resetUserAuth(); } $fullChain = $data['chain'] . $insert; $fullChainList = explode('/', trim($fullChain, '/')); M('promote', 'tab_')->where(['id' => $insert])->save([ 'level1_id' => $fullChainList[0] ?? 0, 'level2_id' => $fullChainList[1] ?? 0, 'level3_id' => $fullChainList[2] ?? 0, 'level4_id' => $fullChainList[3] ?? 0, ]); return $insert; } public function getLandingPageIdentifier($url) { $code = $this->getUrlParam($url, 'code'); if ($code === null) { $pid = $this->getUrlParam($url, 'gid'); $gid = $this->getUrlParam($url, 'pid'); if ($gid === null || $gid === null) { return null; } else { return $gid . '-' . $pid; } } return $code; } public function getDownloadIdentifier($url) { $code = $this->getUrlParam($url, 'code'); if ($code === null) { $pid = $this->getUrlParam($url, 'game_id'); $gid = $this->getUrlParam($url, 'promote_id'); if ($gid === null || $gid === null) { return null; } else { return $gid . '-' . $pid; } } return $code; } private function getUrlParam($url, $name) { $items = parse_url($url); $queryString = ltrim($items['query'], 's='); $queryString = ltrim($queryString, '/'); $queryString = rtrim($queryString, '.html'); $rows = explode('/', $queryString); $codeIndex = null; foreach ($rows as $key => $value) { if ($key >= 3 && $value == $name) { $codeIndex = $key; break; } } if ($codeIndex !== null) { return $rows[$codeIndex + 1] ?? null; } return null; } public function isPresidentAccess($promote) { $company = M('promote_company', 'tab_')->field(['id', 'company_belong'])->where(['id' => $promote['company_id']])->find(); if (in_array($company['company_belong'], [1, 2])) { $record = M('president_deposit', 'tab_')->where(['company_id' => $company['id']])->find(); if (!$record) { return false; } if (!in_array($record['status'], [1, 2])) { return false; } } return true; } public function getPromoteGroups($topPromoteId) { $promoteGroups = []; if (Registry::has('promoteGroups')) { $promoteGroups = Registry::get('promoteGroups'); } if (!isset($promoteGroups[$topPromoteId])) { $data = []; $promotes = M('promote', 'tab_')->field(['id', 'level', 'group_remark', 'parent_id'])->where(['level' => ['in', [2, 3]], 'chain' => ['like', '/'.$topPromoteId.'/%']])->select(); foreach ($promotes as $promote) { if ($promote['level'] == 2) { $data[$promote['id']] = [ 'name' => $promote['group_remark'], 'subs' => [] ]; } } foreach ($promotes as $promote) { if ($promote['level'] == 3) { $data[$promote['parent_id']]['subs'][$promote['id']] = [ 'name' => $promote['group_remark'], ]; } } /*echo '
'; var_dump($data); echo '';die();*/ $promoteGroups[$topPromoteId] = $data; Registry::set('promoteGroups', $promoteGroups); } return $promoteGroups[$topPromoteId]; } public function getGroupNameByChain($chain, $promoteId) { $chain = trim($chain, '/'); if ($chain == '') { return ''; } $row = explode('/', $chain); $promoteGroups = $this->getPromoteGroups($row[0]); $groupName = ''; if (isset($row[1])) { $groupName .= $promoteGroups[$row[1]]['name']; if (isset($row[2])) { $groupName .= '/' . $promoteGroups[$row[1]]['subs'][$row[2]]['name']; } } if (count($row) == 2) { $groupName .= '/' . $promoteGroups[$row[1]]['subs'][$promoteId]['name']; } if (count($row) == 1) { $groupName .= $promoteGroups[$promoteId]['name']; } return $groupName; } public function getVisibleBaseGames($promote) { $gameIds = $this->getVisibleGameIds($promote); if (count($gameIds) == 0) { return []; } return M('base_game', 'tab_')->where([ '_logic' => 'or', 'android_game_id' => ['in', $gameIds], 'ios_game_id' => ['in', $gameIds], ])->select(); } public function getVisibleGameIds($promote) { /* $gameIds = M('game', 'tab_')->getField('id', true); $selfGameIds = $promote['game_ids'] == '' ? $gameIds : explode(',', $promote['game_ids']); */ $topPromote = $this->getTopPromote($promote); $topGameIds = $topPromote['game_ids'] == '' ? [] : explode(',', $topPromote['game_ids']); $selfGameIds = $topGameIds; // $selfGameIds = $promote['game_ids'] == '' ? [] : explode(',', $promote['game_ids']); // $selfGameIds = array_intersect($topGameIds, $selfGameIds); if ($promote['level'] == 1) { return $selfGameIds; } if ($topPromote['child_game_permission'] == 0) { $gameIds = M('apply', 'tab_')->where(['offline_status' => 0, 'promote_id' => $topPromote['id']])->getField('game_id', true); if (empty($gameIds)) { return []; } return array_intersect($selfGameIds, $gameIds); } else { return $selfGameIds; } } /** * 推广员所属公会历史所有推广过的游戏ID * @todo 如果没有用户充值则该游戏ID不会显示? */ public function getHistoryGameIds($promote) { $topPromote = $this->getTopPromote($promote); $key = Redis::getKey('promote_history_games', ['promote_id' => $topPromote['level1_id']]); $value = Redis::get($key); $historyGameIds = $value ? explode(',', $value) : []; $nowGameIds = $topPromote['game_ids'] == '' ? [] : explode(',', $topPromote['game_ids']); return array_unique(array_merge($historyGameIds, $nowGameIds)); } public function checkPromoteLimitRule($promote) { $topPromote = $this->getTopPromote($promote); $rule = M('promote_limit_rules', 'tab_')->where(['promote_id' => $topPromote['id']])->order('created_at desc')->limit(1)->find(); if ($rule) { if ($rule['started_at'] === null && $rule['ended_at'] === null) { return false; } elseif ($rule['started_at'] === null && $rule['ended_at'] !== null) { if (time() < strtotime($rule['ended_at'] . ' 23:59:59')) { return false; } } elseif ($rule['started_at'] !== null && $rule['ended_at'] === null) { if (time() >= strtotime($rule['started_at'] . ' 00:00:00')) { return false; } } else { if (time() >= strtotime($rule['started_at'] . ' 00:00:00') && time() < strtotime($rule['ended_at'] . ' 23:59:59')) { return false; } } } return true; } public function getPromoteCompanyBySite($url) { $domain = C('DOMAIN', null, ''); if ($domain == '') { return null; } if (strpos($url, $domain) === false) { return null; } $url = str_replace('http://', '', $url); $url = str_replace('https://', '', $url); $url = str_replace($domain, '', $url); $domainPrefix = ''; if ($url != 'tg') { $domainPrefix = str_replace('tg-', '', $url); } return M('promote_company', 'tab_')->where(['site_domain_prefix' => $domainPrefix])->find(); } public function getSiteConfig($promoteCompany) { $siteConfig = $promoteCompany && $promoteCompany['is_site_custom'] == 1 ? json_decode($promoteCompany['site_config'], true) : null; if (!$siteConfig) { $siteConfig = []; $siteConfig['logo'] = check_logo_is_exist(C('CH_LOGO_BACKSTAGE'), 'logo_default.png'); // $siteConfig['login_logo'] = check_logo_is_exist(C('CH_SET_LOGO'),'logo_default.png'); $siteConfig['icon'] = get_cover(C('CH_SET_ICO'), 'path'); $siteConfig['title'] = seo_replace(C('channel_index.seo_title'),'','channel') . '_' . C('CH_SET_TITLE'); } else { $siteConfig['logo'] = get_cover($siteConfig['logo'], 'path'); $siteConfig['icon'] = get_cover($siteConfig['icon'], 'path'); $siteConfig['title'] = '推广平台_手机游戏推广联盟_手游推广员赚钱平台'; } $siteConfig['description'] = '首页 登录 欢迎您回来!'; $siteConfig['keywords'] = C('channel_index.seo_keyword'); return $siteConfig; } /** * 获取推广员实际拥有的测试资源数据操作范围(测试资源跨部门操作权限) */ public function getTSPermPromote($promote) { if (empty($promote)) { return null; } if ($promote['ts_over_apply'] == 1) { return $this->getTopPromote($promote); } return $promote; } }