Viporders.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. <?php
  2. namespace app\admin\controller;
  3. use app\common\controller\Backend;
  4. use app\main\constants\AdminConstants;
  5. use app\main\service\AdminService;
  6. use app\main\helper\ArrayHelper;
  7. use think\db\Query;
  8. use think\Log;
  9. class Viporders extends Backend
  10. {
  11. /**
  12. * @var \app\common\model\Orders
  13. */
  14. protected $model = null;
  15. /**
  16. * @var \app\common\model\VipAdminBind
  17. */
  18. protected $vipAdminBindModel = null;
  19. /**
  20. * @var \app\common\model\Admin
  21. */
  22. protected $adminModel = null;
  23. /**
  24. * @var \app\common\model\AdminConfig
  25. */
  26. protected $adminConfigModel = null;
  27. public function _initialize()
  28. {
  29. parent::_initialize();
  30. $this->model = model('Orders');
  31. $this->vipAdminBindModel = model('VipAdminBind');
  32. $this->adminModel = model('Admin');
  33. $this->adminConfigModel = model('AdminConfig');
  34. }
  35. /**
  36. * 订单明细导出
  37. * @throws \think\db\exception\DataNotFoundException
  38. * @throws \think\db\exception\ModelNotFoundException
  39. * @throws \think\exception\DbException
  40. * @author 李聪聪
  41. */
  42. public function export()
  43. {
  44. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  45. $filter = $this->request->get("filter", '');
  46. $filter = json_decode($filter, true);
  47. $where = [];
  48. $channelId = null;
  49. $username = null;
  50. $nickname = null;
  51. if ($filter) {
  52. foreach ($filter as $k => $v) {
  53. switch ($k) {
  54. case 'out_trade_no':
  55. $where['out_trade_no'] = ['like', '%' . $v . '%'];
  56. break;
  57. case 'transaction_id':
  58. $where['transaction_id'] = ['like', '%' . $v . '%'];
  59. break;
  60. case 'money':
  61. $where['orders.money'] = $v;
  62. break;
  63. case 'state':
  64. $where['orders.state'] = $v;
  65. break;
  66. case 'createtime':
  67. $arr = array_slice(explode(' - ', $v), 0, 2);
  68. $where['orders.createtime'] = ['BETWEEN time', $arr];
  69. if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
  70. $this->error("查询时间范围超过一个月", null, 13);
  71. }
  72. break;
  73. case 'finishtime':
  74. $arr = array_slice(explode(' - ', $v), 0, 2);
  75. $where['orders.finishtime'] = ['BETWEEN time', $arr];
  76. if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
  77. $this->error("查询时间范围超过一个月", null, 13);
  78. }
  79. break;
  80. case 'channel_nickname';
  81. $nickname = $v;
  82. break;
  83. case 'channel_id':
  84. $channelId = $v;
  85. break;
  86. case 'channel_username':
  87. $username = $v;
  88. break;
  89. default:
  90. break;
  91. }
  92. }
  93. }
  94. ini_set('memory_limit', '256M'); //内存限制
  95. $columns = [
  96. '商户单号',
  97. '交易单号',
  98. '用户',
  99. '用户关注时间',
  100. '用户注册时间',
  101. '类型',
  102. '充值金额',
  103. '支付状态',
  104. '下单时间',
  105. '完成时间',
  106. '推广链接id',
  107. '推广链接渠道',
  108. '书名',
  109. '代理商',
  110. '渠道商昵称',
  111. '渠道商Id',
  112. '渠道商账号',
  113. '是否分账'
  114. ];
  115. header('Content-Description: File Transfer');
  116. header('Content-Type: application/vnd.ms-excel');
  117. header('Content-Disposition: attachment; filename="vip导出订单明细-'.date('YmdHis', time()).'.csv"');
  118. header('Expires: 0');
  119. header('Cache-Control: must-revalidate');
  120. header('Pragma: public');
  121. $fp = fopen('php://output', 'a');//打开output流
  122. mb_convert_variables('GBK', 'UTF-8', $columns);
  123. fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中
  124. $condition_referral = []; //推广条件
  125. if (isset($_GET['ids'])) {
  126. $condition_referral['orders.referral_id'] = $_GET['ids'];//推广id
  127. $condition_referral['orders.resource_id'] = [['exp', 'is null'], ['=', 0], 'or'];//资源id
  128. }
  129. $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
  130. if (empty($channelIds) && empty($channelId)) {
  131. fclose($fp);
  132. exit();
  133. }
  134. $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
  135. $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
  136. $fetch = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
  137. $total = $fetch->count();
  138. $limit = 1000;
  139. $pages = ceil($total / $limit);
  140. $offset = 0;
  141. $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
  142. if (empty($channelIds) && empty($channelId)) {
  143. return json(["total" => 0, "rows" => []]);
  144. }
  145. $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
  146. $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
  147. for($i = 1; $i <= $pages; $i++) {
  148. $fetch = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
  149. if (!empty($where['orders.createtime']) || !empty($where['createtime'])) {
  150. $fetch->force('createtime');
  151. }
  152. /**
  153. * @var Query
  154. */
  155. $query = $fetch->order($sort, $order)
  156. ->limit(0, $limit);
  157. if ($offset) {
  158. $query->where('orders.id','<',$offset);
  159. }
  160. $list = $query->select();
  161. $orderOne = end($list);
  162. $offset = $orderOne['id'];
  163. $orderIds = array_column($list, 'out_trade_no');
  164. $splitRows = model("PalmpaySplitAccountLog")->field('order_id')->where('order_id', 'in', $orderIds)->where('channel_amount', '>', 0)->select();
  165. if ($splitRows) {
  166. $splitRows = ArrayHelper::index($splitRows, 'order_id');
  167. }
  168. $ids = array_column($list, 'referral_id');
  169. //wud 20191021 VIP后台订单明细查询
  170. $referrals = model('referral')->field(['id','admin_id', 'name'])->where('id', "in", $ids )->select();
  171. if ( !empty($referrals) ){
  172. $keyReferrals = [];
  173. foreach ( $referrals as $kk => $vv ){
  174. $keyReferrals[$vv['id']] = [
  175. 'admin_id' => $vv['admin_id'],
  176. 'name' => $vv['name'],
  177. ];
  178. }
  179. }
  180. $book_ids = array_column($list, 'book_id');
  181. $book_data = model('Book')->whereIn('id', $book_ids)->column('id,name');
  182. $admin_ids = array_column($list, 'admin_id');
  183. $admin_channel_list = model('admin')
  184. ->join(['admin' => 'leadAdmin'], 'admin.id = leadAdmin.id')
  185. ->join(['admin_extend' => 'leadExt'], 'admin.id = leadExt.admin_id')
  186. ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
  187. ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
  188. ->whereIn('admin.id', $admin_ids)
  189. ->field([
  190. 'admin.id' => 'id',
  191. 'leadAdmin.id' => 'lead_admin_id',
  192. 'leadAdmin.username' => 'lead_admin_username',
  193. 'leadAdmin.nickname' => 'lead_admin_nickname',
  194. 'channelAdmin.id' => 'channel_admin_id',
  195. 'channelAdmin.username' => 'channel_admin_username',
  196. 'channelAdmin.nickname' => 'channel_admin_nickname',
  197. 'leadAga.group_id' => 'lead_group_id',
  198. ])
  199. ->select();
  200. $admin_channel_data = [];
  201. foreach($admin_channel_list as $data){
  202. $admin_channel_data[$data['id']] = $data;
  203. }
  204. foreach ($list as $k => &$v) {
  205. if ($v['book_id'] && array_key_exists($v['book_id'], $book_data)) {
  206. $v['bookname'] = $book_data[$v['book_id']];
  207. }
  208. $v['pdpd']= $keyReferrals[$v['referral_id']]['name'] ?? '';
  209. $v['radmin_id']= $keyReferrals[$v['referral_id']]['admin_id'] ?? '';
  210. if (array_key_exists($v['admin_id'], $admin_channel_data)) {
  211. if(!isset($admin_channel_data[$v['admin_id']]['lead_group_id'])){
  212. continue;
  213. }
  214. if ($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_CHANNEL) {
  215. $v['channel_id'] = $admin_channel_data[$v['admin_id']]['lead_admin_id'];
  216. $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
  217. $v['channel_username'] = $admin_channel_data[$v['admin_id']]['lead_admin_username'];
  218. $v['agent_nickname'] = '-';
  219. } else if($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_AGENT){
  220. $v['channel_id'] = $admin_channel_data[$v['admin_id']]['channel_admin_id'];
  221. $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['channel_admin_nickname'];
  222. $v['channel_username'] = $admin_channel_data[$v['admin_id']]['channel_admin_username'];
  223. $v['agent_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
  224. }
  225. }
  226. if($v['user_id']){
  227. try{
  228. $res = model('user')
  229. ->setConnect($v['user_id'])
  230. ->where(['id' => $v['user_id']])
  231. ->field('id,channel_id,nickname,createtime,avatar,subscribe_time')
  232. ->select();
  233. $res = $res[0];
  234. }catch (\Exception $e){
  235. Log::info("获取用户信息失败,用户ID:{$v['user_id']}");
  236. Log::info($e->getMessage());
  237. }
  238. if($res){
  239. $v['user'] = $res;
  240. }else{
  241. $v['user'] = ['nickname'=>'未知','subscribe_time'=>'','createtime'=>0];
  242. }
  243. }else{
  244. $v['user'] = ['nickname'=>'未知'];
  245. }
  246. //是否分账
  247. $split = '否';
  248. if ($splitRows && isset($splitRows[$v['out_trade_no']])) {
  249. $split = '是';
  250. }
  251. // '\t' 可以解决科学技术法问题
  252. $rowData = [
  253. empty($v['out_trade_no'])?"" : "\t".$v['out_trade_no']."\t" ,
  254. empty($v['transaction_id'])? "":"\t".$v['transaction_id']."\t" ,
  255. $v['user']['nickname']."(id:{$v['user_id']})",
  256. $v['user']['subscribe_time'] ? date('Y-m-d H:i:s', $v['user']['subscribe_time']) : '-',
  257. date('Y-m-d H:i:s',$v['user']['createtime']),
  258. $v['type'] == 1 ? '书币充值':'VIP充值',
  259. $v['money']?? '',
  260. $v['state'] == 0 ?'未支付':'已支付',
  261. date('Y-m-d H:i:s',$v['createtime']),
  262. date('Y-m-d H:i:s',$v['finishtime']),
  263. $v['referral_id']?? '',
  264. $v['pdpd']?? '',
  265. $v['bookname']?? '',
  266. $v['agent_nickname']?? '',
  267. $v['channel_nickname']?? '',
  268. $v['channel_id']?? '',
  269. $v['channel_username']?? '',
  270. $split
  271. ];
  272. //需要格式转换,否则会乱码
  273. mb_convert_variables('GBK', 'UTF-8', $rowData);
  274. fputcsv($fp, $rowData);
  275. unset($rowData);
  276. }
  277. unset($list);
  278. //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
  279. ob_flush();
  280. flush();
  281. }
  282. fclose($fp);
  283. exit();
  284. }
  285. public function index()
  286. {
  287. if (!in_array($this->group, [7, 8])) {
  288. $this->error('当前用户不是vip也不是vip运营');
  289. }
  290. $orderpath = '/admin/viporders/index?ref=addtabs';
  291. $exportpath = '/admin/viporders/export';
  292. if (isset($_GET['ids'])) {
  293. $orderpath .= '&ids=' . $_GET['ids'];
  294. $exportpath .= '?ids=' . $_GET['ids'];
  295. }
  296. $this->assignconfig('orderpath', $orderpath);
  297. $this->assignconfig('exportpath', $exportpath);
  298. if ($this->request->isAjax()) {
  299. $condition_referral = []; //推广条件
  300. if (isset($_GET['ids'])) {
  301. $condition_referral['orders.referral_id'] = $_GET['ids'];//推广id
  302. $condition_referral['orders.resource_id'] = [['exp', 'is null'], ['=', 0], 'or'];//资源id
  303. }
  304. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  305. $orCondition = [];
  306. $filter = $this->request->get("filter", '');
  307. $filter = json_decode($filter, true);
  308. $where = [];
  309. $channelId = null;
  310. $username = null;
  311. $nickname = null;
  312. $whereChannel = [];
  313. if ($filter) {
  314. foreach ($filter as $k => $v) {
  315. switch ($k) {
  316. case 'out_trade_no':
  317. case 'transaction_id':
  318. case 'money':
  319. case 'state':
  320. $where[$k] = $v;
  321. break;
  322. case 'createtime':
  323. $arr = array_slice(explode(' - ', $v), 0, 2);
  324. $where['orders.createtime'] = ['BETWEEN time', $arr];
  325. if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
  326. $this->error("查询时间范围超过一个月", null, 13);
  327. }
  328. break;
  329. case 'finishtime':
  330. $arr = array_slice(explode(' - ', $v), 0, 2);
  331. $where['orders.finishtime'] = ['BETWEEN time', $arr];
  332. if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
  333. $this->error("查询时间范围超过一个月", null, 13);
  334. }
  335. break;
  336. case 'channel_nickname';
  337. $whereChannel['nickname'] = $v;
  338. break;
  339. case 'channel_id':
  340. $whereChannel['id'] = $v;
  341. break;
  342. case 'channel_username':
  343. $whereChannel['username'] = $v;
  344. break;
  345. default:
  346. break;
  347. }
  348. }
  349. }
  350. if ($whereChannel) {
  351. $channelId = AdminService::instance()->getAdminModel()->where($whereChannel)->column('id');
  352. if (!$channelId) {
  353. return json(["total" => 0, "rows" => []]);
  354. }
  355. }
  356. $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
  357. if (empty($channelIds) && empty($channelId)) {
  358. return json(["total" => 0, "rows" => []]);
  359. }
  360. $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
  361. $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
  362. $channelList = $this->adminConfigModel
  363. ->field([
  364. 'admin_id',
  365. 'qrcode_image',
  366. 'json'
  367. ])
  368. ->where(['admin_id' => ['in', $channelIds]])
  369. ->select();
  370. $aChannels = [];
  371. foreach ($channelList as $item) {
  372. $aChannels[$item->admin_id] = [
  373. 'channel_qrCodeImage' => $this->_getQrCodeImage($item->qrcode_image, $item->json)
  374. ];
  375. }
  376. $totleFetchObj = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
  377. if (array_key_exists('createtime', $filter)) {
  378. $total = $totleFetchObj->force('createtime')->count();
  379. $sort = 'orders.createtime';
  380. } else {
  381. $total = $totleFetchObj->count();
  382. $sort = 'orders.id';
  383. }
  384. $listFetchObj = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
  385. $list = $listFetchObj
  386. ->order($sort, $order)
  387. ->limit($offset, $limit)
  388. ->select();
  389. $ids = $keyReferrals = [];
  390. foreach ($list as $k => $v) {
  391. $ids[] = $v['referral_id'];
  392. $v['user'] = model('user')->setConnect($v['user_id'])->where(['id' => $v['user_id']])->find();
  393. }
  394. //wud 20191021 VIP后台订单明细查询
  395. $referrals = model('referral')->field(['id','admin_id', 'name'])->where('id', "in", $ids )->select();
  396. if ( !empty($referrals) ){
  397. $keyReferrals = [];
  398. foreach ( $referrals as $kk => $vv ){
  399. $keyReferrals[$vv['id']] = [
  400. 'admin_id' => $vv['admin_id'],
  401. 'name' => $vv['name'],
  402. ];
  403. }
  404. }
  405. $book_ids = array_column($list, 'book_id');
  406. $book_data = model('Book')->whereIn('id', $book_ids)->column('id,name');
  407. $admin_ids = array_column($list, 'admin_id');
  408. $admin_channel_list = model('admin')
  409. ->join(['admin' => 'leadAdmin'], 'admin.id = leadAdmin.id')
  410. ->join(['admin_extend' => 'leadExt'], 'admin.id = leadExt.admin_id')
  411. ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
  412. ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
  413. ->whereIn('admin.id', $admin_ids)
  414. ->field([
  415. 'admin.id' => 'id',
  416. 'leadAdmin.id' => 'lead_admin_id',
  417. 'leadAdmin.username' => 'lead_admin_username',
  418. 'leadAdmin.nickname' => 'lead_admin_nickname',
  419. 'channelAdmin.id' => 'channel_admin_id',
  420. 'channelAdmin.username' => 'channel_admin_username',
  421. 'channelAdmin.nickname' => 'channel_admin_nickname',
  422. 'leadAga.group_id' => 'lead_group_id',
  423. ])
  424. ->select();
  425. $admin_channel_data = [];
  426. foreach($admin_channel_list as $data){
  427. $admin_channel_data[$data['id']] = $data;
  428. }
  429. foreach ($list as $k => &$v) {
  430. if ($v['book_id'] && array_key_exists($v['book_id'], $book_data)) {
  431. $v['bookname'] = $book_data[$v['book_id']];
  432. }
  433. $v['pdpd']= $keyReferrals[$v['referral_id']]['name'] ?? '';
  434. $v['radmin_id']= $keyReferrals[$v['referral_id']]['admin_id'] ?? '';
  435. if (array_key_exists($v['admin_id'], $admin_channel_data)) {
  436. if ($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_CHANNEL) {
  437. $v['channel_id'] = $admin_channel_data[$v['admin_id']]['lead_admin_id'];
  438. $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
  439. $v['channel_username'] = $admin_channel_data[$v['admin_id']]['lead_admin_username'];
  440. $v['agent_nickname'] = '-';
  441. $v['channel_qrimage'] = $aChannels[$v['channel_id']]['channel_qrCodeImage'];
  442. } else if($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_AGENT){
  443. $v['channel_id'] = $admin_channel_data[$v['admin_id']]['channel_admin_id'];
  444. $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['channel_admin_nickname'];
  445. $v['channel_username'] = $admin_channel_data[$v['admin_id']]['channel_admin_username'];
  446. $v['agent_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
  447. $v['channel_qrimage'] = $aChannels[$v['channel_id']]['channel_qrCodeImage'];
  448. }
  449. }
  450. }
  451. $result = array("total" => $total, "rows" => $list);
  452. return json($result);
  453. }
  454. return $this->view->fetch();
  455. }
  456. private function _getQrCodeImage($qrCodeImage, $adminJson)
  457. {
  458. if (empty($qrCodeImage)) {
  459. return 'https://open.weixin.qq.com/qr/code?username=' . $adminJson['authorizer_info']['user_name'];
  460. } else {
  461. return $qrCodeImage;
  462. }
  463. }
  464. /**
  465. * @param $where
  466. * @param $condition_referral
  467. * @param $channelIdAndAgentIds
  468. * @return \app\common\model\Orders
  469. */
  470. private function _getFetchObj($where, $condition_referral, $channelIdAndAgentIds)
  471. {
  472. $fetchObj = $this->model
  473. //wu 20191021 优化
  474. // ->join(['referral' => 'r'], 'r.id=orders.referral_id', 'left')
  475. // ->join(['book' => 'b'], 'orders.book_id = b.id', 'left')
  476. // ->join(['admin' => 'leadAdmin'], 'orders.admin_id = leadAdmin.id')
  477. // ->join(['admin_extend' => 'leadExt'], 'orders.admin_id = leadExt.admin_id')
  478. // ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
  479. // ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
  480. // ->field([
  481. // 'orders.*',
  482. // 'r.name' => 'pdpd',
  483. // 'b.name' => 'bookname',
  484. // 'r.admin_id' => 'radmin_id',
  485. // 'leadAdmin.id' => 'lead_admin_id',
  486. // 'leadAdmin.username' => 'lead_admin_username',
  487. // 'leadAdmin.nickname' => 'lead_admin_nickname',
  488. // 'channelAdmin.id' => 'channel_admin_id',
  489. // 'channelAdmin.username' => 'channel_admin_username',
  490. // 'channelAdmin.nickname' => 'channel_admin_nickname',
  491. // 'leadAga.group_id' => 'lead_group_id',
  492. // ])
  493. ->where($where)
  494. ->where('orders.deduct', 0)
  495. ->whereIn('admin_id', $channelIdAndAgentIds)
  496. ->where($condition_referral);
  497. return $fetchObj;
  498. }
  499. }