You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
397 lines
12 KiB
397 lines
12 KiB
<?php
|
|
|
|
namespace addons\qingdong\model;
|
|
|
|
use addons\qingdong\library\Ku;
|
|
use app\common\model\Area;
|
|
use think\Db;
|
|
use think\Exception;
|
|
use think\Model;
|
|
use traits\model\SoftDelete;
|
|
/**
|
|
*客户
|
|
*/
|
|
class Customer Extends Model {
|
|
use SoftDelete;
|
|
// 表名,不含前缀
|
|
protected $name = 'qingdong_customer';
|
|
// 开启自动写入时间戳字段
|
|
protected $autoWriteTimestamp = 'int';
|
|
// 定义时间戳字段名
|
|
protected $createTime = 'createtime';
|
|
protected $updateTime = 'updatetime';
|
|
protected $deleteTime = 'deletetime';
|
|
|
|
|
|
//获取创建时间
|
|
public function getCreatetimeAttr($value) {
|
|
return date('Y-m-d H:i:s', $value);
|
|
}
|
|
|
|
|
|
//创建人
|
|
public function createStaff() {
|
|
return $this->hasOne(Staff::class, 'id', 'create_staff_id')->field('id,name,post');
|
|
}
|
|
|
|
|
|
//负责人
|
|
public function ownerStaff() {
|
|
return $this->hasOne(Staff::class, 'id', 'owner_staff_id')->field('id,name,img');
|
|
}
|
|
|
|
|
|
//获取联系人
|
|
public function contacts() {
|
|
return $this->hasOne(Contacts::class, 'customer_id', 'id')->order('is_major desc')->field('id,customer_id,name,mobile,email');
|
|
}
|
|
//获取联系人
|
|
public function contact() {
|
|
return $this->belongsTo(Contacts::class,'id','customer_id', [], 'LEFT')->field('id,customer_id,name,mobile,email')->setEagerlyType(0);;
|
|
}
|
|
|
|
//获取客户相关信息
|
|
public function customerOther() {
|
|
return $this->belongsTo(CustomerOther::class,'id','id');
|
|
}
|
|
|
|
public static function withtrash(){
|
|
return self::withTrashed();
|
|
}
|
|
|
|
public static function getList() {
|
|
$staff = Staff::info();
|
|
$staff_id = $staff->id;
|
|
$whereStaff = function ($query) use ($staff_id) {
|
|
$query->where(['ro_staff_id' => ['like', "%,{$staff_id},%"]])
|
|
->whereOr('rw_staff_id', 'like', "%,{$staff_id},%")
|
|
->whereOr(['owner_staff_id' => ['in', Staff::getMyStaffIds()]]);
|
|
};
|
|
return self::where($whereStaff)->field('id,name')->select();
|
|
}
|
|
|
|
|
|
//创建客户
|
|
public static function createCustomer($params,$leads_id=null,$reminds_id=null) {
|
|
//自定义字段
|
|
$other = [];
|
|
foreach ($params as $name => $val) {
|
|
if (strstr($name,'other_') !== false) {
|
|
if(is_array($val)){
|
|
$other[$name] = implode(',',$val);
|
|
}else{
|
|
$other[$name] = $val;
|
|
}
|
|
unset($params[$name]);
|
|
}else{
|
|
if($params[$name] === ''){
|
|
$params[$name]=NULL;
|
|
}
|
|
}
|
|
}
|
|
$staff = Staff::info();
|
|
if(empty($staff)){
|
|
// 验证失败 输出错误信息
|
|
throw new Exception('账号不存在');
|
|
}
|
|
$params['create_staff_id'] = $staff->id;
|
|
$params['owner_staff_id'] = $staff->id;
|
|
$params['next_time'] = date('Y-m-d H:i:s');
|
|
$params['last_time'] = date('Y-m-d H:i:s');
|
|
$params['receivetime'] = time();
|
|
$customer = new self;
|
|
|
|
$result = $customer->allowField(true)->save($params);
|
|
$lastId=$customer->getLastInsID();
|
|
if (false === $result) {
|
|
// 验证失败 输出错误信息
|
|
throw new Exception($customer->getError());
|
|
}
|
|
$otherModel = new CustomerOther();
|
|
if ($otherModel->save(['id' => $lastId, 'otherdata' => json_encode($other, JSON_UNESCAPED_UNICODE)]) === false) {
|
|
// 验证失败 输出错误信息
|
|
throw new Exception($otherModel->getError());
|
|
}
|
|
if(isset($leads_id) && $leads_id){
|
|
Leads::where(['id' => $leads_id])->update(['is_transform' => 1, 'customer_id' => $lastId]);
|
|
}
|
|
if (isset($reminds_id['reminds_id']) && $reminds_id['reminds_id']) {//发送通知
|
|
$staff_ids = explode(',', $reminds_id['reminds_id']);
|
|
foreach ($staff_ids as $staff_id) {
|
|
//发送通知
|
|
Message::addMessage(Message::CUSTOMER_TYPE, $lastId, $staff_id, $staff->id);
|
|
}
|
|
}
|
|
|
|
OperationLog::createLog(OperationLog::CUSTOMER_TYPE, $lastId, '创建客户');
|
|
//新增跟进记录
|
|
Record::quickCreateRecord(Record::CUSTOMER_TYPE, $lastId, '新增客户:' . $params['name']);
|
|
return $lastId;
|
|
}
|
|
|
|
|
|
/**
|
|
*修改客户信息
|
|
*/
|
|
public static function updateCustomer($params) {
|
|
//自定义字段
|
|
$other = [];
|
|
foreach ($params as $name => $val) {
|
|
if (strstr($name,'other_') !== false) {
|
|
if(is_array($val)){
|
|
$other[$name] = implode(',',$val);
|
|
}else{
|
|
$other[$name] = $val;
|
|
}
|
|
unset($params[$name]);
|
|
}else{
|
|
if($params[$name] === ''){
|
|
$params[$name]=NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
$customer = new self;
|
|
// 调用当前模型对应的User验证器类进行数据验证
|
|
$result = $customer->save($params, ['id' => $params['id']]);
|
|
if (false === $result) {
|
|
// 验证失败 输出错误信息
|
|
throw new Exception($customer->getError());
|
|
}
|
|
$otherModel = new CustomerOther();
|
|
$otherFind = $otherModel->where(['id' => $params['id']])->find();
|
|
if($otherFind){
|
|
$resInfo = $otherModel->save(['otherdata' => json_encode($other, JSON_UNESCAPED_UNICODE)],['id' => $params['id']]);
|
|
}else{
|
|
$resInfo = $otherModel->save(['id' => $params['id'],'otherdata' => json_encode($other, JSON_UNESCAPED_UNICODE)]);
|
|
}
|
|
if ( $resInfo === false) {
|
|
// 验证失败 输出错误信息
|
|
throw new Exception($otherModel->getError());
|
|
}
|
|
//同步数据
|
|
$ku = new Ku();
|
|
$ku->editCustomer($params);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 导入客户
|
|
* @param $data
|
|
* @return bool
|
|
*/
|
|
public static function importCustomer($data) {
|
|
$addCustomers = [];
|
|
$addOther = [];
|
|
$addcontacts = [];
|
|
$addLog=[];
|
|
foreach ($data as $params) {
|
|
//自定义字段
|
|
$other = [];
|
|
foreach ($params as $name => $val) {
|
|
if (strstr($name, 'other_') !== false) {
|
|
if(is_array($val)){
|
|
$other[$name] = implode(',',$val);
|
|
}else{
|
|
$other[$name] = $val;
|
|
}
|
|
unset($params[$name]);
|
|
}else{
|
|
if($params[$name] === ''){
|
|
$params[$name]=NULL;
|
|
}
|
|
}
|
|
}
|
|
$other['id'] = $params['id'];
|
|
$params['next_time'] = date('Y-m-d H:i:s');
|
|
$params['receivetime'] = time();
|
|
$params['createtime'] = time();
|
|
$addOther[] = ['id' => $params['id'], 'otherdata' => json_encode($other, JSON_UNESCAPED_UNICODE)];
|
|
$addcontacts[] = ['customer_id' => $params['id'],'is_major'=>1,'name'=>$params['name'],'mobile'=>$params['mobile'],'createtime'=>time(),'updatetime'=>time()];
|
|
|
|
$addLog[] = [
|
|
'content' => '导入客户',
|
|
'operation_type' => 2,
|
|
'operation_id' => 30,
|
|
'relation_type' => OperationLog::CUSTOMER_TYPE,
|
|
'relation_id' => $params['id'],
|
|
'createtime' => time()
|
|
];
|
|
$addCustomers[] = $params;
|
|
}
|
|
|
|
$customer = new self;
|
|
// 调用当前模型对应的User验证器类进行数据验证
|
|
$result = $customer->allowField(true)->insertAll($addCustomers);
|
|
|
|
$otherModel = new CustomerOther();
|
|
$otherModel->allowField(true)->insertAll($addOther);
|
|
|
|
//联系人
|
|
$contactsModel = new Contacts();
|
|
$contactsModel->allowField(true)->insertAll($addcontacts);
|
|
|
|
$logModel = new OperationLog();
|
|
$logModel->allowField(true)->insertAll($addLog);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
*移入公海
|
|
*/
|
|
public static function moveSeas($id) {
|
|
$row = Customer::where(['id' => $id])->find();
|
|
$row = $row->toArray();
|
|
$row = CustomerOther::getOther($row);
|
|
$seastype=Seastype::where([])->select();
|
|
$seasIds=[];
|
|
foreach ($seastype as $r){
|
|
$rules=json_decode($r['rules'],true)?:[];
|
|
$is_rule=0;//权限是否匹配
|
|
foreach ($rules as $n=>$e){
|
|
|
|
if($n == 'area_ids'){//区域
|
|
$area=Area::where(['id'=>['in',$e]])->column('name');
|
|
foreach ($area as $a){
|
|
$rs=preg_match("/^{$a}/i",$row['address'],$res);
|
|
if($rs){
|
|
$is_rule=1;
|
|
}
|
|
}
|
|
}else if (isset($row[$n]) && $row[$n]) {
|
|
if (is_string($e)) {
|
|
$e = explode(',', $e);
|
|
}
|
|
$rn = explode(',', $row[$n]);
|
|
$intersect = array_intersect($e, $rn);
|
|
if($intersect){
|
|
$is_rule=1;
|
|
}
|
|
}
|
|
|
|
}
|
|
if ($is_rule == 1) {
|
|
$seasIds[] = $r['id'];
|
|
}
|
|
|
|
}
|
|
if(empty($seasIds)){
|
|
$seasIds[]=1;//默认公海
|
|
}
|
|
$seas_id = ',' . implode(',', $seasIds) . ',';
|
|
if (Customer::where(['id' => $id])->update(['owner_staff_id' => 0,
|
|
'seas_id' => $seas_id,'sea_time'=>time()]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
OperationLog::createLog(OperationLog::CUSTOMER_TYPE, $id, '将客户放入公海');
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* 转移客户
|
|
*/
|
|
public static function transfer($id, $staff_id) {
|
|
Db::startTrans();
|
|
try {
|
|
if (Customer::where(['id' => $id])->update([
|
|
'owner_staff_id' => $staff_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
if (Contacts::where(['customer_id' => $id])->count()) {//存在联系人 则修改负责人
|
|
if (Contacts::where(['customer_id' => $id])->update([
|
|
'owner_staff_id' => $staff_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
}
|
|
$staff = Staff::get($staff_id);
|
|
OperationLog::createLog(OperationLog::CUSTOMER_TYPE, $id, '将客户转移给:' . $staff['name']);
|
|
|
|
Db::commit();
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
throw new Exception($e->getMessage());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* 批量转移客户
|
|
*/
|
|
public static function batchTransfer($ids, $staff_id) {
|
|
Db::startTrans();
|
|
try {
|
|
if (Customer::where(['id' => ['in',$ids]])->update([
|
|
'owner_staff_id' => $staff_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
if (Contacts::where(['customer_id' => ['in',$ids]])->count()) {//存在联系人 则修改负责人
|
|
if (Contacts::where(['customer_id' => ['in',$ids]])->update([
|
|
'owner_staff_id' => $staff_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
}
|
|
$staff = Staff::get($staff_id);
|
|
foreach ($ids as $id){
|
|
OperationLog::createLog(OperationLog::CUSTOMER_TYPE, $id, '将客户转移给:' . $staff['name']);
|
|
}
|
|
|
|
Db::commit();
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
throw new Exception($e->getMessage());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* 领取客户
|
|
*/
|
|
public static function receive($customer_id) {
|
|
$staff = Staff::info();
|
|
$where=['owner_staff_id' => 0];
|
|
if($customer_id){
|
|
$where['id']=$customer_id;
|
|
}
|
|
$customer = Customer::where($where)->find();
|
|
Db::startTrans();
|
|
try {
|
|
$id = $customer['id'];
|
|
$staff_id = $staff->id;
|
|
if (Customer::where(['id' => $customer['id']])->update(['owner_staff_id' => $staff->id,'receivetime'=>time()]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
if (Contacts::where(['customer_id' => $id])->count()) {//存在联系人 则修改负责人
|
|
if (Contacts::where(['customer_id' => $id])->update([
|
|
'owner_staff_id' => $staff_id,
|
|
'updatetime' => time()
|
|
]) == false) {
|
|
throw new Exception('修改失败');
|
|
}
|
|
}
|
|
|
|
OperationLog::createLog(OperationLog::CUSTOMER_TYPE, $customer['id'], '领取了客户');
|
|
|
|
Db::commit();
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
throw new Exception($e->getMessage());
|
|
}
|
|
|
|
return $customer['id'];
|
|
}
|
|
}
|
|
|