lihai-oa/app/customer/controller/Index.php

599 lines
20 KiB
PHP
Raw Normal View History

2023-10-24 15:17:16 +08:00
<?php
/**
* @copyright Copyright (c) 2021 勾股工作室
* @license https://opensource.org/licenses/GPL-3.0
* @link https://www.gougucms.com
*/
declare (strict_types = 1);
namespace app\customer\controller;
use app\base\BaseController;
use app\customer\model\Customer as CustomerList;
use app\customer\validate\CustomerCheck;
use think\exception\ValidateException;
use think\facade\Db;
use think\facade\View;
class Index extends BaseController
{
public function index()
{
if (request()->isAjax()) {
$param = get_params();
$tab = isset($param['tab']) ? $param['tab'] : 0;
$where = array();
$whereOr = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.name|cc.name|cc.mobile', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['status'])) {
$where[] = ['a.status', '=', $param['status']];
}
if (!empty($param['grade_id'])) {
$where[] = ['a.grade_id', '=', $param['grade_id']];
}
if (!empty($param['source_id'])) {
$where[] = ['a.source_id', '=', $param['source_id']];
}
if (!empty($param['type'])) {
$where[] = ['a.intent_status', '=', $param['type']];
}
if (!empty($param['follow_time'])) {
$follow_time =explode('~', $param['follow_time']);
$where[] = ['ct.follow_time', 'between', [strtotime(urldecode($follow_time[0])),strtotime(urldecode($follow_time[1]))]];
}
if (!empty($param['next_time'])) {
$next_time =explode('~', $param['next_time']);
$where[] = ['ct.next_time', 'between', [strtotime(urldecode($next_time[0])),strtotime(urldecode($next_time[1]))]];
}
$where[] = ['a.delete_time', '=', 0];
$uid = $this->uid;
$auth = isAuth($uid,'customer_admin');
if (!empty($param['uid']) && $auth == 1) {
$where[] =['a.belong_uid', '=', $param['uid']];
}
else{
$dids = get_department_role($uid);
if($auth == 0){
if($tab == 1){
$whereOr[] =['a.belong_uid', '=', $uid];
}
else if($tab == 2){
if(!empty($dids)){
$whereOr[] =['a.belong_did', 'in', $dids];
}
else{
$whereOr[] =['a.belong_did', '=', 0];
$where[] =['a.belong_uid', '>', 0];
}
}
else if($tab == 3){
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',a.share_ids)")];
}
else{
$whereOr[] =['a.belong_uid', '=', $uid];
if(!empty($dids)){
$whereOr[] =['a.belong_did', 'in', $dids];
}
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',a.share_ids)")];
}
}
else if($auth ==1 ){
if($tab == 1){
$whereOr[] =['a.belong_uid', '=', $uid];
}
else if($tab == 2){
if(!empty($dids)){
$whereOr[] =['a.belong_did', 'in', $dids];
}
else{
$whereOr[] =['a.belong_did', '=', 0];
$where[] =['a.belong_uid', '>', 0];
}
}
else if($tab == 3){
$whereOr[] = ['', 'exp', Db::raw("FIND_IN_SET('{$uid}',a.share_ids)")];
}
else{
$whereOr[] =['a.belong_uid', '>', 0];
}
}
}
$cc_sql= Db::name('CustomerContact')->group('cid,name,mobile,qq,wechat,email')->field('cid,name,mobile,qq,wechat,email')->buildSql();
$ct_sql= Db::name('CustomerTrace')->group('cid')->field('cid,MAX(follow_time) AS follow_time,MAX(next_time) AS next_time')->buildSql();
$orderby = 'ct.next_time desc,a.create_time desc';
if(isset($param['orderby'])){
$orderby = 'ct.'.$param['orderby'];
}
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$content = CustomerList::where($where)
->where(function ($query) use($whereOr) {
$query->whereOr($whereOr);
})
->field('a.*,d.title as belong_department,g.title as grade,s.title as source,i.title as industry,ct.follow_time,ct.next_time')
->alias('a')
->join('customer_source s', 'a.source_id = s.id')
->join('customer_grade g', 'a.grade_id = g.id')
->join('industry i', 'a.industry_id = i.id')
->join('department d', 'a.belong_did = d.id')
->join($ct_sql.' ct', 'ct.cid = a.id','left')
->join($cc_sql.' cc', 'a.id = cc.cid','left')
->group('a.id')
->order($orderby)
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$item->belong_name = Db::name('Admin')->where(['id' => $item->belong_uid])->value('name');
$item->create_time = date('Y-m-d H:i', $item->create_time);
if($item->update_time == 0){
$item->update_time='-';
}
else{
$item->update_time = date('Y-m-d H:i', $item->update_time);
}
$item->intent_status_name = CustomerList::$IntentStatus[(int) $item->intent_status];
$item->status_name = CustomerList::$Status[(int) $item->status];
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
if(!empty($contact)){
$item->user = $contact['name'];
$item->mobile = $contact['mobile'];
$item->qq = $contact['qq'];
$item->wechat = $contact['wechat'];
}
if($item->services_id == 0){
$item->services_name = '-';
}
else{
$item->services_name = Db::name('Services')->where(['id' => $item->services_id])->value('title');
}
if(empty($item->follow_time)){
$item->follow_time = '-';
}
else{
$item->follow_time = date('Y-m-d H:i:s', $item->follow_time);
}
if(empty($item->next_time)){
$item->next_time = '-';
}
else{
$item->next_time = date('Y-m-d H:i:s', $item->next_time);
}
});
return table_assign(0, '', $content);
} else {
$uid = $this->uid;
$auth = isAuth($uid,'customer_admin');
View::assign('auth', $auth);
return view();
}
}
//公海客户
public function sea()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.name', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['status'])) {
$where[] = ['a.status', '=', $param['status']];
}
if (!empty($param['industry_id'])) {
$where[] = ['a.industry_id', '=', $param['industry_id']];
}
if (!empty($param['source_id'])) {
$where[] = ['a.source_id', '=', $param['source_id']];
}
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.belong_uid', '=', 0];
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$content = CustomerList::where($where)
->field('a.*,d.title as belong_department,g.title as grade,s.title as source,i.title as industry')
->alias('a')
->join('customer_source s', 'a.source_id = s.id')
->join('customer_grade g', 'a.grade_id = g.id')
->join('industry i', 'a.industry_id = i.id')
->join('department d', 'a.belong_did = d.id','LEFT')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$item->belong_name = Db::name('Admin')->where(['id' => $item->belong_uid])->value('name');
$item->create_time = date('Y-m-d H:i', $item->create_time);
if($item->update_time == 0){
$item->update_time='-';
}
else{
$item->update_time = date('Y-m-d H:i', $item->update_time);
}
$item->intent_status_name = CustomerList::$IntentStatus[(int) $item->intent_status];
$item->status_name = CustomerList::$Status[(int) $item->status];
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
if(!empty($contact)){
$item->user = $contact['name'];
$item->mobile = $contact['mobile'];
$item->qq = $contact['qq'];
$item->wechat = $contact['wechat'];
}
if($item->services_id == 0){
$item->services_name = '-';
}
else{
$item->services_name = Db::name('Services')->where(['id' => $item->services_id])->value('title');
}
});
return table_assign(0, '', $content);
} else {
return view();
}
}
//移入公海
public function to_sea()
{
if (request()->isAjax()) {
$id = get_params("id");
$uid = $this->uid;
//是否有权限
$customer = customer_auth($uid,$id,1,1);
$data['id'] = $id;
$data['belong_uid'] = 0;
$data['belong_did'] = 0;
$data['belong_time'] = 0;
if (Db::name('Customer')->update($data) !== false) {
add_log('tosea', $id);
$log_data = array(
'field' => 'belong',
'action' => 'tosea',
'type' => 0,
'customer_id' => $data['id'],
'admin_id' => $this->uid,
'create_time' => time(),
);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//废池客户
public function trash()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
if (!empty($param['keywords'])) {
$where[] = ['a.id|a.name|c.title', 'like', '%' . $param['keywords'] . '%'];
}
if (!empty($param['status'])) {
$where[] = ['a.status', '=', $param['status']];
}
$where[] = ['a.delete_time', '>', 0];
$where[] = ['a.belong_uid', '=', 0];
$rows = empty($param['limit']) ? get_config('app.page_size') : $param['limit'];
$content = CustomerList::where($where)
->field('a.*,d.title as belong_department,g.title as grade,s.title as source,i.title as industry')
->alias('a')
->join('customer_source s', 'a.source_id = s.id')
->join('customer_grade g', 'a.grade_id = g.id')
->join('industry i', 'a.industry_id = i.id')
->join('department d', 'a.belong_did = d.id','LEFT')
->order('a.create_time desc')
->paginate($rows, false, ['query' => $param])
->each(function ($item, $key) {
$item->belong_name = Db::name('Admin')->where(['id' => $item->belong_uid])->value('name');
$item->create_time = date('Y-m-d H:i', $item->create_time);
if($item->update_time == 0){
$item->update_time='-';
}
else{
$item->update_time = date('Y-m-d H:i', $item->update_time);
}
$item->intent_status_name = CustomerList::$IntentStatus[(int) $item->intent_status];
$item->status_name = CustomerList::$Status[(int) $item->status];
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
if(!empty($contact)){
$item->user = $contact['name'];
$item->mobile = $contact['mobile'];
$item->qq = $contact['qq'];
$item->wechat = $contact['wechat'];
}
if($item->services_id == 0){
$item->services_name = '-';
}
else{
$item->services_name = Db::name('Services')->where(['id' => $item->services_id])->value('title');
}
});
return table_assign(0, '', $content);
} else {
return view();
}
}
//抢客宝
public function rush()
{
if (request()->isAjax()) {
$param = get_params();
$where = array();
$where[] = ['a.delete_time', '=', 0];
$where[] = ['a.belong_uid', '=', 0];
$content = CustomerList::where($where)
->field('a.*,d.title as belong_department,g.title as grade,s.title as source,i.title as industry')
->alias('a')
->join('customer_source s', 'a.source_id = s.id')
->join('customer_grade g', 'a.grade_id = g.id')
->join('industry i', 'a.industry_id = i.id')
->join('department d', 'a.belong_did = d.id','LEFT')
->orderRaw('rand()')
->limit(10)
->paginate()
->each(function ($item, $key) {
$item->create_time = date('Y-m-d H:i:s', (int) $item->create_time);
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid' => $item->id])->find();
if(!empty($contact)){
$item->user = $contact['name'];
$item->mobile = $contact['mobile'];
$item->qq = $contact['qq'];
$item->wechat = $contact['wechat'];
}
if($item->services_id == 0){
$item->services_name = '-';
}
else{
$item->services_name = Db::name('Services')->where(['id' => $item->services_id])->value('title');
}
});
return table_assign(0, '', $content);
} else {
$time = strtotime(date('Y-m-d')." 00:00:00");
$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('expected_1');
$count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count();
View::assign('max_num', $max_num);
View::assign('count', $count);
return view();
}
}
//添加&&编辑
public function add()
{
$param = get_params();
if (request()->isAjax()) {
if (!empty($param['id']) && $param['id'] > 0) {
try {
validate(CustomerCheck::class)->scene($param['scene'])->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$customer = customer_auth($this->uid,$param['id'],1);
$param['update_time'] = time();
$res = customerList::strict(false)->field(true)->update($param);
if ($res) {
add_log('edit', $param['id'], $param);
to_log($this->uid,0,$param,$customer);
return to_assign();
} else {
return to_assign(1, '操作失败');
}
} else {
try {
validate(CustomerCheck::class)->scene('add')->check($param);
} catch (ValidateException $e) {
// 验证失败 输出错误信息
return to_assign(1, $e->getError());
}
$param['create_time'] = time();
$param['admin_id'] = $this->uid;
$cid = CustomerList::strict(false)->field(true)->insertGetId($param);
$contact = [
'name' => $param['c_name'],
'mobile' => $param['c_mobile'],
'sex' => $param['c_sex'],
'qq' => $param['c_qq'],
'wechat' => $param['c_wechat'],
'email' => $param['c_email'],
'cid' => $cid,
'is_default' => 1,
'create_time' => time(),
'admin_id' => $this->uid
];
Db::name('CustomerContact')->strict(false)->field(true)->insert($contact);
if ($cid) {
add_log('add', $cid, $param);
$log_data = array(
'field' => 'new',
'action' => 'add',
'type' => 0,
'customer_id' => $cid,
'admin_id' => $param['admin_id'],
'create_time' => time(),
);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign();
} else {
return to_assign(1, '操作失败');
}
}
} else {
if (!empty($param['id']) && $param['id'] > 0) {
$sea = isset($param['sea']) ? $param['sea'] : 0;
//查看权限判断
$customer = customer_auth($this->uid,$param['id']);
$detail = (new CustomerList())->detail($param['id']);
View::assign('sea', $sea);
View::assign('detail', $detail);
return view('edit');
}
else{
$sea = isset($param['sea']) ? $param['sea'] : 0;
View::assign('sea', $sea);
View::assign('userinfo', get_admin($this->uid));
return view();
}
}
}
//查看
public function view()
{
$id = get_params("id");
//查看权限判断
$customer = customer_auth($this->uid,$id);
$detail = (new CustomerList())->detail($id);
$contact = Db::name('CustomerContact')->where(['is_default'=>1,'cid'=>$id])->find();
//是否是客户管理员
$auth = isAuth($this->uid,'customer_admin');
View::assign('auth', $auth);
View::assign('contact', $contact);
View::assign('detail', $detail);
return view();
}
//获取客户
public function get()
{
if (request()->isAjax()) {
$id = get_params("id");
$time = strtotime(date('Y-m-d')." 00:00:00");
$max_num = Db::name('DataAuth')->where('name','customer_admin')->value('expected_1');
$count = Db::name('Customer')->where([['belong_time','>',$time],['belong_uid','=',$this->uid]])->count();
if($count>=$max_num){
return to_assign(1, "今日领取客户数已到达上限,请明天再来领取");
}
$data['id'] = $id;
$data['belong_uid'] = $this->uid;
$data['belong_did'] = $this->did;
$data['belong_time'] = time();
if (Db::name('Customer')->update($data) !== false) {
add_log('tosea', $id);
$log_data = array(
'field' => 'belong',
'action' => 'get',
'type' => 0,
'customer_id' => $data['id'],
'admin_id' => $this->uid,
'create_time' => time(),
);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign(0, "操作成功");
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//客户移入废弃池
public function to_trash()
{
if (request()->isAjax()) {
$params = get_params();
$data['id'] = $params['id'];
$log_data = array(
'field' => 'del',
'action' => 'delete',
'type' => 0,
'customer_id' => $params['id'],
'admin_id' => $this->uid,
'create_time' => time(),
);
$data['delete_time'] = time();
$log_data['action'] = 'totrash';
if (Db::name('Customer')->update($data) !== false) {
add_log('totrash', $params['id']);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign();
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//还原客户
public function revert()
{
if (request()->isAjax()) {
$params = get_params();
$data['id'] = $params['id'];
$data['delete_time'] = 0;
if (Db::name('Customer')->update($data) !== false) {
add_log('recovery', $params['id']);
$log_data = array(
'field' => 'del',
'action' => 'recovery',
'type' => 0,
'customer_id' => $params['id'],
'admin_id' => $this->uid,
'create_time' => time(),
);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign();
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
//彻底删除客户
public function delete()
{
if (request()->isDelete()) {
$params = get_params();
//是否是客户管理员
$auth = isAuth($this->uid,'customer_admin');
if($auth==0){
return to_assign(1, "只有客户管理员才有权限操作");
}
$data['id'] = $params['id'];
$data['delete_time'] = -1;
$log_data = array(
'field' => 'del',
'action' => 'delete',
'type' => 0,
'customer_id' => $params['id'],
'admin_id' => $this->uid,
'create_time' => time()
);
if (Db::name('Customer')->update($data) !== false) {
//删除客户联系人
Db::name('CustomerContact')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
//删除客户机会
Db::name('CustomerChance')->where(['cid' => $params['id']])->update(['delete_time'=>time()]);
add_log('delete', $params['id']);
Db::name('CustomerLog')->strict(false)->field(true)->insert($log_data);
return to_assign();
} else {
return to_assign(1, "操作失败");
}
} else {
return to_assign(1, "错误的请求");
}
}
}