request->isAjax()) { $get = input(); $year = empty($get['date']) ? date('Y') : $get['date']; $_year = $year; $year = $this->getYearStartAndEnd($year); $data = [ 'zdd'=>0,//总订单 'xse'=>0,//销售额 'ys'=>0,//已收 'ys2'=>0,//应收 'yxse'=>[],//月销售额 'xlph'=>[],//销量排行 'xszb'=>[],//销售占比 ]; $zdd_where = [ ['del','=',0], ['create_time','>=',$year['start_timestamp']], ['create_time','<=',$year['end_timestamp']], ]; $data['zdd'] = Db::name('order')->where($zdd_where)->count(); $data['xse'] = Db::name('order')->where($zdd_where)->sum('total_amount'); $data['ys'] = Db::name('order')->where($zdd_where)->where('pay_zd',1)->sum('total_amount'); $data['ys2'] = Db::name('order')->where($zdd_where)->where('pay_zd',0)->sum('total_amount'); $query = " SELECT m.month, COALESCE(SUM(o.total_amount), 0) AS total_sales FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) m LEFT JOIN ls_order o ON MONTH(FROM_UNIXTIME(o.create_time)) = m.month AND YEAR(FROM_UNIXTIME(o.create_time)) = :year GROUP BY m.month ORDER BY m.month; "; $yxse_list = Db::query($query,['year'=>$_year]); $yxse_data = []; foreach ($yxse_list as $v){ $yxse_data[] = $v['total_sales']; } $yxse = [ 'list'=>$yxse_list, 'data'=>$yxse_data ]; $data['yxse'] = $yxse; $query = " SELECT goods_id, SUM(total_amount) AS sales_count FROM ls_order WHERE create_time >= {$year['start_timestamp']} AND create_time <= {$year['end_timestamp']} GROUP BY goods_id ORDER BY sales_count DESC "; $xlph_list = Db::query($query); $xlph_data_data = []; $xlph_data_goods = []; foreach ($xlph_list as $v){ $xlph_data_data[] = $v['sales_count']; $xlph_data_goods[] = Db::name('goods')->where('id',$v['goods_id'])->value('name'); } $xlph_data = [ 'goods'=>$xlph_data_goods, 'data'=>$xlph_data_data ]; $xlph = [ 'list'=>$xlph_list, 'data'=>$xlph_data ]; $data['xlph'] =$xlph; //销售占比 $query = " SELECT admin_id, SUM(total_amount) AS sales_count FROM ls_order WHERE create_time >= {$year['start_timestamp']} AND create_time <= {$year['end_timestamp']} GROUP BY admin_id ORDER BY sales_count DESC "; $xszb_list = Db::query($query); $xszb_data_data = []; $xszb_data_goods = []; foreach ($xszb_list as $v){ $xszb_data_data[] = $v['sales_count']; $name = Db::name('admin')->where('id',$v['admin_id'])->value('name'); $xszb_data_goods[] = $name?$name:'其它'; } // $xszb_data = [ // 'goods'=>$xszb_data_goods, // 'data'=>$xszb_data_data // ]; $xszb_data = []; foreach ($xszb_data_goods as $k=>$v){ $xszb_data[] = ['value'=>$xszb_data_data[$k],'name'=>$v]; } $xszb = [ 'list'=>$xszb_list, 'data'=>$xszb_data ]; $data['xszb'] =$xszb; $this->_success('获取成功',$data); } return $this->fetch(); } function getYearStartAndEnd($year) { // 创建年份的开始时间 $startDateTime = new \DateTime("$year-01-01 00:00:00"); $startTimestamp = $startDateTime->getTimestamp(); // 创建年份的结束时间 $endDateTime = new \DateTime("$year-12-31 23:59:59"); $endTimestamp = $endDateTime->getTimestamp(); return [ 'start' => $startDateTime, 'end' => $endDateTime, 'start_timestamp' => $startTimestamp, 'end_timestamp' => $endTimestamp, ]; } /** * 财务中心数据统计 * Class Cache * @package app\admin\controller */ public function finance_chart() { if ($this->request->isAjax()) { $get = input(); $year = empty($get['date']) ? date('Y') : $get['date']; $admin_id = empty($get['admin_id']) ?null : $get['admin_id']; $admin_id2 = empty($get['admin_id2']) ?null : $get['admin_id2']; $admin_id4 = empty($get['admin_id4']) ?null : $get['admin_id4']; $_year = $year; $year = $this->getYearStartAndEnd($year); $data = [ 'zdd'=>0,//总订单 'xse'=>0,//销售额 'ys'=>0,//已收 'ys2'=>0,//应收 'xse_ys'=>[],//销售额-应收-已收 ]; $zdd_where = [ ['del','=',0], ['create_time','>=',$year['start_timestamp']], ['create_time','<=',$year['end_timestamp']], ]; $data['zdd'] = Db::name('order')->where($zdd_where)->count(); $data['xse'] = Db::name('order')->where($zdd_where)->sum('total_amount'); $data['ys'] = Db::name('order')->where($zdd_where)->where('pay_zd',0)->sum('total_amount'); $data['ys2'] = Db::name('order')->where($zdd_where)->where('pay_zd',1)->sum('total_amount'); //销售额-应收-已收 $query = " SELECT m.month, COALESCE(SUM(o.total_amount), 0) AS total_sales FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) m LEFT JOIN ls_order o ON MONTH(FROM_UNIXTIME(o.create_time)) = m.month AND YEAR(FROM_UNIXTIME(o.create_time)) = :year GROUP BY m.month ORDER BY m.month; "; $xse_list = Db::query($query,['year'=>$_year]); $xse_data = []; $xse = []; foreach ($xse_list as $v){ $xse_data[] = $v['total_sales']; } $xse['xse'] = $xse_data; $query = " SELECT o.pay_zd, m.month, COALESCE(SUM(o.total_amount), 0) AS total_sales FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) m LEFT JOIN ls_order o ON MONTH(FROM_UNIXTIME(o.create_time)) = m.month AND YEAR(FROM_UNIXTIME(o.create_time)) = :year AND o.pay_zd = 0 GROUP BY m.month ORDER BY m.month; "; $xse_list = Db::query($query,['year'=>$_year]); $xse_ys_data = []; foreach ($xse_list as $v){ $xse_ys_data[] = $v['total_sales']; } $xse['ys2'] =$xse_ys_data; $query = " SELECT o.pay_zd, m.month, COALESCE(SUM(o.total_amount), 0) AS total_sales FROM ( SELECT 1 AS month UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 ) m LEFT JOIN ls_order o ON MONTH(FROM_UNIXTIME(o.create_time)) = m.month AND YEAR(FROM_UNIXTIME(o.create_time)) = :year AND o.pay_zd = 1 GROUP BY m.month ORDER BY m.month; "; $xse_list = Db::query($query,['year'=>$_year]); $xse_ys_data = []; foreach ($xse_list as $v){ $xse_ys_data[] = $v['total_sales']; } $xse['ys'] =$xse_ys_data; $data['xse_ys'] = $xse; //客户渠道 channel_id $query = " SELECT channel_id, SUM(total_amount) AS value FROM ls_order WHERE create_time >= {$year['start_timestamp']} AND create_time <= {$year['end_timestamp']} GROUP BY channel_id ORDER BY value DESC "; if($admin_id2){ $query = " SELECT channel_id, SUM(total_amount) AS value FROM ls_order WHERE create_time >= {$year['start_timestamp']} AND create_time <= {$year['end_timestamp']} AND admin_id = $admin_id2 GROUP BY channel_id ORDER BY value DESC "; } $qd_list = Db::query($query); foreach ($qd_list as $k=>$v){ $name = Db::name('orderchannel')->where('id',$v['channel_id'])->value('name'); $qd_list[$k]['name'] = $name?$name:'其它'; } $data['qd'] = $qd_list; //第二个客户渠道 //客户渠道 channel_id $query = " SELECT brand_id, count(*) AS value FROM ls_user_address WHERE createtime >= {$year['start_timestamp']} AND createtime <= {$year['end_timestamp']} GROUP BY brand_id ORDER BY value DESC "; if($admin_id4){ $query = " SELECT brand_id, count(*) AS value FROM ls_user_address WHERE createtime >= {$year['start_timestamp']} AND createtime <= {$year['end_timestamp']} AND admin_id = $admin_id4 GROUP BY brand_id ORDER BY value DESC "; } $qd2_list = Db::query($query); foreach ($qd2_list as $k=>$v){ $name = Db::name('staffchannel')->where('id',$v['brand_id'])->value('name'); $qd2_list[$k]['name'] = $name?$name:'其它'; } $data['qd2'] = $qd2_list; //月目标完成率// 获取当前日期 $currentDate = new \DateTime(); // 获取当前月份的第一天 $firstDayOfMonth = new \DateTime($currentDate->format('Y-m-01 00:00:00')); // 获取当前月份的最后一天 $lastDayOfMonth = new \DateTime($currentDate->format('Y-m-t 23:59:59')); // 获取时间戳 $firstDayTimestamp = $firstDayOfMonth->getTimestamp(); $lastDayTimestamp = $lastDayOfMonth->getTimestamp(); $query = " SELECT admin_id, SUM(total_amount) AS price FROM ls_order WHERE create_time >= {$firstDayTimestamp} AND create_time <= {$lastDayTimestamp} AND pay_status = 1 GROUP BY admin_id ORDER BY price DESC "; $mb_list = Db::query($query); foreach ($mb_list as $k=>$v){ $m = Db::name('admin')->where('id',$v['admin_id'])->find(); if($m){ $mb_list[$k]['index'] = $k+1; $mb_list[$k]['name'] = $m['name']; $mb_list[$k]['mb'] = $m['mb']; $m_where = [ ['admin_id','=',$v['admin_id']], ['create_time','>=',$firstDayTimestamp], ['create_time','<=',$lastDayTimestamp], ['pay_status','=',1] ]; $mb_list[$k]['num'] = Db::name('order')->where($m_where)->count('*'); $lv = round($v['price']/$m['mb'],2)*100; $mb_list[$k]['lv'] = $lv.'%'; }else{ unset($mb_list[$k]); } } $data['ymb'] = $mb_list; //年卡销量情况 $ka = [ ['value'=>'','name'=>'单次服务'], ['value'=>'','name'=>'年卡销量'], ['value'=>'','name'=>'次卡销量'], ['value'=>'','name'=>'其它服务'], ]; $ka_where = [ ['del','=',0], ['create_time','>=',$year['start_timestamp']], ['create_time','<=',$year['end_timestamp']], ]; if($admin_id){ $ka_where[] = ['admin_id','=',$admin_id]; } $ka[0]['value'] = Db::name('order')->where($ka_where)->where([ ['number','=',1] ])->sum('total_amount'); $ka[1]['value'] = Db::name('order')->where($ka_where)->where([ ['number','>',6] ])->sum('total_amount'); $ka[2]['value'] = Db::name('order')->where($ka_where)->where([ ['number','>=',2], ['number','<=',6] ])->sum('total_amount'); $ka[3]['value'] = Db::name('order')->where($ka_where)->where([ ['number','=',0] ])->sum('total_amount'); $data['ka'] = $ka; $this->_success('获取成功',$data); } $admin = Db::name('admin')->where('root',0)->select(); $st = empty($input['st']) ? date('Y-m-d') : $input['st']; $et = empty($input['et']) ? date('Y-m').'-31' : $input['et']; $this->assign('st',$st); $this->assign('et',$et); $st = strtotime($st); $et = strtotime($et); $this->assign('admin',$admin); return $this->fetch(); } //按时间区间 public function date_range(){ //默认本月 $input = input(); $st = empty($input['st']) ? date('Y-m-d') : $input['st']; $et = empty($input['et']) ? date('Y-m').'-31 23:59:59' : ($input['et'].' 23:59:59'); $admin_id = empty($input['admin_id']) ?null : $input['admin_id']; $st = strtotime($st); $et = strtotime($et); // echo $st; // echo '='; // echo $et; $data = [ 'cn'=>[] ]; //产能 $cn = []; //客户渠道 channel_id $query = " SELECT admin_id, SUM(number) AS value FROM ls_order WHERE create_time >= {$st} AND create_time <= {$et} GROUP BY admin_id ORDER BY value DESC "; $cn_list = Db::query($query); $cn_where = [ ['create_time','>=',$st], ['create_time','<=',$et] ]; foreach ($cn_list as $k=>$v){ $cn_list[$k]['index'] =$k+1; $fw = 0; $yc = 0; $fw_order_sn = Db::name('order')->where($cn_where)->where('admin_id',$v['admin_id'])->column('order_sn'); if(!empty($fw_order_sn)){ $fw = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->where('staff_status',3)->count(); $yc = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->where('abnormal',1)->count(); } $name = Db::name('admin')->where('id',$v['admin_id'])->value('name'); $cn_list[$k]['name'] =$name ? $name:'其它'; // $cn_list[$k]['fw_sn'] = $fw_order_sn; $cn_list[$k]['fw'] = $fw; $cn_list[$k]['yc'] = $yc; $cn_list[$k]['sy'] = $v['value']-$fw; $cn_list[$k]['$fw_order_sn'] = $fw_order_sn; //加时 $js = 0; if(!empty($fw_order_sn)){ $js_exe_ids = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->column('id'); $js = Db::name('order_timeadd')->whereIn('orderid',$js_exe_ids)->where('status',2)->sum('minute'); } $cn_list[$k]['js'] = $js; //报销 $bx = 0; if(!empty($fw_order_sn)){ $yq_exe_ids = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->column('id'); //报销 if(!empty($yq_exe_ids)){ $bx = Db::name('finance')->whereIn('order_id',$yq_exe_ids)->where('status',2)->sum('pay'); } } $cn_list[$k]['bx'] = $bx; } $data['cn'] = $cn_list; //圆圈 $yq = [ 'dd'=>0,//订单量 'fw'=>0, 'sy'=>0, 'bx'=>0, 'js'=>0 ]; if($admin_id){ $cn_where[] = ['admin_id','=',$admin_id]; } $yq['dd'] = Db::name('order')->where($cn_where)->sum('number'); $fw_order_sn = Db::name('order')->where($cn_where)->column('order_sn'); $yq['fw'] = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->where('staff_status',3)->count(); $yq['sy'] = $yq['dd'] - $yq['fw']; //加时 $yq_exe_ids = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->column('id'); $yq['js'] = Db::name('order_timeadd')->whereIn('orderid',$yq_exe_ids)->where('status',2)->sum('minute'); //报销 $yq['bx'] = Db::name('finance')->whereIn('order_id',$yq_exe_ids)->where('status',2)->sum('pay'); //异常 $yq['yc'] = Db::name('order_exe')->whereIn('order_sn',$fw_order_sn)->where('abnormal',1)->count(); $yq_data = [ ['name'=>'总订单量','value'=> $yq['dd']], ['name'=>'服务量','value'=> $yq['fw']], ['name'=>'剩余量','value'=> $yq['sy']], ['name'=>'报销数量','value'=> $yq['bx']], ['name'=>'加时数量','value'=> $yq['js']], ['name'=>'异常','value'=> $yq['yc']], ]; $data['yq'] = $yq_data; //卡 $ka = [ ['value'=>'','name'=>'单次服务'], ['value'=>'','name'=>'年卡销量'], ['value'=>'','name'=>'次卡销量'], ['value'=>'','name'=>'其它服务'], ]; $ka_where = [ ['del','=',0], ['create_time','>=',$st], ['create_time','<=',$et], ]; if($admin_id){ $ka_where[] = ['admin_id','=',$admin_id]; } $ka[0]['value'] = Db::name('order')->where($ka_where)->where([ ['number','=',1] ])->sum('total_amount'); $ka[1]['value'] = Db::name('order')->where($ka_where)->where([ ['number','>',6] ])->sum('total_amount'); $ka[2]['value'] = Db::name('order')->where($ka_where)->where([ ['number','>=',2], ['number','<=',6] ])->sum('total_amount'); $ka[3]['value'] = Db::name('order')->where($ka_where)->where([ ['number','=',0] ])->sum('total_amount'); $data['ka'] = $ka; //排行 $ph = []; if($admin_id){ $query = " SELECT goods_id, SUM(total_amount) AS value FROM ls_order WHERE create_time >= {$st} AND create_time <= {$et} AND admin_id = $admin_id GROUP BY goods_id ORDER BY value DESC "; }else{ $query = " SELECT goods_id, SUM(total_amount) AS value FROM ls_order WHERE create_time >= {$st} AND create_time <= {$et} GROUP BY goods_id ORDER BY value DESC "; } $ph_list = Db::query($query); $ph_name = []; $ph_value = []; foreach ($ph_list as $k=>$v){ $ph_value[] = $v['value']; $ph_name[] = Db::name('goods')->where('id',$v['goods_id'])->value('name'); } $data['ph'] = [ 'name'=>$ph_name, 'value'=>$ph_value ]; $this->_success('获取成功',$data); } public function orderexe_chart(){ $input = input(); $st = empty($input['st']) ? date('Y-m-d') : $input['st']; $et = empty($input['et']) ? date('Y-m-d') : $input['et']; $this->assign('st',$st); $this->assign('et',$et); $et = $et.' 23:59:59'; $st = strtotime($st); $et = strtotime($et); if ($this->request->isAjax()) { $data = [ 'fwzl'=>0, 'yfwl'=>0, 'wpdl'=>0, 'ycddl'=>0, 'fwqd'=>[] ]; $fwzl_where = [ ['create_time','>=',$st], ['create_time','<=',$et], ['pay_status','=',1] ]; $yfwl_where = [ ['autotime','>=',$st], ['autotime','<=',$et], ]; $data['fwzl'] = Db::name('order')->where($fwzl_where)->sum('number'); $data['yfwl'] = Db::name('order_exe')->where($yfwl_where)->where('staff_status',3)->count(); //剩余量 $data['sycs'] = $data['fwzl'] - $data['yfwl']; $query = " SELECT count(*) FROM ls_order_exe WHERE (autotime >= {$st} AND autotime <= {$et}) AND ( staff_status IS NULL OR staff_status = 0 ) "; $num = Db::query($query); if(!empty($num[0]['count(*)'])){ $data['wpdl'] = $num[0]['count(*)']; } //服务渠道 $query = " SELECT channel_id, SUM(number) AS value FROM ls_order WHERE create_time >= {$st} AND create_time <= {$et} AND pay_status = 1 GROUP BY channel_id ORDER BY value DESC "; $fwqd_list = Db::query($query); foreach ($fwqd_list as $k=>$v){ $name = Db::name('orderchannel')->where('id',$v['channel_id'])->value('name'); $fwqd_list[$k]['name'] = $name?$name:'其它 '; } $data['fwqd'] = $fwqd_list; //已服务订单 $query = " SELECT channel_id, count(*) AS value FROM ls_order_exe WHERE autotime >= {$st} AND autotime <= {$et} AND staff_status = 3 GROUP BY channel_id ORDER BY value DESC "; $yfw_list = Db::query($query); foreach ($yfw_list as $k=>$v){ $name = Db::name('orderchannel')->where('id',$v['channel_id'])->value('name'); $yfw_list[$k]['name'] = $name?$name:'其它 '; } $data['yfw'] = $yfw_list; //未消耗订单 $query = " SELECT channel_id, sum(number) AS value FROM ls_order WHERE create_time >= {$st} AND create_time <= {$et} AND pay_status = 1 GROUP BY channel_id ORDER BY value DESC "; $wxh_list = Db::query($query); $wxh_where = [ ['create_time','>=',$st], ['create_time','<=',$et], ['pay_status','=',1] ]; $wxh_order_sn = Db::name('order')->where($wxh_where)->column('order_sn'); $wxh_order_sn = implode(',',$wxh_order_sn); $query = " SELECT channel_id, count(*) AS value FROM ls_order_exe WHERE order_sn IN($wxh_order_sn) AND staff_status = 3 GROUP BY channel_id ORDER BY value DESC "; $wxh_list2 = Db::query($query); foreach ($wxh_list as $k=>$v){ //channel_id foreach ($wxh_list2 as $k2=>$v2){ if($v['channel_id'] == $v2['channel_id']){ $wxh_list[$k]['value'] = $v['value'] - $v2['value']; } } } foreach ($wxh_list as $k=>$v){ $name = Db::name('orderchannel')->where('id',$v['channel_id'])->value('name'); $wxh_list[$k]['name'] = $name?$name:'其它 '; } $data['wxh'] = $wxh_list; //产能低于多次 function getnum($num = 1,$st,$et){ $user_where = [ ['createtime','>=',$st], ['createtime','<=',$et], ]; $mobiles = Db::name('user_address')->where($user_where)->column('telephone'); if($num == 1) { $num_where = [ ['number','<=',6] ]; }else{ $num_where = [ ['number','>',6] ]; } $cn_list = Db::table('ls_order') ->field('count(*) as num,order_sn,mobile, sum(number) AS value') ->whereIn('mobile', $mobiles) ->where('create_time', '>=', $st) ->where('create_time', '<=', $et) ->where($num_where) // ->where('pay_status', 1) ->group('order_sn') ->order('value', 'DESC') ->select(); $cn_order_sn = []; foreach ($cn_list as $v){ $cn_order_sn[] = $v['order_sn']; } if(empty($cn_order_sn)) return 0; $cn_order_sn = implode(',',$cn_order_sn); $query = " SELECT order_sn, count(*) AS value FROM ls_order_exe WHERE order_sn IN ($cn_order_sn) AND staff_status = 3 GROUP BY order_sn ORDER BY value DESC "; $cn_list2 = Db::query($query); foreach ($cn_list as $k=>$v){ //channel_id foreach ($cn_list2 as $k2=>$v2){ if($v['order_sn'] == $v2['order_sn']){ $cn_list[$k]['value'] = $v['value'] - $v2['value']; } } } //次卡低于2次 foreach ($cn_list as $k=>$v){ if($v['value'] >= 2){ unset($cn_list[$k]); } } //user_address $cn2 = 0; $cn_list_mobile = []; foreach ($cn_list as $k=>$v){ $cn_list_mobile[] = $v['mobile']; } return Db::name('user_address')->where($user_where)->whereIn('telephone',$cn_list_mobile)->count(); } $data['cn'] = [ ['name'=>'年卡低于3次','value'=>getnum(2,$st,$et)], ['name'=>'次卡低于2次','value'=>getnum(1,$st,$et)] ]; $this->_success('获取成功',$data); } return $this->fetch(); } }