2 Commits

Author SHA1 Message Date
18338781771 64441ebe34 1 2025-07-29 17:18:09 +08:00
18338781771 63a1c69072 1 2025-07-29 17:12:05 +08:00
26 changed files with 516 additions and 1848 deletions
+4 -7
View File
@@ -58,16 +58,13 @@ class AreaController
// } // }
$list = Country::get()->toArray(); $list = Country::get()->toArray();
$name = 'en_addr'; $language = 'en_addr';
//$language = $request->user['language']; if($request->user['language'] == 'zh_CN'){
//$language = 'zh_CN'; $language = 'cn_addr';
$language = $request->language;
if($language == 'zh_CN'){
$name = 'cn_addr';
} }
foreach ($list as &$row) { foreach ($list as &$row) {
$row['name'] = $row[$name]; $row['name'] = $row[$language];
} }
return Util::success($list); return Util::success($list);
} }
+2 -5
View File
@@ -17,14 +17,11 @@ class CarTypeController
{ {
$list = CarType::getAll(); $list = CarType::getAll();
//$language = $request->user['language']; if($request->user['language'] != 'zh_CN'){
//$language = 'zh_CN';
$language = $request->language;
if($language == 'en'){
foreach ($list as &$value) { foreach ($list as &$value) {
$value['name'] = $value['name_en']; $value['name'] = $value['name_en'];
} }
}elseif ($language == 'ru'){ }elseif ($request->user['language'] == 'ru'){
foreach ($list as &$value) { foreach ($list as &$value) {
$value['name'] = $value['name_ru']; $value['name'] = $value['name_ru'];
} }
+46 -153
View File
@@ -3,16 +3,13 @@
namespace app\controller; namespace app\controller;
use app\model\Channel; use app\model\Channel;
use app\model\Corp;
use app\model\Customer; use app\model\Customer;
use app\model\CustomerHis; use app\model\CustomerHis;
use app\model\Follow; use app\model\Follow;
use app\model\InquiryLog;
use app\model\User; use app\model\User;
use app\service\UserService; use app\service\UserService;
use app\util\Util; use app\util\Util;
use config\constants\Constants; use config\constants\Constants;
use Illuminate\Database\Eloquent\Builder;
use support\Log; use support\Log;
use support\Request; use support\Request;
@@ -34,13 +31,9 @@ class CustomerController
{ {
$grade = []; $grade = [];
$gradeConstants = Constants::GRADE_EN; $gradeConstants = Constants::GRADE_EN;
if($request->user['language'] == 'zh_CN'){
//$language = $request->user['language'];
//$language = 'zh_CN';
$language = $request->language;
if($language == 'zh_CN'){
$gradeConstants = Constants::GRADE; $gradeConstants = Constants::GRADE;
}elseif ($language == 'ru'){ }elseif ($request->user['language'] == 'ru'){
$gradeConstants = Constants::GRADE_RU; $gradeConstants = Constants::GRADE_RU;
} }
foreach ($gradeConstants as $key => $value) { foreach ($gradeConstants as $key => $value) {
@@ -61,12 +54,9 @@ class CustomerController
{ {
$grade = []; $grade = [];
$magnitudeConstants = Constants::MAGNITUDE_EN; $magnitudeConstants = Constants::MAGNITUDE_EN;
//$language = $request->user['language']; if($request->user['language'] == 'zh_CN'){
//$language = 'zh_CN';
$language = $request->language;
if($language == 'zh_CN'){
$magnitudeConstants = Constants::MAGNITUDE; $magnitudeConstants = Constants::MAGNITUDE;
}elseif ($language == 'ru'){ }elseif ($request->user['language'] == 'ru'){
$magnitudeConstants = Constants::MAGNITUDE_RU; $magnitudeConstants = Constants::MAGNITUDE_RU;
} }
foreach ($magnitudeConstants as $key => $value) { foreach ($magnitudeConstants as $key => $value) {
@@ -87,18 +77,15 @@ class CustomerController
{ {
$list = Channel::getAll(); $list = Channel::getAll();
//$language = $request->user['language']; if($request->user['language'] != 'zh_CN'){
//$language = 'zh_CN'; foreach ($list as &$value) {
// $language = $request->language; $value['name'] = $value['name_en'];
// if($language != 'zh_CN'){ }
// foreach ($list as &$value) { }elseif ($request->user['language'] == 'ru'){
// $value['name'] = $value['name_en']; foreach ($list as &$value) {
// } $value['name'] = $value['name_ru'];
// }elseif ($language == 'ru'){ }
// foreach ($list as &$value) { }
// $value['name'] = $value['name_ru'];
// }
// }
return Util::success($list); return Util::success($list);
@@ -153,7 +140,6 @@ class CustomerController
$keyword = $request->input('keyword', ''); //follow_last $keyword = $request->input('keyword', ''); //follow_last
$follow_last = $request->input('follow_last', ''); //最后跟进:1:当天跟进客户,2:近三天跟进客户,3:近七天跟进客户 $follow_last = $request->input('follow_last', ''); //最后跟进:1:当天跟进客户,2:近三天跟进客户,3:近七天跟进客户
$tagId = $request->input('tag_id', ''); //打有某个标签的客户 $tagId = $request->input('tag_id', ''); //打有某个标签的客户
$countryId = $request->input('country_id', ''); //打有某个标签的客户
$seas = $request->input('seas', ''); //公海客户 $seas = $request->input('seas', ''); //公海客户
$where = []; $where = [];
@@ -168,10 +154,6 @@ class CustomerController
}else{ }else{
$where[] = ['user_id', $userId]; $where[] = ['user_id', $userId];
} }
$where[] = ['status', 1];
if (!empty($countryId)){
$where[] = ['country_id', $countryId];
}
//验证权限 //验证权限
// if ($request->user['role'] != 1) { // if ($request->user['role'] != 1) {
// $where[] =['user_id',$userId] ; // $where[] =['user_id',$userId] ;
@@ -196,20 +178,14 @@ class CustomerController
// 执行分页查询 //关联标签tags //关联标签及分组tags.group // 执行分页查询 //关联标签tags //关联标签及分组tags.group
$query = Customer::with('tags')->where($where) $query = Customer::with('tags')->where($where)
->orderBy('crm_customer.id', 'desc'); ->orderBy('customer.id', 'desc');
if(!empty($tagId)){ if(!empty($tagId)){
//查询有$tagId 里任意一个标签的客户 // $query->with(['tags' => function($query) use ($tagId){
// $query->whereHas('tags', function($query) use ($tagId){
// $query->where('tag.id', $tagId); // $query->where('tag.id', $tagId);
// }); // }]);
$query->whereHas('tags', function($query) use ($tagId){
//查询有$tagId 里所有标签的客户 $query->where('tag.id', $tagId);
$tagId = explode(',', $tagId); });
foreach ($tagId as $id) {
$query->whereHas('tags', function($query) use ($id){
$query->where('tag_id', $id);
});
}
} }
if (!Util::isEmpty($keyword)) { if (!Util::isEmpty($keyword)) {
$query->where(function ($query) use ($keyword) { $query->where(function ($query) use ($keyword) {
@@ -222,31 +198,16 @@ class CustomerController
} }
$recycle = Util::getParam($request,'recycle', ''); $recycle = Util::getParam($request,'recycle', '');
if ($recycle == 'recycle') { if ($recycle == 'recycle' || $seas == 'seas') {
$query->onlyTrashed(); $query->onlyTrashed();
} }
if ($seas == 'seas') {
$user = User::where('id', $userId)->first();
$corpId = $user?$user->corp_id:0;
if($corpId == 1){
$query->whereIn('channel_id', [1,2,3,4,5,6,7,8]);
} elseif($corpId == 3) {
$query->whereIn('channel_id', [9,10,11]);
} else{
$query->whereIn('channel_id', [0]);
}
$query->withTrashed();
}
$data = $query->paginate($perPage, ['*'], 'page', $page); $data = $query->paginate($perPage, ['*'], 'page', $page);
foreach ($data->items() as &$value) { foreach ($data->items() as &$value) {
$value = Customer::getCustomer($value, $request); $value = Customer::getCustomer($value, $request);
if($seas == 'seas'){ if($seas == 'seas'){
$value['phone'] = Util::mask($value['phone']); $value['seas_time'] = time()-strtotime($value['deleted_at']);
$value['email'] = Util::mask($value['email']);
$value['WhatsApp'] = Util::mask($value['WhatsApp']);
$value['seas_time'] = time()-(empty($value['deleted_at'])?strtotime($value['updated_at']):strtotime($value['deleted_at']));
} }
} }
@@ -320,10 +281,10 @@ class CustomerController
if (Util::isEmpty($country_id)) { if (Util::isEmpty($country_id)) {
// return Util::fail([],'country_id'.trans('not_null')); // return Util::fail([],'country_id'.trans('not_null'));
} }
// $car_type_id = Util::getParam($request, 'car_type_id'); $car_type_id = Util::getParam($request, 'car_type_id');
// if (Util::isEmpty($car_type_id)) { if (Util::isEmpty($car_type_id)) {
// return Util::fail([], trans('car_type_not_null')); return Util::fail([], trans('car_type_not_null'));
// } }
$contacts = Util::getParam($request, 'contacts'); $contacts = Util::getParam($request, 'contacts');
$email = Util::getParam($request, 'email'); $email = Util::getParam($request, 'email');
$phone = Util::getParam($request, 'phone'); $phone = Util::getParam($request, 'phone');
@@ -331,19 +292,16 @@ class CustomerController
return Util::fail([], trans('contacts_not_null')); return Util::fail([], trans('contacts_not_null'));
} }
$user = User::where(['id' => $request->user['id']])->first();
$whatsApp = Util::getParam($request, 'WhatsApp', '');
$data = [ $data = [
'user_id' => $request->user['id'], 'user_id' => $request->user['id'],
'corp_id' => $user->corp_id,
'grade' => Util::getParam($request, 'grade', 0), 'grade' => Util::getParam($request, 'grade', 0),
'channel_id' => $channel_id, 'channel_id' => $channel_id,
'country_id' => $country_id, 'country_id' => $country_id,
// 'car_type_id' => $car_type_id, 'car_type_id' => $car_type_id,
'magnitude' => Util::getParam($request, 'magnitude', 0), 'magnitude' => Util::getParam($request, 'magnitude', 0),
'email' => $email, 'email' => $email,
'phone' => $phone, 'phone' => $phone,
'WhatsApp' => $whatsApp, 'WhatsApp' => Util::getParam($request, 'WhatsApp', ''),
'contacts' => $contacts, 'contacts' => $contacts,
'describe' => Util::getParam($request, 'describe'), 'describe' => Util::getParam($request, 'describe'),
'lat' => Util::getParam($request, 'lat', 0), 'lat' => Util::getParam($request, 'lat', 0),
@@ -353,16 +311,6 @@ class CustomerController
]; ];
if (Util::isEmpty($id)) { if (Util::isEmpty($id)) {
$data['enter_user_id'] = $request->user->uid;
$distinct = [
'email' => $email,
'phone' => $phone,
'whatsapp' => $whatsApp,
];
$dis = $this->distinct($distinct, $user->corp_id);
if($dis){
return Util::fail([], '客户线索重复,已经有人在跟进');
}
$res = Customer::create($data); $res = Customer::create($data);
} else { } else {
unset($data['grade']); unset($data['grade']);
@@ -379,26 +327,6 @@ class CustomerController
} }
} }
public function distinct($params, $corpId){
$customer = Customer::where('corp_id', $corpId)
->where((function (Builder $query) use ($params) {
if(!empty($params['email']))
$query->Orwhere('email', '=', $params['email']);
if(!empty($params['phone']))
$query->Orwhere('phone', '=', $params['phone']);
if(!empty($params['whatsApp']))
$query->Orwhere('whatsApp', '=', $params['whatsApp']);
return $query;
}))
->first();
if (!empty($customer)) {
return true;
}
return false;
}
/** /**
* 领取公海客户 * 领取公海客户
* @param Request $request * @param Request $request
@@ -411,11 +339,8 @@ class CustomerController
if (Util::isEmpty($customerId)) { if (Util::isEmpty($customerId)) {
return Util::fail([], trans('customer_id').trans('not_null')); return Util::fail([], trans('customer_id').trans('not_null'));
} }
$user = User::where(['id' => $userId])->first();
$data = [ $data = [
'user_id' => $request->user['id'], 'user_id' => $request->user['id']
'obtain' => time(),
'corp_id' => $user->corp_id,
]; ];
$customer= Customer::withTrashed()->find($customerId); $customer= Customer::withTrashed()->find($customerId);
@@ -432,7 +357,6 @@ class CustomerController
'user_his' => 0, 'user_his' => 0,
'user_id' => $userId, 'user_id' => $userId,
]); ]);
self::inquiryUpdate($customer,$request->user['id']);
if ($res) { if ($res) {
return Util::success($res, trans('success')); return Util::success($res, trans('success'));
@@ -442,36 +366,6 @@ class CustomerController
} }
/**
* 询单修改
*/
public static function inquiryUpdate($customer,$userId = null)
{
if(empty($customer->sn) || $customer->type!=1){
return false;
}
$inquiryLog = InquiryLog::where('order_no', $customer->sn)->first();
if(empty($inquiryLog)){
return false;
}
$userId = $userId??$customer->user_id;
if ($userId == 0){
$inquiryLog->recipient = 0;
$inquiryLog->t_time = time();
$inquiryLog->status = 1;
$inquiryLog->r_time = time();
$inquiryLog->save();
}else {
$inquiryLog->recipient = $customer->user_id;
$inquiryLog->t_time = time();
$inquiryLog->save();
}
return true;
}
/** /**
* 批量转让 * 批量转让
* @param Request $request * @param Request $request
@@ -480,21 +374,25 @@ class CustomerController
public function cede(Request $request) public function cede(Request $request)
{ {
$customerId = Util::getParam($request, 'customer_id'); $customerId = Util::getParam($request, 'customer_id');
$userId = Util::getParam($request, 'user_id'); $user_sn = Util::getParam($request, 'user_sn');
$selfId = $request->user['id']; $userId = $request->user['id'];
if (Util::isEmpty($userId)) { if (Util::isEmpty($user_sn)) {
return Util::fail([], 'user_id'.trans('not_null')); return Util::fail([], 'ID'.trans('not_null'));
}
if (Util::isEmpty($customerId)) {
return Util::fail([], 'customer_id'.trans('not_null'));
} }
$user = User::where(['id' => $userId])->first(); $user = User::where(['sn' => $user_sn])->first();
if (Util::isEmpty($user)) { if (Util::isEmpty($user)) {
return Util::fail(null, trans('user_none')); return Util::fail(null, trans('user_none'));
} }
$query= Customer::where('user_id',$selfId)->where('id',$customerId); if(Util::isEmpty($customerId)){
$data = [
'user_id' => $userId
];
$query= Customer::where($data);
}else{
$query= Customer::whereIn('id',explode(',',$customerId));
}
$customer = $query->get(); $customer = $query->get();
foreach ($customer as $item) { foreach ($customer as $item) {
@@ -504,14 +402,8 @@ class CustomerController
'user_his' => $item->user_id, 'user_his' => $item->user_id,
'user_id' => $user['id'], 'user_id' => $user['id'],
]); ]);
self::inquiryUpdate($customer,$user->id);
} }
$res = $query->update(['user_id' => $user->id]);
$data = [
'user_id' => $user->id,
'obtain' => time(),
];
$res = $query->update($data);
if ($res) { if ($res) {
@@ -691,9 +583,9 @@ class CustomerController
$contacts = Util::getParam($request, 'contacts'); //联系人 $contacts = Util::getParam($request, 'contacts'); //联系人
if (Util::isEmpty($user_sn)) { // if (Util::isEmpty($user_sn)) {
return Util::fail([], '用户sn不能为空'); // return Util::fail([], '用户sn不能为空');
} // }
if (Util::isEmpty($sn)) { if (Util::isEmpty($sn)) {
return Util::fail([], '客户sn不能为空'); return Util::fail([], '客户sn不能为空');
} }
@@ -724,6 +616,7 @@ class CustomerController
if ($res) { if ($res) {
return Util::success($res, trans('success')); return Util::success($res, trans('success'));
} else { } else {
log::info('collect fail',[$res,$request->all()]);
return Util::fail($res, trans('fail')); return Util::fail($res, trans('fail'));
} }
} }
+3 -1
View File
@@ -55,7 +55,9 @@ class FollowController
if(Util::isEmpty($userId)){ if(Util::isEmpty($userId)){
return Util::fail(['user_id'=>$userId],trans('user_none')); return Util::fail(['user_id'=>$userId],trans('user_none'));
} }
$where['user_id'] = $userId; if($request->user['role']!=1){
$where['user_id'] = $userId;
}
//跟进id //跟进id
$id = Util::getParam($request,'id'); $id = Util::getParam($request,'id');
+1 -3
View File
@@ -16,9 +16,7 @@ class TagGroupController
{ {
$list = TagGroup::with('tags')->get(); $list = TagGroup::with('tags')->get();
$languageArr = Constants::LANGUAGE; $languageArr = Constants::LANGUAGE;
// $language = $request->user['language']; $language = $request->user['language'];
//$language = 'zh_CN';
$language = $request->language;
foreach ($list as &$item) { foreach ($list as &$item) {
$item['names'] = unserialize($item['names']); $item['names'] = unserialize($item['names']);
if (in_array($language, $languageArr)) { if (in_array($language, $languageArr)) {
+41 -101
View File
@@ -2,19 +2,16 @@
namespace app\controller; namespace app\controller;
use app\model\Corp;
use app\model\Country; use app\model\Country;
use app\model\FeishuUser; use app\model\FeishuUser;
use app\model\User; use app\model\User;
use app\model\UserSn; use app\model\UserSn;
use app\service\AuthService;
use app\service\MailService; use app\service\MailService;
use app\service\UserService; use app\service\UserService;
use app\util\HttpClient; use app\util\HttpClient;
use app\util\JwtUtil; use app\util\JwtUtil;
use app\util\Util; use app\util\Util;
use config\constants\Constants; use config\constants\Constants;
use support\exception\BusinessException;
use support\Log; use support\Log;
use support\Redis; use support\Redis;
use support\Request; use support\Request;
@@ -24,40 +21,24 @@ class UserController
/** /**
* 不需要登录的方法 * 不需要登录的方法
*/ */
protected $noNeedLogin = ['login', 'sendCode', 'register', 'step', 'savePassword']; protected $noNeedLogin = ['login', 'sendCode', 'register', 'step'];
public function login(Request $request) public function login(Request $request)
{ {
$email = Util::getParam($request, 'email'); $email = Util::getParam($request, 'email');
$corpAbbr = Util::getParam($request, 'abbr');
$language = Util::getParam($request, 'language'); $language = Util::getParam($request, 'language');
if (Util::isEmpty($email)) { if (Util::isEmpty($email)) {
return Util::fail([], trans('required_not_null')); return Util::fail([], trans('required_not_null'));
} }
if (Util::isEmpty($corpAbbr)) {
return Util::fail([], 'abbr'.trans('not_null'));
}
$password = Util::getParam($request, 'password'); $password = Util::getParam($request, 'password');
if (Util::isEmpty($password)) { if (Util::isEmpty($password)) {
return Util::fail([], trans('required_not_null')); return Util::fail([], trans('required_not_null'));
} }
// 获取企业ID $user = User::select(['id', 'name', 'sex', 'role', 'avatar', 'email', 'password'])
$corpInfo = Corp::where('abbr', $corpAbbr)->first(); ->where('status', 0)
if (!$corpInfo) { ->where('email', $request->post('email'))
return Util::fail([], '公司不存在');
}
$corpId = $corpInfo->id;
$user = User::where('status', 0)
// ->where('email', $request->post('email'))
->where('corp_id', $corpId)
->OrWhere(['email' => $request->post('email'),'phone' => $request->post('email')])
->first(); ->first();
// $builder = User::where('status', 0)
// ->where('email', $request->post('email'));
// $sql = str_replace(['?'], ['\'%s\''], $builder->toSql());
// $fullSql = vsprintf($sql, $builder->getBindings());
if (!$user) { if (!$user) {
return Util::fail(['user' => $user], trans('user_none')); return Util::fail(['user' => $user], trans('user_none'));
} }
@@ -71,15 +52,10 @@ class UserController
//验证密码 //验证密码
// if (!password_verify($userPassword, $hashedPassword)) { // if (!password_verify($userPassword, $hashedPassword)) {
// if ($userPassword == $hashedPassword) { // if ($userPassword == $hashedPassword) {
if (!password_verify($password, $userPassword)) { if (!password_verify($password, $userPassword)) {
locale($language); locale($language);
return Util::fail([], trans('password_error')); return Util::fail([], trans('password_error'));
} }
if ($user['status'] != 1) {
return Util::fail([], '账号已禁用',403);
}
$userId = $user['id']; // 实际从数据库获取 $userId = $user['id']; // 实际从数据库获取
@@ -90,29 +66,17 @@ class UserController
$result = $user; $result = $user;
unset($result['password']); unset($result['password']);
$result['token'] = $token; $result['token'] = $token;
// $result['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id'); $result['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id');
$result['feishu_openid'] = $result['openid']??'';
if (!Util::isEmpty($language)) { if (!Util::isEmpty($language)) {
// User::where('id', $userId) User::where('id', $userId)
// ->update(['language' => $language]); ->update(['language' => $language]);
locale($language); locale($language);
} }
return Util::success($result, trans('login_success')); return Util::success($result, trans('login_success'));
} }
public function loginNew(Request $request)
{
try {
$authService = new AuthService();
$result = $authService->uPwdLogin($request->all());
return Util::success($result, '登录成功');
} catch (\Throwable $e) {
Util::fail([],$e->getMessage());
}
}
/** /**
* 发送邮箱验证码 * 发送邮箱验证码
* @param Request $request * @param Request $request
@@ -151,13 +115,12 @@ class UserController
*/ */
public function register(Request $request) public function register(Request $request)
{ {
$email = Util::getParam($request, 'email', ''); $email = Util::getParam($request, 'email', 'asdf');
$code = Util::getParam($request, 'code'); $code = Util::getParam($request, 'code');
$sex = Util::getParam($request, 'sex', 0); $sex = Util::getParam($request, 'sex', 0);
$name = Util::getParam($request, 'name', ''); $name = Util::getParam($request, 'name', '');
$password = Util::getParam($request, 'password'); $password = Util::getParam($request, 'password');
$mobile = Util::getParam($request, 'mobile'); $mobile = Util::getParam($request, 'mobile');
$corpAbbr = Util::getParam($request, 'abbr');
$id = Util::getParam($request, 'id'); $id = Util::getParam($request, 'id');
$language = Util::getParam($request, 'language'); $language = Util::getParam($request, 'language');
@@ -181,7 +144,7 @@ class UserController
if ($code != $verification_code) { if ($code != $verification_code) {
return Util::fail([], trans('code_error')); return Util::fail([], trans('code_error'));
} }
if(strlen($password) < 8) { if(strlen($password) < 6) {
return Util::fail([], trans('password_short')); return Util::fail([], trans('password_short'));
} }
@@ -189,33 +152,36 @@ class UserController
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); $hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$data = [ $data = [
'phone' => $mobile, 'mobile' => $mobile,
'email' => $email, 'email' => $email,
'name' => '用户_'.rand(111111, 999999), 'name' => '用户_'.rand(111111, 999999),
'sex' => $sex, 'sex' => $sex,
'role' => 1,
'password' => $hashedPassword, 'password' => $hashedPassword,
'status' => 1, 'status' => 0,
'avatar' => '' 'avatar' => 'lingke_crm/logo.png'
]; ];
// 获取可用用户编号
$userSnModel = new UserSn(); if (Util::isEmpty($id)) {
$sn = $userSnModel->where('user_id', '=', 0)->inRandomOrder()->first(); $option = ['email' => $email];
if (!$sn) { $userService = new UserService;
Log::error('用户注册时未找到适用编号'); $res = $userService->createOrquery($option);
return Util::fail([], '未找到适用编号'); Log::info('register_rpc',$res);
// return Util::fail($res, trans('register_fail'));
if ($res['code'] != 200 && $res['data']['code'] != 0){
return Util::fail($res, trans('register_fail'));
}
$data['sn'] = $res['data']['data']['sn'];
$data['id'] = $res['data']['data']['uid'];
$res = User::firstOrCreate(['sn' => $data['sn']],$data);
$res['id'] = $data['id'];
} else {
$res = User::where('id', $id)
->update($data);
// Log::info('update', ['res' => $res]);
(!$res) ?: $res = User::find($id)->toArray();
} }
$data['sn'] = $sn->user_sn;
// 获取企业ID
$corpInfo = Corp::where('abbr', $corpAbbr)->first();
if (!$corpInfo) {
return Util::fail([], '公司不存在');
}
$data['corp_id'] = $corpInfo->id;
$res = User::create($data);
unset($res['password']); unset($res['password']);
locale($language); locale($language);
@@ -256,11 +222,10 @@ class UserController
->first(); ->first();
$user->toArray(); $user->toArray();
unset($user->password); unset($user->password);
// $user['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id'); $user['feishu_openid'] = FeishuUser::where('user_id', $userId)->value('open_id');
$user['feishu_openid'] = $user['openid']??'';
$user['country_name'] = Country::where('id', $user['country_id'])->value('cn_addr'); $user['country_name'] = Country::where('id', $user['country_id'])->value('cn_addr');
$ossservice = new \app\service\OssService(); $ossservice = new \app\service\OssService();
$user['avatar_url'] = $user['avatar']; $user['avatar_url'] = $user['avatar'] ? $ossservice->generatePrivateUrl($user['avatar']) : '';
$user['socialize_pic_url'] = $user['socialize_pic'] ? $ossservice->generatePrivateUrl($user['socialize_pic']) : ''; $user['socialize_pic_url'] = $user['socialize_pic'] ? $ossservice->generatePrivateUrl($user['socialize_pic']) : '';
// 重构数组 // 重构数组
@@ -269,21 +234,6 @@ class UserController
return Util::success($user, trans('success')); return Util::success($user, trans('success'));
} }
public function getUsers(Request $request)
{
$userId = $request->user['id'];
$abbr = $request->input('abbr');
if(empty($abbr)){
return Util::fail([], 'abbr'.trans('not_null'));
}
$corpId = Corp::where('abbr', $abbr)->value('id');
$where[] = ['corp_id' , $corpId];
$where[] = ['status' , 1];
$user = User::select('id','name')->where($where)
->get();
return Util::success($user, trans('success'));
}
/** /**
* 修改 * 修改
* @param Request $request * @param Request $request
@@ -338,24 +288,16 @@ class UserController
$email = Util::getParam($request, 'email'); $email = Util::getParam($request, 'email');
$code = Util::getParam($request, 'code'); $code = Util::getParam($request, 'code');
$verification_code = Redis::get("verification_code:{$email}"); $verification_code = Redis::get("verification_code:{$email}");
// $id = $request->user->uid; $id = $request->user['id'];
if ($code != $verification_code) { if ($code != $verification_code) {
return Util::fail([], trans('code_error')); return Util::fail([], trans('code_error'));
} }
// $res = User::where('id', $id) $res = User::where('id', $id)
// ->first();
// if($res['email'] != $email) {
// return Util::fail([], trans('email_consistent'));
// }
$user = User::where('status', 0)
// ->where('corp_id', $corpId)
->OrWhere(['email' => $request->post('email'),'phone' => $request->post('email')])
->first(); ->first();
if(!$user) { if($res['email'] != $email) {
return Util::fail([], trans('user_none')); return Util::fail([], trans('email_consistent'));
} }
//加密 //加密
@@ -365,11 +307,9 @@ class UserController
$data = [ $data = [
'password' => $hashedPassword 'password' => $hashedPassword
]; ];
$user->password = $hashedPassword;
$res = $user->save();
// $res = User::where('id', $id) $res = User::where('id', $id)
// ->update($data); ->update($data);
if ($res) { if ($res) {
return Util::success($res, trans('save_success')); return Util::success($res, trans('save_success'));
@@ -395,7 +335,7 @@ class UserController
return Util::fail([], trans('param_error')); return Util::fail([], trans('param_error'));
} }
$data = [ $data = [
// 'language' => $language, 'language' => $language,
]; ];
$res = User::where('id', $id) $res = User::where('id', $id)
+4 -6
View File
@@ -77,19 +77,17 @@ class AuthMiddleware implements MiddlewareInterface
} }
$userId = $decoded->sub; $userId = $decoded->sub;
$user = User::find($userId); $user = User::select(['id','name','sex','role','avatar','email','password','language','created_at'])
->find($userId);
if(!$user){ if(!$user){
return Util::fail(['user'=>$userId],trans('user_none')); return Util::fail(['user'=>$user],trans('user_none'));
} }
$user = $user->toArray(); $user = $user->toArray();
// 将用户ID存入请求对象,供后续使用 // 将用户ID存入请求对象,供后续使用
// $request->user = ['id' => $userId]; // $request->user = ['id' => $userId];
$request->user = $user; $request->user = $user;
$request->language = $request->header('fdesk-language'); locale($user['language']);
// locale($user['language']);
locale($request->language);
return $handler($request); return $handler($request);
} catch (BusinessException $e) { } catch (BusinessException $e) {
return json(['code' => 401, 'msg' => $e->getMessage()]); return json(['code' => 401, 'msg' => $e->getMessage()]);
+2 -2
View File
@@ -11,7 +11,7 @@ class Channel extends Model
* *
* @var string * @var string
*/ */
protected $table = 'inquiry_channel'; protected $table = 'channel';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
@@ -42,7 +42,7 @@ class Channel extends Model
public static function getAll() public static function getAll()
{ {
$list = self::get()->select('id','name','name_en','status')->where('status',1)->toArray(); $list = self::get()->select('id','name','name_en','status')->where('status',0)->toArray();
return $list; return $list;
} }
} }
-41
View File
@@ -1,41 +0,0 @@
<?php
namespace app\model;
use app\util\Util;
use config\constants\Constants;
use DateTimeInterface;
use Illuminate\Support\Carbon;
use support\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Corp extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'corp';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
//设置黑名单
protected $guarded = ['id','created_at','updated_at'];
// 指定日期字段存储格式为时间戳
protected $dateFormat = 'U';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = true;
}
+3 -7
View File
@@ -17,7 +17,7 @@ class Customer extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_customer'; protected $table = 'customer';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
@@ -67,11 +67,8 @@ class Customer extends Model
*/ */
public static function getCustomer($customer, $request, $tag = false) public static function getCustomer($customer, $request, $tag = false)
{ {
//$language = $request->user['language'] ?: 'en'; $language = $request->user['language'] ?: 'en';
//$language = 'zh_CN';
$language = $request->language;
$customer['grade_txt'] = Util::language($language, Constants::GRADE_EN[$customer['grade']], Constants::GRADE[$customer['grade']], Constants::GRADE_RU[$customer['grade']]); $customer['grade_txt'] = Util::language($language, Constants::GRADE_EN[$customer['grade']], Constants::GRADE[$customer['grade']], Constants::GRADE_RU[$customer['grade']]);
$customer['magnitude'] = ($customer['magnitude']==0)?1:$customer['magnitude'];
$customer['magnitude_txt'] = Util::language($language, Constants::MAGNITUDE_EN[$customer['magnitude']], Constants::MAGNITUDE[$customer['magnitude']], Constants::MAGNITUDE_RU[$customer['magnitude']]); $customer['magnitude_txt'] = Util::language($language, Constants::MAGNITUDE_EN[$customer['magnitude']], Constants::MAGNITUDE[$customer['magnitude']], Constants::MAGNITUDE_RU[$customer['magnitude']]);
$customer['sex_txt'] = Util::language($language, Constants::SEX_EN[$customer['sex']], Constants::SEX[$customer['sex']], Constants::SEX_RU[$customer['sex']]); $customer['sex_txt'] = Util::language($language, Constants::SEX_EN[$customer['sex']], Constants::SEX[$customer['sex']], Constants::SEX_RU[$customer['sex']]);
@@ -100,7 +97,6 @@ class Customer extends Model
$customer = Util::formatDate($customer,['follow_last']); $customer = Util::formatDate($customer,['follow_last']);
$nameLang = $language=='en'?'name_en':($language=='ru'?'name_ru':'name'); $nameLang = $language=='en'?'name_en':($language=='ru'?'name_ru':'name');
$nameLang = 'name';
$countryLang = $language=='en'?'en_addr':'cn_addr'; $countryLang = $language=='en'?'en_addr':'cn_addr';
$customer['car_type_name'] = empty($customer['car_type_id'])?'':CarType::where(['id'=>$customer['car_type_id']])->value($nameLang); $customer['car_type_name'] = empty($customer['car_type_id'])?'':CarType::where(['id'=>$customer['car_type_id']])->value($nameLang);
$customer['country_name'] = empty($customer['country_id'])?'':Country::where(['id'=>$customer['country_id']])->value($countryLang); $customer['country_name'] = empty($customer['country_id'])?'':Country::where(['id'=>$customer['country_id']])->value($countryLang);
@@ -122,7 +118,7 @@ class Customer extends Model
*/ */
public function tags() public function tags()
{ {
return $this->belongsToMany(Tag::class, 'crm_customer_tag', 'customer_id', 'tag_id') return $this->belongsToMany(Tag::class, 'customer_tag', 'customer_id', 'tag_id')
->withTimestamps(); // 如果需要记录关联时间 ->withTimestamps(); // 如果需要记录关联时间
} }
+1 -1
View File
@@ -17,7 +17,7 @@ class CustomerHis extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_customer_his'; protected $table = 'customer_his';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
+1 -1
View File
@@ -14,7 +14,7 @@ class CustomerTag extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_customer_tag'; protected $table = 'customer_tag';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
+3 -3
View File
@@ -16,7 +16,7 @@ class Follow extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_follow'; protected $table = 'follow';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
@@ -57,8 +57,8 @@ class Follow extends Model
}else { }else {
$follow['oss_picture'] = ''; $follow['oss_picture'] = '';
} }
$follow['created_at'] = (!empty($follow['created_at']))?date('Y-m-d H:i:s',strtotime($follow['created_at'])+(3600*8)):''; $follow['created_at'] = date('Y-m-d H:i:s',strtotime($follow['created_at'])+(3600*8));
$follow['updated_at'] = (!empty($follow['updated_at']))?date('Y-m-d H:i:s',strtotime($follow['updated_at'])+(3600*8)):''; $follow['updated_at'] = date('Y-m-d H:i:s',strtotime($follow['updated_at'])+(3600*8));
// $follow = Util::formatDate($follow); // $follow = Util::formatDate($follow);
return $follow; return $follow;
} }
-74
View File
@@ -1,74 +0,0 @@
<?php
namespace app\model;
use support\Model;
class InquiryLog extends Model
{
/**
* The connection name for the model.
*
* @var string|null
*/
protected $connection = 'mysql';
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'inquiry_log';
/**
* The primary key associated with the table.
*
* @var string
*/
protected $primaryKey = 'id';
/**
* Indicates if the model should be timestamped.
*
* @var bool
*/
public $timestamps = true;
protected $dateFormat = 'U';
/**
* 允许自动填充模型字段
*/
protected $fillable = [
'id', 'order_no', 'enter_user_id', 'recipient',
'quality', 'channel', 'email', 'tel', 'whatsapp',
'country', 'contacts', 'content', 'status',
'r_time', 't_time', 'created_at', 'updated_at'
];
/**
* 不允许自动填充模型字段
*/
protected $guarded = [];
public function enter()
{
return $this->hasOne(User::class, 'id', 'enter_user_id');
}
// public function recipientInfo()
// {
// return $this->hasOne(User::class, 'id', 'recipient')->where('status', 1);
// }
public function recipientInfo()
{
return $this->hasOne(User::class, 'id', 'recipient');
}
public function countryInfo()
{
return $this->hasOne(Country::class, 'id', 'country');
}
}
+1 -1
View File
@@ -17,7 +17,7 @@ class Tag extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_tag'; protected $table = 'tag';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
+1 -1
View File
@@ -17,7 +17,7 @@ class TagGroup extends Model
* *
* @var string * @var string
*/ */
protected $table = 'crm_tag_group'; protected $table = 'tag_group';
/** /**
* The primary key associated with the table. * The primary key associated with the table.
+56
View File
@@ -16,6 +16,62 @@ class Task
public function onWorkerStart() public function onWorkerStart()
{ {
// 每半小时执行一次
new Crontab('0 */30 * * * *', function(){
echo date('Y-m-d H:i:s') . "\n";
Log::info('send follow start',[time()]);
// FeishuController::send('xinyouhe','ou_e33bb3017ada6c4781398a68e55a4696', '跟进提醒', '您有新的跟进提醒', '');
// $customer = Customer::where(['follow_next', '<=', time() + 3600])
// ->where(['follow_next', '>', time()])
// ->where(['warn', '<', 1])
// ->get();
// foreach ($customer as $item) {
// $feishuUser = FeishuUser::where(['user_id' => $item->user_id])->first();
// if ($feishuUser) {
// // 获取凭证
// $certificate = config($this->config);
// // 使用parse_url解析URL
// $parsedUrl = parse_url($certificate['rUrl']);
// // 获取域名和端口
// $host = $parsedUrl['host'];
// $port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : '';
// $url = $host .$port. '/pages/customer/detile?id='.$customer->id;
// $item->warn = 1;
// $item->update();
// $user = User::first()->where('id', $item->user_id);
// Log::info('send',['open_id'=>$item['open_id'],'url'=>$url]);
// // FeishuController::send('xinyouhe','ou_e33bb3017ada6c4781398a68e55a4696', '跟进提醒', '您有新的跟进提醒', $url);
// FeishuController::send($user->sign,$feishuUser->open_id, '跟进提醒', '您有新的跟进提醒', $url);
// }
// }
$where = [
['follow_next', '<=', time() + 3600],
['follow_next', '>', time()],
['warn', '<', 1]
];
$customer = Customer::where($where)->get();
foreach ($customer as $item) {
$feishuUser = FeishuUser::where(['user_id' => $item->user_id])->first();
if ($feishuUser) {
// 获取凭证
$certificate = config('feishu.'.$feishuUser->sign);
// 使用parse_url解析URL
$parsedUrl = parse_url($certificate['rUrl']);
// 获取域名和端口
$host = $parsedUrl['host'];
$port = isset($parsedUrl['port']) ? ':' . $parsedUrl['port'] : '';
$url = 'http://'. $host .$port. '/pages/customer/detile?id='.$item->id;
$item->warn = 1;
$item->update();
Log::info('send',['open_id'=>$item['open_id'],'url'=>$url]);
FeishuController::send($feishuUser->sign, $feishuUser->open_id, '跟进提醒', '您有新的跟进提醒', $url);
}
}
Log::info('send follow start',[time()]);
});
// 每小时执行一次 // 每小时执行一次
new Crontab('0 10 * * * *', function(){ new Crontab('0 10 * * * *', function(){
+4 -4
View File
@@ -15,10 +15,10 @@ class OssService
public function __construct() public function __construct()
{ {
$this->accessKeyId = getenv('OSS_ACCESSID'); $this->accessKeyId = 'LTAI5tAGiH7bkVkmrniXnfkA';
$this->accessKeySecret = getenv('OSS_ACCESSSECRET'); $this->accessKeySecret = 'nqklJBft6t3S0A4ZvxF4ci9ni91kmm';
$this->bucket = getenv('OSS_BUCKET'); $this->bucket = 'vehicle-album';
$this->endpoint = getenv('OSS_ENDPOINT'); $this->endpoint = 'https://oss-cn-beijing.aliyuncs.com';
$this->ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint); $this->ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
} }
-8
View File
@@ -118,12 +118,4 @@ class Util
return $en; return $en;
} }
public static function mask($str)
{
if(empty($str)){
return '';
}
return substr($str, 0, 3) . '****' . substr($str, -4);
}
} }
+3 -3
View File
@@ -36,12 +36,12 @@
"firebase/php-jwt": "^6.11", "firebase/php-jwt": "^6.11",
"illuminate/database": "^11.44", "illuminate/database": "^11.44",
"phpmailer/phpmailer": "^6.9", "phpmailer/phpmailer": "^6.9",
"shopwwi/webman-filesystem": "^2.0",
"iidestiny/flysystem-oss": "^4",
"vlucas/phpdotenv": "^5.6", "vlucas/phpdotenv": "^5.6",
"guzzlehttp/guzzle": "^7.9", "guzzlehttp/guzzle": "^7.9",
"webman/cache": "^2.1", "webman/cache": "^2.1",
"workerman/crontab": "^1.0", "workerman/crontab": "^1.0"
"shopwwi/webman-filesystem": "1.1",
"shopwwi/filesystem-oss": "^1.0"
}, },
"suggest": { "suggest": {
"ext-event": "For better performance. " "ext-event": "For better performance. "
Generated
+321 -1397
View File
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -37,9 +37,9 @@ class Constants
]; ];
//客户重要性 //客户重要性
public const CUSTOMER_MAGNITUDE_INITIAL = 1; // 金牌商机 public const CUSTOMER_MAGNITUDE_INITIAL = 0; // 金牌商机
public const CUSTOMER_MAGNITUDE_COMMUNICATE = 2; // 银牌商机 public const CUSTOMER_MAGNITUDE_COMMUNICATE = 1; // 银牌商机
public const CUSTOMER_MAGNITUDE_PLAN = 3; // 铜牌商机 public const CUSTOMER_MAGNITUDE_PLAN = 2; // 铜牌商机
public const MAGNITUDE = [ public const MAGNITUDE = [
self::CUSTOMER_MAGNITUDE_INITIAL => '金牌商机', self::CUSTOMER_MAGNITUDE_INITIAL => '金牌商机',
+13 -23
View File
@@ -1,17 +1,4 @@
<?php <?php
/**
*-------------------------------------------------------------------------p*
* 配置文件
*-------------------------------------------------------------------------h*
* @copyright Copyright (c) 2015-2022 Shopwwi Inc. (http://www.shopwwi.com)
*-------------------------------------------------------------------------c*
* @license http://www.shopwwi.com s h o p w w i . c o m
*-------------------------------------------------------------------------e*
* @link http://www.shopwwi.com by 象讯科技 phcent.com
*-------------------------------------------------------------------------n*
* @since shopwwi象讯·PHP商城系统Pro
*-------------------------------------------------------------------------t*
*/
return [ return [
'enable' => true, 'enable' => true,
@@ -77,18 +64,21 @@ return [
], ],
'oss' => [ 'oss' => [
'driver' => \Shopwwi\WebmanFilesystem\Adapter\AliyunOssAdapterFactory::class, 'driver' => \Shopwwi\WebmanFilesystem\Adapter\AliyunOssAdapterFactory::class,
// 'accessKey' => getenv('OSS_ACCESSID'), // 'accessId' => 'OSS_ACCESS_ID',
// 'secretKey' => getenv('OSS_ACCESSSECRET'), // 'accessSecret' => 'OSS_ACCESS_SECRET',
// 'bucket' => getenv('OSS_BUCKET'), // 'bucket' => 'OSS_BUCKET',
// 'endpoint' => getenv('OSS_ENDPOINT'), // 'endpoint' => 'OSS_ENDPOINT',
'accessId' => getenv('OSS_ACCESSID'), // 'url' => '', // 静态文件访问域名
'accessSecret' => getenv('OSS_ACCESSSECRET'),
'bucket' => getenv('OSS_BUCKET'), 'accessKey' => 'LTAI5tAGiH7bkVkmrniXnfkA',
'endpoint' => getenv('OSS_ENDPOINT'), 'secretKey' => 'nqklJBft6t3S0A4ZvxF4ci9ni91kmm',
'url' => '' // 静态文件访问域名 'bucket' => 'vehicle-album',
'endpoint' => 'https://oss-cn-beijing.aliyuncs.com',
'url' => '', // 静态文件访问域名
// 'timeout' => 3600, // 'timeout' => 3600,
// 'connectTimeout' => 10, // 'connectTimeout' => 10,
// 'isCName' => false, 'isCName' => false,
'prefix' => '',
// 'token' => null, // 'token' => null,
// 'proxy' => null, // 'proxy' => null,
], ],
+1 -1
View File
@@ -28,7 +28,7 @@ return [
'channel_not_null' => ' channel not null', 'channel_not_null' => ' channel not null',
'email_consistent' => ' Inconsistent email addresses', 'email_consistent' => ' Inconsistent email addresses',
'sign_not_null' => ' No affiliated company has been set', 'sign_not_null' => ' No affiliated company has been set',
'password_short' => ' Password cannot be less than 8 characters', 'password_short' => ' Password cannot be less than 6 characters',
'id_empty' => ' ID cannot be empty', 'id_empty' => ' ID cannot be empty',
'customer_id' => ' customer ID', 'customer_id' => ' customer ID',
'tag_group_id' => ' tag group ID', 'tag_group_id' => ' tag group ID',
+1 -1
View File
@@ -28,7 +28,7 @@ return [
'channel_not_null' => ' Каналы не могут быть пустыми', 'channel_not_null' => ' Каналы не могут быть пустыми',
'email_consistent' => ' Почтовый ящик не совпадает', 'email_consistent' => ' Почтовый ящик не совпадает',
'sign_not_null' => ' Компания не создана', 'sign_not_null' => ' Компания не создана',
'password_short' => ' Пароль не может быть меньше 8.', 'password_short' => ' Пароль не может быть меньше 6.',
'id_empty' => ' ID не может быть пустым', 'id_empty' => ' ID не может быть пустым',
'customer_id' => ' Идентификатор клиента', 'customer_id' => ' Идентификатор клиента',
'tag_group_id' => ' Идентификатор группы меток', 'tag_group_id' => ' Идентификатор группы меток',
+1 -1
View File
@@ -28,7 +28,7 @@ return [
'channel_not_null' => ' 渠道不能为空', 'channel_not_null' => ' 渠道不能为空',
'email_consistent' => ' 邮箱不一致', 'email_consistent' => ' 邮箱不一致',
'sign_not_null' => ' 未设置所属公司', 'sign_not_null' => ' 未设置所属公司',
'password_short' => ' 密码不能少于8位', 'password_short' => ' 密码不能少于6位',
'id_empty' => ' id不能为空', 'id_empty' => ' id不能为空',
'customer_id' => ' 客户ID', 'customer_id' => ' 客户ID',
'tag_group_id' => ' 标签组ID', 'tag_group_id' => ' 标签组ID',