Ejemplo n.º 1
0
 private function _find_duplicate(Group_Contact $contact)
 {
     /*1.联系人姓名相同,且有一个手机号码相同的,判断为同一个联系人,
       	自动进行合并处理,合并时需要判断好友关系、公司、部门、职位、生日、
      		昵称、头像这几个信息是否有冲突,如果没有冲突则可以合并两个联系人
       */
     $same_name_tel_tag = new Group_Contact();
     $same_name_tel_tag->set_group_id($contact->get_group_id())->set_formatted_name($this->name_to_formatted_name($contact->get_family_name(), $contact->get_given_name()))->set_tels($contact->get_tels());
     $result = $this->group_contact_mapper->find_by_tags($same_name_tel_tag);
     if (!empty($result)) {
         //冲突检测
         foreach ($result as $id) {
             $find_contact = $this->find_by_id($contact->get_group_id(), $id);
             if ($find_contact->merge($contact)) {
                 return $find_contact;
             }
         }
     }
     return FALSE;
     /*
     //2 两个联系人中有Email、IM、电话号码相同,其中一个没有姓名,在其他信息没有冲突情况下,可以合并 
     $same_email_tag = new Contact();
     $same_email_tag->set_user_id($contact->get_user_id())
         ->set_emails($contact->get_emails());
     $result = $this->contact_mapper->find_by_tags($same_email_tag);
     if (! empty($result)) {
         //冲突检测
         foreach ($result as $id) {
             $find_contact = $this->get($contact->get_user_id(), $id);
             if ($find_contact->merge($contact, $is_append)) {
                 return $find_contact;
             }
         }
     }
     
     //3 所有信息完全相同的联系人,可以合并
     $all_same_tag = new Contact();
     $all_same_tag->set_user_id($contact->get_user_id());
     $contact_array = $contact->to_array();
     foreach ($contact_array as $key => $value) {
         if (! in_array($key, array('tels', 'emails', 'ims')) and
          ! empty($value)) {
             call_user_func(array($all_same_tag, 'set_' . $key), $value);
         }
     }
     $result = $this->contact_mapper->find_by_tags($all_same_tag);
     if (! empty($result)) {
         //冲突检测
         foreach ($result as $id) {
             $find_contact = $this->get($contact->get_user_id(), $id);
             if ($contact_array == array_intersect_assoc(
             $find_contact->to_array(), $contact_array)) {
                 return $find_contact;
             }
         }
     }
     return FALSE;
     */
 }
Ejemplo n.º 2
0
 /**
  * 合并重复的联系人
  * @param Contact $contact   联系人对象
  * @param bool $is_append 是否新增数据
  * @return Contact|bool
  */
 private function _merge_duplicate_contact(Contact $contact, &$is_append)
 {
     $formatted_name = Contact_Helper::name_to_formatted_name($contact->get_family_name(), $contact->get_given_name(), $contact->get_prefix(), $contact->get_middle_name(), $contact->get_suffix());
     /*  1.联系人姓名相同,且有一个手机号码相同的,判断为同一个联系人,
     			自动进行合并处理,合并时需要判断好友关系、公司、部门、职位、生日、
     	        昵称、头像这几个信息是否有冲突,如果没有冲突则可以合并两个联系人
     		*/
     if (!empty($formatted_name)) {
         $same_name_tel_tag = new Contact();
         $same_name_tel_tag->set_user_id($contact->get_user_id())->set_formatted_name($formatted_name);
         $result = $this->contact_mapper->find_by_tags($same_name_tel_tag);
         if (!empty($result)) {
             //冲突检测
             foreach ($result as $id) {
                 if (!in_array($id, $this->changed_ids)) {
                     $find_contact = $this->get($contact->get_user_id(), $id);
                 } else {
                     $find_contact = $this->find_by_id($contact->get_user_id(), $id);
                 }
                 if ($find_contact !== FALSE) {
                     //比较、合并失败进行下一项比较,不退出
                     if ($this->compare_info($contact->get_tels(), $find_contact->get_tels()) or $this->compare_info($contact->get_emails(), $find_contact->get_emails()) or $this->compare_info($contact->get_ims(), $find_contact->get_ims()) or $this->compare_info($contact->get_urls(), $find_contact->get_urls())) {
                         //比较电话、邮箱、IM、网址看是否有交集
                         if ($find_contact->merge($contact, $is_append)) {
                             return $find_contact;
                         }
                     } elseif (!$contact->get_tels() and !$contact->get_emails() and !$contact->get_ims() and !$contact->get_urls()) {
                         //3 所有信息完全相同的联系人,可以合并
                         $contact_array = $contact->to_array();
                         //去除联系人的ID、创建时间、修改时间、来源、分组、自定义字段,姓名只比较全名后比较是否完全相同
                         unset($contact_array['id'], $contact_array['created_at'], $contact_array['modified_at'], $contact_array['category'], $contact_array['source'], $contact_array['customs'], $contact_array['given_name'], $contact_array['family_name'], $contact_array['middle_name'], $contact_array['prefix'], $contact_array['suffix']);
                         $find_contact_array = array_intersect_key($find_contact->to_array(), $contact_array);
                         list($new_md5, $curr_md5) = Photo_Controller::getoriginmd5(array($contact_array['avatar'], $find_contact_array['avatar']));
                         if (empty($contact_array['avatar']) or $contact_array['avatar'] == $find_contact_array['avatar'] or $new_md5 == $curr_md5) {
                             unset($contact_array['avatar'], $find_contact_array['avatar']);
                             if ($contact_array == $find_contact_array) {
                                 return $find_contact;
                             }
                         }
                     }
                 }
             }
         }
     }
     //2 两个联系人中有Email、IM、电话号码相同,其中一个没有姓名,在其他信息没有冲突情况下,可以合并
     $tels = $contact->get_tels();
     $emails = $contact->get_emails();
     $ims = $contact->get_ims();
     if (!empty($tels) or !empty($emails) or !empty($ims)) {
         $ids = array();
         if (!empty($tels)) {
             $ids = array_merge($ids, $this->contact_mapper->get_id_by_info($contact->get_user_id(), 'tels', $tels));
         }
         if (empty($ids) and !empty($emails)) {
             $ids = array_merge($ids, $this->contact_mapper->get_id_by_info($contact->get_user_id(), 'emails', $emails));
         }
         if (empty($ids) and !empty($ims)) {
             $ids = array_merge($ids, $this->contact_mapper->get_id_by_info($contact->get_user_id(), 'ims', $ims));
         }
         foreach ($ids as $id) {
             $find_contact = $this->get($contact->get_user_id(), $id);
             if ($find_contact !== FALSE and $find_contact->merge($contact, $is_append)) {
                 return $find_contact;
             }
         }
     }
     //空名字,主要信息为空,存在信息完全相同的联系人不处理
     /*
     if (empty($formatted_name))
     {
     	$same_name_tel_tag = new Contact();
     	$same_name_tel_tag->set_user_id($contact->get_user_id())->set_formatted_name(
     		$formatted_name
     	);
     	$result = $this->contact_mapper->find_by_tags(
     		$same_name_tel_tag,
     		empty($formatted_name) ? TRUE : FALSE
     	);
     	if (! empty($result))
     	{
     		//冲突检测
     		foreach ($result as $id)
     		{
     			$find_contact = $this->get($contact->get_user_id(), $id);
     			if ($find_contact !== FALSE)
     			{
     				//3 所有信息完全相同的联系人,可以合并
     				$contact_array = $contact->to_array();
     				//去除联系人的ID、创建时间、修改时间后比较是否完全相同
     				unset($contact_array['id'],
     				$contact_array['created_at'],
     				$contact_array['modified_at'], $contact_array['health']);
     				$find_contact_array = array_intersect_assoc(
     					$find_contact->to_array(), $contact_array
     				);
     				list ($new_md5, $curr_md5) = Photo_Controller::getoriginmd5(
     					array(
     					     $contact_array['avatar'],
     					     $find_contact_array['avatar']
     					)
     				);
     				if (empty($contact_array['avatar']) or $contact_array['avatar'] ==
     					$find_contact_array['avatar'] or $new_md5 == $curr_md5
     				)
     				{
     					unset($contact_array['avatar'], $find_contact_array['avatar']);
     					if ($contact_array == $find_contact_array)
     					{
     						return $find_contact;
     					}
     				}
     			}
     		}
     	}
     }
     */
     return FALSE;
 }