Files
crm-server/app/controller/CustomerController.php
T

511 lines
16 KiB
PHP

<?php
namespace app\controller;
use app\model\Channel;
use app\model\Customer;
use app\model\Follow;
use app\service\UserService;
use app\util\Util;
use config\constants\Constants;
use support\Log;
use support\Request;
class CustomerController
{
/**
* 不需要登录的方法
*/
protected $noNeedLogin = ['collect'];
/**
* 客户分级
* @param Request $request
* @return \support\Response
*/
public function getGrade(Request $request)
{
$grade = [];
$gradeConstants = Constants::GRADE_EN;
if($request->user['language'] == 'zh_CN'){
$gradeConstants = Constants::GRADE;
}
foreach ($gradeConstants as $key => $value) {
$grade[] = [
'id' => $key,
'name' => $value,
];
}
return Util::success($grade);
}
/**
* 商机
* @param Request $request
* @return \support\Response
*/
public function getMagnitude(Request $request)
{
$grade = [];
$magnitudeConstants = Constants::MAGNITUDE_EN;
if($request->user['language'] == 'zh_CN'){
$magnitudeConstants = Constants::MAGNITUDE;
}
foreach ($magnitudeConstants as $key => $value) {
$grade[] = [
'id' => $key,
'name' => $value,
];
}
return Util::success($grade);
}
/**
* 客户渠道
* @param Request $request
* @return \support\Response
*/
public function getChannel(Request $request)
{
$list = Channel::getAll();
if($request->user['language'] != 'zh_CN'){
foreach ($list as $key => &$value) {
$value['name'] = $value['name_en'];
}
}
return Util::success($list);
}
/**
* 待跟进客户列表
* @param Request $request
* @return \support\Response
*/
public function waitFollow(Request $request)
{
$userId = $request->user['id'];
$filter = Util::getParam($request, 'filter');
$page = $request->input('page', 1);
$perPage = $request->input('per_page', 10);
$where = [
['user_id', '=', $userId],
['follow_next', '<>', 0],
];
if($filter == 0){
$where[] = ['follow_next', '<=', time() + 3600 * 24];
}elseif($filter == 1){
$where[] = ['follow_next', '<=', time() + 3600 * 24*3];
}elseif($filter == 2){
$where[] = ['follow_next', '<=', time() + 3600 * 24*7];
}
$customer = Customer::where($where)
->whereNotNull('follow_next')
->orderBy('follow_next')
->paginate($perPage, ['*'], 'page', $page);
foreach ($customer as &$item) {
$item['follow_remaining'] = $item->follow_next-time();
$item['follow_next'] = date('Y-m-d H:i:s',$item->follow_next);
}
return Util::page($customer);
}
/**
* 客户列表
* @param Request $request
* @return \support\Response
*/
public function list(Request $request)
{
$page = $request->input('page', 1);
$perPage = $request->input('per_page', 10);
$follow = $request->input('follow', ''); //跟进状态
$keyword = $request->input('keyword', ''); //follow_last
$follow_last = $request->input('follow_last', ''); //最后跟进:1:当天跟进客户,2:近三天跟进客户,3:近七天跟进客户
$where = [];
$userId = $request->user['id'];
if (Util::isEmpty($userId)) {
return Util::fail(['user_id' => $userId], trans('user_none'));
}
$where[] = ['user_id', $userId];
//验证权限
// if ($request->user['role'] != 1) {
// $where[] =['user_id',$userId] ;
// }
$grade = [];
if (!Util::isEmpty($follow) && $follow == 0) {
$where[] = ['grade', '<=', 2];
} elseif (!Util::isEmpty($follow) && $follow == 1) {
$grade = [3, 4];
} elseif (!Util::isEmpty($follow) && $follow == 2) {
$where[] = ['grade', '=', 5];
}
if (!Util::isEmpty($follow_last) && $follow_last == 0) {
$where[] = ['follow_last', '>', strtotime('-1 day')];
} elseif (!Util::isEmpty($follow_last) && $follow_last == 1) {
$where[] = ['follow_last', '>', strtotime('-3 day')];
} elseif (!Util::isEmpty($follow_last) && $follow_last == 2) {
$where[] = ['follow_last', '>', strtotime('-7 day')];
}
// 执行分页查询 //关联标签tags //关联标签及分组tags.group
$query = Customer::where($where)
->orderBy('id', 'desc');
if (!Util::isEmpty($keyword)) {
$query->where(function ($query) use ($keyword) {
$query->where('contacts', 'like', "%{$keyword}%")
->orWhere('phone', 'like', "%{$keyword}%");
});
}
if (!Util::isEmpty($grade)) {
$query->whereIn('grade', $grade);
}
$recycle = Util::getParam($request,'recycle', '');
if ($recycle == 'recycle') {
$query->onlyTrashed();
}
$data = $query->paginate($perPage, ['*'], 'page', $page);
foreach ($data->items() as &$value) {
$value = Customer::getCustomer($value, $request);
}
return Util::page($data);
}
/**
* 客户恢复
* @param Request $request
* @return \support\Response
*/
public function restore(Request $request)
{
$id = Util::getParam($request,'id', '');
if (Util::isEmpty($id)) {
return Util::fail([], trans('id_empty'));
}
$userId = $request->user['id'];
$where = [
'id' => $id,
'user_id' => $userId,
];
$res = Customer::where($where)->restore();
if($res){
return Util::success($res, trans('success'));
}else{
return Util::fail([], trans('fail'));
}
}
/**
* 客户详情
* @param Request $request
* @return \support\Response
*/
public function detail(Request $request)
{
$id = Util::getParam($request, 'id');
if (Util::isEmpty($id)) {
return Util::fail([], 'id' . trans('not_null'));
}
$res = Customer::with('tags')->select('id', 'user_id', 'grade', 'channel_id', 'car_type_id', 'country_id', 'magnitude', 'email', 'phone', 'WhatsApp', 'contacts', 'describe', 'address', 'lat', 'lng', 'follow_next', 'follow_remark', 'sex')
->where('id', $id)
->first();
if ($res) {
$res->toArray();
} else {
return Util::fail([], '记录不存在');
}
$res = Customer::getCustomer($res, $request, true);
return Util::success($res);
}
/**
* 客户录入
* @param Request $request
* @return \support\Response
*/
public function save(Request $request)
{
$id = Util::getParam($request, 'id');
$channel_id = Util::getParam($request, 'channel_id');
if (Util::isEmpty($channel_id)) {
return Util::fail([], trans('channel_not_null'));
}
$country_id = Util::getParam($request, 'country_id', 0);
if (Util::isEmpty($country_id)) {
// return Util::fail([],'country_id'.trans('not_null'));
}
$car_type_id = Util::getParam($request, 'car_type_id');
if (Util::isEmpty($car_type_id)) {
return Util::fail([], trans('car_type_not_null'));
}
$contacts = Util::getParam($request, 'contacts');
$email = Util::getParam($request, 'email');
$phone = Util::getParam($request, 'phone');
if (Util::isEmpty($contacts) && Util::isEmpty($email) && Util::isEmpty($phone)) {
return Util::fail([], trans('contacts_not_null'));
}
$data = [
'user_id' => $request->user['id'],
'grade' => Util::getParam($request, 'grade', 0),
'channel_id' => $channel_id,
'country_id' => $country_id,
'car_type_id' => $car_type_id,
'magnitude' => Util::getParam($request, 'magnitude', 0),
'email' => $email,
'phone' => $phone,
'WhatsApp' => Util::getParam($request, 'WhatsApp', ''),
'contacts' => $contacts,
'describe' => Util::getParam($request, 'describe'),
'lat' => Util::getParam($request, 'lat', 0),
'lng' => Util::getParam($request, 'lng', 0),
'address' => Util::getParam($request, 'address', ''),
'sex' => Util::getParam($request, 'sex', 0),
];
if (Util::isEmpty($id)) {
$res = Customer::create($data);
} else {
unset($data['grade']);
$res = Customer::where('id', $id)
->update($data);
// Log::info('update', ['res' => $res]);
(!$res) ?: $res = Customer::find($id)->toArray();
}
if ($res) {
return Util::success($res, trans('save_success'));
} else {
return Util::fail($res, trans('save_fail'));
}
}
/**
* 跟进状态
* @param Request $request
* @return \support\Response
*/
public function grade(Request $request)
{
$id = Util::getParam($request, 'id');
$grade = Util::getParam($request, 'grade');
if (Util::isEmpty($id)) {
return Util::fail('', 'id' . trans('not_null'));
}
if (Util::isEmpty($id)) {
return Util::fail('', 'grade' . trans('not_null'));
}
$data = [
'grade' => $grade,
];
$res = Customer::where('id', $id)
->update($data);
if ($res) {
return Util::success($res, trans('save_success'));
} else {
return Util::fail($res, trans('save_fail'));
}
}
/**
* 更新下次跟进时间
* @param Request $request
* @return \support\Response
*/
public function followNext(Request $request)
{
$id = Util::getParam($request, 'id');
if (Util::isEmpty($id)) {
return Util::fail([], 'id' . trans('not_null'));
}
$data = [
'follow_next' => Util::getParam($request, 'follow_next', 0),
'follow_remark' => Util::getParam($request, 'follow_remark', 0),
'warn' => 0,
];
$res = Customer::where('id', $id)
->update($data);
if ($res) {
return Util::success($res, trans('save_success'));
} else {
return Util::fail($res, trans('save_fail'));
}
}
/**
* 删除客户
* @param Request $request
* @return \support\Response
*/
public function delete(Request $request)
{
$id = Util::getParam($request, 'id');
$force = Util::getParam($request, 'force','');
$userId = $request->user['id'];
$where = [
'id' => $id,
'user_id' => $userId,
];
$customer = Customer::where($where)->withTrashed()->first();
if(empty($customer)){
return Util::fail('', trans('fail'));
}
if($force == 'force'){
$res = $customer->forceDelete();
}else{
$res = $customer->delete();
}
if ($res) {
return Util::success($res, trans('success'));
} else {
return Util::fail($res, trans('fail'));
}
}
/**
* 统计客户
* @param Request $request
* @return \support\Response
*/
public function statistics(Request $request)
{
$created = Util::getParam($request, 'created');
if (Util::isEmpty($created)) {
return Util::fail([], 'created' . trans('not_null'));
}
$userId = $request->user['id'];
$created_at = $request->user['created_at'];
$day = ceil((time() - $created_at + 1) / 60 / 60 / 24);
$where[] = ['user_id', '=', $userId];
$start = strtotime($created . '-01');
$year = date('Y', $start);
$month = date('n', $start); //获取月份
$end = mktime(00, 00, 00, $month + 1, 1, $year);
$where[] = ['created_at', '>=', $start];
$where[] = ['created_at', '<', $end];
$customer = Customer::where($where)->count();
//初步接触
$whereGrade = $where;
$whereGrade[] = ['grade', '<=', 2];
$customerInit = Customer::where($whereGrade)->count();
//跟进中
$customeroFllow = Customer::where($where)->whereIn('grade', [3, 4])->count();
//已成交
$whereGrade = $where;
$whereGrade[] = ['grade', '=', 5];
$customerDeal = Customer::where($whereGrade)->count();
//拜访数
$whereVisit = $where;
$whereVisit[] = ['type', '=', 0];
$visit = Follow::where($whereVisit)->distinct('customer_id')->count();
//跟进数
$whereVisit = $where;
$whereVisit[] = ['type', '=', 1];
$follow = Follow::where($whereVisit)->distinct('customer_id')->count();
$res = [
'customer' => $customer, //客户数
'visit' => $visit, //拜访
'follow' => $follow, //跟进
'day' => $day, //注册天数
'customer_init' => $customerInit, //初步接触
'customero_fllow' => $customeroFllow, //跟进中
'customer_deal' => $customerDeal, //已成交
];
if ($res) {
return Util::success($res, trans('success'));
} else {
return Util::fail($res, trans('fail'));
}
}
/**
* 线索分配
* @param Request $request
* @return \support\Response
*/
public function collect(Request $request)
{
Log::info('send follow start',$request->all());
$user_sn = Util::getParam($request, 'user_sn'); //用户sn
$user_email = Util::getParam($request, 'user_email'); //邮箱
$sn = Util::getParam($request, 'order_no'); //客户sn验证客户唯一性
$channel_id = Util::getParam($request, 'channel_id'); //渠道
$country_id = Util::getParam($request, 'country_id'); //国家
$magnitude = Util::getParam($request, 'magnitude'); //商机
$describe = Util::getParam($request, 'describe'); //客户详情
$phone = Util::getParam($request, 'phone'); //用户详情
$email = Util::getParam($request, 'email'); //用户详情
$WhatsApp = Util::getParam($request, 'WhatsApp');
$contacts = Util::getParam($request, 'contacts'); //联系人
if (Util::isEmpty($user_sn)) {
return Util::fail([], '用户sn不能为空');
}
if (Util::isEmpty($user_email)) {
return Util::fail([], '用户邮箱不能为空');
}
if (Util::isEmpty($sn)) {
return Util::fail([], '客户sn不能为空');
}
$user = UserService::updateSn($user_sn, $user_email);
if(!$user){
return Util::fail($user, $user_email.'用户不存在');
}
$res = Customer::firstOrCreate(
['sn' => $sn],
[
'user_id' => $user->id,
'channel_id' => $channel_id,
'country_id' => $country_id,
'magnitude' => $magnitude,
'describe' => $describe,
'phone' => $phone,
'email' => $email,
'WhatsApp' => $WhatsApp,
'contacts' => $contacts,
]
);
if ($res) {
return Util::success($res, trans('success'));
} else {
return Util::fail($res, trans('fail'));
}
}
}