From 22e7db10534c0a87ee13787b9cd6e316ea789bc7 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Mon, 4 Aug 2025 11:17:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E8=BD=AC=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CustomerController.php | 46 ++++ app/crmAdmin/service/CustomerService.php | 218 ++++++++++-------- 2 files changed, 173 insertions(+), 91 deletions(-) diff --git a/app/crmAdmin/controller/CustomerController.php b/app/crmAdmin/controller/CustomerController.php index bc4b69d..6b3bb8a 100644 --- a/app/crmAdmin/controller/CustomerController.php +++ b/app/crmAdmin/controller/CustomerController.php @@ -99,4 +99,50 @@ class CustomerController extends BaseController } } + + /** + * 批量转让 + * @param Request $request + * @return \support\Response + */ + public function transfer(Request $request) + { + try { + $param = $request->all(); + if (empty($param['customer_id'])) { + return $this->error('customer_id'.trans('not_null')); + } + if (empty($param['user_id'])) { + return $this->error('user_id'.trans('not_null')); + } + + $result = (new CustomerService())->transfer($param); + + return $this->success($result); + } catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + } + + /** + * 客户详情 + * @param Request $request + * @return \support\Response + */ + public function detail(Request $request) + { + try { + $param = $request->all(); + if (empty($param['id'])) { + return $this->error('id'.trans('not_null')); + } + + $result = (new CustomerService())->detail($param); + + return $this->success($result); + } catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + } + } \ No newline at end of file diff --git a/app/crmAdmin/service/CustomerService.php b/app/crmAdmin/service/CustomerService.php index e5f1cf2..ac766ce 100644 --- a/app/crmAdmin/service/CustomerService.php +++ b/app/crmAdmin/service/CustomerService.php @@ -17,6 +17,7 @@ use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Style\Alignment; use PhpOffice\PhpSpreadsheet\Style\Border; use PhpOffice\PhpSpreadsheet\Style\Fill; +use support\Db; class CustomerService { @@ -32,7 +33,8 @@ class CustomerService * @param $export * @return Customer[]|\Illuminate\Contracts\Pagination\LengthAwarePaginator|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Eloquent\Collection[]|\Illuminate\Pagination\LengthAwarePaginator */ - public function search($params, $export = false){ + public function search($params, $export = false) + { // $page = $request->input('page', 1); // $perPage = $request->input('per_page', 10); @@ -50,10 +52,10 @@ class CustomerService if ($scene == 'audit') { $where[] = ['status', '=', 2]; - }else { + } else { $where[] = ['status', '=', 1]; } - if($seas == 'seas' || $scene == 'seas'){ + if ($seas == 'seas' || $scene == 'seas') { $where[] = ['user_id', 0]; } // if($recycle == 'recycle'){ @@ -80,18 +82,18 @@ class CustomerService $query = Customer::where($where); - if(!empty($user_id)){ - $query->whereIn('user_id', explode(',',$user_id)); + if (!empty($user_id)) { + $query->whereIn('user_id', explode(',', $user_id)); } - if(!empty($tagId)){ + if (!empty($tagId)) { //查询有$tagId 里任意一个标签的客户 //$query->whereHas('tags', function($query) use ($tagId){ // $query->whereIn ('tag.id', $tagId); //}); //查询有$tagId 里所有标签的客户 foreach ($tagId as $id) { - $query->whereHas('tags', function($query) use ($id){ + $query->whereHas('tags', function ($query) use ($id) { $query->where('tag.id', $id); }); } @@ -110,20 +112,20 @@ class CustomerService $query->onlyTrashed(); } - if(!$export){ - $customer = $query->orderBy('id','desc')->paginate($perPage, ['*'], 'page', $page); - }else{ - $customer = $query->orderBy('id','desc')->get(); + if (!$export) { + $customer = $query->orderBy('id', 'desc')->paginate($perPage, ['*'], 'page', $page); + } else { + $customer = $query->orderBy('id', 'desc')->get(); return $customer; } - if(!$export){ + if (!$export) { foreach ($customer as &$item) { $item = $this->getCustomer($item); - if($seas == 'seas' || $scene == 'seas'){ - $item['seas_time'] = time()-strtotime($item['deleted_at']); + if ($seas == 'seas' || $scene == 'seas') { + $item['seas_time'] = time() - strtotime($item['deleted_at']); } if ($scene == 'audit') { //审核时查询举报人姓名 - $customerHis = CustomerHis::where('customer_id',$item->id)->orderBy('id','desc')->first(['user_his']); + $customerHis = CustomerHis::where('customer_id', $item->id)->orderBy('id', 'desc')->first(['user_his']); $customer['user_name'] = empty($customerHis['user_his']) ? '' : User::find($customer['user_his'])->value('name'); } } @@ -136,31 +138,31 @@ class CustomerService public function export($params) { $customers = $this->search($params, true); - + // 创建新的Spreadsheet对象 $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); - - // 设置表头 - $headers = [ - 'A1' => '客户ID', - 'B1' => '联系人', - 'C1' => '电话', - 'D1' => '邮箱', - 'E1' => 'WhatsApp', - 'F1' => '性别', - 'G1' => '国家/地区', - 'H1' => '渠道来源', - 'I1' => '描述', - 'J1' => '所属人', - 'K1' => '录入人', - ]; - + + // 设置表头 + $headers = [ + 'A1' => '客户ID', + 'B1' => '联系人', + 'C1' => '电话', + 'D1' => '邮箱', + 'E1' => 'WhatsApp', + 'F1' => '性别', + 'G1' => '国家/地区', + 'H1' => '渠道来源', + 'I1' => '描述', + 'J1' => '所属人', + 'K1' => '录入人', + ]; + // 设置表头样式 foreach ($headers as $cell => $value) { $sheet->setCellValue($cell, $value); } - + // 设置表头样式 $headerStyle = [ 'font' => [ @@ -182,31 +184,31 @@ class CustomerService ], ], ]; - - $sheet->getStyle('A1:K1')->applyFromArray($headerStyle); - - // 填充数据 - $row = 2; - foreach ($customers as $customer) { - // 获取完整的客户信息 - $customerData = $this->getCustomer($customer); - - // 填充数据行 - $sheet->setCellValue('A' . $row, $customerData['id']); - $sheet->setCellValue('B' . $row, $customerData['contacts']); - $sheet->setCellValue('C' . $row, $customerData['phone']); - $sheet->setCellValue('D' . $row, $customerData['email']); - $sheet->setCellValue('E' . $row, $customerData['WhatsApp']); - $sheet->setCellValue('F' . $row, $customerData['sex_txt']); - $sheet->setCellValue('G' . $row, $customerData['country_name']); - $sheet->setCellValue('H' . $row, $customerData['channel_name']); - $sheet->setCellValue('I' . $row, $customerData['describe']); - $sheet->setCellValue('J' . $row, $customerData['user_name']); // 所属人姓名 - $sheet->setCellValue('K' . $row, $customerData['enter_user_name']); - - $row++; - } - + + $sheet->getStyle('A1:K1')->applyFromArray($headerStyle); + + // 填充数据 + $row = 2; + foreach ($customers as $customer) { + // 获取完整的客户信息 + $customerData = $this->getCustomer($customer); + + // 填充数据行 + $sheet->setCellValue('A' . $row, $customerData['id']); + $sheet->setCellValue('B' . $row, $customerData['contacts']); + $sheet->setCellValue('C' . $row, $customerData['phone']); + $sheet->setCellValue('D' . $row, $customerData['email']); + $sheet->setCellValue('E' . $row, $customerData['WhatsApp']); + $sheet->setCellValue('F' . $row, $customerData['sex_txt']); + $sheet->setCellValue('G' . $row, $customerData['country_name']); + $sheet->setCellValue('H' . $row, $customerData['channel_name']); + $sheet->setCellValue('I' . $row, $customerData['describe']); + $sheet->setCellValue('J' . $row, $customerData['user_name']); // 所属人姓名 + $sheet->setCellValue('K' . $row, $customerData['enter_user_name']); + + $row++; + } + // 设置数据行样式 $dataStyle = [ 'borders' => [ @@ -219,35 +221,35 @@ class CustomerService 'vertical' => Alignment::VERTICAL_CENTER, ], ]; - - $lastRow = $row - 1; - if ($lastRow >= 2) { - $sheet->getStyle('A2:K' . $lastRow)->applyFromArray($dataStyle); - } - - // 自动调整列宽 - foreach (range('A', 'K') as $column) { - $sheet->getColumnDimension($column)->setAutoSize(true); - } - + + $lastRow = $row - 1; + if ($lastRow >= 2) { + $sheet->getStyle('A2:K' . $lastRow)->applyFromArray($dataStyle); + } + + // 自动调整列宽 + foreach (range('A', 'K') as $column) { + $sheet->getColumnDimension($column)->setAutoSize(true); + } + // 设置行高 $sheet->getRowDimension(1)->setRowHeight(25); - + // 生成文件名 $filename = '客户数据_' . date('Y-m-d_H-i-s') . '.xlsx'; - + // 创建输出目录 $exportDir = runtime_path() . '/export/'; if (!is_dir($exportDir)) { mkdir($exportDir, 0755, true); } - + $filepath = $exportDir . $filename; - + // 创建Excel写入器 $writer = new Xlsx($spreadsheet); $writer->save($filepath); - + // 返回文件信息 return [ 'filename' => $filename, @@ -261,7 +263,8 @@ class CustomerService * @param $params * @return bool */ - public function audit($params){ + public function audit($params) + { $id = $params['id']; @@ -270,13 +273,45 @@ class CustomerService ]; $logic = new CustomerLogic(); - if($params['scene'] == 'delete'){ + if ($params['scene'] == 'delete') { return $logic->forceDelete($params['id']); - }else{ + } else { return $logic->status($params['id'], 1); } } + /** + * @param $params + * @return bool + */ + public function transfer($params) + { + try { + Db::beginTransaction(); + $customerId = $params['customer_id']; + $userId = $params['user_id']; + + $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' => $userId, + ]); + } + $res = $query->update(['user_id' => $userId]); + + Db::commit(); + return $res; + } catch (\Throwable $e) { + Db::rollback(); + throw $e; + } + } + /** * @param $customer * @param $request @@ -289,21 +324,21 @@ class CustomerService $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']]); - if ($customer['grade']<=2) { + if ($customer['grade'] <= 2) { $customer['follow'] = 0; - $customer['follow_txt'] = Util::language($language,'Following','跟进中','Продолжение'); - }elseif ($customer['grade']<5) { + $customer['follow_txt'] = Util::language($language, 'Following', '跟进中', 'Продолжение'); + } elseif ($customer['grade'] < 5) { $customer['follow'] = 1; - $customer['follow_txt'] = Util::language($language,'transacted','已成交','Транзакция завершена'); - }else{ + $customer['follow_txt'] = Util::language($language, 'transacted', '已成交', 'Транзакция завершена'); + } else { $customer['follow'] = 2; - $customer['follow_txt'] = Util::language($language,'lost','已流失','Потерянный'); + $customer['follow_txt'] = Util::language($language, 'lost', '已流失', 'Потерянный'); } $where = [ 'customer_id' => $customer['id'] ]; - $begin_follow = Follow::select('id','created_at','updated_at') + $begin_follow = Follow::select('id', 'created_at', 'updated_at') ->where($where) ->min('created_at'); @@ -312,12 +347,12 @@ class CustomerService // $customer['created_at'] = Util::timeTotDate($customer['created_at']); // $customer['updated_at'] = Util::timeTotDate($customer['updated_at']); - $customer = Util::formatDate($customer,['follow_last']); - $nameLang = $language=='en'?'name_en':($language=='ru'?'name_ru':'name'); - $countryLang = $language=='en'?'en_addr':'cn_addr'; + $customer = Util::formatDate($customer, ['follow_last']); + $nameLang = $language == 'en' ? 'name_en' : ($language == 'ru' ? 'name_ru' : 'name'); + $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['country_name'] = empty($customer['country_id'])?'':Country::where(['id'=>$customer['country_id']])->value($countryLang); - $customer['channel_name'] = empty($customer['channel_id'])?'':Channel::where(['id'=>$customer['channel_id']])->value($nameLang); + $customer['country_name'] = empty($customer['country_id']) ? '' : Country::where(['id' => $customer['country_id']])->value($countryLang); + $customer['channel_name'] = empty($customer['channel_id']) ? '' : Channel::where(['id' => $customer['channel_id']])->value($nameLang); // $customer['last_follow'] = $last_follow; if ($tag) { @@ -336,10 +371,11 @@ class CustomerService public function detail($params) { - $id =$params['id']; - $customer = 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') + $id = $params['id']; + $customer = Customer::with('tags') ->where('id', $id) ->first(); + $customer = $this->getCustomer($customer); return $customer; }