Files
fdesk/app/crm/controller/CustomerController.php
T
2025-11-17 10:05:29 +08:00

687 lines
20 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\Log;
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);
$item = Util::formatDate($item,['created_at','updated_at']);
}
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 preset(Request $request)
{
try {
$param = $request->all();
$param['user_id'] = $request->user->uid;
$param['corp_abbr'] = $request->basic_data['corp_abbr'];
$result = (new CustomerService())->preset($param);
return $this->success($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'));
}
if (empty($param['remark']) && empty($param['img'])) {
return $this->error('举报理由不能为空');
}
$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', 245);
if(empty($country_id)){
$country_id = 245;
}
$contacts = Util::getParam($request, 'contacts');
$email = Util::getParam($request, 'email');
$phone = Util::getParam($request, 'phone');
$whatsApp = Util::getParam($request, 'WhatsApp', '');
if (Util::isEmpty($contacts) && Util::isEmpty($email) && Util::isEmpty($phone) && Util::isEmpty($whatsApp)) {
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_id' => $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' => $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(),
'company' => Util::getParam($request, 'company', ''),
];
if (Util::isEmpty($id)) {
$data['enter_user_id'] = $request->user->uid;
$distinct = [
'email' => $email,
'phone' => $phone,
'whatsApp' => $whatsApp,
];
$dis = (new CustomerService())->distinct($distinct,$corpId);
if($dis){
Log::info('客户线索重复-'.$corpId,['user_id'=>$data['user_id'],'distinct'=>$distinct]);
return $this->success($dis,'客户线索重复,已经业务跟进','distinct');
}
$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 distinctNotice(Request $request){
$customer_id = Util::getParam($request, 'customer_id');
if (Util::isEmpty($customer_id)) {
return $this->error('客户id不能为空');
}
$res = (new CustomerService())->distinctNotice($customer_id);
if ($res) {
return $this->success($res, '成功');
} else {
return $this->error(trans('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');
$scene = Util::getParam($request, 'scene','');
$status_desc = Util::getParam($request, 'status_desc','');
if($scene == 'force' && empty($status_desc)){
return $this->error( '移除原因不能为空');
}
$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 ($scene == 'force') {
//status=5:业务员自己删除
$customer->status = 5;
$customer->status_desc = $status_desc;
$res = $customer->save();
}else{
$customer->user_id = 0;
$customer->save();
//记录客户关系变化
$his = CustomerHis::create([
'customer_id' => $id,
'user_his' => $userId,
'user_id' => 0,
]);
CustomerService::inquiryUpdate($customer);
}
//软删除
$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;
$user = User::where(['id' => $userId])->first();
if (Util::isEmpty($customerId)) {
return $this->error(trans('customer_id').trans('not_null'));
}
$data = [
'user_id' => $request->user->uid,
'obtain' => time(),
'corp_id' => $user->corp_id,
];
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,
]);
CustomerService::inquiryUpdate($customer, $data['user_id']);
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'],
]);
CustomerService::inquiryUpdate($customer,$userId);
$item->restore();
}
$data = [
'user_id' => $user->id,
'obtain' => time(),
'corp_id' => $user->corp_id,
];
$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'));
}
}
}