脚本
This commit is contained in:
@@ -0,0 +1,386 @@
|
||||
# -*- 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=-1)
|
||||
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}' and "org_type" = '一般';"""
|
||||
# 执行语句
|
||||
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_details.to_excel(r'C:\Users\Administrator.DESKTOP-7IC2USJ\Desktop\NGV明细8.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)
|
||||
# print(form_data)
|
||||
PAGES = form_data.get('totalCount')//100 + 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)
|
||||
# print(form_data)
|
||||
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']
|
||||
|
||||
|
||||
|
||||
"""读取 省市小六技术专家区域客服区域客成"""
|
||||
FORMID = "FORM-TP866D918DFCA4FW79YZU5X43FO32QZJQDZJL7" #
|
||||
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
||||
PAGES = form_data.get('totalCount')//100 + 1
|
||||
# print(11231)
|
||||
|
||||
ALL_DATA_tech = {}
|
||||
""" 获取全量数据 """
|
||||
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)
|
||||
# print(form_data)
|
||||
for data in form_data.get('data'):
|
||||
|
||||
ALL_DATA_tech[data['formData']['textField_o7jtgf1']]=data['formData']['textField_ykecrug'] # "小刘“:”技术专家“
|
||||
|
||||
|
||||
'''遍历数据进行新建'''
|
||||
data_details = data_details.astype('string')
|
||||
data_details = data_details.fillna('',inplace=False)
|
||||
|
||||
# print(12333333)
|
||||
# print(data_details)
|
||||
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]]]
|
||||
formData['employeeField_lluram9u'] = ALL_DATA_staff[ALL_DATA_tech[data_details["service_impl_principal"][i]]] # 技术专家
|
||||
|
||||
except:
|
||||
formData['employeeField_l8cepppu'] = ""
|
||||
formData['employeeField_l8ceppp4'] = ""
|
||||
formData['employeeField_lbfwxou1'] = ""
|
||||
formData['employeeField_lluram9u'] = ""
|
||||
|
||||
ALL_formData.append(json.dumps(formData, cls=NpEncoder))
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
# print(formData)
|
||||
# print(123)
|
||||
|
||||
|
||||
FORMID = "FORM-33666CB1XDU37AU57RKPK990C79S2YMOEEC8LS"
|
||||
|
||||
|
||||
res_new = Batch_creation(FORMID,TOKEN,ALL_formData)
|
||||
print("新建第",i,"条数据!",res_new)
|
||||
time.sleep(10)
|
||||
# print(12322)
|
||||
|
||||
|
||||
'''校验是否新建正常'''
|
||||
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
|
||||
Reference in New Issue
Block a user