diff --git a/app/crm/controller/CustomerController.php b/app/crm/controller/CustomerController.php index 9844dc3..d8b4887 100644 --- a/app/crm/controller/CustomerController.php +++ b/app/crm/controller/CustomerController.php @@ -2,14 +2,123 @@ namespace app\crm\controller; +use app\crm\model\Channel; use app\crm\model\Customer; +use app\crm\model\CustomerHis; +use app\crm\model\Follow; use app\crm\model\User; use app\crm\service\CustomerService; use app\crm\utils\Util; +use config\constants\Constants; use support\Request; class CustomerController extends BaseController { + + /** + * 客户分级 + * @param Request $request + * @return \support\Response + */ + public function getGrade(Request $request) + { + $grade = []; + $gradeConstants = Constants::GRADE_EN; + if($request->user['language'] == 'zh_CN'){ + $gradeConstants = Constants::GRADE; + }elseif ($request->user['language'] == 'ru'){ + $gradeConstants = Constants::GRADE_RU; + } + foreach ($gradeConstants as $key => $value) { + $grade[] = [ + 'id' => $key, + 'name' => $value, + ]; + } + return Util::success($grade); + } + + /** + * 商机 + * @param Request $request + * @return \support\Response + */ + public function getMagnitude(Request $request) + { + $grade = []; + $magnitudeConstants = Constants::MAGNITUDE_EN; + if($request->user['language'] == 'zh_CN'){ + $magnitudeConstants = Constants::MAGNITUDE; + }elseif ($request->user['language'] == 'ru'){ + $magnitudeConstants = Constants::MAGNITUDE_RU; + } + foreach ($magnitudeConstants as $key => $value) { + $grade[] = [ + 'id' => $key, + 'name' => $value, + ]; + } + return Util::success($grade); + } + + /** + * 客户渠道 + * @param Request $request + * @return \support\Response + */ + public function getChannel(Request $request) + { + $list = Channel::getAll(); + + if($request->user['language'] != 'zh_CN'){ + foreach ($list as &$value) { + $value['name'] = $value['name_en']; + } + }elseif ($request->user['language'] == 'ru'){ + foreach ($list as &$value) { + $value['name'] = $value['name_ru']; + } + } + + return Util::success($list); + + } + + /** + * 待跟进客户列表 + * @param Request $request + * @return \support\Response + */ + public function waitFollow(Request $request) + { + $userId = $request->user['id']; + $filter = Util::getParam($request, 'filter'); + $page = $request->input('page', 1); + $perPage = $request->input('per_page', 10); + $where = [ + ['user_id', '=', $userId], + ['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 Util::page($customer); + } + /** * 客户列表 * @param Request $request @@ -18,32 +127,362 @@ class CustomerController extends BaseController public function list(Request $request) { try { - $result = (new CustomerService())->list($request->all()); + $param = $request->all(); + $param['user_id'] = $request->user->uid; + $result = (new CustomerService())->list($param); return $this->success($this->page($result)); } catch (\Throwable $e) { return $this->error($e->getMessage()); } } - public function follow(Request $request) + /** + * 客户恢复 + * @param Request $request + * @return \support\Response + */ + public function restore(Request $request) { -// try { -// $result = (new CustomerService())->follow($request->all()); -// return $this->success($this->page($result)); -// } catch (\Throwable $e) { -// return $this->error($e->getMessage()); -// } - $page = $request->input('page', 1); - $perPage = $request->input('per_page', 10); - $where = []; - if($request->input('user_id')){ - $where[] = ['user_id', '=', $request->input('user_id')]; + $id = Util::getParam($request,'id', ''); + if (Util::isEmpty($id)) { + return Util::fail([], trans('id_empty')); } - $user = Customer::with('user')->where($where)->paginate($perPage, ['*'], 'page', $page); - $user = $user->toArray(); - foreach ($user['data'] as &$item) { - unset($item['password']); + $userId = $request->user['id']; + $where = [ + 'id' => $id, + 'user_id' => $userId, + ]; + $res = Customer::where($where)->restore(); + if($res){ + return Util::success($res, trans('success')); + }else{ + return Util::fail([], trans('fail')); + } + } + + + /** + * 客户详情 + * @param Request $request + * @return \support\Response + */ + public function detail(Request $request) + { + $id = Util::getParam($request, 'id'); + if (Util::isEmpty($id)) { + return Util::fail([], '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(); + if ($res) { + $res->toArray(); + } else { + return Util::fail([], '记录不存在'); + } + + $res = Customer::getCustomer($res, $request, true); + + return Util::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 Util::fail([], trans('channel_not_null')); + } + $country_id = Util::getParam($request, 'country_id', 0); + if (Util::isEmpty($country_id)) { +// return Util::fail([],'country_id'.trans('not_null')); + } + $car_type_id = Util::getParam($request, 'car_type_id'); + if (Util::isEmpty($car_type_id)) { + return Util::fail([], 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 Util::fail([], trans('contacts_not_null')); + } + + $data = [ + 'user_id' => $request->user['id'], + '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), + ]; + + if (Util::isEmpty($id)) { + $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 Util::success($res, trans('save_success')); + } else { + return Util::fail($res, trans('save_fail')); + } + } + + + + /** + * 更新下次跟进时间 + * @param Request $request + * @return \support\Response + */ + public function followNext(Request $request) + { + $id = Util::getParam($request, 'id'); + if (Util::isEmpty($id)) { + return Util::fail([], '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 Util::success($res, trans('save_success')); + } else { + return Util::fail($res, 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['id']; + $where = [ + 'id' => $id, + 'user_id' => $userId, + ]; + $customer = Customer::where($where)->withTrashed()->first(); + if(empty($customer)){ + return Util::fail('', trans('fail')); + } + if($force == 'force'){ + $res = $customer->forceDelete(); + }else{ + $res = $customer->delete(); + } + if ($res) { + return Util::success($res, trans('success')); + } else { + return Util::fail($res, trans('fail')); + } + } + + /** + * 统计客户 + * @param Request $request + * @return \support\Response + */ + public function statistics(Request $request) + { + $created = Util::getParam($request, 'created'); + if (Util::isEmpty($created)) { + return Util::fail([], 'created' . trans('not_null')); + } + $userId = $request->user['id']; + $created_at = $request->user['created_at']; + $day = ceil((time() - $created_at + 1) / 60 / 60 / 24); + $where[] = ['user_id', '=', $userId]; + $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)->distinct('customer_id')->count(); + + //跟进数 + $whereVisit = $where; + $whereVisit[] = ['type', '=', 1]; + $follow = Follow::where($whereVisit)->distinct('customer_id')->count(); + + $res = [ + 'customer' => $customer, //客户数 + 'visit' => $visit, //拜访 + 'follow' => $follow, //跟进 + 'day' => $day, //注册天数 + 'customer_init' => $customerInit, //初步接触 + 'customero_fllow' => $customeroFllow, //跟进中 + 'customer_deal' => $customerDeal, //已成交 + ]; + if ($res) { + return Util::success($res, trans('success')); + } else { + return Util::fail($res, trans('fail')); + } + } + + /** + * 领取公海客户 + * @param Request $request + * @return \support\Response + */ + public function claim(Request $request) + { + $customerId = Util::getParam($request, 'customer_id'); + $userId = $request->user['id']; + if (Util::isEmpty($customerId)) { + return Util::fail([], trans('customer_id').trans('not_null')); + } + $data = [ + 'user_id' => $request->user['id'] + ]; + $customer= Customer::withTrashed()->find($customerId); + + if(empty($customer) || $customer->user_id != 0){ + return Util::fail('', trans('claim_fail')); + } + + $customer->restore(); + $res = $customer->update($data); + + //记录客户关系变化 + $his = CustomerHis::create([ + 'customer_id' => $customerId, + 'user_his' => 0, + 'user_id' => $userId, + ]); + + if ($res) { + return Util::success($res, trans('success')); + } else { + return Util::fail($res, trans('fail')); + } + } + + + + /** + * 批量转让 + * @param Request $request + * @return \support\Response + */ + public function cede(Request $request) + { + $customerId = Util::getParam($request, 'customer_id'); + $user_sn = Util::getParam($request, 'user_sn'); + $userId = $request->user['id']; + if (Util::isEmpty($user_sn)) { + return Util::fail([], 'ID'.trans('not_null')); + } + + $user = User::where(['sn' => $user_sn])->first(); + if (Util::isEmpty($user)) { + return Util::fail(null, trans('user_none')); + } + + if(Util::isEmpty($customerId)){ + $data = [ + 'user_id' => $userId + ]; + $query= Customer::where($data); + }else{ + $query= Customer::whereIn('id',explode(',',$customerId)); + } + $customer = $query->get(); + + foreach ($customer as $item) { + //记录客户关系变化 + $his = CustomerHis::create([ + 'customer_id' => $item->id, + 'user_his' => $item->user_id, + 'user_id' => $user['id'], + ]); + } + $res = $query->update(['user_id' => $user->id]); + + + if ($res) { + return Util::success($res, trans('success')); + } else { + return Util::fail($res, 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 Util::fail('', 'id' . trans('not_null')); + } + if (Util::isEmpty($id)) { + return Util::fail('', 'grade' . trans('not_null')); + } + $data = [ + 'grade' => $grade, + ]; + $res = Customer::where('id', $id) + ->update($data); + + if ($res) { + return Util::success($res, trans('save_success')); + } else { + return Util::fail($res, trans('save_fail')); } - return $this->success($user); } } \ No newline at end of file diff --git a/app/crm/model/Customer.php b/app/crm/model/Customer.php index c03d4ac..3935a79 100644 --- a/app/crm/model/Customer.php +++ b/app/crm/model/Customer.php @@ -9,6 +9,7 @@ use DateTimeInterface; use Illuminate\Support\Carbon; use support\Model; use Illuminate\Database\Eloquent\SoftDeletes; +use app\common\model\User; class Customer extends Model {