RebateLogic.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. <?php
  2. /**
  3. * RebateLogic.php UTF-8
  4. * 返利逻辑处理表
  5. *
  6. * @date : 2018/7/28 15:12
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : Huosdk 8.0
  11. */
  12. namespace huoRebate\logic;
  13. use huo\controller\member\MemCache;
  14. use huo\controller\wap\Option;
  15. use huo\logic\member\CpLogic;
  16. use huo\logic\member\MemberLogic;
  17. use huo\model\game\GameModel;
  18. use huo\model\member\MemberModel;
  19. use huo\model\member\MemGameModel;
  20. use huo\model\member\MgRoleModel;
  21. use huo\model\order\OrderModel;
  22. use huolib\constant\CommonConst;
  23. use huolib\constant\OptionConst;
  24. use huolib\constant\OrderConst;
  25. use huolib\constant\PaywayConst;
  26. use huolib\constant\WalletConst;
  27. use huolib\tool\StrUtils;
  28. use huoRebate\model\RebateOrderModel;
  29. use huoRebate\model\RebateOrderPayModel;
  30. class RebateLogic {
  31. /**
  32. * 获取未返利的订单
  33. *
  34. * @param int $mem_id 玩家ID
  35. * @param int $app_id 应用ID
  36. * @param int $start_time 开始时间戳
  37. * @param int $end_time 结束时间戳
  38. *
  39. * @return array
  40. */
  41. public function getNotRebateOrders($mem_id, $app_id = 0, $start_time = 0, $end_time = 0) {
  42. $_o_map['mem_id'] = $mem_id;
  43. if (!empty($app_id)) {
  44. $_o_map['app_id'] = $app_id;
  45. }
  46. if (!empty($start_time)) {
  47. $_o_map['create_time'] = ['gt', $start_time];
  48. }
  49. if (!empty($end_time)) {
  50. $_o_map['create_time'] = ['lt', $end_time];
  51. }
  52. $_o_map['status'] = OrderConst::PAY_STATUS_SUC;
  53. $_pay_orders = (new OrderModel())->where($_o_map)->column('order_id');
  54. if (empty($_pay_orders)) {
  55. return [];
  56. }
  57. $_rop_orders = (new RebateOrderPayModel())->getOrdersByMemApp($mem_id, $app_id);
  58. $_orders = array_diff($_pay_orders, $_rop_orders);
  59. if (empty($_orders)) {
  60. return [];
  61. }
  62. return $_orders;
  63. }
  64. /**
  65. * 获取游戏金额
  66. *
  67. * @param int $mem_id 玩家ID
  68. *
  69. * @param int $app_id 应用ID
  70. *
  71. * @param int $start_time 开始时间戳
  72. * @param int $end_time 结束时间戳
  73. *
  74. * @return array
  75. */
  76. public function getGameAmount($mem_id, $app_id = 0, $start_time = 0, $end_time = 0) {
  77. $_orders = $this->getNotRebateOrders($mem_id);
  78. if (empty($_orders)) {
  79. return [];
  80. }
  81. $_map['order_id'] = ['in', $_orders];
  82. if (!empty($app_id)) {
  83. $_map['app_id'] = $app_id;
  84. }
  85. if (!empty($start_time)) {
  86. $_map['create_time'] = ['gt', $start_time];
  87. }
  88. if (!empty($end_time)) {
  89. $_map['create_time'] = ['lt', $end_time];
  90. }
  91. if (!empty($app_id)) {
  92. $_rdata = (new OrderModel())->where($_map)->column('sum(amount) amount,id,app_id', 'app_id');
  93. } else {
  94. $_rdata = (new OrderModel())->where($_map)->group('app_id')->column(
  95. 'sum(amount) amount,id,app_id', 'app_id'
  96. );
  97. }
  98. if (empty($_rdata)) {
  99. return [];
  100. }
  101. $_rdata = array_values($_rdata);
  102. if (empty($_rdata[0]['app_id'])) {
  103. return [];
  104. }
  105. return $_rdata;
  106. }
  107. /**
  108. * 获取可返利的游戏ID
  109. *
  110. * @param int $mem_id 玩家ID
  111. *
  112. * @return array
  113. */
  114. public function getGames($mem_id) {
  115. $_o_map['mem_id'] = $mem_id;
  116. $_o_map['status'] = OrderConst::PAY_STATUS_SUC;
  117. $_app_ids = (new OrderModel())->where($_o_map)->column('distinct(app_id)');
  118. if (empty($_app_ids)) {
  119. return [];
  120. }
  121. return $_app_ids;
  122. }
  123. /**
  124. * 获取区服角色
  125. *
  126. * @param int $mem_id 玩家ID
  127. * @param int $app_id 应用ID
  128. *
  129. * @return array
  130. */
  131. public function getServerRoles($mem_id, $app_id) {
  132. $_map['mem_id'] = $mem_id;
  133. $_map['app_id'] = $app_id;
  134. $_mg_mem_ids = (new MemGameModel())->where($_map)->column('id');
  135. if (empty($_mg_mem_ids)) {
  136. return [];
  137. }
  138. $_mgr_map['app_id'] = $app_id;
  139. $_mgr_map['mg_mem_id'] = ['in', $_mg_mem_ids];
  140. $_sr_list = (new MgRoleModel())->getServerRoles($_mgr_map);
  141. if (empty($_sr_list)) {
  142. return [];
  143. }
  144. $_list = [];
  145. foreach ($_sr_list as $_k => $_v) {
  146. $_role_list = [];
  147. if (in_array($_v['server_id'], $_list)) {
  148. $_role_list['mg_mem_id'] = $_v['mg_mem_id'];
  149. $_role_list['role_id'] = $_v['role_id'];
  150. $_role_list['role_name'] = $_v['role_name'];
  151. $_list[$_v['server_id']]['role_list'][] = $_role_list;
  152. } else {
  153. $_list[$_v['server_id']]['server_id'] = $_v['server_id'];
  154. $_list[$_v['server_id']]['server_name'] = $_v['server_name'];
  155. $_role_list['mg_mem_id'] = $_v['mg_mem_id'];
  156. $_role_list['role_id'] = $_v['role_id'];
  157. $_role_list['role_name'] = $_v['role_name'];
  158. $_list[$_v['server_id']]['role_list'][] = $_role_list;
  159. }
  160. }
  161. return array_values($_list);
  162. }
  163. /**
  164. * 获取返利订单列表
  165. *
  166. * @param array $where
  167. * @param string $page
  168. * @param string $order
  169. * @param array $field
  170. *
  171. * @return array
  172. */
  173. public function getList($where = [], $page = '1,10', $order = 'create_time desc', $field = []) {
  174. $_map = $where;
  175. $_ro_model = new RebateOrderModel();
  176. $_count = $_ro_model->where($where)->count();
  177. if (empty($_count)) {
  178. $_rdata['count'] = 0;
  179. $_rdata['list'] = [];
  180. return $_rdata;
  181. }
  182. $_field = [
  183. 'id' => 'id',
  184. 'app_id' => 'app_id',
  185. 'order_id' => 'order_id',
  186. 'amount' => 'amount',
  187. 'status' => 'status',
  188. '`status`' => 'status_txt',
  189. 'create_time' => 'apply_time',
  190. ];
  191. if (!empty($field)) {
  192. $_field = array_merge($_field, $field);
  193. }
  194. $_order = $order;
  195. $_datas = $_ro_model
  196. ->with('game')
  197. ->field($_field)
  198. ->where($_map)
  199. ->order($_order)
  200. ->page($page)
  201. ->select();
  202. if (is_object($_datas)) {
  203. $_datas = $_datas->toArray();
  204. }
  205. $_list = [];
  206. foreach ($_datas as $_k => $_v) {
  207. $_data = [];
  208. $_data['id'] = $_v['id'];
  209. $_data['order_id'] = $_v['order_id'];
  210. $_data['game_id'] = isset($_v['game']) ? $_v['game']['id'] : 0;
  211. $_data['gamename'] = isset($_v['game']) ? $_v['game']['name'] : '';
  212. $_data['icon'] = isset($_v['game']) ? $_v['game']['icon'] : '';
  213. $_data['amount'] = $_v['amount'];
  214. $_data['status'] = $_v['status'];
  215. $_data['status_txt'] = $_v['status_txt'];
  216. $_data['apply_time'] = $_v['apply_time'];
  217. $_list[] = $_data;
  218. }
  219. if (empty($_list)) {
  220. $_list = null;
  221. }
  222. $_rdata['count'] = $_count;
  223. $_rdata['list'] = $_list;
  224. return $_rdata;
  225. }
  226. /**
  227. * 获取返利详情
  228. *
  229. * @param int $mem_id 玩家ID
  230. * @param int $ro_id 返利ID
  231. *
  232. * @return array
  233. */
  234. public function getRoDetail($mem_id, $ro_id) {
  235. $_map['mem_id'] = $mem_id;
  236. $_map['ro_id'] = $ro_id;
  237. $_orders = (new RebateOrderPayModel())->where($_map)->column('order_id');
  238. if (empty($_orders)) {
  239. $_rdata['count'] = 0;
  240. $_rdata['list'] = null;
  241. return $_rdata;
  242. }
  243. $_o_map['order_id'] = ['in', $_orders];
  244. $_field = [
  245. 'order_id' => 'order_id',
  246. 'amount' => 'amount',
  247. 'real_amount' => 'real_amount',
  248. 'create_time' => 'create_time',
  249. 'payway' => 'payway',
  250. ];
  251. $_datas = (new OrderModel())->field($_field)->where($_o_map)->select();
  252. if (is_object($_datas)) {
  253. $_datas = $_datas->toArray();
  254. }
  255. if (empty($_datas)) {
  256. $_rdata['count'] = 0;
  257. $_rdata['list'] = null;
  258. return $_rdata;
  259. }
  260. $_rdata['count'] = count($_datas);
  261. $_list = [];
  262. foreach ($_datas as $_k => $_v) {
  263. $_data['order_id'] = $_v['order_id'];
  264. $_data['amount'] = $_v['amount'];
  265. $_data['real_amount'] = $_v['real_amount'];
  266. $_data['create_time'] = $_v['create_time'];
  267. $_data['payname'] = PaywayConst::getMsg($_v['payway']);
  268. $_list[] = $_data;
  269. }
  270. $_rdata['list'] = $_list;
  271. return $_rdata;
  272. }
  273. /**
  274. * 后台获取返利订单列表
  275. *
  276. * @param array $param
  277. * @param string $page
  278. * @param string $order
  279. *
  280. * @return array
  281. * @throws \think\db\exception\DataNotFoundException
  282. * @throws \think\db\exception\ModelNotFoundException
  283. * @throws \think\exception\DbException
  284. */
  285. public function getAdminList($param = [], $page = '1,10', $order = 'create_time desc') {
  286. $_rdata = ['count' => 0, 'list' => [], 'sum' => 0, 'members' => []];
  287. $_map = [];
  288. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  289. $_map['create_time']
  290. = [
  291. 'between',
  292. [
  293. strtotime($param['start_time']),
  294. CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])
  295. ]
  296. ];
  297. } elseif (!empty($param['start_time'])) {
  298. $_map['create_time'] = ['egt', strtotime($param['start_time'])];
  299. } elseif (!empty($param['end_time'])) {
  300. $_map['create_time'] = ['elt', CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])];
  301. }
  302. if (!empty($param['order_id'])) {
  303. $_map['order_id'] = $param['order_id'];
  304. }
  305. if (!empty($param['username'])) {
  306. $_mem_id = (new MemberLogic())->getIdByName($param['username']);
  307. if (empty($_mem_id)) { //没有玩家返回空数据
  308. return $_rdata;
  309. }
  310. $_map['mem_id'] = $_mem_id;
  311. }
  312. if (!empty($param['status'])) {
  313. $_map['status'] = $param['status'];
  314. }
  315. if (!empty($param['cp'])) {
  316. /*获取CP下的所有游戏id*/
  317. $_ids = (new GameModel())->where(['cp_id' => $param['cp']])->column('id');
  318. if (empty($_ids)) {
  319. return $_rdata;
  320. }
  321. $_map['app_id'] = ['in', $_ids];
  322. }
  323. if (!empty($param['app_id'])) {
  324. $_map['app_id'] = $param['app_id'];
  325. }
  326. if (!empty($param['mg_mem_id'])) {
  327. $_map['mg_mem_id'] = $param['mg_mem_id'];
  328. }
  329. $_ro_model = new RebateOrderModel();
  330. $_count = $_ro_model->where($_map)->count();
  331. if (empty($_count)) {
  332. return $_rdata;
  333. }
  334. $_sum = $_ro_model->where($_map)->value('sum(amount)');
  335. $_field = [
  336. 'id' => 'id',
  337. 'order_id' => 'order_id',
  338. 'app_id' => 'app_id',
  339. 'mem_id' => 'mem_id',
  340. 'server_name' => 'server_name',
  341. 'role_id' => 'role_id',
  342. 'role_name' => 'role_name',
  343. 'amount' => 'amount',
  344. 'status' => 'status',
  345. '`status`' => 'status_txt',
  346. 'create_time' => 'apply_time',
  347. 'remark' => 'remark',
  348. 'mg_mem_id' => 'mg_mem_id',
  349. ];
  350. if (!empty($field)) {
  351. $_field = array_merge($_field, $field);
  352. }
  353. $_order = $order;
  354. $_datas = $_ro_model
  355. ->with('game')
  356. ->field($_field)
  357. ->where($_map)
  358. ->order($_order)
  359. ->page($page)
  360. ->select();
  361. if (is_object($_datas)) {
  362. $_datas = $_datas->toArray();
  363. }
  364. $_list = [];
  365. $_mem_ids = [];
  366. foreach ($_datas as $_k => $_v) {
  367. $_data = [];
  368. $_data['id'] = $_v['id'];
  369. $_data['order_id'] = $_v['order_id'];
  370. $_data['mem_id'] = $_v['mem_id'];
  371. array_push($_mem_ids, $_data['mem_id']);
  372. $_data['server_name'] = $_v['server_name'];
  373. $_data['role_id'] = $_v['role_id'];
  374. $_data['role_name'] = $_v['role_name'];
  375. //$_data['game_id'] = isset($_v['game']) ? $_v['game']['id'] : 0;
  376. $_data['gamename'] = isset($_v['game']) ? $_v['game']['name'] : '';
  377. //$_data['icon'] = isset($_v['game']) ? $_v['game']['icon'] : '';
  378. $_data['cp_id'] = isset($_v['game']) ? $_v['game']['cp_id'] : 0;
  379. $_data['amount'] = $_v['amount'];
  380. $_data['status'] = $_v['status'];
  381. $_data['status_txt'] = $_v['status_txt'];
  382. $_data['apply_time'] = $_v['apply_time'];
  383. $_data['remark'] = $_v['remark'];
  384. $_data['mg_mem_id'] = $_v['mg_mem_id'];
  385. $_list[] = $_data;
  386. }
  387. if (empty($_list)) {
  388. $_list = null;
  389. }
  390. $_members = [];
  391. if (!empty($_mem_ids)) {
  392. $_mem_ids = array_unique($_mem_ids);
  393. $_members = (new MemberModel())->where(['id' => ['in', $_mem_ids]])->column('username', 'id');
  394. }
  395. $_rdata['count'] = $_count;
  396. $_rdata['list'] = $_list;
  397. $_rdata['members'] = $_members;
  398. $_rdata['sum'] = $_sum;
  399. return $_rdata;
  400. }
  401. /**
  402. * 添加返利
  403. *
  404. * @param $mem_id
  405. * @param $amount
  406. * @param array $orders 订单数组
  407. * @param array $param 参数
  408. *
  409. * @return bool
  410. */
  411. public function addRebate($mem_id, $amount, $orders = [], $param = []) {
  412. $_agent_id = MemCache::ins()->getAgentIdByMemId($mem_id);
  413. $_ro_data['order_id'] = StrUtils::genOrderId(
  414. $_agent_id, $_agent_id, $mem_id, WalletConst::WALLET_ORDER_PREFIX_REBATE
  415. );
  416. $_ro_data['mem_id'] = $mem_id;
  417. $_ro_data['mobile'] = $param['mobile'];
  418. $_ro_data['mg_mem_id'] = $param['mg_mem_id'];
  419. $_ro_data['agent_id'] = $_agent_id;
  420. $_ro_data['app_id'] = $param['app_id'];
  421. $_ro_data['amount'] = $amount;
  422. $_ro_data['status'] = OrderConst::REBATE_STATUS_NOT;
  423. $_ro_data['server_id'] = $param['server_id'];
  424. $_ro_data['server_name'] = $param['server_name'];
  425. $_ro_data['role_id'] = $param['role_id'];
  426. $_ro_data['role_name'] = $param['role_name'];
  427. $_ro_data['start_time'] = $param['start_time'];
  428. $_ro_data['end_time'] = $param['end_time'];
  429. $_ro_data['remark'] = $param['remark'];
  430. $_ro_id = (new RebateOrderModel())->add($_ro_data);
  431. if (false == $_ro_id) {
  432. return false;
  433. }
  434. $_rop_datas = [];
  435. foreach ($orders as $_order_id) {
  436. $_rop_data = [];
  437. $_rop_data['ro_id'] = $_ro_id;
  438. $_rop_data['mem_id'] = $mem_id;
  439. $_rop_data['app_id'] = $param['app_id'];;
  440. $_rop_data['order_id'] = $_order_id;
  441. $_rop_data['status'] = OrderConst::REBATE_STATUS_NOT;
  442. $_rop_data['create_time'] = time();
  443. $_rop_data['update_time'] = $_rop_data['create_time'];
  444. $_rop_datas[] = $_rop_data;
  445. }
  446. $_rs = (new RebateOrderPayModel())->insertAll($_rop_datas);
  447. if (false == $_rs) {
  448. return false;
  449. }
  450. return true;
  451. }
  452. /**
  453. * 订单审核
  454. *
  455. * @param $id
  456. * @param $status
  457. *
  458. * @param string $remark
  459. *
  460. * @return bool
  461. * @throws \think\exception\PDOException
  462. */
  463. public function setStatus($id, $status, $remark = '') {
  464. $_ro_data['status'] = $status;
  465. if (!empty($remark)) {
  466. $_ro_data['remark'] = $remark;
  467. }
  468. $_ro_data['update_time'] = time();
  469. $_rop_data['status'] = $status;
  470. $_rop_data['update_time'] = time();
  471. $_ro_map = ['id' => $id];
  472. $_rop_map = ['ro_id' => $id];
  473. // 启动事务
  474. $_ro_model = new RebateOrderModel();
  475. $_rop_model = new RebateOrderPayModel();
  476. $_ro_model->startTrans();
  477. try {
  478. $_ro_model->update($_ro_data, $_ro_map);
  479. $_rop_model->update($_rop_data, $_rop_map);
  480. // 提交事务
  481. $_ro_model->commit();
  482. return true;
  483. } catch (\Exception $e) {
  484. // 回滚事务
  485. $_ro_model->rollback();
  486. return false;
  487. }
  488. }
  489. /***
  490. * 获取返利详情
  491. *
  492. * @param $ro_id
  493. *
  494. * @return bool|array
  495. * @throws \think\Exception
  496. * @throws \think\db\exception\DataNotFoundException
  497. * @throws \think\db\exception\ModelNotFoundException
  498. * @throws \think\exception\DbException
  499. */
  500. public function getRoInfo($ro_id) {
  501. $_map = ['id' => $ro_id];
  502. $_data = (new RebateOrderModel())->with('game')
  503. ->where($_map)
  504. ->find();
  505. if (is_object($_data)) {
  506. $_data = $_data->toArray();
  507. }
  508. if (empty($_data)) {
  509. return false;
  510. }
  511. $_ro_info = [];
  512. $_ro_info['id'] = $_data['id'];
  513. $_ro_info['order_id'] = $_data['order_id'];
  514. $_ro_info['mem_id'] = $_data['mem_id'];
  515. $_ro_info['server_name'] = $_data['server_name'];
  516. $_ro_info['role_id'] = $_data['role_id'];
  517. $_ro_info['role_name'] = $_data['role_name'];
  518. $_ro_info['gamename'] = isset($_data['game']) ? $_data['game']['name'] : '';
  519. $_ro_info['cp_id'] = isset($_data['game']) ? $_data['game']['cp_id'] : 0;
  520. $_ro_info['amount'] = $_data['amount'];
  521. $_ro_info['status'] = $_data['status'];
  522. $_ro_info['apply_time'] = $_data['create_time'];
  523. $_ro_info['remark'] = $_data['remark'];
  524. $_ro_info['mg_mem_id'] = $_data['mg_mem_id'];
  525. $_ro_info['cp'] = '';
  526. $_ro_info['mem'] = '';
  527. if (!empty($_ro_info['cp_id'])) {
  528. $_ro_info['cp'] = (new CpLogic())->getCpNameById($_ro_info['cp_id']);
  529. }
  530. if (!empty($_ro_info['mem_id'])) {
  531. $_ro_info['mem'] = (new MemberLogic())->getNameById($_ro_info['mem_id']);
  532. }
  533. $_ro_list = $this->getRoDetail($_ro_info['mem_id'], $_ro_info['id']);
  534. return ['ro_info' => $_ro_info, 'ro_list' => $_ro_list];
  535. }
  536. /**
  537. * 获取最小值设定
  538. * return int
  539. */
  540. public function getMinSet() {
  541. $_setting_name = OptionConst::REBATE_MIN_SET;
  542. $_item = (new Option())->getOptionData($_setting_name, 1, true);
  543. if (!empty($_item['option_value'])) {
  544. return $_item['option_value'];
  545. }
  546. return 0;
  547. }
  548. public function setMinSet($setting_name, $_option_vale) {
  549. $_res = (new Option())->saveOptionData($setting_name, json_encode($_option_vale));
  550. return $_res;
  551. }
  552. }