AgentOa.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842
  1. <?php
  2. /**
  3. * Agentgame.php UTF-8
  4. * 渠道游戏处理
  5. *
  6. * @date : 2017/1/16 21:14
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 7.0
  11. */
  12. namespace huolib\oa;
  13. use think\Db;
  14. use think\Log;
  15. class AgentOa extends Oa {
  16. private $agent_id;
  17. private $today;
  18. private $app_id;
  19. /**
  20. * 自定义错误处理
  21. *
  22. * @param msg 输出的文件
  23. */
  24. private function _error($msg, $level = 'error') {
  25. $_info = 'huolib\oa\AgentOa Error:'.$msg;
  26. Log::write($_info, 'error');
  27. }
  28. /**
  29. * 构造函数
  30. *
  31. * @param $agentid INT 代理ID
  32. * @param $agentgame string 代理游戏名称
  33. */
  34. public function __construct($agent_id = 0, $agentgame = '') {
  35. if (empty($agent_id)) {
  36. $this->setAgentidfromAg($agentgame);
  37. } else {
  38. $this->agent_id = $agent_id;
  39. }
  40. $this->today = date('Y-m-d');
  41. }
  42. /**
  43. * 基础更新渠道信息
  44. *
  45. * @param array $agent_data
  46. *
  47. * @return array
  48. */
  49. public function baseUpdate($agent_data = array()
  50. ) {
  51. $_agent_data = array(
  52. 'mem_id' => $this->getVal($agent_data, 'mem_id'),
  53. 't_id' => $this->getVal($agent_data, 't_id'),
  54. 't_name' => $this->getVal($agent_data, 't_name'),
  55. 'agent_id' => $this->getVal($agent_data, 'agent_id'),
  56. 'app_id' => $this->getVal($agent_data, 'app_id'),
  57. 'update_ip_cnt' => $this->getVal($agent_data, 'update_ip_cnt'),
  58. 'reg_cnt' => $this->getVal($agent_data, 'reg_cnt'),
  59. 'order_cnt' => $this->getVal($agent_data, 'order_cnt'),
  60. 'check_order_cnt' => $this->getVal($agent_data, 'check_order_cnt'),
  61. 'update_pay_mem_cnt' => $this->getVal($agent_data, 'update_pay_mem_cnt'),
  62. 'check_sum_money' => $this->getVal($agent_data, 'check_sum_money'),
  63. 'update_s_mem_cnt' => $this->getVal($agent_data, 'update_s_mem_cnt'),
  64. 'sum_money' => $this->getVal($agent_data, 'sum_money'),
  65. 'role_level' => $this->getVal($agent_data, 'role_level'),
  66. 'real_amount' => $this->getVal($agent_data, 'real_amount'),
  67. 'date' => $this->getVal($agent_data, 'now_time')
  68. );
  69. $this->agent_id = $_agent_data['app_id'];
  70. $_doinfo = $this->change_agent_oa($_agent_data);
  71. return $_doinfo;
  72. }
  73. /**
  74. * 设置agentid
  75. *
  76. * @param $agentid INT 代理ID
  77. */
  78. public function setAgentid($agentid) {
  79. $this->agent_id = $agentid;
  80. }
  81. /**
  82. * 通过agentgame设置agentid
  83. *
  84. * @param $agentid INT 代理ID
  85. */
  86. public function setAgentidfromAg($agentgame) {
  87. if (empty($agentgame) || 'default' == $agentgame) {
  88. $this->agent_id = 0;
  89. return;
  90. }
  91. $_map['agentgame'] = $agentgame;
  92. $_agent_id = DB::name(self::AGENT_GAME_DB_NAME)->where($_map)->value('agent_id');
  93. if (empty($_agent_id)) {
  94. $this->agent_id = 0;
  95. return;
  96. }
  97. $this->agent_id = $_agent_id;
  98. }
  99. /**
  100. * 获取agentid
  101. */
  102. public function getAgentid() {
  103. return $this->agent_id;
  104. }
  105. /**
  106. * 注册成功,支付回调,上传角色后调起的异步处理
  107. * 有传值则为加一处理
  108. * $reg_data 不能为空
  109. * 至少要有推广员的agent_id和游戏的app_id
  110. * date为处理时间 可以为数字和时间格式
  111. *
  112. * 后续需要考虑并发
  113. * 查询后统计就要传参数
  114. * 这接口每天每个推广员的每个游戏运行一次就可以了
  115. *
  116. * @param array $agent_data
  117. *
  118. * @return array
  119. *
  120. */
  121. public function change_agent_oa($agent_data = array()) {
  122. $_check_data = $this->check_agent_oa_exent($agent_data);
  123. if (empty($_check_data)) {
  124. return array(
  125. 'status' => 'FAIL',
  126. 'code' => 503,
  127. 'status_desc' => '参数未传或格式错误',
  128. 'func' => 'change_agent_oa',
  129. 'info' => array()
  130. );
  131. }
  132. if (!isset($_check_data['info']) || empty($_check_data['info'])) {
  133. return $_check_data;
  134. }
  135. //Log::write($_check_data, 'error');
  136. if (isset($_check_data['code']) && 200 == $_check_data['code']) {
  137. /* 需走更新 注册完进行判断是否更新独立ip数 注册人数肯定要更新 支付完判断是否更新支付人数 次数和金额肯定要更新 */
  138. // return $this->update_change_agent_oa($_check_data['info']);
  139. return $this->initialize_agent_oa($_check_data['info']);
  140. } else {
  141. return $this->initialize_agent_oa($_check_data['info']);
  142. }
  143. }
  144. /**
  145. * 更新推广员业绩数据
  146. *
  147. * @param array $update_data
  148. *
  149. * @return array
  150. */
  151. public function update_change_agent_oa($update_data = array()) {
  152. if (empty($update_data) || !isset($update_data['id']) || !$update_data['id']
  153. || !is_numeric(
  154. $update_data['id']
  155. )
  156. ) {
  157. return array(
  158. 'status' => 'FAIL',
  159. 'code' => 403,
  160. 'status_desc' => '参数未传或格式错误',
  161. 'func' => 'update_change_agent_oa',
  162. 'data' => $update_data,
  163. 'info' => array()
  164. );
  165. }
  166. $_oa_map = array();
  167. $_oa_map['id'] = $update_data['id'];
  168. $_update_data = array();
  169. $_oa_info = Db::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->field('agent_id,date,app_id,is_standard')->find(
  170. );
  171. if (empty($_oa_info)) {
  172. return array(
  173. 'status' => 'FAIL',
  174. 'code' => 408,
  175. 'status_desc' => '操作失败未找到信息',
  176. 'func' => 'update_change_agent_oa',
  177. 'info' => array()
  178. );
  179. }
  180. if (isset($update_data['reg_cnt']) && $update_data['reg_cnt'] && is_numeric($update_data['reg_cnt'])) {
  181. $_update_data['reg_cnt'] = ['exp',
  182. 'reg_cnt'.($update_data['reg_cnt'] > 0 ? '+' : '').$update_data['reg_cnt']];
  183. }
  184. if (isset($update_data['update_ip_cnt']) && $update_data['update_ip_cnt']) {
  185. /* $_update_data['reg_ip_cnt']= ['exp','reg_ip_cnt'.($update_data['reg_ip_cnt']>0?'+':'').$update_data['reg_ip_cnt']]; */
  186. $_update_data['reg_ip_cnt'] = $this->get_agent_distinct_reg_ip_cnt($_oa_info);
  187. }
  188. if (isset($update_data['update_s_mem_cnt']) && $update_data['update_s_mem_cnt']) {
  189. $_update_data['standard_mem_cnt'] = $this->get_agent_standard_mem_cnt($_oa_info);
  190. }
  191. if (isset($update_data['order_cnt']) && $update_data['order_cnt'] && is_numeric($update_data['order_cnt'])) {
  192. $_update_data['order_cnt'] = ['exp', 'order_cnt'.($update_data['order_cnt'] > 0 ? '+' : '')
  193. .$update_data['order_cnt']];
  194. }
  195. if (isset($update_data['check_order_cnt']) && $update_data['check_order_cnt']
  196. && is_numeric(
  197. $update_data['check_order_cnt']
  198. )
  199. ) {
  200. $_update_data['order_cnt'] = $this->get_agent_order_cnt($_oa_info);
  201. }
  202. if (isset($update_data['update_pay_mem_cnt']) && $update_data['update_pay_mem_cnt']) {
  203. $_update_data['pay_mem_cnt'] = $this->get_agent_pay_mem_cnt($_oa_info);
  204. }
  205. if ((isset($update_data['sum_money']) && $update_data['sum_money'] && is_numeric($update_data['sum_money']))
  206. || (isset($update_data['check_sum_money']) && $update_data['check_sum_money']
  207. && is_numeric(
  208. $update_data['check_sum_money']
  209. ))
  210. ) {
  211. /* sum_money 如果累加会造成严重的误差 */
  212. $_update_data['sum_money'] = $this->get_agent_sum_money($_oa_info);
  213. }
  214. $_update_data['update_time'] = time();
  215. $update_do = Db::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->update($_update_data);
  216. if ($update_do) {
  217. define('NOT_STANDARD', 1);
  218. if (NOT_STANDARD == $_oa_info['is_standard']) {/* 当还不及格的时候再检测是否及格 */
  219. $check_is_standard = $this->check_is_standard($_oa_map);
  220. if (NOT_STANDARD != $check_is_standard) {
  221. Db::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->setField('is_standard', $check_is_standard);
  222. }
  223. }
  224. return array(
  225. 'status' => 'OK',
  226. 'code' => 200,
  227. 'status_desc' => '操作成功',
  228. 'func' => 'update_change_agent_oa',
  229. 'info' => array(
  230. 'update_do' => $update_do
  231. )
  232. );
  233. } else {
  234. return array(
  235. 'status' => 'FAIL',
  236. 'code' => 409,
  237. 'status_desc' => '操作失败',
  238. 'func' => 'update_change_agent_oa',
  239. 'info' => array(
  240. 'update_do' => $update_do
  241. )
  242. );
  243. }
  244. }
  245. /**
  246. * 检测当天数据记录是否已有记录 code 200 已有 201 未有
  247. *
  248. * @param array $agent_data
  249. *
  250. * @return array
  251. */
  252. public function check_agent_oa_exent($agent_data = array()) {
  253. if (empty($agent_data)) {
  254. return array(
  255. 'status' => 'FAIL',
  256. 'code' => 503,
  257. 'status_desc' => '参数未传或格式错误',
  258. 'func' => 'check_agent_oa_exent',
  259. 'info' => array()
  260. );
  261. }
  262. $_agent_id = ($agent_data['agent_id'] && is_numeric($agent_data['agent_id'])) ? $agent_data['agent_id']
  263. : $this->agent_id;
  264. if (!$_agent_id || !is_numeric($_agent_id)) {
  265. return array(
  266. 'status' => 'FAIL',
  267. 'code' => 504,
  268. 'status_desc' => '参数agent_id未传或格式错误',
  269. 'func' => 'check_agent_oa_exent',
  270. 'info' => array()
  271. );
  272. }
  273. if (!$agent_data['app_id'] || !is_numeric($agent_data['app_id'])) {
  274. return array(
  275. 'status' => 'FAIL',
  276. 'code' => 505,
  277. 'status_desc' => '参数app_id未传或格式错误',
  278. 'func' => 'check_agent_oa_exent',
  279. 'info' => array()
  280. );
  281. }
  282. $_reg_today = $agent_data['date'] ? (is_numeric($agent_data['date']) ? date('Y-m-d', $agent_data['date'])
  283. : $agent_data['date']) : $this->today;
  284. $_oa_map = array(
  285. 'agent_id' => $_agent_id,
  286. 'app_id' => $agent_data['app_id'],
  287. 'date' => $_reg_today
  288. );
  289. $this->app_id = $agent_data['app_id'];
  290. $this->today = $_reg_today;
  291. $_agent_oa_data = DB::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->field('id,date,app_id,agent_id')->find();
  292. if (!empty($_agent_oa_data)) {
  293. // Log::write($agent_data, 'error');
  294. // Log::write($_agent_oa_data, 'error');
  295. $_info = array_merge($agent_data, $_agent_oa_data);
  296. //Log::write($_info, 'error');
  297. return array(
  298. 'status' => 'OK',
  299. 'code' => 200,
  300. 'status_desc' => '已有记录',
  301. 'func' => 'check_agent_oa_exent',
  302. 'info' => $_info
  303. );
  304. } else {
  305. $_info = array_merge($agent_data, $_oa_map);
  306. return array(
  307. 'status' => 'OK',
  308. 'code' => 201,
  309. 'status_desc' => '未找到该记录',
  310. 'func' => 'check_agent_oa_exent',
  311. 'info' => $_info
  312. );
  313. }
  314. }
  315. /**
  316. * 初始化某天某个推广员的某个游戏记录
  317. *
  318. * @param array $agent_data
  319. *
  320. * @return array
  321. */
  322. public function initialize_agent_oa($agent_data = array()) {
  323. $_check_data = $this->check_agent_oa_exent($agent_data);
  324. if (empty($_check_data)) {
  325. return array(
  326. 'status' => 'FAIL',
  327. 'code' => 503,
  328. 'status_desc' => '参数未传或格式错误',
  329. 'func' => 'initialize_agent_oa',
  330. 'info' => array()
  331. );
  332. }
  333. if (!isset($_check_data['info']) || empty($_check_data['info'])) {
  334. return $_check_data;
  335. } else {
  336. $_agent_oa_data = $_check_data['info'];
  337. }
  338. if (isset($_check_data['code']) && 200 == $_check_data['code']) {
  339. /* 走更新流程 */
  340. $_update_agent_oa = $this->update_agent_oa($_agent_oa_data);
  341. if (is_array($_update_agent_oa) && !empty($_update_agent_oa) && isset($_update_agent_oa['status'])
  342. && 'OK' == $_update_agent_oa['status']
  343. ) {
  344. return $_update_agent_oa;
  345. } else {
  346. return $_update_agent_oa;
  347. }
  348. } else {
  349. /* 还没有记录 */
  350. $_save_info = $this->save_agent_oa($_agent_oa_data);
  351. if (is_array($_save_info) && !empty($_save_info) && isset($_save_info['status'])
  352. && 'OK' == $_save_info['status']
  353. ) {
  354. /* 处理成功 */
  355. return $_save_info;
  356. } else {
  357. return $_save_info;
  358. }
  359. }
  360. }
  361. /**
  362. * 直接统计更新当天推广员某游戏数据
  363. *
  364. * @param array $agent_oa_data
  365. *
  366. * @return array
  367. */
  368. public function update_agent_oa($agent_oa_data = array()) {
  369. if (!is_array($agent_oa_data) || empty($agent_oa_data)) {
  370. return array(
  371. 'status' => 'FAIL',
  372. 'code' => 503,
  373. 'status_desc' => '参数为空',
  374. 'func' => 'update_agent_oa',
  375. 'info' => array()
  376. );
  377. }
  378. if (!isset($agent_oa_data['id']) || !is_numeric($agent_oa_data['id'])) {
  379. return array(
  380. 'status' => 'FAIL',
  381. 'code' => 504,
  382. 'status_desc' => '参数为空',
  383. 'func' => 'update_agent_oa',
  384. 'info' => array()
  385. );
  386. }
  387. $_oa_map = array();
  388. $_oa_map['id'] = $agent_oa_data['id'];
  389. $_oa_info = Db::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->field('agent_id,app_id,date')->find();
  390. if (!is_array($_oa_info) || empty($_oa_info)) {
  391. return array(
  392. 'status' => 'FAIL',
  393. 'code' => 404,
  394. 'status_desc' => '未找到相关记录',
  395. 'func' => 'update_agent_oa',
  396. 'info' => array()
  397. );
  398. }
  399. $_update_data = array();
  400. $_update_data['reg_cnt'] = $this->get_agent_reg_cnt($_oa_info);
  401. $_update_data['reg_ip_cnt'] = $this->get_agent_distinct_reg_ip_cnt($_oa_info);
  402. $_update_data['order_cnt'] = $this->get_agent_order_cnt($_oa_info);
  403. $_update_data['pay_mem_cnt'] = $this->get_agent_pay_mem_cnt($_oa_info);
  404. $_update_data['sum_money'] = $this->get_agent_sum_money($_oa_info);
  405. $_update_data['standard_mem_cnt'] = $this->get_agent_standard_mem_cnt($_oa_info);
  406. $_update_data['is_standard'] = $this->check_is_standard($_update_data);
  407. $_update_data['update_time'] = time();
  408. $update_do = Db::name(self::OA_AGENT_DB_NAME)->where($_oa_map)->update($_update_data);
  409. if ($update_do) {
  410. return array(
  411. 'status' => 'OK',
  412. 'code' => 200,
  413. 'status_desc' => '更新成功',
  414. 'func' => 'update_agent_oa',
  415. 'info' => array(
  416. 'update_do' => $update_do,
  417. 'id' => $agent_oa_data['id']
  418. )
  419. );
  420. } else {
  421. return array(
  422. 'status' => 'FAIL',
  423. 'code' => 500,
  424. 'status_desc' => '更新失败',
  425. 'func' => 'update_agent_oa',
  426. 'info' => array()
  427. );
  428. }
  429. }
  430. /**
  431. * 统计初始化推广员某游戏当天数据
  432. *
  433. * @param array $agent_info
  434. *
  435. * @return array
  436. */
  437. public function save_agent_oa($agent_info = array()) {
  438. if (!is_array($agent_info) || empty($agent_info)) {
  439. return array(
  440. 'status' => 'FAIL',
  441. 'code' => 503,
  442. 'status_desc' => '参数为空或未传',
  443. 'func' => 'update_agent_oa',
  444. 'info' => array()
  445. );
  446. }
  447. if (!isset($agent_info['agent_id']) || !$agent_info['agent_id'] || !is_numeric($agent_info['agent_id'])) {
  448. return array(
  449. 'status' => 'FAIL',
  450. 'code' => 504,
  451. 'status_desc' => '参数agent_id未传或不是正确的数字类型',
  452. 'func' => 'update_agent_oa',
  453. 'info' => array()
  454. );
  455. }
  456. if (!isset($agent_info['app_id']) || !$agent_info['app_id'] || !is_numeric($agent_info['app_id'])) {
  457. return array(
  458. 'status' => 'FAIL',
  459. 'code' => 505,
  460. 'status_desc' => '参数app_id未传或不是正确的数字类型',
  461. 'func' => 'update_agent_oa',
  462. 'info' => array()
  463. );
  464. }
  465. $_oa_data = array();
  466. $_oa_data['agent_id'] = $agent_info['agent_id'];
  467. $_oa_data['app_id'] = $agent_info['app_id'];
  468. $_oa_data['date'] = isset($agent_info['date']) ? $agent_info['date'] : $this->taday;
  469. $_oa_data['reg_cnt'] = $this->get_agent_reg_cnt($agent_info);
  470. $_oa_data['reg_ip_cnt'] = $this->get_agent_distinct_reg_ip_cnt($agent_info);
  471. $_oa_data['order_cnt'] = $this->get_agent_order_cnt($agent_info);
  472. $_oa_data['pay_mem_cnt'] = $this->get_agent_pay_mem_cnt($agent_info);
  473. $_oa_data['sum_money'] = $this->get_agent_sum_money($agent_info);
  474. $_oa_data['standard_mem_cnt'] = $this->get_agent_standard_mem_cnt($agent_info);
  475. $_oa_data['is_standard'] = $this->check_is_standard($_oa_data);
  476. $_oa_data['create_time'] = time();
  477. $_oa_data['update_time'] = time();
  478. $agent_oa_id = Db::name(self::OA_AGENT_DB_NAME)->insertGetId($_oa_data);
  479. if ($agent_oa_id) {
  480. return array(
  481. 'status' => 'OK',
  482. 'code' => 200,
  483. 'status_desc' => '添加处理成功',
  484. 'func' => 'save_agent_oa',
  485. 'info' => array(
  486. 'agent_oa_id' => $agent_oa_id
  487. )
  488. );
  489. } else {
  490. return array(
  491. 'status' => 'FAIL',
  492. 'code' => 400,
  493. 'status_desc' => '添加处理失败',
  494. 'func' => 'save_agent_oa',
  495. 'info' => array(
  496. 'agent_oa_id' => $agent_oa_id
  497. )
  498. );
  499. }
  500. }
  501. /**
  502. * 获取达标数量Db::query("select * from think_user where status=1");
  503. *
  504. * @param array $agent_info
  505. *
  506. * @return int
  507. */
  508. public function get_agent_standard_mem_cnt(
  509. $agent_info = array()
  510. ) {
  511. /* 先找出当天注册的用户 */
  512. $_agent_info_check = $this->check_agent_info($agent_info);
  513. if (!is_array($_agent_info_check) || empty($_agent_info_check)) {
  514. return 0;
  515. }
  516. $_standard_level = $this->get_standard_level($agent_info);
  517. if ($_standard_level == 0) {
  518. return 0;
  519. }
  520. $DB_PREFIX = \think\Config::get('database.prefix');
  521. $countsql = "select count(DISTINCT(r.mem_id)) from";
  522. $countsql .= " ".$DB_PREFIX.self::MG_ROLE_DB_NAME." as r left JOIN ".$DB_PREFIX.self::MEMBER_DB_NAME
  523. ." as m on r.mem_id=m.id";
  524. $countsql .= " where r.role_level>='".$_standard_level."'";
  525. $countsql .= " and m.agent_id=".$_agent_info_check['agent_id'];
  526. $countsql .= " and m.app_id=".$_agent_info_check['app_id'];
  527. /* strtotime($has_check_where['date']), strtotime($has_check_where['date']." +1 day") */
  528. $countsql .= " and r.create_time>='".strtotime($_agent_info_check['date'])."'";
  529. $countsql .= " and r.create_time<'".strtotime($_agent_info_check['date']." +1 day")."'";
  530. $countsql .= " and m.create_time>='".strtotime($_agent_info_check['date'])."'";
  531. $countsql .= " and m.create_time<'".strtotime($_agent_info_check['date']." +1 day")."'";
  532. \think\Log::write($countsql, 'debug');
  533. $_standard_query = DB::query($countsql);
  534. \think\Log::write($_standard_query, 'debug');
  535. if (!empty($_standard_query)) {
  536. if (isset($_standard_query[0]) && !empty($_standard_query[0])) {
  537. return isset($_standard_query[0]['count(DISTINCT(r.mem_id))'])
  538. ? $_standard_query[0]['count(DISTINCT(r.mem_id))'] : 0;
  539. }
  540. }
  541. return 0;
  542. }
  543. /**
  544. * 获取游戏的达标等级设置
  545. *
  546. * @param array $agent_info
  547. *
  548. * @return int|mixed
  549. */
  550. public function get_standard_level($agent_info = array()) {
  551. if ($agent_info['app_id'] && is_numeric($agent_info['app_id'])) {
  552. $_game_map = array();
  553. $_game_map['app_id'] = $agent_info['app_id'];
  554. $_standard_level = DB::name(self::OA_GAME_DB_NAME)->where($_game_map)->value('standard_level');
  555. return $_standard_level ? $_standard_level : 0;
  556. } else {
  557. return 0;
  558. }
  559. }
  560. /**
  561. * 判断是否达标
  562. *
  563. * @param array $oa_data
  564. *
  565. * @return int
  566. */
  567. public function check_is_standard($oa_data = array()) {
  568. if (!empty($oa_data) && isset($oa_data['id']) && $oa_data['id']) {
  569. $_oamap = array();
  570. $_oamap['id'] = $oa_data['id'];
  571. $_agent_info_check = DB::name(self::OA_AGENT_DB_NAME)->where($_oamap)->field('agent_id,app_id,date')->find(
  572. );
  573. $_agent_info_check['standard_mem_cnt'] = $this->get_agent_standard_mem_cnt($_agent_info_check);
  574. $_agent_info_check['sum_money'] = $this->get_agent_sum_money($_agent_info_check);
  575. } else {
  576. $_agent_info_check = $this->check_agent_info($oa_data);
  577. }
  578. if (!is_array($_agent_info_check) || empty($_agent_info_check)) {
  579. return 1;
  580. }
  581. if (!isset($_agent_info_check['standard_mem_cnt']) || !$_agent_info_check['standard_mem_cnt']) {
  582. return 1;/* 没有设置达标人数则所有人都不合格 */
  583. }
  584. $_get_standard_mem_cnt = $this->get_standard_mem_cnt($_agent_info_check);
  585. if ($_agent_info_check['standard_mem_cnt'] > $_get_standard_mem_cnt) {
  586. /* 达标人数大于推广人数 肯定合格 */
  587. return 2;
  588. }
  589. /* 达标人数小于或等于推广人数 是要看消费奖金( 角色关联玩家每日消费总额*积分等级对应提成) */
  590. if (0.00 == $_agent_info_check['sum_money'] || !$_agent_info_check['sum_money']) {
  591. return 1;/* 玩家消费额不大于零肯定不及格 */
  592. }
  593. if ($_get_standard_mem_cnt == $_agent_info_check['standard_mem_cnt']) {
  594. /* 达标人数等于设置达标数时 只要有消费 就及格 */
  595. return 2;
  596. }
  597. /* 消费额达到某个点后才能 算及格 推广一个达标人多少钱 5?写死吗 最底2个点 和 最高5个点怎么配置 都是跟游戏有关的吧 */
  598. $chae = ($_get_standard_mem_cnt - $_agent_info_check['standard_mem_cnt']) * 500;
  599. if ($_agent_info_check['sum_money'] * 2 > $chae) {
  600. return 2;
  601. }
  602. if ($_agent_info_check['sum_money'] * 5 < $chae) {
  603. return 1;
  604. }
  605. return 1;
  606. }
  607. /**
  608. * 获取达标人数设置
  609. *
  610. * @param array $agent_info
  611. *
  612. * @return int|mixed
  613. */
  614. public function get_standard_mem_cnt($agent_info = array()) {
  615. if ($agent_info['app_id'] && is_numeric($agent_info['app_id'])) {
  616. $_game_map = array();
  617. $_game_map['app_id'] = $agent_info['app_id'];
  618. $standard_mem_cnt = DB::name(self::OA_GAME_DB_NAME)->where($_game_map)->value('standard_mem_cnt');
  619. $standard_mem_cnt = $standard_mem_cnt ? $standard_mem_cnt : 0;
  620. return $standard_mem_cnt;
  621. } else {
  622. return 0;
  623. }
  624. }
  625. /**
  626. * 更新推广员当天的注册独立ip数
  627. *
  628. * @param array $agent_info
  629. *
  630. * @return int|string
  631. *
  632. */
  633. public function get_agent_distinct_reg_ip_cnt($agent_info = array()) {
  634. $_reg_ip_map = $this->get_agent_daily_reg_where_arr($agent_info);
  635. if (!is_array($_reg_ip_map) || empty($_reg_ip_map)) {
  636. return 0;
  637. }
  638. /* ->whereTime('reg_time', 'd') 会有问题 避免如2016年多一秒少一秒等情况 造成一天并不只24*3600 86400 */
  639. $_reg_ip_cnt = DB::name(self::MEMBER_DB_NAME)->where($_reg_ip_map)->count(
  640. 'DISTINCT(`'.self::MEM_REG_IP_COLUMN.'`)'
  641. );
  642. return $_reg_ip_cnt ? $_reg_ip_cnt : 0;
  643. }
  644. /**
  645. * 获取推广员下的当天注册量
  646. *
  647. * @param array $agent_info
  648. *
  649. * @return int|string
  650. */
  651. public function get_agent_reg_cnt($agent_info = array()) {
  652. $_reg_cnt_map = $this->get_agent_daily_reg_where_arr($agent_info);
  653. if (!is_array($_reg_cnt_map) || empty($_reg_cnt_map)) {
  654. return 0;
  655. }
  656. $_reg_cnt = DB::name(self::MEMBER_DB_NAME)->where($_reg_cnt_map)->count();
  657. return $_reg_cnt ? $_reg_cnt : 0;
  658. }
  659. /**
  660. * 获取订单数
  661. *
  662. * @param array $agent_info
  663. *
  664. * @return int|string
  665. *
  666. */
  667. public function get_agent_order_cnt($agent_info = array()) {
  668. $_order_cnt_map = $this->get_agent_daily_order_where_arr($agent_info);
  669. if (!is_array($_order_cnt_map) || empty($_order_cnt_map)) {
  670. return 0;
  671. }
  672. $_order_cnt = DB::name(self::PAY_DB_NAME)->where($_order_cnt_map)->count();
  673. return $_order_cnt ? $_order_cnt : 0;
  674. }
  675. /**
  676. * 获取充值人数
  677. *
  678. * @param array $agent_info
  679. *
  680. * @return int
  681. */
  682. public function get_agent_pay_mem_cnt($agent_info = array()) {
  683. $_pay_mem_cnt_map = $this->get_agent_daily_order_where_arr($agent_info);
  684. if (!is_array($_pay_mem_cnt_map) || empty($_pay_mem_cnt_map)) {
  685. return 0;
  686. }
  687. $_pay_mem_cnt = DB::name(self::PAY_DB_NAME)->where($_pay_mem_cnt_map)->count('DISTINCT(`mem_id`)');
  688. return $_pay_mem_cnt ? $_pay_mem_cnt : 0;
  689. }
  690. /**
  691. * 获取 推广员下的玩家的某一游戏的 充值总额
  692. *
  693. * @param array $agent_info
  694. *
  695. * @return float|int
  696. */
  697. public function get_agent_sum_money($agent_info = array()) {
  698. $_sum_money_map = $this->get_agent_daily_order_where_arr($agent_info);
  699. if (!is_array($_sum_money_map) || empty($_sum_money_map)) {
  700. return 0;
  701. }/* 直接用amount */
  702. $_sum_money = DB::name(self::PAY_DB_NAME)->where($_sum_money_map)->sum('amount');
  703. return $_sum_money ? $_sum_money : 0.00;
  704. }
  705. /**
  706. * 获取支付相关的sql筛选
  707. *
  708. * @param array $agent_info
  709. *
  710. * @return array
  711. */
  712. public function get_agent_daily_order_where_arr($agent_info = array()) {
  713. $has_check_agent_info = $this->check_agent_info($agent_info);
  714. if (empty($has_check_agent_info)) {
  715. return array();
  716. }
  717. $_daily_order_map = [
  718. 'agent_id' => ['eq', $has_check_agent_info['agent_id']],
  719. 'app_id' => ['eq', $has_check_agent_info['app_id']],
  720. 'status' => ['eq', self::PAY_STATUS_SUCCESS],
  721. 'create_time' => ['between', [strtotime($has_check_agent_info['date']),
  722. strtotime($has_check_agent_info['date']." +1 day")]],
  723. ];
  724. return $_daily_order_map;
  725. }
  726. /**
  727. * 获取每天统计的条件
  728. *
  729. * @param array $where
  730. *
  731. * @return array
  732. */
  733. public function get_agent_daily_reg_where_arr($where = array()) {
  734. $has_check_where = $this->check_agent_info($where);
  735. if (empty($has_check_where)) {
  736. return array();
  737. }
  738. $_daily_map = [
  739. 'agent_id' => ['eq', $has_check_where['agent_id']],
  740. 'app_id' => ['eq', $has_check_where['app_id']],
  741. 'create_time' => ['between',
  742. [strtotime($has_check_where['date']), strtotime($has_check_where['date']." +1 day")]],
  743. ];
  744. return $_daily_map;
  745. }
  746. /**
  747. * 获取推广员下的所有游戏id
  748. *
  749. * @param int $agent_id
  750. *
  751. * @return array|false|\PDOStatement|string|\think\Collection
  752. */
  753. public function get_agent_app_id_list($agent_id = 0) {
  754. if (!$agent_id || !is_numeric($agent_id)) {
  755. if ($this->agent_id) {
  756. $agent_id = $this->agent_id;
  757. } else {
  758. return array();
  759. }
  760. }
  761. $_agent_game_map = array();
  762. $_agent_game_map['agent_id'] = $agent_id;
  763. $_agent_game_map['status'] = 2;
  764. $_agent_game_map['is_delete'] = 2;
  765. $app_id_list = Db::name(self::AGENT_GAME_DB_NAME)->where($_agent_game_map)->field('app_id')->select();
  766. return $app_id_list;
  767. }
  768. /**
  769. * 检测 $agent_info 数据 用于生成条件语句
  770. *
  771. * @param array $agent_info
  772. *
  773. * @return array
  774. */
  775. public function check_agent_info($agent_info = array()) {
  776. $_today = isset($agent_info['date']) ? (is_numeric($agent_info['date']) ? date('Y-m-d', $agent_info['date'])
  777. : $agent_info['date']) : $this->today;
  778. if (!$_today) {
  779. $_today = date('Y-m-d');
  780. }
  781. $_app_id = isset($agent_info['app_id']) ? $agent_info['app_id'] : $this->app_id;
  782. if (!$_app_id || !is_numeric($_app_id)) {
  783. return array();
  784. }
  785. $_agent_id = isset($agent_info['agent_id']) ? $agent_info['agent_id'] : $this->agent_id;
  786. if (!$_agent_id || !is_numeric($_agent_id)) {
  787. return array();
  788. }
  789. $_agent_info = array();
  790. $_agent_info['date'] = $_today;
  791. $_agent_info['app_id'] = $_app_id;
  792. $_agent_info['agent_id'] = $_agent_id;
  793. return $_agent_info;
  794. }
  795. }