diff --git a/api/controllers/wxapp/licheb/Biz.php b/api/controllers/wxapp/licheb/Biz.php index aff8fa6e..2e18c372 100644 --- a/api/controllers/wxapp/licheb/Biz.php +++ b/api/controllers/wxapp/licheb/Biz.php @@ -10,6 +10,7 @@ require_once APPPATH . 'controllers/wxapp/Wxapp.php'; class Biz extends Wxapp { + private $biz_id; function __construct($inputs, $app_key) { @@ -19,15 +20,252 @@ class Biz extends Wxapp $this->check_status = array();//用户状态校验 $this->check_mobile = array();//需要手机号 $this->check_headimg = array();//授权微信信息 - $this->load->model("biz/biz_model", 'mdBiz'); - $this->load->model("biz/biz_brand_model", 'mdBizBrand'); - $this->load->model("biz/biz_base_model", 'mdBizBase'); - $this->load->model("biz/biz_sell_model", 'mdBizSell'); - $this->load->model('area_model'); - $this->load->model('sys/sys_street_model', 'mdStreet'); - $this->load->model('receiver/order/receiver_orders_model', 'mdOrders'); + $this->load->model('receiver/order/receiver_orders_v2_model', 'mdOrders'); + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->biz_id = $this->get_biz_id(); } + /** + * Notes:门店数据 + * Created on: 2022/8/10 14:37 + * Created by: dengbw + * @return array + */ + protected function get_stats() + { + $this->load->model('app/app_lichene_qy_log_model', 'mdWechatqyLog'); + $s_time = $this->input_param('s_time'); + $e_time = $this->input_param('e_time'); + !$s_time && $s_time = date('Y-m-d'); + !$e_time && $e_time = date('Y-m-d'); + $c_time = ['s_time' => strtotime($s_time), 'e_time' => strtotime(date('Y-m-d 23:59:59', strtotime($e_time)))]; + $o_time = ['s_time' => $s_time . ' 00:00:00', 'e_time' => $e_time . ' 23:59:59']; + //客户 + $customers = $this->mdCustomers->count(['biz_id' => $this->biz_id, 'status>=' => 0, 'c_time>=' => $c_time['s_time'], + 'c_time<=' => $c_time['e_time']]); + //进店 + $intos = $this->mdCustomers->db->select('a.id') + ->from('lc_receiver_customer_oplogs as a') + ->join('lc_receiver_customers as b', "b.id=a.customer_id", 'left') + ->where(['a.type' => 4, 'a.log' => '客户到店', 'a.c_time>=' => $c_time['s_time'], 'a.c_time<=' => $c_time['e_time'], + 'b.status>=' => 0, 'b.biz_id' => $this->biz_id]) + ->count_all_results(); + //企微添加 + $wxqys_add = 0; + $res_user = $this->app_user_model->select(['status' => 1, 'userid<>' => '', 'biz_id' => $this->biz_id], 'id desc', 0, 0, 'userid'); + if ($res_user) { + $str_ids = implode("','", array_unique(array_column($res_user, 'userid'))); + $wxqys_add = $this->mdWechatqyLog->count(["userid in('{$str_ids}')" => null, 'change_type' => 'add_external_contact']); + } + //点亮 + $wxqys = $this->mdCustomers->count(['biz_id' => $this->biz_id, 'status>=' => 0, 'c_time>=' => $c_time['s_time'], + 'c_time<=' => $c_time['e_time'], 'wxqy' => 1]); + //成交 + $orders = $this->mdOrders->count(['biz_id' => $this->biz_id, 'status>=' => 0, 'order_time>=' => $o_time['s_time'], 'order_time<=' => $o_time['e_time']]); + //退定 + $refunds = $this->mdOrders->count(['biz_id' => $this->biz_id, 'status' => 2, 'refund_time>=' => $o_time['s_time'], 'refund_time<=' => $o_time['e_time']]); + $data['tabs'] = [['title' => '客户/进店', 'value_1' => $customers, 'value_2' => '/' . $intos, 'url' => 'pages/'], + ['title' => '企微添加/点亮', 'value_1' => $wxqys_add, 'value_2' => '/' . $wxqys, 'url' => 'pages/'], + ['title' => '成交/退定', 'value_1' => $orders, 'value_2' => '/' . $refunds, 'url' => 'pages/'], + ]; + $orders_per = number_format_com($orders / $customers * 100, 1, ''); + $intos_per = number_format_com($intos / $customers * 100, 1, ''); + $data['funnel'] = ['title' => '线索转化漏斗', + 'expected_data' => [['name' => "成交数({$orders_per}%)", 'value' => 33.3], ['name' => "到店数({$intos_per}%)", 'value' => 66.7], ['name' => '客户量', 'value' => 100]] + , 'actual_data' => [['name' => '成交数', 'value' => $orders], ['name' => '到店数', 'value' => $intos], ['name' => '客户量', 'value' => $customers]]]; + $data['title'] = '门店数据'; + return $data; + } + + /** + * Notes:客户/订单走势图 + * Created on: 2022/8/12 10:56 + * Created by: dengbw + * @return mixed + */ + protected function get_stats_days() + { + $days = intval($this->input_param('days')); + !$days && $days = 7; + $customers = $orders = $xAxis = []; + for ($i = ($days - 1); $i >= 0; $i--) { + $s_time = date('Y-m-d', strtotime("-{$i} day")); + $c_time = ['s_time' => strtotime($s_time), 'e_time' => strtotime(date('Y-m-d 23:59:59', strtotime($s_time)))]; + $o_time = ['s_time' => $s_time . ' 00:00:00', 'e_time' => $s_time . ' 23:59:59']; + $xAxis[] = $days > 7 ? date('d', strtotime($s_time)) : date('n-d', strtotime($s_time)); + $customers[] = $this->mdCustomers->count(['biz_id' => $this->biz_id, 'status>=' => 0, 'c_time>=' => $c_time['s_time'], 'c_time<=' => $c_time['e_time']]);; + $orders[] = $this->mdOrders->count(['biz_id' => $this->biz_id, 'status>=' => 0, 'order_time>=' => $o_time['s_time'], 'order_time<=' => $o_time['e_time']]); + } + $data = ['title' => "近{$days}日走势图", 'legend_data' => ["近{$days}日客户数", "近{$days}日订单数"], 'xAxis' => $xAxis, + 'series' => [['name' => "近{$days}日客户数", 'type' => 'line', 'stack' => '总量', 'smooth' => true, 'data' => $customers] + , ['name' => "近{$days}日订单数", 'type' => 'line', 'stack' => '总量', 'smooth' => true, 'data' => $orders]]]; + return $data; + } + + /** + * Notes:客户数据 + * Created on: 2022/8/11 16:09 + * Created by: dengbw + * @return mixed + */ + protected function get_stats_customer() + { + $s_time = $this->input_param('s_time'); + $e_time = $this->input_param('e_time'); + !$s_time && $s_time = date('Y-m-d'); + !$e_time && $e_time = date('Y-m-d'); + $c_time = ['s_time' => strtotime($s_time), 'e_time' => strtotime(date('Y-m-d 23:59:59', strtotime($e_time)))]; + $pie1_level = $pie2_level = $pie1_offline = $pie2_offline = $users = $users_customer = []; + $sdata_level = $this->mdCustomers->get_sdata('level'); + $where = ['biz_id' => $this->biz_id, 'status>=' => 0, 'c_time>=' => $c_time['s_time'], 'c_time<=' => $c_time['e_time']]; + foreach ($sdata_level as $v) { + $value_1 = $this->mdCustomers->count(array_merge($where, ['level' => $v])); + $pie1_level[] = ['name' => $v, 'value' => $value_1]; + $value_2 = $this->mdCustomers->db->select('a.id') + ->from('lc_receiver_customer_oplogs as a') + ->join('lc_receiver_customers as b', "b.id=a.customer_id", 'left') + ->where(['a.type' => 4, 'a.log' => '客户到店', 'a.c_time>=' => $c_time['s_time'], 'a.c_time<=' => $c_time['e_time'], + 'b.status>=' => 0, 'b.biz_id' => $this->biz_id, 'b.level' => $v]) + ->count_all_results(); + $pie2_level[] = ['name' => $v, 'value' => $value_2]; + } + $offlineSources = $this->mdCustomers->offlineSources(); + foreach ($offlineSources as $k => $v) { + $value_1 = $this->mdCustomers->count(array_merge($where, ['of_id' => $k])); + $pie1_offline[] = ['name' => $v['name'], 'value' => $value_1]; + $value_2 = $this->mdCustomers->db->select('a.id') + ->from('lc_receiver_customer_oplogs as a') + ->join('lc_receiver_customers as b', "b.id=a.customer_id", 'left') + ->where(['a.type' => 4, 'a.log' => '客户到店', 'a.c_time>=' => $c_time['s_time'], 'a.c_time<=' => $c_time['e_time'], + 'b.status>=' => 0, 'b.biz_id' => $this->biz_id, 'b.of_id' => $k]) + ->count_all_results(); + $pie2_offline[] = ['name' => $v['name'], 'value' => $value_2]; + } + $res_user = $this->app_user_model->select(['status' => 1, 'biz_id' => $this->biz_id], 'id desc', 0, 0, 'id,uname'); + foreach ($res_user as $k => $v) { + $users[] = $v['uname']; + $users_customer[] = $this->mdCustomers->count(array_merge($where, ['admin_id' => $v['id']])); + } + $data['pie1'] = ['title' => '客户来源(录入)', 'series_data_1' => $pie1_level, 'series_data_2' => $pie1_offline]; + $data['pie2'] = ['title' => '客户来源(进店)', 'series_data_1' => $pie2_level, 'series_data_2' => $pie2_offline]; + $data['bar'] = ['title' => '顾问录入客户', 'xAxis_data' => $users, 'series_data' => $users_customer]; + $data['title'] = '客户数据'; + return $data; + } + + /** + * Notes:企微数据 + * Created on: 2022/8/11 15:40 + * Created by: dengbw + * @return mixed + */ + protected function get_stats_wxqy() + { + $this->load->model('app/app_lichene_qy_log_model', 'mdWechatqyLog'); + $s_time = $this->input_param('s_time'); + $e_time = $this->input_param('e_time'); + !$s_time && $s_time = date('Y-m-d'); + !$e_time && $e_time = date('Y-m-d'); + $c_time = ['s_time' => strtotime($s_time), 'e_time' => strtotime(date('Y-m-d 23:59:59', strtotime($e_time)))]; + $bar1_xAxis_data = $bar1_series_data = $bar2_xAxis_data = $bar2_series_data = []; + $res_user = $this->app_user_model->select(['status' => 1, 'biz_id' => $this->biz_id], 'id desc', 0, 0, 'id,uname,userid'); + foreach ($res_user as $k => $v) { + $bar1_xAxis_data[] = $v['uname']; + $wxqys_add = 0; + if ($v['userid']) { + $wxqys_add = $this->mdWechatqyLog->count(["userid" => $v['userid'], 'change_type' => 'add_external_contact' + , 'c_time>=' => $c_time['s_time'], 'c_time<=' => $c_time['e_time']]); + } + $bar1_series_data[] = $wxqys_add; + $bar2_xAxis_data[] = $v['uname']; + $bar2_series_data[] = $this->mdCustomers->count(['admin_id' => $v['id'], 'biz_id' => $this->biz_id, 'status>=' => 0 + , 'c_time>=' => $c_time['s_time'], 'c_time<=' => $c_time['e_time'], 'wxqy' => 1]); + } + $data['bar1'] = ['title' => '企微添加好友', 'xAxis_data' => $bar1_xAxis_data, 'series_data' => $bar1_series_data]; + $data['bar2'] = ['title' => '企微添加点亮', 'xAxis_data' => $bar2_xAxis_data, 'series_data' => $bar2_series_data]; + $data['title'] = '企微数据'; + return $data; + } + + /** + * Notes:订单数据 + * Created on: 2022/8/11 15:40 + * Created by: dengbw + * @return mixed + */ + protected function get_stats_order() + { + $s_time = $this->input_param('s_time'); + $e_time = $this->input_param('e_time'); + !$s_time && $s_time = date('Y-m-d'); + !$e_time && $e_time = date('Y-m-d'); + $c_time = ['s_time' => strtotime($s_time), 'e_time' => strtotime(date('Y-m-d 23:59:59', strtotime($e_time)))]; + $o_time = ['s_time' => $s_time . ' 00:00:00', 'e_time' => $e_time . ' 23:59:59']; + $pie1_series_data = $users = $users_customer = $users_order = []; + $offlineSources = $this->mdCustomers->offlineSources(); + foreach ($offlineSources as $k => $v) { + $value = $this->mdOrders->db->select('a.id') + ->from('lc_receiver_orders_v2 as a') + ->join('lc_receiver_customers as b', "b.id=a.customer_id", 'left') + ->where(['a.biz_id' => $this->biz_id, 'a.status>=' => 0, 'a.order_time>=' => $o_time['s_time'], 'a.order_time<=' => $o_time['e_time'] + , 'b.of_id' => $k]) + ->count_all_results(); + $pie1_series_data[] = ['name' => $v['name'], 'value' => $value]; + } + $res_user = $this->app_user_model->select(['status' => 1, 'biz_id' => $this->biz_id], 'id desc', 0, 0, 'id,uname'); + foreach ($res_user as $k => $v) { + $users[] = $v['uname']; + $users_customer[] = $this->mdCustomers->count(['admin_id' => $v['id'], 'biz_id' => $this->biz_id, 'status>=' => 0 + , 'c_time>=' => $c_time['s_time'], 'c_time<=' => $c_time['e_time']]); + $users_order[] = $this->mdOrders->count(['admin_id' => $v['id'], 'biz_id' => $this->biz_id, 'status>=' => 0 + , 'order_time>=' => $o_time['s_time'], 'order_time<=' => $o_time['e_time']]); + } + $this->load->model('auto/auto_brand_model', 'mdAutoBrand'); + $series_data_1 = $series_data_2 = []; + $where_o = ['biz_id' => $this->biz_id, 'status>=' => 0, 'order_time>=' => $o_time['s_time'], 'order_time<=' => $o_time['e_time']]; + $where_r = ['biz_id' => $this->biz_id, 'status' => 2, 'refund_time>=' => $o_time['s_time'], 'refund_time<=' => $o_time['e_time']]; + //成交 + $orders = $this->mdOrders->count($where_o); + $res_o = $this->mdOrders->select($where_o, 'id desc', 0, 0, 'distinct(brand_id) as brand_id'); + if ($res_o) { + $str_ids = implode(",", array_unique(array_column($res_o, 'brand_id'))); + $map_brand = $this->mdAutoBrand->map('id', 'name', ["id in({$str_ids})" => null]); + foreach ($res_o as $k => $v) { + $name = $map_brand[$v['brand_id']] ? $map_brand[$v['brand_id']] : '-'; + $value = 0; + if ($v['brand_id']) { + $value = $this->mdOrders->count(array_merge($where_o, ['brand_id' => $v['brand_id']])); + } + $series_data_1[] = ['name' => $name, 'value' => $value]; + } + } + //退定 + $refunds = $this->mdOrders->count($where_r); + $res_r = $this->mdOrders->select($where_r, 'id desc', 0, 0, 'distinct(brand_id) as brand_id'); + if ($res_r) { + $str_ids = implode(",", array_unique(array_column($res_r, 'brand_id'))); + $map_brand = $this->mdAutoBrand->map('id', 'name', ["id in({$str_ids})" => null]); + foreach ($res_r as $k => $v) { + $name = $map_brand[$v['brand_id']] ? $map_brand[$v['brand_id']] : '-'; + $value = 0; + if ($v['brand_id']) { + $value = $this->mdOrders->count(array_merge($where_r, ['brand_id' => $v['brand_id']])); + } + $series_data_2[] = ['name' => $name, 'value' => $value]; + } + } + $data['pie1'] = ['title' => '订单来源', 'series_data' => $pie1_series_data]; + $data['pie2'] = ['title' => '品牌分布' + , 'series_data' => [['name' => '成交数', 'value' => $orders, 'selected' => true], ['name' => '退定数', 'value' => $refunds]] + , 'series_data_1' => $series_data_1, 'series_data_2' => $series_data_2 + ]; + $data['bar'] = ['title' => '顾问成交情况', 'xAxis_data' => $users + , 'series' => [['name' => '客户数', 'type' => 'bar', 'data' => $users_customer], ['name' => '订单数', 'type' => 'bar', 'data' => $users_order]]]; + $data['title'] = '订单数据'; + return $data; + } + + /** * Notes:店铺概况_tab * Created on: 2022/1/5 15:13 @@ -41,6 +279,12 @@ class Biz extends Wxapp protected function get_situation() { + $this->load->model("biz/biz_brand_model", 'mdBizBrand'); + $this->load->model("biz/biz_base_model", 'mdBizBase'); + $this->load->model("biz/biz_sell_model", 'mdBizSell'); + $this->load->model("biz/biz_model", 'mdBiz'); + $this->load->model('area_model'); + $this->load->model('sys/sys_street_model', 'mdStreet'); $tabs_id = intval($this->input_param('tabs_id')); $biz_id = $this->session['new_biz_id'] ? $this->session['new_biz_id'] : intval($this->session['biz_id']); $re_biz = $this->mdBiz->get(['id' => $biz_id, 'status' => 1]); @@ -135,6 +379,8 @@ class Biz extends Wxapp protected function get_street() { + $this->load->model('area_model'); + $this->load->model('sys/sys_street_model', 'mdStreet'); $id = intval($this->input->get('id')); $list[] = ['id' => 0, 'name' => '选择乡镇']; if (!$id) { @@ -162,6 +408,9 @@ class Biz extends Wxapp protected function post_situation() { + $this->load->model("biz/biz_base_model", 'mdBizBase'); + $this->load->model("biz/biz_sell_model", 'mdBizSell'); + $this->load->model("biz/biz_model", 'mdBiz'); $tabs_id = intval($this->input_param('tabs_id')); $info = $this->input_param('info'); if (!$tabs_id || !$info) {