2019-09-06 23:53:10 +08:00

497 lines
24 KiB
PHP
Executable File

<?php
namespace wstmart\admin\model;
use think\Db;
use think\Loader;
/**
* ============================================================================
* 报表业务处理
*/
class Reports extends Base{
/**
* 获取商品销售统计
*/
public function topSaleGoodsByPage(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$startTime = strtotime(input('startDate'));
$endTime =strtotime(input('endDate'));
$goodsCatIdPath = input('goodsCatIdPath');
$shopName = input('post.shopName');
$goodsName = input('post.goodsName');
$where='(payType=0 or (payType=1 and isPay=1)) and o.dataFlag=1';
if($shopName)$where.=' AND shopName like "%'.$shopName.'%"';
if($goodsName)$where.=' AND g.goodsName like "%'.$goodsName.'%"';
if($goodsCatIdPath !='')$where.=' AND g.goodsCatIdPath like "%'.$goodsCatIdPath.'%"';
$rs= Db::field('og.goodsId,g.goodsName,goodsSn,s.shopId,shopName,sum(og.goodsNum) goodsNum,og.goodsImg,count(og.goodsId)orderNum,pageNum,goodsCatIdPath')
->name('order_goods')->alias('og')
->join('(select p.*,count(p.goodsId) pageNum from __PAGE_VIEW__ p group by p.goodsId ) con','con.goodsId=og.goodsId','left')
->join('__ORDERS__ o','og.orderId=o.orderId','left')
->join('__GOODS__ g','og.goodsId=g.goodsId','left')
->join('__SHOPS__ s','g.shopId=s.shopId','left')
->order('goodsNum desc')
->whereTime('o.createTime','between',[$start,$end])
->where($where)
->group('og.goodsId,g.goodsName,goodsSn,s.shopId,shopName,og.goodsImg')
->paginate(input('limit/d'))->toArray();
return $rs;
}
/**
* 获取店铺销售统计
*/
public function topShopSalesByPage(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$shopName = input('shopName');
$where='(payType=0 or (payType=1 and isPay=1)) and o.dataFlag=1';
if($shopName)$where.=' AND shopName like "%'.$shopName.'%"';
$rs = Db::field('s.shopId,s.shopImg,s.shopName,sum(o.totalMoney) totalMoney,count(o.shopId) orderNum,s.userId')
->name('shops')->alias('s')
->join('__ORDERS__ o','s.shopId=o.shopId')
->order('totalMoney desc,orderNum desc')
->whereTime('o.createTime','between',[$start,$end])
->where($where)
->group('o.shopId')
->paginate(input('limit/d'))->toArray();
foreach($rs['Rows'] as $k=>$v){
$onLineArr = Db::name('orders')
->whereTime('createTime','between',[$start,$end])
->field('sum(totalMoney) totalMoney,sum(realTotalMoney) realTotalMoney')
->where('payType=1 and isPay=1 and dataFlag=1 and orderStatus=2')
->where(['shopId'=>$v['shopId']])
->find();
$rs['Rows'][$k]['onLinePayMoney'] = (float)$onLineArr['totalMoney'];// 在线支付总金额
$rs['Rows'][$k]['onLinePayTrueMoney'] = (float)$onLineArr['realTotalMoney'];// 在线支付实际金额
$rs['Rows'][$k]['offLinePayMoney'] = (float)Db::name('orders')
->whereTime('createTime','between',[$start,$end])
->where('payType=0 and dataFlag=1 and orderStatus=2')
->where(['shopId'=>$v['shopId']])
->value('sum(totalMoney)');;// 货到付款金额
$rs['Rows'][$k]['ectNum']=db('user_ect_log')->where(['userId'=>$v['userId'],'ectType'=>12])->value('sum(ectNum)ectNum');
}
return $rs;
}
/**
* 获取销售额
*/
public function statSales(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$payType = (int)input('payType',-1);
$rs = Db::field('left(createTime,10) createTime,orderSrc,sum(totalMoney) totalMoney')->name('orders')->whereTime('createTime','between',[$start,$end])
->where('((payType=0 or (payType=1 and isPay=1)) and dataFlag=1) '.(in_array($payType,[0,1])?" and payType=".$payType:''))
->order('createTime asc')
->group('left(createTime,10),orderSrc')->select();
$rdata = [];
if(count($rs)>0){
$days = [];
$payTypes = [0,1,2,3,4];
$tmp = [];
foreach($rs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp[$v['orderSrc']."_".$v['createTime']] = $v['totalMoney'];
}
$rdata['map'] = ['p0'=>0,'p1'=>0,'p2'=>0,'p3'=>0,'p4'=>0];
foreach($days as $v){
$total = 0;
foreach($payTypes as $p){
$pv = isset($tmp[$p."_".$v])?$tmp[$p."_".$v]:0;
$rdata['p'.$p][] = (float)$pv;
$total = $total + (float)$pv;
$rdata['map']['p'.$p] = $rdata['map']['p'.$p] + (float)$pv;
}
$rdata['total'][] = $total;
}
$rdata['days'] = $days;
}
return WSTReturn('',1,$rdata);
}
/**
* 获取订单统计
*/
public function statOrders(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$payType = (int)input('payType',-1);
$rs = Db::field('left(createTime,10) createTime,orderSrc,count(orderId) orderNum')->name('orders')->whereTime('createTime','between',[$start,$end])
->where('((payType=0 or (payType=1 and isPay=1)) and dataFlag=1) '.(in_array($payType,[0,1])?" and payType=".$payType:''))
->order('createTime asc')
->group('left(createTime,10),orderSrc')->select();
$rdata = [];
if(count($rs)>0){
$days = [];
$payTypes = [0,1,2,3,4];
$tmp = [];
foreach($rs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp[$v['orderSrc']."_".$v['createTime']] = $v['orderNum'];
}
$rdata['map'] = ['p0'=>0,'p1'=>0,'p2'=>0,'p3'=>0,'p4'=>0];
foreach($days as $v){
$total = 0;
foreach($payTypes as $p){
$pv = isset($tmp[$p."_".$v])?$tmp[$p."_".$v]:0;
$rdata['p'.$p][] = (float)$pv;
$total = $total + (float)$pv;
$rdata['map']['p'.$p] = $rdata['map']['p'.$p] + (float)$pv;
}
$rdata['total'][] = $total;
}
$rdata['days'] = $days;
}
return WSTReturn('',1,$rdata);
}
/*首页获取订单数量*/
public function getOrders(){
$data = cache('orderData');
if(empty($data)){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$payType = -1;
$rs = Db::field('left(createTime,10) createTime,orderSrc,count(orderId) orderNum')->name('orders')->whereTime('createTime','between',[$start,$end])
->where('((payType=0 or (payType=1 and isPay=1)) and dataFlag=1) '.(in_array($payType,[0,1])?" and payType=".$payType:''))
->order('createTime asc')
->group('left(createTime,10),orderSrc')->select();
$rdata = [];
if(count($rs)>0){
$days = [];
$tmp = [];
$payTypes = [0,1,2,3,4];
foreach($rs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp[$v['orderSrc']."_".$v['createTime']] = $v['orderNum'];
}
foreach($days as $v){
$total = 0;
foreach($payTypes as $p){
$pv = isset($tmp[$p."_".$v])?$tmp[$p."_".$v]:0;
$total = $total + (float)$pv;
}
$rdata['total'][] = $total;
}
$rdata['days'] = $days;
cache('orderData',$rdata,7200);
}
}else{
$rdata = cache('orderData');
}
return WSTReturn('',1,$rdata);
}
/**
* 获取新增用户
*/
public function statNewUser(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$urs = Db::field('left(createTime,10) createTime,count(userId) userNum')
->name('users')
->whereTime('createTime','between',[$start,$end])
->where(['dataFlag'=>1,'userType'=>0])
->order('createTime asc')
->group('left(createTime,10)')
->select();
$srs = Db::field('left(createTime,10) createTime,count(shopId) userNum')
->name('shops')
->whereTime('createTime','between',[$start,$end])
->where(['dataFlag'=>1])
->order('createTime asc')
->group('left(createTime,10)')
->select();
$rdata = [];
$days = [];
$tmp = [];
if(count($urs)>0){
foreach($urs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp["0_".$v['createTime']] = $v['userNum'];
}
}
if(count($srs)>0){
foreach($srs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp["1_".$v['createTime']] = $v['userNum'];
}
}
sort($days);
foreach($days as $v){
$rdata['u0'][] = isset($tmp['0_'.$v])?$tmp['0_'.$v]:0;
$rdata['u1'][] = isset($tmp['1_'.$v])?$tmp['1_'.$v]:0;
}
$rdata['days'] = $days;
return WSTReturn('',1,$rdata);
}
/**
* 会员登录统计
*/
public function statUserLogin(){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$prefix = config('database.prefix');
$sql ='select createTime,userType,count(userId) userNum from (
SELECT left(loginTime,10) createTime,`userType`,u.userId
FROM `'.$prefix.'users` `u` INNER JOIN `'.$prefix.'log_user_logins` `lg` ON `u`.`userId`=`lg`.`userId`
WHERE `loginTime` BETWEEN "'.$start.'" AND "'.$end.'" AND ( dataFlag=1 )
GROUP BY left(loginTime,10),userType,lg.userId
) a GROUP BY createTime, userType ORDER BY createTime asc ';
$rs = Db::query($sql);
$rdata = [];
if(count($rs)>0){
$days = [];
$tmp = [];
foreach($rs as $key => $v){
if(!in_array($v['createTime'],$days))$days[] = $v['createTime'];
$tmp[$v['userType']."_".$v['createTime']] = $v['userNum'];
}
foreach($days as $v){
$rdata['u0'][] = isset($tmp['0_'.$v])?$tmp['0_'.$v]:0;
$rdata['u1'][] = isset($tmp['1_'.$v])?$tmp['1_'.$v]:0;
}
$rdata['days'] = $days;
}
return WSTReturn('',1,$rdata);
}
/**
* 导出商品销售订单
*/
public function toExportGoods(){
$name='商品销售统计表';
$start = input('startDate');
$end = input('endDate');
$where=[];
$shopName = input('shopName');
$goodsName = input('goodsName');
$goodsCatIdPath = input('goodsCatIdPath');
if($goodsCatIdPath !='')$where['g.goodsCatIdPath'] = ['like','%'.$goodsCatIdPath.'%'];
if($shopName!='')$where['shopName'] = ['like','%'.$shopName.'%'];
if($goodsName!='')$where['g.goodsName'] = ['like','%'.$goodsName.'%'];
if($start!='' && $end!=''){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$where['o.createTime'] = ['between',[$start.' 00:00:00',$end.' 23:59:59']];
}else if($start!=''){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$where['o.createTime'] = ['>=',$start.' 00:00:00'];
}else if($end!=''){
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$where['o.createTime'] = ['<=',$end.' 23:59:59'];
}
$page=Db::field('og.goodsId,g.goodsName,goodsSn,s.shopId,shopName,sum(og.goodsNum) goodsNum,og.goodsImg,count(og.goodsId)orderNum,pageNum')
->name('order_goods')->alias('og')
->join('(select p.*,count(p.goodsId) pageNum from __PAGE_VIEW__ p group by p.goodsId ) con','con.goodsId=og.goodsId','left')
->join('__ORDERS__ o','og.orderId=o.orderId','left')
->join('__GOODS__ g','og.goodsId=g.goodsId','left')
->join('__SHOPS__ s','g.shopId=s.shopId','left')
->order('goodsNum desc')
->where($where)
->where('(payType=0 or (payType=1 and isPay=1)) and o.dataFlag=1')
->group('og.goodsId,g.goodsName,goodsSn,s.shopId,shopName,og.goodsImg')
->select();
Loader::import('phpexcel.PHPExcel.IOFactory');
$objPHPExcel = new \PHPExcel();
// 设置excel文档的属性
$objPHPExcel->getProperties()->setCreator("heyuanhui")//创建人
->setLastModifiedBy("heyuanhui")//最后修改人
->setTitle($name)//标题
->setSubject($name)//题目
->setDescription($name)//描述
->setKeywords("订单")//关键字
->setCategory("Test result file");//种类
// 开始操作excel表
$objPHPExcel->setActiveSheetIndex(0);
// 设置工作薄名称
$objPHPExcel->getActiveSheet()->setTitle(iconv('gbk', 'utf-8', 'Sheet'));
// 设置默认字体和大小
$objPHPExcel->getDefaultStyle()->getFont()->setName(iconv('gbk', 'utf-8', ''));
$objPHPExcel->getDefaultStyle()->getFont()->setSize(11);
$styleArray = array(
'font' => array(
'bold' => true,
'color'=>array(
'argb' => 'ffffffff',
)
),
'borders' => array (
'outline' => array (
'style' => \PHPExcel_Style_Border::BORDER_THIN, //设置border样式
'color' => array ('argb' => 'FF000000'), //设置border颜色
)
)
);
//设置宽
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(25);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFill()->getStartColor()->setARGB('333399');
$objPHPExcel->getActiveSheet()
->setCellValue('A1', '商品ID')
->setCellValue('B1', '商品编号')
->setCellValue('C1', '商品名称')
->setCellValue('D1', '商品销量')
->setCellValue('E1', '所属店铺')
->setCellValue('F1', '订单总数')
->setCellValue('G1', '浏览总数');
$objPHPExcel->getActiveSheet()->getStyle('A1:G1')->applyFromArray($styleArray);
for ($row = 0; $row < count($page); $row++){
$i = $row+2;
$objPHPExcel->getActiveSheet()
->setCellValue('A'.$i, $page[$row]['goodsId'])
->setCellValue('B'.$i, chunk_split($page[$row]['goodsSn']))
->setCellValue('C'.$i, $page[$row]['goodsName'])
->setCellValue('D'.$i, $page[$row]['goodsNum'])
->setCellValue('E'.$i, $page[$row]['shopName'])
->setCellValue('F'.$i, $page[$row]['orderNum'])
->setCellValue('G'.$i, $page[$row]['pageNum']);
}
//输出EXCEL格式
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
// 从浏览器直接输出$filename
header('Content-Type:application/csv;charset=UTF-8');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-excel;");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition: attachment;filename="'.$name.'.xls"');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');
}
/**
* 导出商品销售订单
*/
public function toExportShop(){
$name='店铺销售统计表';
$start = input('startDate');
$end = input('endDate');
$shopName = input('shopName');
$wh='(payType=0 or (payType=1 and isPay=1)) and o.dataFlag=1';
if($shopName)$wh.=' AND shopName like "%'.$shopName.'%"';
$where=[];
if($start!='' && $end!=''){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$where['o.createTime'] = ['between',[$start.' 00:00:00',$end.' 23:59:59']];
}else if($start!=''){
$start = date('Y-m-d 00:00:00',strtotime(input('startDate')));
$where['o.createTime'] = ['>=',$start.' 00:00:00'];
}else if($end!=''){
$end = date('Y-m-d 23:59:59',strtotime(input('endDate')));
$where['o.createTime'] = ['<=',$end.' 23:59:59'];
}
$page=Db::field('s.shopId,s.shopImg,s.shopName,sum(o.totalMoney) totalMoney,count(o.orderId) orderNum')
->name('shops')->alias('s')
->join('__ORDERS__ o','s.shopId=o.shopId')
->order('totalMoney desc,orderNum desc')
->where($where)
->where($wh)
->group('o.shopId')
->select();
foreach($page as $k=>$v){
$onLineArr = Db::name('orders')->alias('o')
->where($where)
->field('sum(totalMoney) totalMoney,sum(realTotalMoney) realTotalMoney')
->where('payType=1 and isPay=1 and dataFlag=1 and orderStatus=2')
->where(['shopId'=>$v['shopId']])
->find();
$page[$k]['onLinePayMoney'] = (float)$onLineArr['totalMoney'];// 在线支付总金额
$page[$k]['onLinePayTrueMoney'] = (float)$onLineArr['realTotalMoney'];// 在线支付实际金额
$page[$k]['offLinePayMoney'] = (float)Db::name('orders')->alias('o')
->where($where)
->where('payType=0 and dataFlag=1 and orderStatus=2')
->where(['shopId'=>$v['shopId']])
->value('sum(totalMoney)');;// 货到付款金额
}
Loader::import('phpexcel.PHPExcel.IOFactory');
$objPHPExcel = new \PHPExcel();
// 设置excel文档的属性
$objPHPExcel->getProperties()->setCreator("heyuanhui")//创建人
->setLastModifiedBy("heyuanhui")//最后修改人
->setTitle($name)//标题
->setSubject($name)//题目
->setDescription($name)//描述
->setKeywords("订单")//关键字
->setCategory("Test result file");//种类
// 开始操作excel表
$objPHPExcel->setActiveSheetIndex(0);
// 设置工作薄名称
$objPHPExcel->getActiveSheet()->setTitle(iconv('gbk', 'utf-8', 'Sheet'));
// 设置默认字体和大小
$objPHPExcel->getDefaultStyle()->getFont()->setName(iconv('gbk', 'utf-8', ''));
$objPHPExcel->getDefaultStyle()->getFont()->setSize(11);
$styleArray = array(
'font' => array(
'bold' => true,
'color'=>array(
'argb' => 'ffffffff',
)
),
'borders' => array (
'outline' => array (
'style' => \PHPExcel_Style_Border::BORDER_THIN, //设置border样式
'color' => array ('argb' => 'FF000000'), //设置border颜色
)
)
);
//设置宽
$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(25);
$objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(25);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet()->getStyle('A1:H1')->getFill()->getStartColor()->setARGB('333399');
$objPHPExcel->getActiveSheet()
->setCellValue('A1', '店铺名称')
->setCellValue('B1', '订单总金额')
->setCellValue('C1', '订单总数')
->setCellValue('D1', '在线支付总金额')
->setCellValue('E1', '在线支付实际金额')
->setCellValue('F1', '货到付款金额');
$objPHPExcel->getActiveSheet()->getStyle('A1:E1')->applyFromArray($styleArray);
for ($row = 0; $row < count($page); $row++){
$i = $row+2;
$objPHPExcel->getActiveSheet()
->setCellValue('A'.$i, $page[$row]['shopName'])
->setCellValue('B'.$i, $page[$row]['totalMoney'])
->setCellValue('C'.$i, $page[$row]['orderNum'])
->setCellValue('D'.$i, $page[$row]['onLinePayMoney'])
->setCellValue('E'.$i, $page[$row]['onLinePayTrueMoney'])
->setCellValue('F'.$i, $page[$row]['offLinePayMoney']);
}
//输出EXCEL格式
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
// 从浏览器直接输出$filename
header('Content-Type:application/csv;charset=UTF-8');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-excel;");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition: attachment;filename="'.$name.'.xls"');
header("Content-Transfer-Encoding:binary");
$objWriter->save('php://output');
}
}