OrderLogic.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. <?php
  2. /**
  3. * OrderLogic.php UTF-8
  4. * 订单逻辑
  5. *
  6. * @date : 2018/1/19 22:43
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huo\logic\order;
  13. use huo\controller\game\GameCache;
  14. use huo\logic\agent\AgentLogic;
  15. use huo\model\common\CommonModel;
  16. use huo\model\order\OrderExtModel;
  17. use huo\model\order\OrderModel;
  18. use huolib\constant\CommonConst;
  19. use huolib\constant\OrderConst;
  20. use huolib\constant\PaywayConst;
  21. use huolib\status\OrderStatus;
  22. use huolib\tool\StrUtils;
  23. use huolib\tool\Time;
  24. use think\db\exception\DataNotFoundException;
  25. use think\db\exception\ModelNotFoundException;
  26. use think\Exception;
  27. use think\exception\DbException;
  28. use think\Log;
  29. class OrderLogic extends CommonModel {
  30. /**
  31. * 根据order_id 获取信息
  32. *
  33. * @param string $order_id
  34. *
  35. * @return array|bool
  36. */
  37. public function getInfoByOrderId($order_id) {
  38. $_map['order_id'] = $order_id;
  39. try {
  40. $_order_data = (new OrderModel())->with('payext')->where($_map)->find();
  41. if (is_object($_order_data)) {
  42. $_order_data = $_order_data->toArray();
  43. }
  44. return $_order_data;
  45. } catch (DataNotFoundException $_e) {
  46. Log::write(
  47. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::DATA_NOT_FOUND_EXCEPTION."&Exception"
  48. .$_e->getMessage(),
  49. LOG::ERROR
  50. );
  51. return false;
  52. } catch (ModelNotFoundException $_e) {
  53. Log::write(
  54. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::MODEL_NOT_FOUND_EXCEPTION."&Exception"
  55. .$_e->getMessage(),
  56. LOG::ERROR
  57. );
  58. return false;
  59. } catch (DbException $_e) {
  60. Log::write(
  61. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::DB_EXCEPTION."&Exception"
  62. .$_e->getMessage(),
  63. LOG::ERROR
  64. );
  65. return false;
  66. } catch (Exception $_e) {
  67. Log::write(
  68. "func=".__FUNCTION__."&class=".__CLASS__."&code=".OrderStatus::INNER_ERROR."&Exception"
  69. .$_e->getMessage(),
  70. LOG::ERROR
  71. );
  72. return false;
  73. }
  74. }
  75. /**
  76. * 判断是否首充
  77. *
  78. * @param $map
  79. *
  80. * @return bool true 表示为首充 false 表示为已充值过
  81. */
  82. public function isFirstCharge($map) {
  83. $_map = $map;
  84. $_map['status'] = OrderConst::PAY_STATUS_SUC;
  85. $_cnt = (new OrderModel())->where($_map)->count();
  86. if (0 < $_cnt) {
  87. return false;
  88. }
  89. return true;
  90. }
  91. /**
  92. * @param array $param
  93. *
  94. * @return array
  95. */
  96. public function getListWhere($param) {
  97. $_map = [];
  98. if (!empty($param['start_time']) && !empty($param['start_time'])) {
  99. $_map['order_model.create_time'] = ['between',
  100. [strtotime($param['start_time']),
  101. CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])]];
  102. } else if (!empty($param['start_time'])) {
  103. $_map['order_model.create_time'] = ['gt', strtotime($param['start_time'])];
  104. } else if (!empty($param['end_time'])) {
  105. $_map['order_model.create_time'] = ['lt', CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])];
  106. }
  107. if (!empty($param['cp_order_id'])) {
  108. $_map['order_model.cp_order_id'] = $param['cp_order_id'];
  109. }
  110. if (!empty($param['username'])) {
  111. $_map['mem.username'] = ['like', $param['username'].'%'];
  112. }
  113. if (!empty($param['mem_id'])) {
  114. $_map['order_model.mem_id'] = $param['mem_id'];
  115. }
  116. if (!empty($param['order_id'])) {
  117. $_map['order_id'] = $param['order_id'];
  118. }
  119. if (empty($param['order_id']) && !empty($param['role_name'])) {
  120. // $_ids = (new OrderExtModel())->where(['role_name' => ['like', $param['role_name'].'%']])->column(
  121. // 'pay_id'
  122. // );
  123. $_map['leftpayext.role_name'] = ['like', $param['role_name'].'%'];
  124. }
  125. if (!empty($param['parent_id'])) {
  126. $_agent_ids = (new AgentLogic())->getAgentIds($param['parent_id'], true);
  127. $_map['order_model.agent_id'] = ['in', $_agent_ids];
  128. }
  129. if (!empty($param['agent_id'])) {
  130. if (-1 == $param['agent_id']) {
  131. $param['agent_id'] = 0;
  132. }
  133. $_map['order_model.agent_id'] = $param['agent_id'];
  134. }
  135. if (!empty($param['app_id'])) {
  136. $_map['order_model.app_id'] = $param['app_id'];
  137. }
  138. if (!empty($param['is_handle'])) {
  139. $_map['order_model.is_handle'] = $param['is_handle'];
  140. }
  141. if (!empty($param['status'])) {
  142. $_map['order_model.status'] = $param['status'];
  143. }
  144. if (!empty($param['cp_status'])) {
  145. $_map['order_model.status'] = OrderConst::PAY_STATUS_SUC;
  146. $_map['order_model.cp_status'] = $param['cp_status'];
  147. }
  148. if (!empty($param['is_switch'])) {
  149. $_map['order_model.is_switch'] = $param['is_switch'];
  150. }
  151. if (!empty($param['os'])) {
  152. $_pe_map = ['os' => $param['os']];
  153. $_ids = (new OrderExtModel())->where($_pe_map)->column('pay_id');
  154. $_map['order_model.id'] = ['in', $_ids];
  155. }
  156. /* 未充值订单不显示 */
  157. $_map['payway'] = ['neq', ''];
  158. if (!empty($param['payway'])) {
  159. $_map['order_model.payway'] = $param['payway'];
  160. }
  161. return $_map;
  162. }
  163. /**
  164. * @param $param
  165. * @param string $page
  166. * @param string $order
  167. *
  168. * @return array
  169. */
  170. public function getOrderList($param, $page = '1,10', $order = '-create_time') {
  171. $_map = $this->getListWhere($param);
  172. $_field = [];
  173. return $this->getList($_field, $_map, $page, $order);
  174. }
  175. /**
  176. * 获取订单列表
  177. *
  178. * @param array $field
  179. * @param $where
  180. * @param string $page
  181. * @param string $order
  182. *
  183. * @return array
  184. */
  185. public function getList($field = [], $where, $page = '1,10', $order = '-create_time') {
  186. $_sum = [
  187. 'amount' => 0,
  188. 'real_amount' => 0,
  189. 'gm_amount' => 0,
  190. 'ptb_cnt' => 0,
  191. ];
  192. $_map = $where;
  193. $_model = new OrderModel();
  194. $_count = $_model->with('mem,leftpayext')->where($_map)->count();
  195. if (empty($_count)) {
  196. return [
  197. 'count' => 0,
  198. 'sum' => $_sum,
  199. 'list' => []
  200. ];
  201. }
  202. $_sum_field = [
  203. 'sum(amount)' => 'sum_amount',
  204. 'sum(real_amount)' => 'sum_real_amount',
  205. 'sum(gm_amount)' => 'sum_gm_amount',
  206. 'sum(ptb_amount)' => 'sum_ptb_amount'
  207. ];
  208. $_sum_data = $_model->with('mem,leftpayext')
  209. ->field($_sum_field)
  210. ->where($_map)
  211. ->find();
  212. if (is_object($_sum_data)) {
  213. $_sum_data = $_sum_data->toArray();
  214. }
  215. $_sum['amount'] = StrUtils::formatNumber($_sum_data['sum_amount']);
  216. $_sum['real_amount'] = StrUtils::formatNumber($_sum_data['sum_real_amount']);
  217. $_sum['gm_amount'] = StrUtils::formatNumber($_sum_data['sum_gm_amount']);
  218. $_sum['ptb_amount'] = StrUtils::formatNumber($_sum_data['ptb_amount']);
  219. /* 实收金额只统计支付成功的金额 */
  220. $_map_bank = $_map;
  221. $_map_bank['order_model.status'] = OrderConst::PAY_STATUS_SUC;
  222. $_sum_field = [
  223. 'sum(real_amount)' => 'sum_real_amount'
  224. ];
  225. $_sum_data_bank = $_model->with('mem,leftpayext')
  226. ->field($_sum_field)
  227. ->where($_map_bank)
  228. ->find();
  229. if (is_object($_sum_data_bank)) {
  230. $_sum_data_bank = $_sum_data_bank->toArray();
  231. }
  232. $_sum['real_amount'] = StrUtils::formatNumber($_sum_data_bank['sum_real_amount']);
  233. $_field = $field;
  234. if (empty($field)) {
  235. $_field = [];
  236. }
  237. $_order = $_model->orderFilter($order);
  238. $_datas = $_model
  239. ->with('mem,leftpayext,agent,game')
  240. // ->with('payext')
  241. // ->with('agent')
  242. // ->with('game')
  243. ->where($_map)
  244. ->field($_field)
  245. ->order($_order)
  246. ->page($page)
  247. ->select();
  248. if (is_object($_datas)) {
  249. $_datas = $_datas->toArray();
  250. }
  251. if (empty($_datas)) {
  252. return [
  253. 'count' => $_count,
  254. 'sum' => $_sum,
  255. 'list' => []
  256. ];
  257. }
  258. $_list = $_datas;
  259. foreach ($_datas as $_k => $_v) {
  260. $_list[$_k]['agent_name'] = !empty($_v['agent']) ? $_v['agent']['user_login'] : '';
  261. $_list[$_k]['gamename'] = !empty($_v['game']) ? $_v['game']['name'] : '';
  262. $_list[$_k]['username'] = !empty($_v['mem']) ? $_v['mem']['username'] : '';
  263. $_list[$_k]['is_switch_msg'] = ($_v['is_switch'] == OrderConst::PAY_SWITCH_YES) ? lang('SWITCH')
  264. : lang('NOT_SWITCH');
  265. }
  266. return [
  267. 'count' => $_count,
  268. 'sum' => $_sum,
  269. 'list' => $_list
  270. ];
  271. }
  272. /**
  273. * 统计总流水 今日流水 昨日流水
  274. *
  275. * @param int|array $agent_ids
  276. *
  277. * @return array
  278. * sum_money 总流水
  279. * today_money 今日流水
  280. * yesterday_money 昨日流水
  281. */
  282. public function getStaticMoney($agent_ids) {
  283. $_agent_ids = $agent_ids;
  284. if (is_numeric($agent_ids)) {
  285. $_agent_ids = [$agent_ids];
  286. }
  287. $_map = [];
  288. if (!empty($agent_ids)) {
  289. $_map['agent_id'] = ['in', $_agent_ids];
  290. }
  291. $_map['status'] = OrderConst::PAY_STATUS_SUC;
  292. $_order_model = new OrderModel();
  293. $_rdata['sum_money'] = $_order_model->where($_map)->sum('amount');
  294. list($today_start, $today_end) = Time::today();
  295. $_map['create_time'] = ['gt', $today_start];
  296. $_rdata['today_money'] = $_order_model->where($_map)->sum('amount');
  297. $_map['create_time'] = ['between', [$today_start - CommonConst::CONST_DAY_SECONDS, $today_start]];
  298. $_rdata['yesterday_money'] = $_order_model->where($_map)->sum('amount');
  299. return $_rdata;
  300. }
  301. public function getMemOrderList($mem_id, $param = [], $page, $order = '-create_time') {
  302. $_rdata = ['count' => 0, 'list' => []];
  303. $param['mem_id'] = $mem_id;
  304. $_map = $this->getListWhere($param);
  305. $_field = [
  306. 'order_id' => 'order_id',
  307. 'app_id' => 'app_id',
  308. 'amount' => 'amount',
  309. 'real_amount' => 'real_amount',
  310. 'product_id' => 'product_id',
  311. 'product_name' => 'product_name',
  312. 'payway' => 'payway',
  313. 'status' => 'status',
  314. 'pay_time' => 'pay_time',
  315. 'create_time' => 'create_time',
  316. ];
  317. $_model = new OrderModel();
  318. $_order = $this->orderFilter($order);
  319. $_count = $_model->alias('order_model')->with('game')->where($_map)->count();
  320. if (empty($_count)) {
  321. return $_rdata;
  322. }
  323. $_datas = $_model->alias('order_model')
  324. ->with('game')
  325. ->field($_field)
  326. ->where($_map)
  327. ->order($_order)
  328. ->page($page)
  329. ->select();
  330. $_list = [];
  331. if (!$_datas->isEmpty()) {
  332. $_list = $_datas->toArray();
  333. foreach ($_list as $key => $item) {
  334. $item['payway'] = PaywayConst::getMsg($item['payway']);
  335. $item['gamename'] = isset($item['game']) ? $item['game']['name'] : '';
  336. $item['pay_time'] = !empty($item['pay_time']) ? $item['pay_time'] : $item['create_time'];
  337. unset($item['game']);
  338. $_list[$key] = $item;
  339. }
  340. }
  341. return [
  342. 'count' => $_count,
  343. 'list' => $_list
  344. ];
  345. }
  346. /**
  347. * 获取订单扩展列表--适用由角色查找订单
  348. *
  349. * @param $server_id
  350. * @param $role_id
  351. * @param array $param
  352. * @param $page
  353. * @param string $order
  354. *
  355. * @return array
  356. */
  357. public function getOrderExtList($server_id, $role_id, $param = [], $page, $order = '-create_time') {
  358. $_rdata = ['count' => 0, 'list' => []];
  359. $_map = [];
  360. $_map['server_id'] = $server_id;
  361. $_map['role_id'] = $role_id;
  362. if (!empty($param['start_time']) && !empty($param['start_time'])) {
  363. $_map['create_time'] = ['between',
  364. [strtotime($param['start_time']),
  365. CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])]];
  366. } else if (!empty($param['start_time'])) {
  367. $_map['create_time'] = ['gt', strtotime($param['start_time'])];
  368. } else if (!empty($param['end_time'])) {
  369. $_map['create_time'] = ['lt', CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])];
  370. }
  371. if (!empty($param['cp_order_id'])) {
  372. $_map['cp_order_id'] = $param['cp_order_id'];
  373. }
  374. if (!empty($param['order_id'])) {
  375. $_map['order_id'] = $param['order_id'];
  376. }
  377. if (!empty($param['app_id'])) {
  378. $_map['app_id'] = $param['app_id'];
  379. }
  380. if (!empty($param['status'])) {
  381. $_map['status'] = $param['status'];
  382. }
  383. if (!empty($param['cp_status'])) {
  384. $_map['status'] = OrderConst::PAY_STATUS_SUC;
  385. $_map['cp_status'] = $param['cp_status'];
  386. }
  387. /* 未充值订单不显示 */
  388. $_map['payway'] = ['neq', ''];
  389. if (!empty($param['payway'])) {
  390. $_map['payway'] = $param['payway'];
  391. }
  392. $_field = [
  393. 'pay.order_id' => 'order_id',
  394. 'pay.cp_order_id' => 'cp_order_id',
  395. 'pay.app_id' => 'app_id',
  396. 'pay.amount' => 'amount',
  397. 'pay.real_amount' => 'real_amount',
  398. 'pay.product_id' => 'product_id',
  399. 'pay.product_name' => 'product_name',
  400. 'pay.payway' => 'payway',
  401. 'pay.status' => 'status',
  402. 'pay.cp_status' => 'cp_status',
  403. 'pay.pay_time' => 'pay_time',
  404. 'pay.create_time' => 'create_time',
  405. 'server_id' => 'server_id',
  406. 'server_name' => 'server_name',
  407. 'role_id' => 'role_id',
  408. 'role_name' => 'role_name',
  409. ];
  410. $_model = new OrderExtModel();
  411. $_order = $this->orderFilter($order);
  412. $_count = $_model->with('pay')->where($_map)->count();
  413. if (empty($_count)) {
  414. return $_rdata;
  415. }
  416. $_datas = $_model->with('pay')
  417. ->field($_field)
  418. ->where($_map)
  419. ->order($_order)
  420. ->page($page)
  421. ->select();
  422. $_list = [];
  423. if (!$_datas->isEmpty()) {
  424. $_fame_cache = GameCache::ins();
  425. $_list = $_datas->toArray();
  426. foreach ($_list as $key => $item) {
  427. $_game = $_fame_cache->getInfoByAppId($item['app_id']);
  428. $item['payway'] = PaywayConst::getMsg($item['payway']);
  429. $item['gamename'] = $_game['name'];
  430. $item['icon'] = $_game['icon'];
  431. $item['pay_time'] = !empty($item['pay_time']) ? $item['pay_time'] : $item['create_time'];
  432. unset($item['game']);
  433. $_list[$key] = $item;
  434. }
  435. }
  436. return [
  437. 'count' => $_count,
  438. 'list' => $_list
  439. ];
  440. }
  441. }