# -*- coding: utf-8 -*- import psycopg2 import pandas as pd import calendar import datetime # 获得连接 conn = psycopg2.connect(database="f6_bi", user="BASIC$ro_caowei", password="!ro_caowei123", host="hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com", port="80") # 获得游标对象,一个游标对象可以对数据库进行执行操作 cursor = conn.cursor() # 获取当前日期 now_time = datetime.datetime.now() yes_time = now_time + datetime.timedelta(days=-4) yes_time_new = now_time + datetime.timedelta(days=-1) yes_time_nyr1 = yes_time_new.strftime('%Y%m%d') yes_time_nyr2 = yes_time.strftime('%Y%m%d')# 获取前7天日期 # sql语句 建表 sql =f"""SELECT * FROM "public"."holo_ads_dataservice_saas_org_health_warning" WHERE "pt" = '{yes_time_nyr2}' or "pt" = '{yes_time_nyr1}';""" # 执行语句 cursor.execute(sql) # 获取结果集的每一行 rows = cursor.fetchall() # 获取所有字段名 all_fields = cursor.description #执行结果转化为dataframe col = [] for i in all_fields: col.append(i[0]) data_details = pd.DataFrame(list(rows),columns=col) # data_NGV.to_excel(r'C:\Users\admin\Desktop\NGV明细.xlsx') # 关闭数据库连接 cursor.close() conn.close() print(len(data_details)) # 基础函数配置 import pandas as pd import pandas as pd import requests from pathlib import Path from urllib.parse import quote import json import numpy as np import time ROOT = Path('.').absolute() # 当前工作目录 def generateToken() -> str: """ 生成 token """ token_api = 'https://api.dingtalk.com/v1.0/oauth2/accessToken' # 该信息在钉钉开放应用中 data = { "appKey": "ding5kqocon5s9oph5uq", "appSecret": 'HL1jgsIIfLAC0eTH0A1m4mwxUDqbgsiPeCCGGE3ocM6qJBTIW7Ivt9drxF_Z4Kb_' } res = requests.post(token_api, json=data) token = res.json()['accessToken'] return token def read_instances(token, formUuid, page, n): """ 函数功能:读取普通表单的所有数据 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": token } formData = { "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "userId" : "yida_pub_account", "language" : "zh_CN", "formUuid" : formUuid, "currentPage" : page, "pageSize" : n } res = requests.post(api, headers=headers, json=formData) return res.json() def read_delete(token, formInstanceId): """ 函数功能:调用本接口删除表单数据。 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": token } formData = { "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "userId" : "yida_pub_account", "language" : "zh_CN", "formInstanceId" : formInstanceId } res = requests.delete(api, headers=headers, json=formData) return res.json() def read_new(FORMID,formData): """ 通过实例id 获取表单内容 """ api = f'https://api.dingtalk.com/v1.0/yida/forms/instances' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } payload = { "formUuid" : FORMID, "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "formDataJson" : json.dumps(formData, cls=NpEncoder), "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "language" : "zh_CN", "userId" : "yida_pub_account" } res = requests.post(api, headers=headers, json=payload) print(res.json()) return res.json() def component(FORMID,TOKEN): """ 获取组件信息 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } payload = { "formUuid" : FORMID, "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", # "formDataJson" : json.dumps(formData, cls=NpEncoder), "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", # "language" : "zh_CN", "userId" : "yida_pub_account" } res = requests.get(api, headers=headers, json=payload) return res.json() def Batch_creation(FORMID,TOKEN,ALL_formData): """ 获取组件信息 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } payload = { # "formDataJson" : json.dumps(formData, cls=NpEncoder), "noExecuteExpression" : "false", "formUuid" : FORMID, "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "asynchronousExecution" : "false", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "keepRunningAfterException" : "false", "userId" : "2268275546837446", "formDataJsonList" : json.dumps(ALL_formData, cls=NpEncoder), } res = requests.post(api, headers=headers, json=payload) return res.json() def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance): """ 批量删除表单实例 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } payload = { "formUuid" : FORMID, "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "asynchronousExecution" : "true", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "formInstanceIdList" : json.dumps(ALL_DATA_instance, cls=NpEncoder), "userId" : "yida_pub_account", "executeExpression" : "false" # 不触发 } res = requests.post(api, headers=headers, json=payload) return res.json() def delete_in(TOKEN,formInstanceIdList): """ 逐条删除表单实例 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } res = requests.delete(api, headers=headers) return res.json() class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) elif isinstance(obj, np.floating): return float(obj) elif isinstance(obj, np.ndarray): return obj.tolist() else: return super(NpEncoder, self).default(obj) TOKEN = generateToken() '''读取员工对应关系:宜搭员工-ID对应表 ''' FORMID = "FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6 form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) PAGES = form_data.get('totalCount')//10 + 1 ALL_DATA_staff = {} """ 获取全量数据 """ for i in range(1, PAGES+1): # form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100, searchField={'textField_l7if5ff9': '否'}) form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100) for data in form_data.get('data'): ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59'] '''获取表内控件信息 ''' FORMID = "FORM-CP766081P0BBRV2AEB645ATM0KO62IHOWBFIL1" component_list = component(FORMID,TOKEN) for i in range(len(component_list['result'])): componentName = component_list['result'][i]['componentName'] name_value = component_list['result'][i]['label']['value'] fieldId = component_list['result'][i]['fieldId'] print("'",fieldId,"':","data_details[",name_value,"][i], # ",name_value) '''读取 运营负责人-区域客服 ''' FORMID = "FORM-YZ9664D1DM8BX1PV7MUGU9ZOBQ3I36PI8DFILB" # 运营负责人-区域客服 FORM-YZ9664D1DM8BX1PV7MUGU9ZOBQ3I36PI8DFILB form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) PAGES = form_data.get('totalCount')//10 + 1 ALL_DATA_service = {} """ 获取全量数据 """ for i in range(1, PAGES+1): # form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100, searchField={'textField_l7if5ff9': '否'}) form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100) for data in form_data.get('data'): ALL_DATA_service[data['formData']['textField_lifdgt27']]=data['formData']['textField_lifdgt26'] '''批量删除数据''' # for i in range(0,10): # default = True # while default: # FORMID = "FORM-CP766081P0BBRV2AEB645ATM0KO62IHOWBFIL1" # form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) # PAGES = form_data.get('totalCount')//100 +1 # print(form_data.get('totalCount')) # if form_data.get('totalCount')<=0: # default = False # for i in range(PAGES, 1,-1): # ALL_DATA_instance = [] # form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) # for data in form_data.get('data'): # ALL_DATA_instance.append(data['formInstanceId']) # print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!') # red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance) # form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) # for data in form_data.get('data'): # formInstanceId = data['formInstanceId'] # delete_in(TOKEN,formInstanceId) # print(f'单条删除 {formInstanceId} 数据!') '''遍历数据进行新建''' data_details = data_details.astype('string') data_details = data_details.fillna('',inplace=False) for a in range(0,len(data_details["pt"]),100): ALL_formData = [] for i in range(a,a+100): # for i in range(len(data_NGV["date_fmt"])): try: date_obj1 = datetime.datetime.strptime(data_details["init_day"][i], "%Y%m%d").strftime("%Y-%m-%d") date_obj2 = datetime.datetime.strptime(data_details["push_day"][i], "%Y%m%d").strftime("%Y-%m-%d") formData = { 'textField_l8ceppnl':data_details["health_warning_info"][i],#"活跃健康状态变化" 'dateField_l9dy6f8g':int(time.mktime(time.strptime(date_obj1, "%Y-%m-%d"))*1000) if data_details["init_day"][i] !='' else '',#"初始日" 'dateField_l9dy6f8h':int(time.mktime(time.strptime(date_obj2, "%Y-%m-%d"))*1000) if data_details["push_day"][i] !='' else '',#"推进日" 'textField_l8ceppo5':data_details["group_name"][i],#"公司名称" 'textField_lief8uqx':data_details["org_type"][i],#"门店类型" 'textField_lief8ur1':data_details["saas_edition_fmt"][i],#"SaaS版本名称" 'textField_lief8ur2':data_details["saas_customer_type"][i],#"saas客户类型" 'textField_l8ceppo9':data_details["group_grade"][i],#"公司等级" 'textField_lief8uqy':data_details["org_stage"][i],#"门店阶段" 'textField_lief8ur0':data_details["saas_version_fmt"][i],#"系统版本名称:E.L/E.S" 'dateField_lief8uqz':int(time.mktime(time.strptime(data_details["saas_create_time"][i], "%Y-%m-%d %H:%M:%S"))*1000) if data_details["saas_create_time"][i] !='' else '',#"SaaS门店开户时间" 'textField_l8ceppo4':data_details["org_code"][i],#"门店编码" 'textField_l8ceppo6':data_details["org_name"][i],#"门店名称" 'textField_l8ceppo7':data_details["contacts"][i],#"联系人" 'textField_l8ceppo8':data_details["contact_mobile"][i],#"联系方式" 'textField_l8ceppoi':data_details["region_name"][i],#"大区" 'textField_l8ceppoj':data_details["province_name"][i],#"省" # 'employeeField_l8cepppu':ALL_DATA_staff[data_details["service_impl_principal"][i]],#"运营负责人" 'textField_lief8ur3':data_details["area_manager"][i],#"区域经理" 'textField_lief8ur4':data_details["city_name"][i],#"城市" 'radioField_l8ceppq7':"未处理",#跟进状态 # 'employeeField_l8ceppp4':ALL_DATA_staff[ALL_DATA_service[data_details["service_impl_principal"][i]]],#"跟进人" # 'employeeField_lbfwxou1':ALL_DATA_staff[ALL_DATA_service[data_details["service_impl_principal"][i]]],#"区域客服" } try: formData['employeeField_l8cepppu'] = ALL_DATA_staff[data_details["service_impl_principal"][i]] formData['employeeField_l8ceppp4'] = ALL_DATA_staff[ALL_DATA_service[data_details["service_impl_principal"][i]]] formData['employeeField_lbfwxou1'] = ALL_DATA_staff[ALL_DATA_service[data_details["service_impl_principal"][i]]] except: formData['employeeField_l8cepppu'] = "" formData['employeeField_l8ceppp4'] = "" formData['employeeField_lbfwxou1'] = "" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) except: pass FORMID = "FORM-33666CB1XDU37AU57RKPK990C79S2YMOEEC8LS" res_new = Batch_creation(FORMID,TOKEN,ALL_formData) print("新建第",i,"条数据!",res_new) time.sleep(10) # '''校验是否新建正常''' # time.sleep(30) # FORMID = "FORM-CP766081P0BBRV2AEB645ATM0KO62IHOWBFIL1" # form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) # if int(form_data.get('totalCount')) ==len(data_details): # print("数据新建成功!") # else: # def start_instance_process(token: str, name): # """发送宜搭表单 -- 发起流程表单 # Args: # token # data:需要发送的数据字典 # """ # yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start" # headers = { # "Content-Type": "application/json", # "x-acs-dingtalk-access-token": token # } # send_data = { # "textField_l9fe0uiw": name, # "textField_l9fe0uiv": name # } # payload = { # "appType": "APP_TNVBVZ3K8G56HG03Z45Q", # "systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1", # "userId": "yida_pub_account",# 超级管理员账号 # "language": "zh_CN", # "formUuid": "FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2", # "formDataJson": json.dumps(send_data), # "processCode":"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2" # } # res = requests.post(yida_api, headers=headers, json=payload) # return res # try: # name = "[表单]异常服务跟进待办2023 新建条数不正确!" # res_yujing = start_instance_process(TOKEN,name) # except: # pass