run_task(); return 0; } /** * 执行任务 * * */ public function run_task(){ // 实例 $Model = New Model(); // 获取数据 $taskList = $Model->getList(); // 如果没有任务列表,结束 if( !$taskList ) return ['error'=>'无待执行任务']; // 如果没有任务列表,结束 $task = array_pop($taskList); // 返回结果 if( !$task ) return ['error'=>'无待执行任务']; // 异步锁上锁,失败结束 if( !RedisLock::lock('work:sync:task:id',$task['id'],'180') ) return ['error'=>'任务执行中...']; // 获取接待人员 $userIdList = ExternalContact::getFollowUsers(); // 如果没有成员ID列表,结束 if( !$userIdList ) { // 解锁 RedisLock::unlock('work:sync:task:id',$task['id']); // 无需同步 return ['error'=>'未获取到跟进人员']; } // 获取游标 $cursor = $task['cursor']; // 批量获取客户详情 $extUserList = ExternalContact::batchGetByUser($userIdList,$cursor,100); // 如果没有客户列表,结束 if( !$extUserList ) { // 解锁 RedisLock::unlock('work:sync:task:id',$task['id']); // 结束 return ['error'=>'未获取到外部联系人']; } // 实例其他模型 $CustomModel = New Custom(); $WorkExternalModel = New WorkExternal(); $WorkUserModel = New WorkUser(); $WorkTagModel = New WorkTag(); // 下一页游标 $task['cursor'] = $extUserList['next_cursor']; // 外部联系人列表 $extUserList = $extUserList['external_contact_list']; // 更新的数据 $extUsers = []; $followUsers = []; $followTags = []; // 时间 $time = time(); // 循环处理 foreach ( $extUserList as $key=>$value ) { // 外部联系人 $extUser = []; $extUser['name'] = $value['external_contact']['name']; $extUser['avatar'] = str_ireplace('http://','https://',$value['external_contact']['avatar']); $extUser['gender'] = $value['external_contact']['gender']; $extUser['work_type'] = $value['external_contact']['type']; $extUser['external_userid'] = $value['external_contact']['external_userid']; $extUser['insert_time'] = $time; $extUser['update_time'] = $time; // 处理外部联系人 $extUsers[] = $extUser; // 跟进客服 $followUser = []; $followUser['external_userid'] = $extUser['external_userid']; $followUser['work_userid'] = $value['follow_info']['userid']; $followUser['remark'] = $value['follow_info']['remark']; $followUser['description'] = $value['follow_info']['description']; $followUser['insert_time'] = $time; $followUser['update_time'] = $time; $followUser['remark_mobiles'] = implode(',',$value['follow_info']['remark_mobiles']); $followUser['remark_company'] = empty($value['external_contact']['corp_name'])? (empty($value['follow_info']['remark_corp_name']) ? '' : $value['follow_info']['remark_corp_name']) : $value['external_contact']['corp_name']; $followUsers[] = $followUser; // 跟进人员标签组合 foreach ( $value['follow_info']['tag_id'] as $tagId ) { // 重组 $followTags[] = ['tag_id'=>$tagId,'external_userid'=>$followUser['external_userid'],'work_userid'=>$followUser['work_userid'],'update_time'=>$time]; } // 跟进人员是否备注手机号 $extUser['phone'] = $value['follow_info']['remark_mobiles'] ? $value['follow_info']['remark_mobiles'][0] : ''; // 重组数据 $extUserList[$key] = $extUser; } // 标签写入 if( $followTags ) $WorkTagModel->query()->insert($followTags); // 需要更新的数据 $WorkExternalModel->query()->upsert($extUsers,'external_userid',['name','avatar','gender','work_type','update_time']); // 需要更新的数据 $WorkUserModel->query()->upsert($followUsers,['external_userid','work_userid'],['remark','description','remark_mobiles','remark_company','update_time']); // 获取外部联系人ID,并去重 $customIds = array_values(array_unique(array_filter(array_column($extUserList,'external_userid')))); // 获取外部联系人ID,并去重 $customPhones = array_values(array_unique(array_filter(array_column($extUserList,'phone')))); // 查询客户表中是否存在该客户 $customIds = $customIds ? $WorkExternalModel->getPluckInFiled('external_userid',$customIds,'custom_uid','external_userid') : []; // 获取 $customPhones = $customPhones ? $CustomModel->getPluckInFiled('phone',$customPhones,'external_userid','phone') : []; // 循环处理 foreach ( $extUserList as $value ) { // 不存在外部联系人账号的跳过 if( !isset($customIds[$value['external_userid']]) ) continue; // 存在在外部联系人账号但是绑定了账号的跳过 if( $customIds[$value['external_userid']] ) continue; // 不存在手机号,跳过 if( !$value['phone'] ) continue; // 如果绑定了其他外部联系人 if( !empty($customPhones[$value['phone']]) ) continue; // 账号UID默认 $uid = 0; // 账号未注册 if( !isset($customPhones[$value['phone']]) ) { // 注册账号 $uid = $CustomModel->add(['phone'=>$value['phone'],'username'=>$value['name'],'userpic'=>$value['avatar'],'sex'=>$value['gender'],'external_userid'=>$value['external_userid']]); // 注册失败, if( !$uid ) continue; }else{ // 已经注册的,未绑定外部联系人 if( !$customPhones[$value['phone']] ) { // 查询号码 $custom = $CustomModel->getOneByPhone($value['phone']); // 没有账号,跳过 if( !$custom ) continue; // 账号存在跳过 if( $custom['external_userid'] ) { // 避免重复注册 $customPhones[$value['phone']] = $custom['external_userid']; continue; } // 账号UID $uid = $custom['uid']; } } // 避免重复注册 $customPhones[$value['phone']] = $value['external_userid']; // 修改 $result = $uid ? $WorkExternalModel->query()->where([['external_userid','=',$value['external_userid']]])->update(['custom_uid'=>$uid,'update_time'=>$time]) : true; // 如果修改失败 if( !$result ) continue; // 同步数量 +1 $task['sync_total'] += 1; } // 如果没有下一页游标,标记任务完成 if( !$task['cursor'] ) $task['status'] = 1; // 修改任务情况 $Model->edit($task['id'],$task); // 解锁 RedisLock::unlock('work:sync:task:id',$task['id']); } }