attempts() > 2) { $job->delete(); } $is_done = $this->jobDone($queuedata); if($is_done){ $job->delete(); } else { // 导入过程失败 $log = CrmRemoveImportLog::where('id', $queuedata['id'])->find(); $tmp_file = $log['tmp_path']; if (file_exists($tmp_file)) { unlink($tmp_file); } $log->tmp_path = ''; $log->status = 3; $log->save(); $job->delete(); } } catch (OssException $e) { //报错直接结束 $job->delete(); } } public function failed($queuedata) { // ...任务达到最大重试次数后,失败了 } // 导入 private function jobDone($data){ $log_id = $data['id']; $new_queue = false; $log = CrmRemoveImportLog::where('id', $log_id)->findOrEmpty(); if ($log->isEmpty()) { return false; } if ($log['status'] == 2) { return true; } if (empty($log['tmp_path'])) { // 开始导入 $ali_oss_bindurl = config('app.ali_oss_bindurl'); $path = 'https://' . $ali_oss_bindurl . '/' . $log['path']; // 抓取远程Excel文件的内容 try { $content = file_get_contents($path); if (!$content) { return false; } } catch (\Exception $e) { return false; } // 保存Excel文件到本地临时文件 $run_path = runtime_path(); $tmp_file = tempnam($run_path, 'PHPExcel'); file_put_contents($tmp_file, $content); $log->tmp_path = $tmp_file; $log->save(); } else { $tmp_file = $log['tmp_path']; } //实例化PHPExcel类 $reader = IOFactory::createReader('Xlsx'); if (!$reader->canRead($tmp_file)) { Log::record('-------------')->save(); Log::record('file canRead false')->save(); Log::record('-------------')->save(); return false; } $rows = 20; if ($log['execute_rows'] == 0) { $start_rows = 1; } else { $start_rows = $log['execute_rows']; } $end_rows = $start_rows + $rows; $MyReadFilter = new MyreadFilter($start_rows, $end_rows); $reader->setReadFilter($MyReadFilter); $reader->setReadDataOnly(true); $objPHPExcel = $reader->load($tmp_file); $sheet = $objPHPExcel->getSheet(0); //excel中的第一张sheet $highestRow = $sheet->getHighestRow(); // 取得总行数 $highestColumn = $sheet->getHighestColumn(); // 取得总列数 \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn); $lines = $highestRow - 1; $end = true; $root_id = $log['root_id']; if ($lines > 0) { //客户来源扩展字段 $source = CustomerSource::where(['root_id'=> $root_id])->column('id','source'); //员工 $employee_list = Employee::where([['root_id', '=', $root_id], ['uid', '>', 0], ['state', '=', '在职']])->field('id,name,uid,org_id,root_id,phone')->select()->toArray(); $employee = []; foreach ($employee_list as $k => $v) { if ($v['phone']) { $employee[$v['phone']] = $v; } } $datas = []; $j = $start_rows + 1; for ($j; $j <= $highestRow; $j++) { $date_check = ['K', 'O', 'P', 'Q', 'R', 'S', 'T', 'V', 'X', 'Y']; $date_value = []; foreach ($date_check as $v) { try { $get_value = $objPHPExcel->getActiveSheet()->getCell($v . $j)->getValue(); if (empty($get_value)) { $date_value[$v] = ''; continue; } if ($v !== "O") { $date_value[$v] = gmdate('Y-m-d H:i:s', PHPExcel_Shared_Date::ExcelToPHP($get_value)); } else { $date_value[$v] = gmdate('Y-m-d', PHPExcel_Shared_Date::ExcelToPHP($get_value)); } } catch (\Exception $e) { $date_value[$v] = ''; } } $datas[] = [ 'employee_name' => trim($objPHPExcel->getActiveSheet()->getCell("A" . $j)->getValue()), 'employee_phone' => trim($objPHPExcel->getActiveSheet()->getCell("B" . $j)->getValue()), 'name' => trim($objPHPExcel->getActiveSheet()->getCell("C" . $j)->getValue()), 'sex' => trim($objPHPExcel->getActiveSheet()->getCell("D" . $j)->getValue()), 'phone' => trim($objPHPExcel->getActiveSheet()->getCell("E" . $j)->getValue()), 'level' => trim($objPHPExcel->getActiveSheet()->getCell("F" . $j)->getValue()), 'community_name' => trim($objPHPExcel->getActiveSheet()->getCell("G" . $j)->getValue()), 'square' => trim($objPHPExcel->getActiveSheet()->getCell("H" . $j)->getValue()), 'housetype_arrow' => trim($objPHPExcel->getActiveSheet()->getCell("I" . $j)->getValue()), 'follow' => trim($objPHPExcel->getActiveSheet()->getCell("J" . $j)->getValue()), 'addtime' => !empty($date_value["K"]) ? $date_value["K"] : date('Y-m-d H:i:s'), 'age_range' => trim($objPHPExcel->getActiveSheet()->getCell("L" . $j)->getValue()), 'source' => trim($objPHPExcel->getActiveSheet()->getCell("M" . $j)->getValue()), 'state' => trim($objPHPExcel->getActiveSheet()->getCell("N" . $j)->getValue()), 'add_wechat_time' => !empty($date_value["O"]) ? $date_value["O"] : null, 'valid_time' => !empty($date_value["P"]) ? $date_value["P"] : null, 'daodian_time' => !empty($date_value["Q"]) ? $date_value["Q"] : null, 'liangfang_time' => !empty($date_value["R"]) ? $date_value["R"] : null, 'daochang_time' => !empty($date_value["S"]) ? $date_value["S"] : null, 'qiandan_time' => !empty($date_value["T"]) ? $date_value["T"] : null, 'qiandan_money' => trim($objPHPExcel->getActiveSheet()->getCell("U" . $j)->getValue()), 'zhuandan_time' => !empty($date_value["V"]) ? $date_value["V"] : null, 'zhuandan_money' => trim($objPHPExcel->getActiveSheet()->getCell("W" . $j)->getValue()), 'maika_time' => !empty($date_value["X"]) ? $date_value["X"] : null, 'wuxiao_time' => !empty($date_value["Y"]) ? $date_value["Y"] : null, 'row'=> $j ]; } //error 手机号错误数量 repeat 手机号重复数量 $rs = ['ok' => 0, 'error' => 0, 'repeat' => 0]; $error = []; $portrait_field = CustomerPortraitField::with('select')->where([['root_id', '=', $root_id], ['keyname', 'in', ['housetype_arrow', 'wechat', 'follow', 'add_wechat_time']]])->select()->toArray(); $save_data = []; $wx_state = CustomerVisitLog::changeState('无效', 'n'); $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); foreach ($datas as $k => $v) { if(isset($employee[$v['employee_phone']])) { $employee_id = $employee[$v['employee_phone']]['id']; $one_cus = []; $one_log = []; $one_cus['phone1'] = $one_cus['phone2'] = ''; ////2023-02-15 修改手机号可以输入多个 $s = true; $ls_phone = explode('、', $v['phone']); if(!empty($ls_phone) && is_array($ls_phone)){ $p = 0; foreach ($ls_phone as $k2 => $v2) { if ($this->checkphone($v2)) { $field = $p ? 'phone'.$p : 'phone'; $one_cus[$field] = $aec->encrypt($v2); $p+=1; } if($p>2) break;//只取三个有效手机号 } if($p>0) $s = false; } if($s){ $rs['error']++; $one_error['rows'] = $v['row']; $one_error['type'] = 2; // 1、员工不存在 2、手机号格式错误 $one_error['phone'] = $v['phone']; $error[] = $one_error; continue; } // 手机号验重 $encrypt_phone = $one_cus['phone']; $is_have = Customer::where([['employee_id', '=', $employee_id], ['phone', '=', $encrypt_phone]])->findOrEmpty(); if (!$is_have->isEmpty()) { $rs['error']++; $one_error['rows'] = $v['row']; $one_error['type'] = 3; // 1、员工不存在 2、手机号格式错误 3、手机号重复 $one_error['phone'] = $v['phone']; $error[] = $one_error; continue; } // 来源判断处理 $source_id = 0; if (!empty($v['source'])) { if (!isset($source[$v['source']])) { $source_id = CustomerSource::insertGetId(['source'=> $v['source'], 'root_id'=> $root_id]); $source[$v['source']] = $source_id; } else { $source_id = $source[$v['source']]; } } // 数据处理 $one_cus['employee_id'] = $employee_id; $one_cus['name'] = $v['name']; $one_cus['sex'] = $v['sex']; $one_cus['level'] = in_array($v['level'], ['A', 'B', 'C', 'D']) ? $v['level'] : ''; $one_cus['community_name'] = $v['community_name']; $one_cus['square'] = $v['square']; $one_cus['community_name'] = $v['community_name']; $state = Customer::changeState($v['state'], 'n'); $one_cus['state'] = $state ? $state : 0; $one_cus['org_id'] = $employee[$v['employee_phone']]['org_id']; $one_cus['bad_phone'] = 0; $one_cus['source_id'] = $source_id; $one_cus['addtime'] = date('Y-m-d H:i:s', strtotime($v['addtime'])); $one_cus['age_range'] = $v['age_range']; $one_cus['deposit_money'] = $v['qiandan_money'] ? $v['qiandan_money'] : 0; $one_cus['signed_money'] = $v['zhuandan_money'] ? $v['zhuandan_money'] : 0; // 标记有效时间 if ($v['valid_time']) { $one_cus['valid_time'] = $v['valid_time']; } else { // 如果没填写有效时间 $min_valid_time = ''; $time_field = ['daodian_time', 'liangfang_time', 'daochang_time', 'qiandan_time', 'zhuandan_time']; foreach ($time_field as $t) { if (empty($v[$t])) { continue; } if (empty($min_valid_time)) { $min_valid_time = $v[$t]; } elseif (strtotime($v[$t]) < strtotime($min_valid_time)) { $min_valid_time = $v[$t]; } } if ($min_valid_time) { $one_cus['valid_time'] = $min_valid_time; } } $youxiao = false; // 当前状态是待确认 $now_state = $one_cus['state']; if ($now_state == 0) { $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> CustomerVisitLog::changeState('待确认', 'n'), 'addtime'=> date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; } elseif ($now_state == 7) { // 无效状态清空员工 $one_cus['employee_id'] = null; } // 到店记录 $dd_state = CustomerVisitLog::changeState('已到店', 'n'); if (!empty($v['daodian_time']) || $now_state == $dd_state) { $youxiao = true; $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $dd_state, 'addtime'=> !empty($v['daodian_time']) ? $v['daodian_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['daodian_time']) ? $v['daodian_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; } // 量房记录 $lf_state = CustomerVisitLog::changeState('已量房', 'n'); if (!empty($v['liangfang_time']) || $now_state == $lf_state) { $youxiao = true; $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $lf_state, 'addtime'=> !empty($v['liangfang_time']) ? $v['liangfang_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['liangfang_time']) ? $v['liangfang_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; } // 到场记录 $dc_state = CustomerVisitLog::changeState('已到场', 'n'); if (!empty($v['daochang_time']) || $now_state == $dc_state) { $youxiao = true; $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $dc_state, 'addtime'=> !empty($v['daochang_time']) ? $v['daochang_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['daochang_time']) ? $v['daochang_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; } // 签单记录 $qd_state = CustomerVisitLog::changeState('已交定', 'n'); if (!empty($v['qiandan_time']) || $now_state == $qd_state) { $youxiao = true; $qiandan_money = 0; if (!empty($v['qiandan_money'])) { $qiandan_money = $v['qiandan_money']; } $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $qd_state, 'addtime'=> !empty($v['qiandan_time']) ? $v['qiandan_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['qiandan_time']) ? $v['qiandan_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'], 'money'=> $qiandan_money ]; } // 转单记录 $zd_state = CustomerVisitLog::changeState('已签单', 'n'); if (!empty($v['zhuandan_time']) || $now_state == $zd_state) { $youxiao = true; $zhuandan_money = 0; if (!empty($v['zhuandan_money'])) { $zhuandan_money = $v['zhuandan_money']; } $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $zd_state, 'addtime'=> !empty($v['zhuandan_time']) ? $v['zhuandan_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['zhuandan_time']) ? $v['zhuandan_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'], 'money'=> $zhuandan_money ]; } // 卖卡记录 $mk_state = CustomerVisitLog::changeState('已卖卡', 'n'); if (!empty($v['maika_time']) || $now_state == $mk_state) { $youxiao = true; $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $mk_state, 'addtime'=> !empty($v['maika_time']) ? $v['maika_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['maika_time']) ? $v['maika_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; } // 无效记录 if (!empty($v['wuxiao_time']) || $now_state == $wx_state) { $one_log[] = [ 'type'=> '', 'employee_id'=> $employee_id, 'user_id'=> $employee[$v['employee_phone']]['uid'], 'state'=> $wx_state, 'addtime'=> !empty($v['wuxiao_time']) ? $v['wuxiao_time'] : date('Y-m-d H:i:s'), 'confirm_date'=> !empty($v['wuxiao_time']) ? $v['wuxiao_time'] : date('Y-m-d H:i:s'), 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'customer_employee_id'=> $employee_id, 'customer_org_id'=> $employee[$v['employee_phone']]['org_id'] ]; $inv_log = [ 'employee_id'=> $employee_id, 'designer_id'=> 0, 'org_id'=> $employee[$v['employee_phone']]['org_id'], 'root_id'=> $employee[$v['employee_phone']]['root_id'], 'cus_addtime'=> $one_cus['addtime'], 'source_id'=> $one_cus['source_id'], 'status'=> $youxiao ? 1 : 2 ]; if ($one_cus['valid_time']) { $inv_log['valid_time'] = $one_cus['valid_time']; } } $ext = []; // 扩展字段 户型、装修关注点、是否加微 foreach ($portrait_field as $kk => $vv) { switch ($vv['keyname']) { case 'housetype_arrow': $house_type_val = 0; if (!empty($vv['select'])) { foreach ($vv['select'] as $vvv) { if ($vvv['name'] == $v['housetype_arrow']) { $house_type_val = $vvv['id']; } } } if ($house_type_val) { $ext[] = ['id'=> $vv['id'], 'keyname'=> 'housetype_arrow', 'value'=> (string)$house_type_val]; } break; case 'wechat': if (!empty($v['add_wechat_time'])) { $have_wechat_val = ['是', '有']; $have_wechat = 0; if (!empty($vv['select'])) { foreach ($vv['select'] as $vvv) { if (in_array($vvv['name'], $have_wechat_val)) { $have_wechat = $vvv['id']; } } } if ($have_wechat) { $ext[] = ['id'=> $vv['id'], 'keyname'=> 'wechat', 'value'=> (string)$have_wechat]; } } break; case 'add_wechat_time': if (!empty($v['add_wechat_time'])) { $ext[] = ['id'=> $vv['id'], 'keyname'=> 'add_wechat_time', 'value'=> (string)$v['add_wechat_time']]; } break; case 'follow': $follow_list = explode('、', $v['follow']); $follow_ids = []; if (!empty($vv['select'])) { foreach ($vv['select'] as $vvv) { if (in_array($vvv['name'], $follow_list)) { $follow_ids[] = $vvv['id']; } } } if (!empty($follow_ids)) { $ext[] = ['id'=> $vv['id'], 'keyname'=> 'follow', 'value'=> implode(',', $follow_ids)]; } break; default: break; } } $one_cus['ext'] = $ext ? json_encode($ext) : NULL; $one['customer'] = $one_cus; $one['log'] = $one_log; $save_data[] = $one; $rs['ok']++; } else { $rs['error']++; $one_error['rows'] = $v['row']; $one_error['type'] = 1; // 1、员工不存在 2、手机号格式错误 $one_error['phone'] = $v['phone']; $error[] = $one_error; } } Db::startTrans(); try { foreach ($save_data as $k => $v) { $customer_id = Customer::insertGetId($v['customer']); if (!empty($v['log'])) { foreach($v['log'] as $v_log){ $v_log['customer_id'] = $customer_id; $res_id = CustomerVisitLog::insertGetId($v_log); if (!empty($inv_log) && $v_log['state'] == $wx_state) { $inv_log['customer_id'] = $customer_id; $inv_log['visitlog_id'] = $res_id; CustomerInvalidLog::create($inv_log); } } } $log_customer['log_id'] = $log_id; $log_customer['customer_id'] = $customer_id; $log_customer['root_id'] = $root_id; CrmRemoveCustomer::create($log_customer); } Db::commit(); } catch (\Exception $e) { trace($e->getMessage(), 'error'); // 回滚事务 Db::rollback(); return false; } // 执行记录 $excute_log['log_id'] = $log_id; $excute_log['employee_id'] = $log['employee_id']; $excute_log['start_rows'] = $start_rows; $excute_log['end_rows'] = $end_rows; $excute_log['error_count'] = count($error); $excute_log['content'] = $error ? json_encode($error) : null; CrmRemoveRecord::create($excute_log); if ($log['status'] == 0) { $log->status = 1; } $log->count = $log['count'] + count($datas); $log->avaliable_count = $log['avaliable_count'] + $rs['ok']; $log->bad_phone_num = $log['bad_phone_num'] + $rs['error']; $log->execute_rows = $highestRow; $log->save(); if (count($datas) > 0) { $end = false; } else { $log->tmp_path = ''; $log->status = 2; $log->save(); if (file_exists($tmp_file)) { unlink($tmp_file); } } } else { $log->tmp_path = ''; $log->status = 2; $log->save(); if (file_exists($tmp_file)) { unlink($tmp_file); } } if($lines == $rows) { $end = false; } if (!$end) { $new_queue = true; } if ($new_queue == true) { $jobHandlerClassName = 'app\jobs\CrmRemove'; $jobQueueName = 'crm_remove'; $orderData = ['id'=> $log_id]; //这个是需要传到消费者的数据 Queue::later(0, $jobHandlerClassName, $orderData, $jobQueueName); } return true; } private function checkphone($value) { if (preg_match("/^1[356789]\d{9}$/", $value)) { return true; } else { return false; } } }