AgentController.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537
  1. <?php
  2. namespace Modules\ManageApi\Controllers;
  3. use App\Constants\AgentConstant;
  4. use App\Constants\CommonConstant;
  5. use App\Jobs\AppPackJob;
  6. use App\Models\Mongo\PayLogsModel;
  7. use App\Models\Mongo\UsersModel;
  8. use App\Models\Mysql\AgentAttrsModel;
  9. use App\Models\Mysql\AgentModel;
  10. use App\Models\Mysql\PackModel;
  11. use App\Models\Mysql\WithDrawalLogModel;
  12. use App\Repositories\AgentBankInfoRepository;
  13. use App\Repositories\AgentRepository;
  14. use App\Repositories\AppRepository;
  15. use App\Repositories\ChannelRepository;
  16. use App\Repositories\ConfigRepoistory;
  17. use App\Repositories\Criterias\AgentPagesCriteria;
  18. use App\Repositories\Criterias\ChannelPagesCriteria;
  19. use App\Repositories\Criterias\OrderLimitCriteria;
  20. use App\Repositories\ShareUrlsRepository;
  21. use Carbon\Carbon;
  22. use Grpc\Channel;
  23. use Illuminate\Support\Facades\Validator;
  24. use Modules\ManageApi\Responses\AgentPagesResponse;
  25. use Modules\ManageApi\Responses\CommonAllResponse;
  26. use Modules\ManageApi\Responses\CommonSuccessUidResponse;
  27. use Modules\ManageApi\Responses\NotIncrementIdDetailResponse;
  28. class AgentController extends BaseController
  29. {
  30. public function lists(AgentRepository $agenRepo)
  31. {
  32. $inputData = $this->getJsonData();
  33. // 针对layui table自动分页请求参数,优先GET值.
  34. $queryPage = request()->has('page') ? request()->input('page', 1) : null;
  35. $queryPageSize = request()->has('page_size') ? request()->input('page_size', 10) : null;
  36. if (!is_null($queryPage)) {
  37. $inputData['page'] = $queryPage;
  38. }
  39. if (!is_null($queryPageSize)) {
  40. $inputData['page_size'] = $queryPageSize;
  41. }
  42. $rules = [
  43. 'page' => 'nullable|integer',
  44. 'page_size' => 'nullable|integer',
  45. 'deduction_switch' => 'nullable|integer',
  46. 'parent_uid' => 'nullable',
  47. 'uid' => 'nullable',
  48. 'username' => 'nullable',
  49. 'nick' => 'nullable',
  50. 'end_date' => 'nullable|date',
  51. 'start_date' => 'nullable|date'
  52. ];
  53. $validator = Validator::make($inputData, $rules);
  54. if ($validator->fails()) {
  55. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  56. return json_fail($validator->errors()->first());
  57. }
  58. $inputData['today_date'] = date('Y-m-d');
  59. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  60. if ($pageSize > 500) {
  61. $pageSize = CommonConstant::PAGE_SIZE;
  62. }
  63. $page = format_page($inputData['page'] ?? 0);
  64. $orders = [['id', 'desc']];
  65. $res = $agenRepo->pushCriteria(new AgentPagesCriteria($inputData))
  66. ->pushCriteria(new OrderLimitCriteria($orders))
  67. ->paginate($pageSize, ['*'], $page);
  68. if (!empty($inputData['start_date']) && !empty($inputData['end_date'])) {
  69. $startDate = toMongoIsoDate(Carbon::parse($inputData['start_date'])->startOfDay()->toDateTimeString());
  70. $endDate = toMongoIsoDate(Carbon::parse($inputData['end_date'])->endOfDay()->toDateTimeString());
  71. }
  72. $withdrawalModel = new WithDrawalLogModel();
  73. foreach ($res->items() as &$val) {
  74. // 今日充值
  75. $val->td_order_success_money = $val->attrsDay->td_order_success_money ?? 0;
  76. // 今日扣量金额
  77. $val->td_deduction_money = $val->attrsDay->td_deduction_success_money ?? 0;
  78. // 今日注册
  79. $val->td_users_total = $val->attrsDay->td_users_total ?? 0;
  80. // 今日注册扣量
  81. $val->td_users_deduction = $val->attrsDay->td_users_deduction ?? 0;
  82. // 时间范围搜索数据
  83. if (empty($inputData['start_date'])) {
  84. $val->all_users_total = 0;
  85. $val->add_users_deduction = 0;
  86. $val->add_deduction_success_money = 0;
  87. $val->all_success_money = 0;
  88. } else {
  89. $val->all_users_total = UsersModel::where( 'agent_uid', $val->uid)->whereBetween('created_at', [$startDate, $endDate])->count();
  90. $val->add_users_deduction = UsersModel::where(['is_deduction' => 1, 'agent_uid' => $val->uid])->whereBetween('created_at', [$startDate, $endDate])->count();
  91. $val->all_success_money = PayLogsModel::where( ['agent_uid' => $val->uid, 'pay_status' => 1])->whereBetween('created_at', [$startDate, $endDate])->sum('real_amount');
  92. $val->add_deduction_success_money = PayLogsModel::where( ['agent_uid' => $val->uid, 'pay_status' => 1, 'is_deduction' => 1])->whereBetween('created_at', [$startDate, $endDate])->sum('real_amount');
  93. }
  94. // 今日提现
  95. $val->td_withdraw = $withdrawalModel->where([
  96. 'status' => 3,
  97. 'agent_uid' => $val['uid']
  98. ])->whereBetween('paid_at', [
  99. Carbon::parse()->startOfDay()->toDateTimeString(),
  100. Carbon::parse()->endOfDay()->toDateTimeString()
  101. ])->sum('amount');
  102. // 总充值
  103. $val->order_success_money = $val->attrs->order_success_money ?? 0;
  104. // 总充值扣量
  105. $val->deduction_success_money = $val->attrs->deduction_success_money ?? 0;
  106. // // 总注册
  107. // $val->users_total = UsersModel::where('agent_uid', $val->uid)->groupBy('user_uid')->count();
  108. // // 总注册扣量
  109. // $val->users_deduction = UsersModel::where(['agent_uid' => $val->uid, 'is_deduction' => 1])->groupBy('user_uid')->count();
  110. // 总注册
  111. $val->users_total = UsersModel::where('agent_uid', $val->uid)->groupBy('user_uid')->count();
  112. // 总注册扣量
  113. $val->users_deduction = UsersModel::where(['agent_uid' => $val->uid, 'is_deduction' => 1])->groupBy('user_uid')->count();
  114. // 累计提现
  115. $val->withdraw_money = $withdrawalModel->where(['status' => 3, 'agent_uid' => $val['uid']])->sum('amount');
  116. // cpa支出金额
  117. $val->cps_money = ($val->users_total - $val->users_deduction) * $val->cpa_price;
  118. unset($val->attrs, $val->attrsDay, $val->everyDay);
  119. }
  120. return new AgentPagesResponse($res);
  121. }
  122. /**
  123. * 用户详情
  124. */
  125. public function detail()
  126. {
  127. $inputData = $this->getJsonData();
  128. $rules = [
  129. 'uid' => 'required|string',
  130. ];
  131. $validator = Validator::make($inputData, $rules);
  132. if ($validator->fails()) {
  133. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  134. return json_fail($validator->errors()->first());
  135. }
  136. $agentRepo = app(AgentRepository::class);
  137. $data = $agentRepo->findBy('uid', $inputData['uid']);
  138. $jdata = json_decode($data['jdata'], true);
  139. $data['deduction_price'] = $jdata['deduction_price'] ?? 0;
  140. $data['deduction_number'] = $jdata['deduction_number'] ?? 0;
  141. //获取代理提现银行卡
  142. $bankRepo = app(AgentBankInfoRepository::class);
  143. $data['bank_info'] = $bankRepo->findWhere(['agent_uid' => $inputData['uid']]);
  144. return new NotIncrementIdDetailResponse($data);
  145. }
  146. /**
  147. * 创建一个代理.
  148. * @param Validator $validatorFactory
  149. * @param AgentRepository $objRepo
  150. * @return \Illuminate\Http\JsonResponse|CommonSuccessUidResponse
  151. */
  152. public function create(Validator $validatorFactory, AgentRepository $objRepo)
  153. {
  154. $inputData = $this->getJsonData();
  155. $rules = [
  156. 'parent_uid' => 'nullable|max:16',
  157. 'username' => 'unique:agent,username|required|max:16',
  158. 'nick' => 'nullable|max:64',
  159. 'status' => 'in:1,2',
  160. 'password' => 'required|min:6|max:32',
  161. 'otp_screct' => 'nullable|max:32',
  162. 'own_app_uids' => 'required|string',
  163. 'withdraw_pwd' => 'nullable|max:64',
  164. 'commission_ratio' => 'required|integer|between:0,100',
  165. 'deduction_switch' => 'in:0,1,2,3',
  166. 'deduction_price' => 'nullable|string',
  167. 'deduction_number' => 'nullable|string',
  168. 'withdraw_amount' => 'nullable|integer',
  169. 'withdraw_usdt' => 'nullable|integer'
  170. ];
  171. $validator = Validator::make($inputData, $rules);
  172. if ($validator->fails()) {
  173. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  174. return json_fail($validator->errors()->first());
  175. }
  176. if ($inputData['commission_ratio'] < AgentConstant::MIN_COMMISSION_RATIO || $inputData['commission_ratio'] > AgentConstant::MAX_COMMISSION_RATIO) {
  177. return json_fail('提成设置错误');
  178. }
  179. if (empty($inputData['withdraw_pwd'])) {
  180. //如果为空就取默认值
  181. $appRepo = app(ConfigRepoistory::class);
  182. $withdrawPwd = $appRepo->get('withdraw_pwd', 'sys');
  183. $inputData['withdraw_pwd'] = $withdrawPwd;
  184. }
  185. if (empty($inputData['withdraw_pwd'])) {
  186. //如果为空就取默认值
  187. $appRepo = app(ConfigRepoistory::class);
  188. $withdrawPwd = $appRepo->get('withdraw_pwd', 'sys');
  189. $inputData['withdraw_pwd'] = $withdrawPwd;
  190. }
  191. if (empty($inputData['withdraw_amount'])) {
  192. $inputData['withdraw_amount'] = 0;
  193. }
  194. if (empty($inputData['withdraw_usdt'])) {
  195. $inputData['withdraw_usdt'] = 0;
  196. }
  197. $item = [
  198. 'username' => $inputData['username'],
  199. 'nick' => $inputData['nick'] ?? '',
  200. 'password' => $inputData['password'],
  201. 'status' => $inputData['status'],
  202. 'otp_screct' => $inputData['otp_screct'] ?? '',
  203. 'parent_uid' => $inputData['parent_uid'] ?? '',
  204. 'withdraw_pwd' => $inputData['withdraw_pwd'],
  205. 'own_app_uids' => $inputData['own_app_uids'],
  206. 'commission_ratio' => $inputData['commission_ratio'],
  207. 'deduction_switch' => $inputData['deduction_switch'],
  208. 'preferential_order' => $inputData['preferential_order'] ?: 0,
  209. 'jdata' => $inputData['jdata'],
  210. 'cpa_deduction_rule' => $inputData['cpa_deduction_rule'],
  211. 'cpa_price' => $inputData['cpa_price'] ?: 0,
  212. 'withdraw_amount' => $inputData['withdraw_amount'],
  213. 'withdraw_usdt' => $inputData['withdraw_usdt'],
  214. ];
  215. $agentObj = $objRepo->createOne($item);
  216. $respData = [
  217. 'uid' => $agentObj->uid,
  218. ];
  219. //创建渠道
  220. $chanRepo = app(ChannelRepository::class);
  221. $chanRepo->createAgentChannel($agentObj->uid);
  222. return new CommonSuccessUidResponse($respData);
  223. }
  224. public function checkUsername()
  225. {
  226. $inputData = $this->getJsonData();
  227. $rules = [
  228. 'username' => 'unique:agent,username|required|max:16',
  229. ];
  230. $message = [
  231. 'username.unique' => '账号已存在!',
  232. 'username.required' => '用户名不能为空!',
  233. 'username.max' => '用户名不能大于16字节!'
  234. ];
  235. $validator = Validator::make($inputData, $rules, $message);
  236. if ($validator->fails()) {
  237. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  238. return json_fail($validator->errors()->first());
  239. }
  240. return json_fail('用户名可用!', 200, []);
  241. }
  242. /**
  243. * 修改代理.
  244. * @param Validator $validatorFactory
  245. * @param AgentRepository $objRepo
  246. * @return \Illuminate\Http\JsonResponse|CommonSuccessUidResponse
  247. * @throws \App\Exceptions\ApiException
  248. */
  249. public function modify(Validator $validatorFactory, AgentRepository $objRepo)
  250. {
  251. $inputData = $this->getJsonData();
  252. $rules = [
  253. 'uid' => 'required',
  254. 'nick' => 'required|max:64',
  255. 'password' => 'nullable|min:6|max:32',
  256. 'withdraw_pwd' => 'nullable|max:64',
  257. 'own_app_uids' => 'required|string',
  258. 'status' => 'in:1,2',
  259. 'commission_ratio' => 'required|integer|between:0,100',
  260. 'deduction_switch' => 'in:0,1,2,3',
  261. 'deduction_price' => 'nullable|string',
  262. 'deduction_number' => 'nullable|string',
  263. 'withdraw_amount' => 'nullable|integer',
  264. 'withdraw_usdt' => 'nullable|integer'
  265. ];
  266. $validator = Validator::make($inputData, $rules);
  267. if ($validator->fails()) {
  268. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  269. return json_fail($validator->errors()->first());
  270. }
  271. if ($inputData['commission_ratio'] < AgentConstant::MIN_COMMISSION_RATIO || $inputData['commission_ratio'] > AgentConstant::MAX_COMMISSION_RATIO) {
  272. return json_fail('提成设置错误');
  273. }
  274. if (empty($inputData['withdraw_amount'])) {
  275. $inputData['withdraw_amount'] = 0;
  276. }
  277. if (empty($inputData['withdraw_usdt'])) {
  278. $inputData['withdraw_usdt'] = 0;
  279. }
  280. $item = [
  281. 'nick' => $inputData['nick'] ?? '',
  282. 'status' => $inputData['status'],
  283. 'password' => $inputData['password'] ?? null,
  284. 'withdraw_pwd' => $inputData['withdraw_pwd'] ?? null,
  285. 'parent_uid' => $inputData['parent_uid'] ?? '',
  286. 'own_app_uids' => $inputData['own_app_uids'],
  287. 'commission_ratio' => $inputData['commission_ratio'],
  288. 'deduction_switch' => $inputData['deduction_switch'],
  289. 'preferential_order' => $inputData['preferential_order'] ?: 0,
  290. 'cpa_deduction_rule' => $inputData['cpa_deduction_rule'],
  291. 'cpa_price' => $inputData['cpa_price'],
  292. 'withdraw_amount' => $inputData['withdraw_amount'],
  293. 'withdraw_usdt' => $inputData['withdraw_usdt'],
  294. 'jdata' => $inputData['jdata']
  295. ];
  296. $saveResult = $objRepo->updateOne($item, $inputData['uid']);
  297. if (!$saveResult) {
  298. return json_fail('修改失败');
  299. }
  300. $objRepo->delAgentRuleCache($inputData['uid']);
  301. return new CommonSuccessUidResponse($inputData['uid']);
  302. }
  303. public function editStatus(Validator $validatorFactory, AgentRepository $objRepo)
  304. {
  305. $inputData = $this->getJsonData();
  306. $rules = [
  307. 'uid' => 'required|string'
  308. ];
  309. $validator = Validator::make($inputData, $rules);
  310. if ($validator->fails()) {
  311. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  312. return json_fail($validator->errors()->first());
  313. }
  314. $user = $objRepo->findBy('uid', $inputData['uid']);
  315. if (empty($user)) {
  316. return json_fail(trans('common.err_resource_not_found'));
  317. }
  318. $oldUser = clone $user;
  319. $user->status = $user->status === 1 ? 2 : 1;
  320. $result = $user->save();
  321. if (!$result) {
  322. return json_fail('修改失败');
  323. } else {
  324. $logSubject = '编辑一个代理状态, UID:' . $user->uid;
  325. $logSvalue = $user->uid;
  326. $logDbData = [
  327. 'after_items' => [
  328. $user->toArray(),
  329. ],
  330. 'before_items' => [
  331. $oldUser->toArray(),
  332. ],
  333. ];
  334. $this->log($logSubject, $logSvalue, $logDbData);
  335. return new CommonSuccessUidResponse($user->uid);
  336. }
  337. }
  338. /**
  339. * 修改代理提现账户
  340. *
  341. * @return \Illuminate\Http\JsonResponse|CommonSuccessUidResponse
  342. */
  343. public function editAgentBank()
  344. {
  345. $inputData = $this->getJsonData();
  346. $rules = [
  347. 'type' => 'required|integer',
  348. 'agent_uid' => 'required|string',
  349. 'bank_card' => 'required|string',
  350. 'bank_account' => 'required|string',
  351. ];
  352. $validator = Validator::make($inputData, $rules);
  353. if ($validator->fails()) {
  354. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  355. return json_fail($validator->errors()->first());
  356. }
  357. /**
  358. * @var AgentBankInfoRepository
  359. */
  360. $agentBankRepo = app(AgentBankInfoRepository::class);
  361. $bankInfo = $agentBankRepo->findBy('agent_uid', $inputData['agent_uid']);
  362. if (empty($bankInfo)) {
  363. return json_fail(trans('common.err_resource_not_found'));
  364. }
  365. $oldbankInfo = clone $bankInfo;
  366. if (!empty($inputData['type'])) {
  367. $bankInfo->type = trim($inputData['type']);
  368. }
  369. if (!empty($inputData['bank_card'])) {
  370. $bankInfo->bank_card = trim($inputData['bank_card']);
  371. }
  372. if (!empty($inputData['bank_account'])) {
  373. $bankInfo->bank_account = trim($inputData['bank_account']);
  374. }
  375. $result = $bankInfo->save();
  376. if (!$result) {
  377. return json_fail('修改失败');
  378. } else {
  379. $logSubject = '修改一个代理的提现方式,开户方式:' . $bankInfo->type;
  380. $logSvalue = $bankInfo->uid;
  381. $logDbData = [
  382. 'after_items' => [
  383. $bankInfo->toArray(),
  384. ],
  385. 'before_items' => [
  386. $oldbankInfo->toArray(),
  387. ],
  388. ];
  389. $this->log($logSubject, $logSvalue, $logDbData);
  390. return new CommonSuccessUidResponse($bankInfo->uid);
  391. }
  392. }
  393. public function channelList()
  394. {
  395. $inputData = $this->getJsonData();
  396. $rules = [
  397. 'uid' => 'nullable|string',
  398. 'agent_uid' => 'nullable|string',
  399. 'mom_app_uid' => 'nullable|string',
  400. ];
  401. $validator = Validator::make($inputData, $rules);
  402. if ($validator->fails()) {
  403. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  404. return json_fail($validator->errors()->first());
  405. }
  406. $orders = [
  407. ['id', 'DESC'],
  408. ];
  409. // 注意,单例分页一定要克隆一个(保证前面没用使用到paginate);
  410. $page = request()->has('page') ? request()->input('page', 1) : null;
  411. $pageSize = request()->has('page_size') ? request()->input('page_size', 10) : null;
  412. if ($pageSize > 500) {
  413. $pageSize = CommonConstant::PAGE_SIZE;
  414. }
  415. /**
  416. * @var ChannelRepository $videoRepo
  417. */
  418. $channelRepo = app(ChannelRepository::class);
  419. $res = $channelRepo->pushCriteria(new ChannelPagesCriteria($inputData))->pushCriteria(new OrderLimitCriteria($orders))
  420. ->paginate($pageSize,
  421. ['*'], $page);
  422. $shareUrlData = app(ShareUrlsRepository::class)->findWhere(['status' => 1], ['mom_app_uid', 'url'])->toArray();
  423. $shareUrlData = array_column($shareUrlData, null, 'mom_app_uid');
  424. foreach ($res->items() as &$val) {
  425. if (isset($shareUrlData[$val->mom_app_uid])) {
  426. $val->share_url = $shareUrlData[$val->mom_app_uid]['url'] . '?channel_code=' . $val->uid;
  427. } else {
  428. $val->share_url = '';
  429. }
  430. }
  431. return new CommonAllResponse($res);
  432. }
  433. /**
  434. * 打包
  435. * @return \Illuminate\Http\JsonResponse|void
  436. */
  437. public function channelPack()
  438. {
  439. $inputData = $this->getJsonData();
  440. $rules = [
  441. 'uid' => 'required',
  442. ];
  443. $validator = Validator::make($inputData, $rules);
  444. if ($validator->fails()) {
  445. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  446. return json_fail($validator->errors()->first());
  447. }
  448. // 查找渠道开始打包
  449. /**
  450. * 获取渠道app
  451. * @var ChannelRepository $channRepo
  452. */
  453. $channelRepo = app(ChannelRepository::class);
  454. $channelData = $channelRepo->getAppChannel($inputData['uid']);
  455. $packArray =[
  456. 'agent_uid'=>$channelData->agent_uid,
  457. 'channel_code'=>$channelData->uid,
  458. 'mom_app_name'=>$channelData->app->name,
  459. 'mom_app_uid'=>$channelData->app->uid,
  460. 'mom_app_id'=>$channelData->app->app_id,
  461. 'android_or_ios'=>1,
  462. 'mom_app_download'=>$channelData->app->android_url,
  463. 'mom_app_version'=>$channelData->app->android_version,
  464. ];
  465. $packCreateData = $packArray;
  466. // 数据库格式
  467. unset($packCreateData['mom_app_download']);
  468. $packCreateData['app_download'] = '';
  469. $packCreateData['status'] = 3;// 打包中
  470. // 写入数据库
  471. $packModel = (new PackModel())->where('channel_code',$inputData['uid'])->count();
  472. if ($packModel){
  473. if (!PackModel::query()->where('channel_code',$inputData['uid'])->update($packCreateData)){
  474. return json_success([],'打包失败请重试');
  475. }
  476. }else{
  477. if (!PackModel::query()->create($packCreateData)){
  478. return json_success([],'打包失败请重试');
  479. }
  480. }
  481. // 打包
  482. dispatch(new AppPackJob($packArray))->onQueue('app_pack');
  483. return json_success([],'开始打包,稍等1-2分钟');
  484. }
  485. }