123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 |
- <?php
- namespace app\admin\controller;
- use app\common\controller\Backend;
- use app\main\constants\AdminConstants;
- use app\main\service\AdminService;
- use app\main\helper\ArrayHelper;
- use think\db\Query;
- use think\Log;
- class Viporders extends Backend
- {
- /**
- * @var \app\common\model\Orders
- */
- protected $model = null;
- /**
- * @var \app\common\model\VipAdminBind
- */
- protected $vipAdminBindModel = null;
- /**
- * @var \app\common\model\Admin
- */
- protected $adminModel = null;
- /**
- * @var \app\common\model\AdminConfig
- */
- protected $adminConfigModel = null;
- public function _initialize()
- {
- parent::_initialize();
- $this->model = model('Orders');
- $this->vipAdminBindModel = model('VipAdminBind');
- $this->adminModel = model('Admin');
- $this->adminConfigModel = model('AdminConfig');
- }
- /**
- * 订单明细导出
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- * @author 李聪聪
- */
- public function export()
- {
- list($where, $sort, $order, $offset, $limit) = $this->buildparams();
- $filter = $this->request->get("filter", '');
- $filter = json_decode($filter, true);
- $where = [];
- $channelId = null;
- $username = null;
- $nickname = null;
- if ($filter) {
- foreach ($filter as $k => $v) {
- switch ($k) {
- case 'out_trade_no':
- $where['out_trade_no'] = ['like', '%' . $v . '%'];
- break;
- case 'transaction_id':
- $where['transaction_id'] = ['like', '%' . $v . '%'];
- break;
- case 'money':
- $where['orders.money'] = $v;
- break;
- case 'state':
- $where['orders.state'] = $v;
- break;
- case 'createtime':
- $arr = array_slice(explode(' - ', $v), 0, 2);
- $where['orders.createtime'] = ['BETWEEN time', $arr];
- if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
- $this->error("查询时间范围超过一个月", null, 13);
- }
- break;
- case 'finishtime':
- $arr = array_slice(explode(' - ', $v), 0, 2);
- $where['orders.finishtime'] = ['BETWEEN time', $arr];
- if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
- $this->error("查询时间范围超过一个月", null, 13);
- }
- break;
- case 'channel_nickname';
- $nickname = $v;
- break;
- case 'channel_id':
- $channelId = $v;
- break;
- case 'channel_username':
- $username = $v;
- break;
- default:
- break;
- }
- }
- }
- ini_set('memory_limit', '256M'); //内存限制
- $columns = [
- '商户单号',
- '交易单号',
- '用户',
- '用户关注时间',
- '用户注册时间',
- '类型',
- '充值金额',
- '支付状态',
- '下单时间',
- '完成时间',
- '推广链接id',
- '推广链接渠道',
- '书名',
- '代理商',
- '渠道商昵称',
- '渠道商Id',
- '渠道商账号',
- '是否分账'
- ];
- header('Content-Description: File Transfer');
- header('Content-Type: application/vnd.ms-excel');
- header('Content-Disposition: attachment; filename="vip导出订单明细-'.date('YmdHis', time()).'.csv"');
- header('Expires: 0');
- header('Cache-Control: must-revalidate');
- header('Pragma: public');
- $fp = fopen('php://output', 'a');//打开output流
- mb_convert_variables('GBK', 'UTF-8', $columns);
- fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中
- $condition_referral = []; //推广条件
- if (isset($_GET['ids'])) {
- $condition_referral['orders.referral_id'] = $_GET['ids'];//推广id
- $condition_referral['orders.resource_id'] = [['exp', 'is null'], ['=', 0], 'or'];//资源id
- }
- $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
- if (empty($channelIds) && empty($channelId)) {
- fclose($fp);
- exit();
- }
- $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
- $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
- $fetch = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
- $total = $fetch->count();
- $limit = 1000;
- $pages = ceil($total / $limit);
- $offset = 0;
- $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
- if (empty($channelIds) && empty($channelId)) {
- return json(["total" => 0, "rows" => []]);
- }
- $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
- $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
- for($i = 1; $i <= $pages; $i++) {
- $fetch = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
- if (!empty($where['orders.createtime']) || !empty($where['createtime'])) {
- $fetch->force('createtime');
- }
- /**
- * @var Query
- */
- $query = $fetch->order($sort, $order)
- ->limit(0, $limit);
- if ($offset) {
- $query->where('orders.id','<',$offset);
- }
- $list = $query->select();
- $orderOne = end($list);
- $offset = $orderOne['id'];
- $orderIds = array_column($list, 'out_trade_no');
- $splitRows = model("PalmpaySplitAccountLog")->field('order_id')->where('order_id', 'in', $orderIds)->where('channel_amount', '>', 0)->select();
- if ($splitRows) {
- $splitRows = ArrayHelper::index($splitRows, 'order_id');
- }
- $ids = array_column($list, 'referral_id');
- //wud 20191021 VIP后台订单明细查询
- $referrals = model('referral')->field(['id','admin_id', 'name'])->where('id', "in", $ids )->select();
- if ( !empty($referrals) ){
- $keyReferrals = [];
- foreach ( $referrals as $kk => $vv ){
- $keyReferrals[$vv['id']] = [
- 'admin_id' => $vv['admin_id'],
- 'name' => $vv['name'],
- ];
- }
- }
- $book_ids = array_column($list, 'book_id');
- $book_data = model('Book')->whereIn('id', $book_ids)->column('id,name');
- $admin_ids = array_column($list, 'admin_id');
- $admin_channel_list = model('admin')
- ->join(['admin' => 'leadAdmin'], 'admin.id = leadAdmin.id')
- ->join(['admin_extend' => 'leadExt'], 'admin.id = leadExt.admin_id')
- ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
- ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
- ->whereIn('admin.id', $admin_ids)
- ->field([
- 'admin.id' => 'id',
- 'leadAdmin.id' => 'lead_admin_id',
- 'leadAdmin.username' => 'lead_admin_username',
- 'leadAdmin.nickname' => 'lead_admin_nickname',
- 'channelAdmin.id' => 'channel_admin_id',
- 'channelAdmin.username' => 'channel_admin_username',
- 'channelAdmin.nickname' => 'channel_admin_nickname',
- 'leadAga.group_id' => 'lead_group_id',
- ])
- ->select();
- $admin_channel_data = [];
- foreach($admin_channel_list as $data){
- $admin_channel_data[$data['id']] = $data;
- }
- foreach ($list as $k => &$v) {
- if ($v['book_id'] && array_key_exists($v['book_id'], $book_data)) {
- $v['bookname'] = $book_data[$v['book_id']];
- }
- $v['pdpd']= $keyReferrals[$v['referral_id']]['name'] ?? '';
- $v['radmin_id']= $keyReferrals[$v['referral_id']]['admin_id'] ?? '';
- if (array_key_exists($v['admin_id'], $admin_channel_data)) {
- if(!isset($admin_channel_data[$v['admin_id']]['lead_group_id'])){
- continue;
- }
- if ($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_CHANNEL) {
- $v['channel_id'] = $admin_channel_data[$v['admin_id']]['lead_admin_id'];
- $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
- $v['channel_username'] = $admin_channel_data[$v['admin_id']]['lead_admin_username'];
- $v['agent_nickname'] = '-';
- } else if($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_AGENT){
- $v['channel_id'] = $admin_channel_data[$v['admin_id']]['channel_admin_id'];
- $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['channel_admin_nickname'];
- $v['channel_username'] = $admin_channel_data[$v['admin_id']]['channel_admin_username'];
- $v['agent_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
- }
- }
- if($v['user_id']){
- try{
- $res = model('user')
- ->setConnect($v['user_id'])
- ->where(['id' => $v['user_id']])
- ->field('id,channel_id,nickname,createtime,avatar,subscribe_time')
- ->select();
- $res = $res[0];
- }catch (\Exception $e){
- Log::info("获取用户信息失败,用户ID:{$v['user_id']}");
- Log::info($e->getMessage());
- }
- if($res){
- $v['user'] = $res;
- }else{
- $v['user'] = ['nickname'=>'未知','subscribe_time'=>'','createtime'=>0];
- }
- }else{
- $v['user'] = ['nickname'=>'未知'];
- }
- //是否分账
- $split = '否';
- if ($splitRows && isset($splitRows[$v['out_trade_no']])) {
- $split = '是';
- }
- // '\t' 可以解决科学技术法问题
- $rowData = [
- empty($v['out_trade_no'])?"" : "\t".$v['out_trade_no']."\t" ,
- empty($v['transaction_id'])? "":"\t".$v['transaction_id']."\t" ,
- $v['user']['nickname']."(id:{$v['user_id']})",
- $v['user']['subscribe_time'] ? date('Y-m-d H:i:s', $v['user']['subscribe_time']) : '-',
- date('Y-m-d H:i:s',$v['user']['createtime']),
- $v['type'] == 1 ? '书币充值':'VIP充值',
- $v['money']?? '',
- $v['state'] == 0 ?'未支付':'已支付',
- date('Y-m-d H:i:s',$v['createtime']),
- date('Y-m-d H:i:s',$v['finishtime']),
- $v['referral_id']?? '',
- $v['pdpd']?? '',
- $v['bookname']?? '',
- $v['agent_nickname']?? '',
- $v['channel_nickname']?? '',
- $v['channel_id']?? '',
- $v['channel_username']?? '',
- $split
- ];
- //需要格式转换,否则会乱码
- mb_convert_variables('GBK', 'UTF-8', $rowData);
- fputcsv($fp, $rowData);
- unset($rowData);
- }
- unset($list);
- //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
- ob_flush();
- flush();
- }
- fclose($fp);
- exit();
- }
- public function index()
- {
- if (!in_array($this->group, [7, 8])) {
- $this->error('当前用户不是vip也不是vip运营');
- }
- $orderpath = '/admin/viporders/index?ref=addtabs';
- $exportpath = '/admin/viporders/export';
- if (isset($_GET['ids'])) {
- $orderpath .= '&ids=' . $_GET['ids'];
- $exportpath .= '?ids=' . $_GET['ids'];
- }
- $this->assignconfig('orderpath', $orderpath);
- $this->assignconfig('exportpath', $exportpath);
- if ($this->request->isAjax()) {
- $condition_referral = []; //推广条件
- if (isset($_GET['ids'])) {
- $condition_referral['orders.referral_id'] = $_GET['ids'];//推广id
- $condition_referral['orders.resource_id'] = [['exp', 'is null'], ['=', 0], 'or'];//资源id
- }
- list($where, $sort, $order, $offset, $limit) = $this->buildparams();
- $orCondition = [];
- $filter = $this->request->get("filter", '');
- $filter = json_decode($filter, true);
- $where = [];
- $channelId = null;
- $username = null;
- $nickname = null;
- $whereChannel = [];
- if ($filter) {
- foreach ($filter as $k => $v) {
- switch ($k) {
- case 'out_trade_no':
- case 'transaction_id':
- case 'money':
- case 'state':
- $where[$k] = $v;
- break;
- case 'createtime':
- $arr = array_slice(explode(' - ', $v), 0, 2);
- $where['orders.createtime'] = ['BETWEEN time', $arr];
- if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
- $this->error("查询时间范围超过一个月", null, 13);
- }
- break;
- case 'finishtime':
- $arr = array_slice(explode(' - ', $v), 0, 2);
- $where['orders.finishtime'] = ['BETWEEN time', $arr];
- if (abs(strtotime($arr[1])-strtotime($arr[0]) > (86400*31))) {
- $this->error("查询时间范围超过一个月", null, 13);
- }
- break;
- case 'channel_nickname';
- $whereChannel['nickname'] = $v;
- break;
- case 'channel_id':
- $whereChannel['id'] = $v;
- break;
- case 'channel_username':
- $whereChannel['username'] = $v;
- break;
- default:
- break;
- }
- }
- }
- if ($whereChannel) {
- $channelId = AdminService::instance()->getAdminModel()->where($whereChannel)->column('id');
- if (!$channelId) {
- return json(["total" => 0, "rows" => []]);
- }
- }
- $channelIds = $this->vipAdminBindModel->getChannelIds($this->auth->id, $channelId, $username, $nickname);
- if (empty($channelIds) && empty($channelId)) {
- return json(["total" => 0, "rows" => []]);
- }
- $allAgentIds = $this->vipAdminBindModel->getAllAgentIds($channelIds);
- $channelIdAndAgentIds = array_merge($channelIds, $allAgentIds);
- $channelList = $this->adminConfigModel
- ->field([
- 'admin_id',
- 'qrcode_image',
- 'json'
- ])
- ->where(['admin_id' => ['in', $channelIds]])
- ->select();
- $aChannels = [];
- foreach ($channelList as $item) {
- $aChannels[$item->admin_id] = [
- 'channel_qrCodeImage' => $this->_getQrCodeImage($item->qrcode_image, $item->json)
- ];
- }
- $totleFetchObj = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
- if (array_key_exists('createtime', $filter)) {
- $total = $totleFetchObj->force('createtime')->count();
- $sort = 'orders.createtime';
- } else {
- $total = $totleFetchObj->count();
- $sort = 'orders.id';
- }
- $listFetchObj = $this->_getFetchObj($where, $condition_referral, $channelIdAndAgentIds);
- $list = $listFetchObj
- ->order($sort, $order)
- ->limit($offset, $limit)
- ->select();
- $ids = $keyReferrals = [];
- foreach ($list as $k => $v) {
- $ids[] = $v['referral_id'];
- $v['user'] = model('user')->setConnect($v['user_id'])->where(['id' => $v['user_id']])->find();
- }
- //wud 20191021 VIP后台订单明细查询
- $referrals = model('referral')->field(['id','admin_id', 'name'])->where('id', "in", $ids )->select();
- if ( !empty($referrals) ){
- $keyReferrals = [];
- foreach ( $referrals as $kk => $vv ){
- $keyReferrals[$vv['id']] = [
- 'admin_id' => $vv['admin_id'],
- 'name' => $vv['name'],
- ];
- }
- }
- $book_ids = array_column($list, 'book_id');
- $book_data = model('Book')->whereIn('id', $book_ids)->column('id,name');
- $admin_ids = array_column($list, 'admin_id');
- $admin_channel_list = model('admin')
- ->join(['admin' => 'leadAdmin'], 'admin.id = leadAdmin.id')
- ->join(['admin_extend' => 'leadExt'], 'admin.id = leadExt.admin_id')
- ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
- ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
- ->whereIn('admin.id', $admin_ids)
- ->field([
- 'admin.id' => 'id',
- 'leadAdmin.id' => 'lead_admin_id',
- 'leadAdmin.username' => 'lead_admin_username',
- 'leadAdmin.nickname' => 'lead_admin_nickname',
- 'channelAdmin.id' => 'channel_admin_id',
- 'channelAdmin.username' => 'channel_admin_username',
- 'channelAdmin.nickname' => 'channel_admin_nickname',
- 'leadAga.group_id' => 'lead_group_id',
- ])
- ->select();
- $admin_channel_data = [];
- foreach($admin_channel_list as $data){
- $admin_channel_data[$data['id']] = $data;
- }
- foreach ($list as $k => &$v) {
- if ($v['book_id'] && array_key_exists($v['book_id'], $book_data)) {
- $v['bookname'] = $book_data[$v['book_id']];
- }
- $v['pdpd']= $keyReferrals[$v['referral_id']]['name'] ?? '';
- $v['radmin_id']= $keyReferrals[$v['referral_id']]['admin_id'] ?? '';
- if (array_key_exists($v['admin_id'], $admin_channel_data)) {
- if ($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_CHANNEL) {
- $v['channel_id'] = $admin_channel_data[$v['admin_id']]['lead_admin_id'];
- $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
- $v['channel_username'] = $admin_channel_data[$v['admin_id']]['lead_admin_username'];
- $v['agent_nickname'] = '-';
- $v['channel_qrimage'] = $aChannels[$v['channel_id']]['channel_qrCodeImage'];
- } else if($admin_channel_data[$v['admin_id']]['lead_group_id'] == AdminConstants::ADMIN_GROUP_ID_AGENT){
- $v['channel_id'] = $admin_channel_data[$v['admin_id']]['channel_admin_id'];
- $v['channel_nickname'] = $admin_channel_data[$v['admin_id']]['channel_admin_nickname'];
- $v['channel_username'] = $admin_channel_data[$v['admin_id']]['channel_admin_username'];
- $v['agent_nickname'] = $admin_channel_data[$v['admin_id']]['lead_admin_nickname'];
- $v['channel_qrimage'] = $aChannels[$v['channel_id']]['channel_qrCodeImage'];
- }
- }
- }
- $result = array("total" => $total, "rows" => $list);
- return json($result);
- }
- return $this->view->fetch();
- }
- private function _getQrCodeImage($qrCodeImage, $adminJson)
- {
- if (empty($qrCodeImage)) {
- return 'https://open.weixin.qq.com/qr/code?username=' . $adminJson['authorizer_info']['user_name'];
- } else {
- return $qrCodeImage;
- }
- }
- /**
- * @param $where
- * @param $condition_referral
- * @param $channelIdAndAgentIds
- * @return \app\common\model\Orders
- */
- private function _getFetchObj($where, $condition_referral, $channelIdAndAgentIds)
- {
- $fetchObj = $this->model
- //wu 20191021 优化
- // ->join(['referral' => 'r'], 'r.id=orders.referral_id', 'left')
- // ->join(['book' => 'b'], 'orders.book_id = b.id', 'left')
- // ->join(['admin' => 'leadAdmin'], 'orders.admin_id = leadAdmin.id')
- // ->join(['admin_extend' => 'leadExt'], 'orders.admin_id = leadExt.admin_id')
- // ->join(['admin' => 'channelAdmin'], 'leadExt.create_by = channelAdmin.id')
- // ->join(['auth_group_access' => 'leadAga'], 'leadAga.uid = leadAdmin.id')
- // ->field([
- // 'orders.*',
- // 'r.name' => 'pdpd',
- // 'b.name' => 'bookname',
- // 'r.admin_id' => 'radmin_id',
- // 'leadAdmin.id' => 'lead_admin_id',
- // 'leadAdmin.username' => 'lead_admin_username',
- // 'leadAdmin.nickname' => 'lead_admin_nickname',
- // 'channelAdmin.id' => 'channel_admin_id',
- // 'channelAdmin.username' => 'channel_admin_username',
- // 'channelAdmin.nickname' => 'channel_admin_nickname',
- // 'leadAga.group_id' => 'lead_group_id',
- // ])
- ->where($where)
- ->where('orders.deduct', 0)
- ->whereIn('admin_id', $channelIdAndAgentIds)
- ->where($condition_referral);
- return $fetchObj;
- }
- }
|