Files
littleTiger/application/admin/controller/Report.php
2019-02-28 19:48:21 +08:00

369 lines
16 KiB
PHP

<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* Author: 当燃
* Date: 2015-12-21
*/
namespace app\admin\controller;
use app\admin\logic\GoodsLogic;
use app\common\model\Order;
use think\Db;
use think\Page;
class Report extends Base
{
public function _initialize(){
parent::_initialize();
}
public function index(){
($this->begin > $this->end) && $this->error('起止时间选择错误!!!');
$now = strtotime(date('Y-m-d'));
$today['today_amount'] = M('order')->where("add_time>$now AND (pay_status=1 or pay_code='cod') and order_status in(1,2,4)")->sum('total_amount');//今日销售总额
$today['today_order'] = M('order')->where("add_time>$now and (pay_status=1 or pay_code='cod') and order_status!=3")->count();//今日订单数
$today['cancel_order'] = M('order')->where("add_time>$now AND order_status=3")->count();//今日取消订单
if ($today['today_order'] == 0) {
$today['sign'] = round(0, 2);
} else {
$today['sign'] = round($today['today_amount'] / $today['today_order'], 2);
}
$this->assign('today',$today);
$select_year = $this->select_year;
$res = Db::name("order".$select_year)
->field(" COUNT(*) as tnum,sum(total_amount) as amount, FROM_UNIXTIME(add_time,'%Y-%m-%d') as gap ")
->where(" add_time >$this->begin and add_time < $this->end AND (pay_status=1 or pay_code='cod') and order_status in(1,2,4) ")
->group('gap')
->select();
foreach ($res as $val){
$arr[$val['gap']] = $val['tnum'];
$brr[$val['gap']] = $val['amount'];
$tnum += $val['tnum'];
$tamount += $val['amount'];
}
for($i=$this->begin;$i<=$this->end;$i=$i+24*3600){
$tmp_num = empty($arr[date('Y-m-d',$i)]) ? 0 : $arr[date('Y-m-d',$i)];
$tmp_amount = empty($brr[date('Y-m-d',$i)]) ? 0 : $brr[date('Y-m-d',$i)];
$tmp_sign = empty($tmp_num) ? 0 : round($tmp_amount/$tmp_num,2);
$order_arr[] = $tmp_num;
$amount_arr[] = $tmp_amount;
$sign_arr[] = $tmp_sign;
$date = date('Y-m-d',$i);
$list[] = array('day'=>$date,'order_num'=>$tmp_num,'amount'=>$tmp_amount,'sign'=>$tmp_sign,'end'=>date('Y-m-d',$i+24*60*60));
$day[] = $date;
}
!empty($list) && rsort($list);
$this->assign('list',$list);
$result = array('order'=>$order_arr,'amount'=>$amount_arr,'sign'=>$sign_arr,'time'=>$day);
$this->assign('result',json_encode($result));
return $this->fetch();
}
/**
* 销量排行
* @return mixed
*/
public function saleTop(){
$goods_name = I('goods_name');
$where = [
'od.pay_time' => ['Between',"$this->begin,$this->end"],
'od.order_status'=> ['notIN','3,5'],
'og.is_send' => 1,
];
if(!empty($goods_name))$where['og.goods_name'] =['like', "%$goods_name%"];
$count = Db::name('order_goods')->alias('og')
->field('sum(og.goods_num) as sale_num,sum(og.goods_num*og.goods_price) as sale_amount ')
->join('order od','og.order_id=od.order_id','LEFT')
->where($where)->group('og.goods_id')->count();
$Page = new Page($count,$this->page_size);
$res = Db::name('order_goods')->alias('og')
->field('og.goods_name,og.goods_id,og.goods_sn,sum(og.goods_num) as sale_num,sum(og.goods_num*og.goods_price) as sale_amount ')
->join('order od','og.order_id=od.order_id','LEFT')
->where($where)->group('og.goods_id')->order('sale_num DESC')
->limit($Page->firstRow,$Page->listRows)->cache(true,3600)->select();
$this->assign('list',$res);
$this->assign('page',$Page);
$this->assign('p',I('p/d',1));
$this->assign('page_size',$this->page_size);
return $this->fetch();
}
/**
* 统计报表 - 会员排行
* @return mixed
*/
public function userTop(){
$mobile = I('mobile');
$email = I('email');
$order_where = [
'o.add_time'=>['Between',"$this->begin,$this->end"],
'o.pay_status'=>1,
'o.order_status'=>['notIn','3,5']
];
if($mobile){
$user_where['mobile'] =$mobile;
}
if($email){
$user_where['email'] = $email;
}
if($user_where){ //有查询单个用户的条件就去找出user_id
$user_id = Db::name('users')->where($user_where)->getField('user_id');
$order_where['o.user_id']=$user_id;
}
$count = Db::name('order')->alias('o')->where($order_where)->group('o.user_id')->count(); //统计数量
$Page = new Page($count,$this->page_size);
$list = Db::name('order')->alias('o')
->field('count(o.order_id) as order_num,sum(o.total_amount) as amount,o.user_id,u.mobile,u.email,u.nickname')
->join('users u','o.user_id=u.user_id','LEFT')
->where($order_where)
->group('o.user_id')
->order('amount DESC')
->limit($Page->firstRow,$Page->listRows)
->cache(true)->select(); //以用户ID分组查询
$this->assign('page',$Page);
$this->assign('p',I('p/d',1));
$this->assign('page_size',$this->page_size);
$this->assign('list',$list);
return $this->fetch();
}
/**
* 用户订单
* @return mixed
*/
public function userOrder(){
$orderModel = new Order();
$user_id = trim(I('user_id'));
// 搜索条件
$condition=[
'add_time'=>['Between',"$this->begin,$this->end"],
'pay_status'=>1,
'user_id' => $user_id,
'order_status'=>['notIn','3,5'],
];
$keyType = I("keytype");
$keywords = I('keywords','','trim');
$pay_code = input('pay_code');
$order_sn = ($keyType && $keyType == 'order_sn') ? $keywords : I('order_sn') ;
$order_sn ? $condition['order_sn'] = trim($order_sn) : false;
$pay_code != '' ? $condition['pay_code'] = $pay_code : false; //支付方式
$count = $orderModel->where($condition)->count();
$Page = new Page($count,$this->page_size);
$orderList = $orderModel->where($condition)
->limit("{$Page->firstRow},{$Page->listRows}")->order('add_time desc')->select();
$this->assign('orderList',$orderList);
$this->assign('user_id',$user_id);
$this->assign('keywords',$keywords);
$this->assign('page',$Page);// 赋值分页输出
return $this->fetch();
}
public function saleOrder(){
$end_time = $this->begin+24*60*60;
$order_where = "o.add_time>$this->begin and o.add_time<$end_time"; //交易成功的有效订单
$order_count = Db::name('order')->alias('o')->where($order_where)->whereIn('order_status','1,2,4')->count();
$Page = new Page($order_count,20);
$order_list = Db::name('order')->alias('o')
->field('o.order_id,o.order_sn,o.goods_price,o.shipping_price,o.total_amount,o.add_time,u.user_id,u.nickname')
->join('users u','u.user_id = o.user_id','left')
->where($order_where)->whereIn('order_status','1,2,4')
->limit($Page->firstRow,$Page->listRows)->select();
$this->assign('order_list',$order_list);
$this->assign('page',$Page);
return $this->fetch();
}
/**
* 销售明细列表
*/
public function saleList(){
$cat_id = I('cat_id',0);
$brand_id = I('brand_id',0);
$goods_id = I('goods_id',0);
$where = "o.add_time>$this->begin and o.add_time<$this->end and o.order_status in(1,2,4) and og.is_send = 1 "; //交易成功的有效订单
if($cat_id>0){
$where .= " and (g.cat_id=$cat_id or g.extend_cat_id=$cat_id)";
$this->assign('cat_id',$cat_id);
}
if($brand_id>0){
$where .= " and g.brand_id=$brand_id";
$this->assign('brand_id',$brand_id);
}
if($goods_id >0){
$where .= " and og.goods_id=$goods_id";
}
$count = Db::name('order_goods')->alias('og')
->join('order o','og.order_id=o.order_id ','left')
->join('goods g','og.goods_id = g.goods_id','left')
->where($where)->count(); //统计数量
$Page = new Page($count,20);
$show = $Page->show();
$res = Db::name('order_goods')->alias('og')->field('og.*,o.user_id,o.order_sn,o.shipping_name,o.pay_name,o.add_time,og.spec_key_name')
->join('order o','og.order_id=o.order_id ','left')
->join('goods g','og.goods_id = g.goods_id','left')
->where($where)->limit($Page->firstRow,$Page->listRows)
->order('o.add_time desc')->select();
$this->assign('list',$res);
$this->assign('pager',$Page);
$this->assign('page',$show);
$GoodsLogic = new GoodsLogic();
$brandList = $GoodsLogic->getSortBrands(); //获取排好序的品牌列表
$categoryList = $GoodsLogic->getSortCategory(); //获取排好序的分类列表
$this->assign('categoryList',$categoryList);
$this->assign('brandList',$brandList);
return $this->fetch();
}
public function user(){
$today = strtotime(date('Y-m-d'));
$month = strtotime(date('Y-m-01'));
$user['today'] = D('users')->where("reg_time>$today")->count();//今日新增会员
$user['month'] = D('users')->where("reg_time>$month")->count();//本月新增会员
$user['total'] = D('users')->count();//会员总数
$user['user_money'] = D('users')->sum('user_money');//会员余额总额
$res = M('order')->cache(true)->distinct(true)->field('user_id')->select();
$user['hasorder'] = count($res);
$this->assign('user',$user);
$sql = "SELECT COUNT(*) as num,FROM_UNIXTIME(reg_time,'%Y-%m-%d') as gap from __PREFIX__users where reg_time>$this->begin and reg_time<$this->end group by gap";
$new = DB::query($sql);//新增会员趋势
foreach ($new as $val){
$arr[$val['gap']] = $val['num'];
}
for($i=$this->begin;$i<=$this->end;$i=$i+24*3600){
$brr[] = empty($arr[date('Y-m-d',$i)]) ? 0 : $arr[date('Y-m-d',$i)];
$day[] = date('Y-m-d',$i);
}
$result = array('data'=>$brr,'time'=>$day);
$this->assign('result',json_encode($result));
return $this->fetch();
}
public function expense_log(){
$map = array();
$admin_id = I('admin_id');
if($this->begin && $this->end){
$map['addtime'] = array('between',"$this->begin,$this->end");
}
if($admin_id){
$map['admin_id'] = $admin_id;
}
$count = Db::name('expense_log')->where($map)->count();
$page = new Page($count);
$lists = Db::name('expense_log')->where($map)->limit($page->firstRow.','.$page->listRows)->order('id desc')->select();
$this->assign('page',$page->show());
$this->assign('total_count',$count);
$this->assign('list',$lists);
$admin = Db::name('admin')->getField('admin_id,user_name');
$this->assign('admin',$admin);
$typeArr = array('','会员提现','订单取消','订单退款');//数据库设计问题 原订单退款=订单取消,其他=订单退款
$this->assign('typeArr',$typeArr);
return $this->fetch();
}
//财务统计
public function finance(){
$begin = $this->begin;
$end_time = $this->end;
$order = Db::name('order')->alias('o')
->where(['o.pay_status'=>1])->whereTime('o.add_time', 'between', [$begin, $end_time])
->order('o.add_time asc')->getField('order_id,o.*'); //以时间升序
$order_id_arr = get_arr_column($order,'order_id');
$order_ids = implode(',',$order_id_arr); //订单ID组
$order_goods = Db::name('order_goods')->where(['is_send'=>['in','1,2'],'order_id'=>['in',$order_ids]])->group('order_id')
->order('order_id asc')->getField('order_id,sum(goods_num*cost_price) as cost_price,sum(goods_num*member_goods_price) as goods_amount'); //订单商品退货的不算
$frist_key = key($order); //第一个key
$sratus_date = strtotime(date('Y-m-d',$order["$frist_key"]['add_time'])); //有数据那天为循环初始时间,大范围查询可以避免前面输出一堆没用的数据
$key = array_keys($order);
$lastkey = end($key);//最后一个key
$end_date = strtotime(date('Y-m-d',$order["$lastkey"]['add_time']))+24*3600; //数据最后时间为循环结束点,大范围查询可以避免前面输出一堆没用的数据
for($i=$sratus_date;$i<=$end_date;$i=$i+24*3600){ //循环时间
$date = $day[] = date('Y-m-d',$i);
$everyday_end_time = $i+24*3600;
$goods_amount=$cost_price =$shipping_amount=$coupon_amount=$order_prom_amount=$total_amount=0.00; //初始化变量
foreach ($order as $okey => $oval){ //循环订单
$for_order_id = $oval['order_id'];
if (!isset($order_goods["$for_order_id"])){
unset($order[$for_order_id]); //去掉整个订单都了退货后的
}
if($oval['add_time'] >= $i && $oval['add_time']<$everyday_end_time){ //统计同一天内的数据
$goods_amount += $oval['goods_price'];
$total_amount += $oval['total_amount'];
$cost_price += $order_goods["$for_order_id"]['cost_price']; //订单成本价
$shipping_amount += $oval['shipping_price'];
$coupon_amount += $oval['coupon_price'];
$order_prom_amount += $oval['order_prom_amount'];
unset($order[$okey]); //省的来回循环
}
}
//拼装输出到图表的数据
$goods_arr[] = $goods_amount;
$total_arr[] = $total_amount;
$cost_arr[] = $cost_price ;
$shipping_arr[] = $shipping_amount;
$coupon_arr[] = $coupon_amount;
$list[] = [
'day'=>$date,
'goods_amount' => $goods_amount,
'total_amount' => $total_amount,
'cost_amount' => $cost_price,
'shipping_amount' => $shipping_amount,
'coupon_amount' => $coupon_amount,
'order_prom_amount' => $order_prom_amount,
'end'=>$everyday_end_time,
]; //拼装列表
}
rsort($list);
$this->assign('list',$list);
$result = ['goods_arr'=>$goods_arr,'cost_arr'=>$cost_arr,'shipping_arr'=>$shipping_arr,'coupon_arr'=>$coupon_arr,'time'=>$day];
$this->assign('result',json_encode($result));
return $this->fetch();
}
/**
* 运营概况详情
* @return mixed
*/
public function financeDetail(){
$begin = $this->begin;
$end_time = $this->begin+24*60*60;
$order_where = [
'o.pay_status'=>1,
'o.shipping_status'=>1,
'og.is_send'=>['in','1,2']]; //交易成功的有效订单
$order_count = Db::name('order')->alias('o')
->join('order_goods og','o.order_id = og.order_id','left')->join('users u','u.user_id = o.user_id','left')
->whereTime('o.add_time', 'between', [$begin, $end_time])->where($order_where)
->group('o.order_id')->count();
$Page = new Page($order_count,50);
$order_list = Db::name('order')->alias('o')
->field('o.*,u.user_id,u.nickname,SUM(og.cost_price) as coupon_amount')
->join('order_goods og','o.order_id = og.order_id','left')->join('users u','u.user_id = o.user_id','left')
->where($order_where)->whereTime('o.add_time', 'between', [$begin, $end_time])
->group('o.order_id')->limit($Page->firstRow,$Page->listRows)->select();
$this->assign('order_list',$order_list);
$this->assign('page',$Page);
return $this->fetch();
}
}