import json from celery.utils.log import get_task_logger from django.utils import timezone from pingcap_sso.celery import app as celery_app from pingcap_sso.models import ( FXCRMLeads, PartnerCompatibilityCertification, ) from pingcap_sso.lib.crm import ( get_fxiaoke_crm_access_token, sync_leads_to_fxiaoke_crm, sync_custom_object_to_fxiaoke_crm, upload_file_to_fxiaoke_crm, sync_approved_partner_compatibility_certification_from_fxiaoke_crm, sync_review_status_from_fxiaoke_crm, ) logger = get_task_logger(__name__) @celery_app.task def create_sales_leads_in_fxiaoke_crm(leads_id): try: leads = FXCRMLeads.objects.get(id=leads_id) except FXCRMLeads.DoesNotExist: logger.error(f'FXCRMLeads (id: {leads_id}) not found') return if leads.sync_status == FXCRMLeads.SYNC_STATUS_SUCCESS: logger.info(f'FXCRMLeads (id: {leads_id}) already synced') return crm_object = { 'dataObjectApiName': 'LeadsObj', 'field_5yh1e__c': leads.leads_type, # 线索类型 'leads_pool_id': leads.leads_poll_id, # 线索池 'source': leads.source_code, # 来源 'tel': leads.phone, # 手机 'name': leads.name or '无', # 姓名 } def _update_crm_object(crm_api_name, value, max_length=None): if value: if isinstance(value, str): value = value or '' if max_length: value = value[:max_length] crm_object[crm_api_name] = value _update_crm_object('field_Pc954__c', leads.leads_stage_code) _update_crm_object('field_T99qZ__c', leads.mark_mql_at_str) _update_crm_object('email', leads.email) _update_crm_object('company', leads.company, max_length=100) _update_crm_object('address', leads.address, max_length=400) _update_crm_object('field_l418a__c', leads.user_id) _update_crm_object('field_nabCI__c', leads.username) _update_crm_object('field_o5R5l__c', leads.wechat_id) _update_crm_object('field_zD1qn__c', leads.member_range_code) _update_crm_object('field_f20bn__c', leads.industry_type_code) _update_crm_object('field_Zoxhc__c', leads.customer_type_code) _update_crm_object('field_ZMxG2__c', leads.consult_category_code) _update_crm_object('field_2CtMr__c', leads.job_title_code) _update_crm_object('field_zviK8__c', leads.cql_code) _update_crm_object('utm_medium__c', leads.utm_medium) _update_crm_object('utm_source__c', leads.utm_source) _update_crm_object('utm_campaign__c', leads.utm_campaign) _update_crm_object('utm_term__c', leads.utm_term) _update_crm_object('field_9k1fm__c', leads.referer, max_length=2000) _update_crm_object('field_vt40o__c', leads.referer2, max_length=2000) _update_crm_object('field_Jfeuy__c', leads.contact_us_url, max_length=2000) _update_crm_object('field_yA17P__c', leads.person_source, max_length=100) _update_crm_object('field_lK3x1__c', leads.person_source_details, max_length=2000) _update_crm_object('remark', leads.crm_remark, max_length=2000) _update_crm_object('field_xx6Ab__c', leads.primary_source_code) _update_crm_object('field_zIbbF__c', leads.secondary_source_code) sync_success, crm_response = sync_leads_to_fxiaoke_crm( crm_object, leads.crm_creator_openid) leads.sync_at = timezone.now() leads.sync_status = leads.SYNC_STATUS_SUCCESS if sync_success else leads.SYNC_STATUS_FAILED leads.request_body = json.dumps(crm_object) leads.response_body = json.dumps(crm_response) if crm_response else None leads.crm_leads_object_id = crm_response['dataId'] if sync_success else None leads.save(update_fields=[ 'sync_at', 'sync_status', 'request_body', 'response_body', 'crm_leads_object_id' ]) @celery_app.task def create_partner_compatibility_certification_in_fxiaoke_crm(object_id): try: obj = PartnerCompatibilityCertification.objects.get(id=object_id) except PartnerCompatibilityCertification.DoesNotExist: logger.error(f'PartnerCompatibilityCertification (id: {object_id}) not found') return if obj.sync_status == PartnerCompatibilityCertification.SYNC_STATUS_SUCCESS: logger.info(f'PartnerCompatibilityCertification (id: {object_id}) already synced') return crm_access_token = get_fxiaoke_crm_access_token() success, media_id_1 = upload_file_to_fxiaoke_crm(obj.attachment_1, crm_access_token) if not success: logger.error(f'Upload attachment_1 to CRM Failed, object_id: {object_id}') return success, company_logo = upload_file_to_fxiaoke_crm(obj.company_logo, crm_access_token) if not success: logger.error(f'Upload company_logo to CRM Failed, object_id: {object_id}') return crm_object = { 'dataObjectApiName': 'object_WP33j__c', 'field_q61zh__c': obj.company, # 认证合作伙伴名称 'field_25Jx7__c': [obj.company_area_code], # 开展业务的区域 'field_oS1y0__c': obj.contact_name, # 邮寄联系人 'field_DMbhr__c': obj.contact_phone, # 邮寄联系电话 'field_BBBbR__c': obj.contact_job_title_text, # 邮寄联系人职务 'field_C31Wx__c': obj.contact_email, # 邮寄联系人邮箱 'field_fi68h__c': obj.shipping_address, # 邮寄地址 'field_m189y__c': obj.product_name, # 联合解决方案名称 'field_93yLR__c': obj.product_description, # 伙伴应用介绍 'field_lh83t__c': [obj.product_industry_code], # 客户重点行业 'certification_purpose__c': obj.purpose_of_certification,# 认证用途 'field_0e6BW__c': obj.compatible_database_version_code, # 我司版本 'field_cP4Sc__c': obj.solution_type_code, # 协议类型 'field_FYmze__c': obj.cert_owner_name, # 合作伙伴证书负责人姓名 'field_wag6f__c': obj.cert_owner_job_title, # 合作伙伴证书负责人职位 'owner': [obj.crm_creator_openid], # 创建人 'sales_manager__c': [obj.crm_creator_openid], # 销售负责人 'field_x6nt1__c': [ # 公司 logo { 'ext': obj.company_logo.path.split('.')[-1], 'path': company_logo, 'filename': obj.company_logo.original_filename, 'isImage': True }, ], 'field_H5E4s__c': [ # 测试报告 { 'ext': obj.attachment_1.path.split('.')[-1], 'path': media_id_1, 'filename': obj.attachment_1.original_filename, 'isImage': False }, ] } if obj.infra_category_code: crm_object['field_9LTuk__c'] = [obj.infra_category_code] sync_success, crm_response = sync_custom_object_to_fxiaoke_crm( crm_object, obj.crm_creator_openid, crm_access_token ) obj.sync_at = timezone.now() obj.sync_status = obj.SYNC_STATUS_SUCCESS if sync_success else obj.SYNC_STATUS_FAILED obj.request_body = json.dumps(crm_object) obj.response_body = json.dumps(crm_response) if crm_response else None obj.crm_object_id = crm_response['dataId'] if sync_success else None obj.save(update_fields=[ 'sync_at', 'sync_status', 'request_body', 'response_body', 'crm_object_id' ]) @celery_app.task def sync_approved_partner_compatibility_certification_from_fxiaoke_crm_task(): sync_approved_partner_compatibility_certification_from_fxiaoke_crm() @celery_app.task def sync_review_status_from_fxiaoke_crm_task(): sync_review_status_from_fxiaoke_crm()