Files
spacestation/api/controllers/wxapp/licheb/Score.php
T
2024-11-03 18:16:32 +08:00

337 lines
16 KiB
PHP

<?php
defined('WXAPP_APP') or exit('No direct script access allowed');
require_once APPPATH . 'controllers/wxapp/Wxapp.php';
class Score extends Wxapp
{
function __construct($inputs, $app_key)
{
parent::__construct($inputs, $app_key);
$this->load->model('receiver/receiver_score_config_model');
$this->load->model('receiver/receiver_score_day_model');
$this->load->model('receiver/receiver_score_month_model');
$this->load->model('receiver/receiver_score_log_model');
$this->load->model('app/licheb/app_licheb_users_model');
$this->load->model('receiver/receiver_customers_model', 'customers_model');
$this->load->model('receiver/order/receiver_orders_model', 'orders_model');
$this->biz_id = $this->get_biz_id();
$this->group_id = $this->session['group_id'];
}
/**
* @return array
*/
protected function get()
{
$max_score = 100; //最高得分
$uid = $this->session['uid'];
$show_biz = false;
$type = $this->input_param('type'); // 0个人 1门店
$day_type = $this->input_param('day_type'); // 默认0昨天 1上月
if ($this->group_id == App_licheb_users_model::GROUP_BIZ && $type) { //店长可查看个人或门店
$show_biz = true;
} elseif ($this->group_id == App_licheb_users_model::GROUP_INVESTOR || $this->group_id == App_licheb_users_model::GROUP_CUSTOMER_MANAGER) { //投资人和客户成功经理 只能查看门店
$show_biz = true;
}
$where = [
'biz_id' => $this->biz_id
];
if (!$show_biz) {//查看个人
$where['uid'] = $uid;
}
if ($day_type == 1) { //上月
$up_month = strtotime("-1 month"); //上个月时间
$where['year'] = date('Y', $up_month);
$where['month'] = date('m', $up_month);
$where['type'] = $type ? Receiver_score_month_model::TYPE_BIZ : Receiver_score_month_model::TYPE_USER;
$row = $this->receiver_score_month_model->get($where);
$up_time = date('Y-m-01', time());
$title_hd = '较本月';
} elseif ($day_type == 2) {
$up_month = strtotime("-1 month"); //上个月时间
$where['year'] = date('Y', $up_month);
$where['month'] = date('m', $up_month);
$where['type'] = $type ? Receiver_score_month_model::TYPE_BIZ : Receiver_score_month_model::TYPE_USER;
$row = $this->receiver_score_month_model->get($where);
$up_time = date('Y-m-01', time());
$title_hd = '较上月';
} else {
$up_month = strtotime("-1 day");
$where['day'] = date('Y-m-d', $up_month);
$where['type'] = $type ? Receiver_score_day_model::TYPE_BIZ : Receiver_score_day_model::TYPE_USER;
$row = $this->receiver_score_day_model->get($where);
$up_time = date('Y-m-d', $up_month);
$title_hd = '较昨日';
}
$score = ceil($row['score']) ?: 0;
$abs_score = ceil($row['change_score']) ?: 0;
if ($abs_score >= 0) {
$title = $title_hd . "上升{$abs_score}";
$score_trend = 1;
} else {
$abs_score = abs($abs_score);
$title = $title_hd . "下降{$abs_score}";
$score_trend = 2;
}
$percentage = $score / $max_score * 100;
$score_list = [];
if (!$day_type && !$show_biz) { //个人且非查看门店
$scoreLogModel = new receiver_score_log_model();
$day = date('Y-m-d', strtotime("-1 day"));
$base_list = Receiver_score_config_model::TYPE_LIST;
foreach ($base_list as $key => $item) {
$where = [
'biz_id' => $this->biz_id,
'uid' => $uid,
'day' => $day,
'type' => $key
];
$scoreSum = $scoreLogModel->sum('score', $where);
$operator = '';
if ($key > 0) {
$operator = $scoreSum['operator'] >= 0 ? '+' : '-';
}
if ($key == Receiver_score_config_model::TYPE_DEDUCT) {
$operator = '-';
}
$score_list[] = [
'name' => $item['name'],
'value' => $scoreSum['score'] ? abs(ceil($scoreSum['score'])) : 0,
'operator' => $operator
];
}
}
return [
'score' => $score,
'percentage' => $percentage,
'title' => $title,
'sub_title' => '当前显示为昨日运营情况评分',
'u_time_text' => "*更新于" . $up_time,
'score_trend' => $score_trend, //控制样式:1 上升 、2 下降
'desc' => '<p><b>如何提升运营分?</b></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运营分是根据个人在理车宝的基础分、线索分、订单分等方面综合计算得出的分值,运营分按天每日更新,可通过以下方式提升运营分:</p>
<p><b>基础分:</b>每日初始基本分为50分,当日登录理车宝进行信息查询、线索跟进等操作即视为开工,可再得10分</p>
<p><b>线索分:</b>录入线索并且按要求完善信息,无论是平台分配还是自录线索都按时跟进回访并做好小记,尽可能添加客户微信并上传截图,使用系统提供的虚拟电话联系客户留存回访录音以便复盘。
单条线索不因重复动作而多次加分,分值次日更新,每日新增/跟进的线索越多,线索分越多。</p>
<p><b>订单分:</b>新增订单并且按要求完善信息,上传相关资料。产生订单时应及时录入系统,否则会因订单时间逻辑不符而导致扣分。分值次日更新,新增订单越多,相关资料上传越完善,订单分越多。</p>
<p><b>扣分:</b>理车宝使用过程,未按规范要求操作,将会导致运营分被扣。</p><p><b>具体如下:</b></p>
<p>* 线索逾期未跟进;</p>
<p>* 店长分配线索后未及时跟进,时间超过15分钟;</p>
<p>* 线索未提前录入,与下单时间间隔少于T+1;</p>
<p>* 订单未及时录入,导致开票时间早于订单录入时间;</p>
<p>* 平台下发线索,分配时间超过10分钟(店长);</p>
<p>* 战败申请当日未处理(店长);</p>',
'score_list' => $score_list
];
}
/**
* 获取分数排行
* @return array
*/
public function get_lists()
{
$type = $this->input_param('type'); // 默认0店内排行 1门店排行
$day_type = $this->input_param('day_type'); // 默认0昨天 1本月 2上月
$limit = $type ? 100 : 10;
if ($day_type == 1) {
$result = Receiver_score_month_model::getTopLists($type, $this->biz_id, $limit);
} elseif ($day_type == 2) {
$result = Receiver_score_month_model::getTopLists($type, $this->biz_id, $limit);
} else {
$result = Receiver_score_day_model::getTopLists($type, $this->biz_id, $limit);
}
return [
'lists' => $result['lists'],
'day' => $result['day']
];
}
/**
*
* @return array
*/
public function get_detail()
{
$uid = $this->session['uid'];
$base_list = Receiver_score_config_model::TYPE_LIST;
$day = date('Y-m-d', strtotime("-1 day"));
$where = [
'day' => $day,
'type' => Receiver_score_day_model::TYPE_USER,
'uid' => $uid,
'biz_id' => $this->biz_id
];
$dayRow = $this->receiver_score_day_model->get($where);
$user_score = $dayRow['score'] ? ceil($dayRow['score']) : 0;
$change_score = $dayRow['change_score'] ? ceil($dayRow['change_score']) : 0;
$up_data_score = $change_score;
$score_trend = 1;
if ($up_data_score >= 0) {
$change_text = '较上一日上升' . $up_data_score . '分';
} else {
$change_text = '较上一日下降' . abs($up_data_score) . '分';
$score_trend = 2;
}
$data = [];
if ($base_list) {
$scoreLogModel = new receiver_score_log_model();
foreach ($base_list as $key => $item) {
$where = [
'biz_id' => $this->biz_id,
'uid' => $uid,
'day' => $day,
'type' => $key
];
$scoreSum = $scoreLogModel->sum('score', $where);
$score = $scoreSum['score'] ? ceil($scoreSum['score']) : 0;
$trend = $score >= 0 ? 1 : 2;
$data_list = Receiver_score_log_model::getUserLogLists($this->biz_id, $uid, $day, $key);
$data[] = [
'name' => $item['name'],
'score' => $score,
'trend' => $trend,
'data' => $data_list
];
}
}
return ['data' => $data, 'score' => $user_score, 'up_data_score' => $up_data_score, 'change_text' => $change_text, 'score_trend' => $score_trend];
}
public function get_radar()
{
$biz = (new Biz_model())->get(['id' => $this->biz_id]);
$province_id = $biz['province_id'];
$s_time = date('Y-m-d 00:00:00');
$e_time = date('Y-m-d 23:59:59');
$s_stime = strtotime($s_time);
$s_etime = strtotime($e_time);
$indicator = [
['name' => '拓客能力', 'max' => 100],
['name' => '跟进能力', 'max' => 1],
['name' => '邀约能力', 'max' => 100],
['name' => '成交能力', 'max' => 100],
['name' => '交付能力', 'max' => 1]
];
$series_value = [];
foreach ($indicator as $key => $value) {
switch ($key) {
case 0:
$where = [
'status>=' => 0,
"biz_id in (biz_id in (select id from lc_biz where province_id =$province_id))" => null,
'c_time >=' => $s_stime,
'c_time <=' => $s_etime,
];
$max = $this->customers_model->count($where);
$max && $indicator[$key]['max'] = $max;
$where['biz_id'] = $this->biz_id;
$value = $this->customers_model->count($where);
break;
case 1://跟进能力
$where = [
'status>=' => 0,
"biz_id in (select id from lc_biz where province_id =$province_id)" => null,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"id in (select DISTINCT customer_id from lc_receiver_customer_oplogs where c_time>={$s_stime} and c_time>={$s_etime})" => null
];
$province_gj = $this->customers_model->count($where);
$where = [
'status>=' => 0,
'province_id' => $province_id,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"id in (select DISTINCT customer_id from lc_receiver_customer_oplogs where c_time>={$s_stime} and c_time>={$s_etime})" => null,
"biz_id" => $this->biz_id
];
$biz_gj = $this->customers_model->count($where);
$where = [
'status>=' => 0,
"biz_id in (select id from lc_biz where province_id =$province_id)" => null,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"status in (0,1)" => null
];
$province_total = $this->customers_model->count($where);
$where = [
'status>=' => 0,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"status in (0,1)" => null,
'biz_id' => $this->biz_id
];
$biz_total = $this->customers_model->count($where);
$province_total && $max = $province_gj / $province_total;
$value = 0;
if ($biz_total) {
$value = $biz_gj / $biz_total;
}
break;
case 2:
$where = [
'status>=' => 0,
"biz_id in (select id from lc_biz where province_id =$province_id)" => null,
'dt_time >=' => $s_time,
'dt_time <=' => $e_time,
];
$max = $this->customers_model->count($where);
$max && $indicator[$key]['max'] = $max;
$where["biz_id"] = $this->biz_id;
$value = $this->customers_model->count($where);
break;
case 3:
$where = [
'status>=' => 0,
'biz_id in (select id from lc_biz where province_id =$province_id)' => null,
'c_time >=' => $s_stime,
'c_time <=' => $s_etime,
];
$max = $this->customers_model->count($where);
$max && $indicator[$key]['max'] = $max;
$sub_sql = "select id from lc_receiver_customers where province_id={$province_id} and biz_id={$this->biz_id} and c_time>={$s_stime} and c_time>={$s_etime}";
$where = [
'status>=' => 0,
"biz_id" => $this->biz_id,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"customer_id in ($sub_sql)" => null
];
$value = $this->orders_model->count($where);
break;
case 4:
$sub_sql = "select id from lc_receiver_customers where province_id={$province_id} and c_time>={$s_stime} and c_time>={$s_etime}";
$where = [
'status>=' => 0,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"customer_id in ($sub_sql)" => null
];
$province_order = $this->orders_model->count($where);
$where['status'] = 3;
$province_jf = $this->orders_model->count($where);
$sub_sql = "select id from lc_receiver_customers where biz_id={$this->biz_id} and province_id={$province_id} and c_time>={$s_stime} and c_time>={$s_etime}";
$where = [
'status>=' => 0,
'c_time >=' => strtotime($s_time),
'c_time <=' => strtotime($e_time),
"customer_id in ($sub_sql)" => null
];
$biz_order = $this->orders_model->count($where);
$where['status'] = 3;
$biz_jf = $this->orders_model->count($where);
$province_order && $max = $province_jf / $province_order;
$max && $indicator[$key]['max'] = $max;
$value = $biz_order ? $biz_jf / $biz_order : 0;
default:
}
$series_value[] = $value;
}
$data = [
'indicator' => $indicator,
'series_value' => $series_value
];
return $data;
}
}