634 lines
19 KiB
PHP
634 lines
19 KiB
PHP
<?php
|
|
|
|
namespace app\crm\controller;
|
|
|
|
use app\common\model\Corp;
|
|
use app\common\model\InquiryLog;
|
|
use app\common\model\User;
|
|
use app\common\traits\crud\CrudControllerTrait;
|
|
use app\crm\model\Channel;
|
|
use app\crm\model\Country;
|
|
use app\crm\model\Customer;
|
|
use app\crm\model\CustomerHis;
|
|
use app\crm\model\Follow;
|
|
use app\crm\service\CustomerService;
|
|
use app\crm\utils\Util;
|
|
use config\constants\Constants;
|
|
use support\Db;
|
|
use support\Request;
|
|
|
|
class CustomerController extends BaseController
|
|
{
|
|
use CrudControllerTrait;
|
|
|
|
/**
|
|
* 不需要头信息的方法
|
|
*/
|
|
protected $noNeedHeader = [];
|
|
|
|
protected $noNeedLogin = ['getChannel', 'getCountry'];
|
|
|
|
protected $service;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->service = new CustomerService();
|
|
}
|
|
|
|
/**
|
|
* 获取列表
|
|
*
|
|
* @param Request $request 请求对象
|
|
* @return mixed 返回分页数据及总数
|
|
*/
|
|
public function index(Request $request)
|
|
{
|
|
try {
|
|
$raw = $this->service->serviceList($request);
|
|
$data = $this->transformData($raw, method_exists($this, 'indexFormat')
|
|
? [$this, 'indexFormat']
|
|
: null);
|
|
foreach ($data['records'] as &$item) {
|
|
$item = $this->service->getCustomer($item);
|
|
}
|
|
return $this->success($data);
|
|
} catch (\Throwable $e) {
|
|
return $this->error($e->getMessage().$e->getLine().$e->getFile());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 客户分级
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function getGrade(Request $request)
|
|
{
|
|
$grade = [];
|
|
$gradeConstants = Constants::GRADE_EN;
|
|
if('zh_CN' == 'zh_CN'){
|
|
$gradeConstants = Constants::GRADE_ZH;
|
|
}elseif ('zh_CN' == 'ru'){
|
|
$gradeConstants = Constants::GRADE_RU;
|
|
}
|
|
foreach ($gradeConstants as $key => $value) {
|
|
$grade[] = [
|
|
'id' => $key,
|
|
'name' => $value,
|
|
];
|
|
}
|
|
return $this->success($grade);
|
|
}
|
|
|
|
/**
|
|
* 商机
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function getMagnitude(Request $request)
|
|
{
|
|
$grade = [];
|
|
$magnitudeConstants = Constants::MAGNITUDE_EN;
|
|
if('zh_CN' == 'zh_CN'){
|
|
$magnitudeConstants = Constants::MAGNITUDE;
|
|
}elseif ('zh_CN' == 'ru'){
|
|
$magnitudeConstants = Constants::MAGNITUDE_RU;
|
|
}
|
|
foreach ($magnitudeConstants as $key => $value) {
|
|
$grade[] = [
|
|
'id' => $key,
|
|
'name' => $value,
|
|
];
|
|
}
|
|
return $this->success($grade);
|
|
}
|
|
|
|
/**
|
|
* 客户渠道
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function getChannel(Request $request)
|
|
{
|
|
$list = Channel::getAll();
|
|
|
|
if('zh_CN' != 'zh_CN'){
|
|
foreach ($list as &$value) {
|
|
$value['name'] = $value['name_en'];
|
|
}
|
|
}elseif ('zh_CN' == 'ru'){
|
|
foreach ($list as &$value) {
|
|
$value['name'] = $value['name_ru'];
|
|
}
|
|
}
|
|
|
|
return $this->success($list);
|
|
|
|
}
|
|
|
|
/**
|
|
* 国家
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function getCountry(Request $request)
|
|
{
|
|
$list = Country::getAll();
|
|
|
|
if('zh_CN' != 'zh_CN'){
|
|
foreach ($list as &$value) {
|
|
$value['name'] = $value['name_en'];
|
|
}
|
|
}elseif ('zh_CN' == 'ru'){
|
|
foreach ($list as &$value) {
|
|
$value['name'] = $value['name_ru'];
|
|
}
|
|
}
|
|
|
|
return $this->success($list);
|
|
|
|
}
|
|
|
|
/**
|
|
* 待跟进客户列表
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function waitFollow(Request $request)
|
|
{
|
|
$userId = $request->user->uid;
|
|
$filter = Util::getParam($request, 'filter');
|
|
$page = $request->input('current', 1);
|
|
$perPage = $request->input('size', 10);
|
|
$where = [
|
|
['user_id', '=', $userId],
|
|
['corp_abbr', '=', $request->basic_data['corp_abbr']],
|
|
['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 $this->success($this->page($customer));
|
|
}
|
|
|
|
/**
|
|
* 客户列表
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function list(Request $request)
|
|
{
|
|
try {
|
|
$param = $request->all();
|
|
$param['user_id'] = $request->user->uid;
|
|
$param['corp_abbr'] = $request->basic_data['corp_abbr'];
|
|
$result = (new CustomerService())->list($param);
|
|
|
|
return $this->success($this->page($result));
|
|
} catch (\Throwable $e) {
|
|
return $this->error($e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 客户恢复
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function restore(Request $request)
|
|
{
|
|
$id = Util::getParam($request,'id', '');
|
|
if (Util::isEmpty($id)) {
|
|
return $this->error(trans('id_empty'));
|
|
}
|
|
$userId = $request->user->uid;
|
|
$where = [
|
|
'id' => $id,
|
|
'user_id' => $userId,
|
|
];
|
|
$res = Customer::where($where)->restore();
|
|
if($res){
|
|
return $this->success($res, trans('success'));
|
|
}else{
|
|
return $this->error(trans('fail'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 无用线索举报
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function report(Request $request)
|
|
{
|
|
$param = $request->all();
|
|
if (Util::isEmpty($param['id'])) {
|
|
return $this->error(trans('id_empty'));
|
|
}
|
|
|
|
$param['user_id'] = $request->user->uid;
|
|
$param['corp_abbr'] = $request->basic_data['corp_abbr'];
|
|
$res = (new CustomerService())->report($param);
|
|
|
|
if($res){
|
|
return $this->success($res, trans('success'));
|
|
}else{
|
|
return $this->error(trans('fail'));
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 客户详情
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function detail(Request $request)
|
|
{
|
|
$id = Util::getParam($request, 'id');
|
|
if (Util::isEmpty($id)) {
|
|
return $this->error('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();
|
|
$res = (new CustomerService)->detail($request->all());
|
|
if ($res) {
|
|
$res->toArray();
|
|
} else {
|
|
return $this->error('记录不存在');
|
|
}
|
|
|
|
$res = CustomerService::getCustomer($res, 'zh_CN', true);
|
|
|
|
return $this->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 $this->error(trans('channel_not_null'));
|
|
}
|
|
$country_id = Util::getParam($request, 'country_id', 0);
|
|
if (Util::isEmpty($country_id)) {
|
|
// return $this->error('country_id'.trans('not_null'));
|
|
}
|
|
// $car_type_id = Util::getParam($request, 'car_type_id');
|
|
// if (Util::isEmpty($car_type_id)) {
|
|
// return $this->error(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 $this->error(trans('contacts_not_null'));
|
|
}
|
|
|
|
$corpInfo = Corp::where('abbr', $request->basic_data['corp_abbr'])->first();
|
|
$corpId = $corpInfo->id;
|
|
$data = [
|
|
'user_id' => $request->user->uid,
|
|
'corp_abbr' => $corpId,
|
|
'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),
|
|
'obtain' => time(),
|
|
];
|
|
|
|
if (Util::isEmpty($id)) {
|
|
$data['enter_user_id'] = $request->user->uid;
|
|
$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 $this->success($res, trans('save_success'));
|
|
} else {
|
|
return $this->error(trans('save_fail'));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 更新下次跟进时间
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function followNext(Request $request)
|
|
{
|
|
$id = Util::getParam($request, 'id');
|
|
if (Util::isEmpty($id)) {
|
|
return $this->error('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 $this->success($res, trans('save_success'));
|
|
} else {
|
|
return $this->error(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->uid;
|
|
$where = [
|
|
'id' => $id,
|
|
'user_id' => $userId,
|
|
];
|
|
$customer = Customer::where($where)->withTrashed()->first();
|
|
if(empty($customer)){
|
|
return $this->error( trans('fail'));
|
|
}
|
|
try {
|
|
Db::beginTransaction();
|
|
if ($force == 'force') {
|
|
//强制删除
|
|
$res = $customer->forceDelete();
|
|
} else {
|
|
$customer->user_id = 0;
|
|
$customer->save();
|
|
|
|
//记录客户关系变化
|
|
$his = CustomerHis::create([
|
|
'customer_id' => $id,
|
|
'user_his' => $userId,
|
|
'user_id' => 0,
|
|
]);
|
|
|
|
//软删除
|
|
$res = $customer->delete();
|
|
}
|
|
Db::commit();
|
|
} catch (\Throwable $e) {
|
|
Db::rollback();
|
|
return $this->error($e->getMessage());
|
|
}
|
|
|
|
if ($res) {
|
|
return $this->success($res, trans('success'));
|
|
} else {
|
|
return $this->error(trans('fail'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 统计客户
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function statistics(Request $request)
|
|
{
|
|
$created = Util::getParam($request, 'created');
|
|
if (Util::isEmpty($created)) {
|
|
return $this->error('created' . trans('not_null'));
|
|
}
|
|
$userId = $request->user->uid;
|
|
//$created_at = $request->user['created_at'];
|
|
$created_at = User::find($userId)->value('created_at');
|
|
$created_at = strtotime($created_at);
|
|
$day = ceil((time() - $created_at + 1) / 60 / 60 / 24);
|
|
$where[] = ['user_id', '=', $userId];
|
|
//$where[] = ['corp_abbr', '=', $request->basic_data['corp_abbr']];
|
|
$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)->count();
|
|
|
|
//跟进数
|
|
$whereVisit = $where;
|
|
$whereVisit[] = ['type', '=', 1];
|
|
$follow = Follow::where($whereVisit)->count();
|
|
|
|
$res = [
|
|
'customer' => $customer, //客户数
|
|
'visit' => $visit, //拜访
|
|
'follow' => $follow, //跟进
|
|
'day' => $day, //注册天数
|
|
'customer_init' => $customerInit, //初步接触
|
|
'customero_fllow' => $customeroFllow, //跟进中
|
|
'customer_deal' => $customerDeal, //已成交
|
|
];
|
|
if ($res) {
|
|
return $this->success($res, trans('success'));
|
|
} else {
|
|
return $this->error(trans('fail'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 领取公海客户
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function claim(Request $request)
|
|
{
|
|
$customerId = Util::getParam($request, 'customer_id');
|
|
$userId = $request->user->uid;
|
|
if (Util::isEmpty($customerId)) {
|
|
return $this->error(trans('customer_id').trans('not_null'));
|
|
}
|
|
$data = [
|
|
'user_id' => $request->user->uid,
|
|
'obtain' => time(),
|
|
];
|
|
|
|
try {
|
|
Db::beginTransaction();
|
|
$customer= Customer::withTrashed()->find($customerId);
|
|
|
|
if(empty($customer) || $customer->user_id != 0){
|
|
return $this->error( trans('claim_fail'));
|
|
}
|
|
|
|
$customer->restore();
|
|
$res = $customer->update($data);
|
|
|
|
//记录客户关系变化
|
|
$his = CustomerHis::create([
|
|
'customer_id' => $customerId,
|
|
'user_his' => 0,
|
|
'user_id' => $userId,
|
|
]);
|
|
if (!empty($customer->sn) && $customer->type==1){
|
|
$inquiryLog = InquiryLog::where('order_no', $customer->sn)->first();
|
|
if (!empty($inquiryLog)) {
|
|
$inquiryLog->recipient = $userId;
|
|
$inquiryLog->save();
|
|
}
|
|
}
|
|
Db::commit();
|
|
} catch (\Throwable $e) {
|
|
Db::rollback();
|
|
return $this->error($e->getMessage());
|
|
}
|
|
|
|
if ($res) {
|
|
return $this->success($res, trans('success'));
|
|
} else {
|
|
return $this->error(trans('fail'));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 批量转让
|
|
* @param Request $request
|
|
* @return \support\Response
|
|
*/
|
|
public function cede(Request $request)
|
|
{
|
|
$customerId = Util::getParam($request, 'customer_id');
|
|
$userId = Util::getParam($request, 'user_id');
|
|
|
|
$user = User::where(['id' => $userId])->first();
|
|
if (Util::isEmpty($user)) {
|
|
return $this->error( trans('user_none'));
|
|
}
|
|
|
|
$query= Customer::withTrashed()->whereIn('id',explode(',',$customerId));
|
|
try {
|
|
$customer = $query->get();
|
|
|
|
Db::beginTransaction();
|
|
foreach ($customer as $item) {
|
|
//记录客户关系变化
|
|
$his = CustomerHis::create([
|
|
'customer_id' => $item->id,
|
|
'user_his' => $item->user_id,
|
|
'user_id' => $user['id'],
|
|
]);
|
|
if (!empty($customer->sn) && $customer->type==1){
|
|
$inquiryLog = InquiryLog::where('order_no', $customer->sn)->first();
|
|
if (!empty($inquiryLog)) {
|
|
$inquiryLog->recipient = $userId;
|
|
$inquiryLog->save();
|
|
}
|
|
}
|
|
|
|
$item->restore();
|
|
}
|
|
|
|
$data = [
|
|
'user_id' => $user->id,
|
|
'obtain' => time(),
|
|
];
|
|
$res = $query->update($data);
|
|
|
|
Db::commit();
|
|
} catch (\Throwable $e) {
|
|
Db::rollback();
|
|
return $this->error($e->getMessage());
|
|
}
|
|
|
|
|
|
|
|
if ($res) {
|
|
return $this->success($res, trans('success'));
|
|
} else {
|
|
return $this->error(trans('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 $this->error( 'id' . trans('not_null'));
|
|
}
|
|
if (Util::isEmpty($id)) {
|
|
return $this->error( 'grade' . trans('not_null'));
|
|
}
|
|
$data = [
|
|
'grade' => $grade,
|
|
];
|
|
$res = Customer::where('id', $id)
|
|
->update($data);
|
|
|
|
if ($res) {
|
|
return $this->success($res, trans('save_success'));
|
|
} else {
|
|
return $this->error(trans('save_fail'));
|
|
}
|
|
}
|
|
} |