接车宝排查问题及续约待办派发数据源加载
This commit is contained in:
@@ -0,0 +1,627 @@
|
||||
import datetime
|
||||
starttime = datetime.datetime.now()
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
import psycopg2
|
||||
import pandas as pd
|
||||
from datetime import date, timedelta
|
||||
# 获得连接
|
||||
# conn = psycopg2.connect(database="f6_bi", user="BASIC$ro_caowei", password="!ro_caowei123", host="hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com", port="80")
|
||||
conn = psycopg2.connect(database="f6_bi", user="LTAI5tMJsijFA9BS1R6uBpUT", password="PajEQMIRWNRcipd8mYvlud2KHWJr6N", host="hgpostcn-cn-m1e4gikbu00l-cn-shanghai.hologres.aliyuncs.com", port="80")
|
||||
|
||||
# 获得游标对象,一个游标对象可以对数据库进行执行操作
|
||||
cursor = conn.cursor()
|
||||
|
||||
import datetime
|
||||
now_time = datetime.datetime.now()
|
||||
yes_time = now_time + datetime.timedelta(days=-2)
|
||||
yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期
|
||||
|
||||
today = date.today()
|
||||
days_to_add = 120
|
||||
future_date = str(today + timedelta(days=days_to_add))
|
||||
# 输出结果
|
||||
print("距离今天还有{}天的日期是:{}".format(days_to_add, future_date))
|
||||
# sql语句 建表
|
||||
sql =f"""SELECT * FROM "public"."holo_ads_report_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}' and "expiry_time" like '%{future_date}%';"""
|
||||
# 执行语句
|
||||
cursor.execute(sql)
|
||||
# 获取结果集的每一行
|
||||
rows = cursor.fetchall()
|
||||
# 获取所有字段名
|
||||
all_fields = cursor.description
|
||||
#执行结果转化为dataframe
|
||||
col = []
|
||||
for i in all_fields:
|
||||
col.append(i[0])
|
||||
data_NGV = pd.DataFrame(list(rows),columns=col)
|
||||
# data_NGV.to_excel(r'C:\Users\admin\Desktop\NGV明细.xlsx')
|
||||
# 关闭数据库连接
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
# 基础函数配置
|
||||
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
|
||||
from datetime import date, timedelta
|
||||
|
||||
ROOT = Path('.').absolute() # 当前工作目录
|
||||
textField_lrzoowld = "正常" # 运行状态
|
||||
textField_lrzoowlb = "" # 信息说明
|
||||
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 initiate_process(TOKEN,formData):
|
||||
""" 发起宜搭审批流程 """
|
||||
api = f'https://api.dingtalk.com//v1.0/yida/processes/instances/start'
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"x-acs-dingtalk-access-token": TOKEN
|
||||
}
|
||||
payload = {
|
||||
"appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
|
||||
"systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
|
||||
"userId" : "yida_pub_account",
|
||||
"language" : "zh_CN",
|
||||
"formUuid" : "FORM-PE866MD1MJMU0WGLYRFLYEN5YN9L1I55Z7ZUK22",
|
||||
"formDataJson" : json.dumps(formData, cls=NpEncoder),
|
||||
"processCode" : "TPROC--PE866MD1MJMU0WGLYRFLYEN5YN9L1885Z7ZUK32",
|
||||
}
|
||||
|
||||
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()
|
||||
|
||||
def read_instances_ngv(token, formUuid, page, n,searchField):
|
||||
""" 函数功能:读取普通表单的所有数据 """
|
||||
|
||||
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,
|
||||
"searchFieldJson": json.dumps(searchField),
|
||||
"currentPage" : page,
|
||||
"pageSize" : n
|
||||
}
|
||||
|
||||
res = requests.post(api, headers=headers, json=formData)
|
||||
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)
|
||||
|
||||
import binascii
|
||||
import time
|
||||
import random
|
||||
from pyDes import des, CBC, PAD_PKCS5
|
||||
import requests
|
||||
|
||||
def des_encrypt(s):
|
||||
"""
|
||||
DES 加密
|
||||
:param s: 原始字符串
|
||||
:return: 加密后字符串,16进制
|
||||
"""
|
||||
secret_key = 'HwdMBW8o'
|
||||
iv = secret_key
|
||||
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
|
||||
en = k.encrypt(s, padmode=PAD_PKCS5)
|
||||
return binascii.b2a_base64(en, newline=False)
|
||||
|
||||
|
||||
def des_descrypt(s):
|
||||
"""
|
||||
DES 解密
|
||||
:param s: 加密后的字符串,16进制
|
||||
:return: 解密后的字符串
|
||||
"""
|
||||
secret_key = 'HwdMBW8o'
|
||||
iv = secret_key
|
||||
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
|
||||
de = k.decrypt(binascii.a2b_base64(s), padmode=PAD_PKCS5)
|
||||
return de
|
||||
|
||||
TOKEN = generateToken()
|
||||
'''读取省市小六技术专家区域客服区域客成 '''
|
||||
FORMID = "FORM-8C7E8036770B495D99862638F87FA8BFOEEN" #省市小六技术专家区域客服区域客成
|
||||
try:
|
||||
# 读取流程表单数据
|
||||
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
||||
PAGES = form_data.get('totalCount')//100 + 1
|
||||
textField_gif29wy = {}
|
||||
textField_3athky8 = {}
|
||||
textField_3hgho1m = {}
|
||||
textField_nc7gskc = {}
|
||||
""" 获取全量数据 """
|
||||
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'):
|
||||
textField_gif29wy[data['formData']['textField_m3hchxc']]=data['formData']['textField_gif29wy'] #区域客成id # 根据市做判断
|
||||
textField_3athky8[data['formData']['textField_m3hchxc']]=data['formData']['textField_3athky8'] #区域客服id
|
||||
# textField_3hgho1m[data['formData']['textField_3hgho1m']]=data['formData']['textField_3hgho1m'] #小六id
|
||||
# textField_nc7gskc[data['formData']['textField_nc7gskc']]=data['formData']['textField_nc7gskc'] #技术专家id
|
||||
print(f'读取到省市小六技术专家区域客服区域客成表单中 {len(textField_gif29wy)} 条数据!')
|
||||
|
||||
|
||||
'''遍历数据进行新建'''
|
||||
data_NGV = data_NGV.astype('string')
|
||||
data_NGV = data_NGV.fillna('',inplace=False)
|
||||
group_grade = {
|
||||
"普通客户(VIP)":10,
|
||||
"重要客户(SVIP)":20,
|
||||
"区域KA(MVP)":30,
|
||||
"全国KA(FMVP)":50
|
||||
}
|
||||
# 过滤数据
|
||||
for i in range(0,len(data_NGV["date_fmt"])):
|
||||
try:
|
||||
t = time.time()
|
||||
ts = int(round(t * 1000))
|
||||
randint = random.randint(100000000, 999999999)
|
||||
req = data_NGV['id_own_org'][i] + "_" + str(ts) + "_" + str(randint)
|
||||
str_en = des_encrypt(req)
|
||||
req_new = str_en.decode('utf-8')
|
||||
|
||||
url = f"http://manage.f6yc.com/hive-admin/py/yida/renewal/orgInfo"
|
||||
data = {
|
||||
'req':req_new,
|
||||
't':ts,
|
||||
'r':randint
|
||||
}
|
||||
res = requests.post(url,data=data)
|
||||
formData = res.json()['data']['yidaFormData']
|
||||
# 过期日期的时间戳
|
||||
expire_timestamp = int(formData['dateField_ksirro5l'])/1000
|
||||
|
||||
# 获取距离过期日期前120天,前90天,前60天,前30天的日期
|
||||
expire_date = datetime.datetime.fromtimestamp(expire_timestamp)
|
||||
before_90_days = expire_date - datetime.timedelta(days=90)
|
||||
before_60_days = expire_date - datetime.timedelta(days=60)
|
||||
before_30_days = expire_date - datetime.timedelta(days=30)
|
||||
# print(formData)
|
||||
formData['dateField_ljzefdm4'] = str(int(before_90_days.timestamp()*1000)) # 90天限制日期
|
||||
formData['dateField_ljzefdm5'] = str(int(before_60_days.timestamp()*1000)) # 60天限制日期
|
||||
formData['dateField_ljzefdm6'] = str(int(before_30_days.timestamp()*1000)) # 30天限制日期
|
||||
|
||||
|
||||
employeeField_kykw5ege = str(formData['employeeField_kykw5ege'])
|
||||
employeeField_ksydghrd = str(formData['employeeField_ksydghrd'])
|
||||
formData['employeeField_ljz6gvwc'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{textField_3athky8[formData['textField_kuj8nx01']]}']" # 区域客成+区域客服
|
||||
# formData['employeeField_ljz6416i'] = f"[{textField_gif29wy[formData['textField_kuj8nx01']]}, {employeeField_kykw5ege}]" # 区域客成+小六
|
||||
formData['employeeField_ljz6416i'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{employeeField_kykw5ege}']" # 区域客成+小六
|
||||
formData['employeeField_ljz6416j'] = f"['{textField_gif29wy[formData['textField_kuj8nx01']]}', '{employeeField_ksydghrd}']" # 区域客成+技术专家
|
||||
formData['employeeField_ljz6gvwd'] = textField_3athky8[formData['textField_kuj8nx01']] # 区域客服
|
||||
formData['employeeField_ksydght0'] = textField_gif29wy[formData['textField_kuj8nx01']] # 区域客成
|
||||
|
||||
if employeeField_kykw5ege =="1824534815658365" or employeeField_kykw5ege =="0627252740652855":
|
||||
if employeeField_ksydghrd =="":
|
||||
employeeField_kykw5ege = '0627252740652855'
|
||||
formData['employeeField_ljz6gvwc'] = '0627252740652855' # 区域客成+区域客服
|
||||
formData['employeeField_ljz6416i'] = '0627252740652855' # 区域客成+小六
|
||||
formData['employeeField_ljz6416j'] = '0627252740652855' # 区域客成+技术专家
|
||||
formData['employeeField_ljz6gvwd'] = '0627252740652855' # 区域客服
|
||||
formData['employeeField_ksydght0'] = '0627252740652855' # 区域客成
|
||||
formData['employeeField_kykw5ege'] = '0627252740652855' # 专属运营顾问
|
||||
formData['employeeField_ksirro5o'] = '0627252740652855' # 续约绩效归属人
|
||||
else:
|
||||
employeeField_kykw5ege = employeeField_ksydghrd
|
||||
formData['employeeField_ljz6gvwc'] = employeeField_ksydghrd # 区域客成+区域客服
|
||||
formData['employeeField_ljz6416i'] = employeeField_ksydghrd # 区域客成+小六
|
||||
formData['employeeField_ljz6416j'] = employeeField_ksydghrd # 区域客成+技术专家
|
||||
formData['employeeField_ljz6gvwd'] = employeeField_ksydghrd # 区域客服
|
||||
formData['employeeField_ksydght0'] = employeeField_ksydghrd # 区域客成
|
||||
formData['employeeField_kykw5ege'] = employeeField_ksydghrd # 专属运营顾问
|
||||
formData['employeeField_ksirro5o'] = employeeField_ksydghrd # 续约绩效归属人
|
||||
if formData['textField_kycfic6o'] == "区域KA(MVP)" or formData['textField_kycfic6o'] == "全国KA(FMVP)":
|
||||
formData['employeeField_ljz6gvwc'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
|
||||
formData['employeeField_ljz6416i'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
|
||||
formData['employeeField_ljz6416j'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
|
||||
formData['employeeField_ljz6gvwd'] = f"['{employeeField_kykw5ege}', '{employeeField_ksydghrd}']" # 小六+技术专家
|
||||
try:
|
||||
formData['textField_ksirro5g'] = group_grade[data_NGV['group_grade'][i]]
|
||||
formData['textField_kycfic6o'] = data_NGV['group_grade'][i]
|
||||
except:
|
||||
pass
|
||||
try:
|
||||
formData['textField_liwg9trm'] = res.json()['data']['franchiseGroupInfo']['groupName']
|
||||
except:
|
||||
pass
|
||||
# 富文本 超链接 NGV
|
||||
try:
|
||||
form_data_ngv = read_instances_ngv(token=TOKEN, formUuid="FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91", page=1, n=100, searchField={'textField_l8nc9f2': data_NGV['id_own_org'][i]})
|
||||
formData['editorField_m3gn517y'] = ["root",{},["p",{},["span",{"data-type":"text"},["span",{"data-type":"leaf"},""]],["a",{"href":"https://f6car.aliwork.com/APP_UYZ0KG6L0CCNV80GZ66O/formDetail/FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91?formInstId="+form_data_ngv['data'][0]['formInstanceId']+"&isAdmin=true"},["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},"点击查看门店NGV"]]],["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},""]]]] # 富文本 超链接 NGV
|
||||
except:
|
||||
pass
|
||||
res_new = initiate_process(TOKEN,formData)
|
||||
time.sleep(2)
|
||||
print(res_new)
|
||||
|
||||
# 回传信息-------------------------------------------------------------------------------------------------------------
|
||||
default_new = True
|
||||
a_len = 1
|
||||
while default_new:
|
||||
t = time.time()
|
||||
ts = int(round(t * 1000))
|
||||
randint = random.randint(100000000, 999999999)
|
||||
req = res_new['result'] + "|" + formData['textField_kuntp6fk'] + "|" + formData['textField_kuntp6fl']+ "|" + formData['employeeField_kykw5ege'] + "_" + str(ts) + "_" + str(randint)
|
||||
str_en = des_encrypt(req)
|
||||
print(str_en.decode('utf-8'))
|
||||
req_new = str_en.decode('utf-8')
|
||||
url = f"http://manage.f6yc.com/hive-admin/py/yida/renewal/insertRenewalFormsData"
|
||||
data = {
|
||||
'req':req_new,
|
||||
't':ts,
|
||||
'r':randint
|
||||
}
|
||||
res = requests.post(url,data=data)
|
||||
res.json()
|
||||
|
||||
if res.json()['message'] == "SUCCESS":
|
||||
default_new = False
|
||||
a_len = a_len + 1
|
||||
if a_len > 5:
|
||||
default_new = False
|
||||
time.sleep(1)
|
||||
'''校验是否新建正常'''
|
||||
FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
|
||||
|
||||
if a_len < 5:
|
||||
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 = f"[流程]续约服务流程 新建后接口回传失败,请检查!{data_NGV['id_own_org'][i]}"
|
||||
res_yujing = start_instance_process(TOKEN,name)
|
||||
except:
|
||||
textField_lrzoowld = "异常" # 运行状态
|
||||
textField_lrzoowlb = "[流程]续约服务流程 新建后接口回传失败,请检查" # 信息说明
|
||||
except:
|
||||
'''校验是否新建正常'''
|
||||
FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
|
||||
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 = f"[流程]续约服务流程 未成功新建,请检查!{data_NGV['id_own_org'][i]}"
|
||||
res_yujing = start_instance_process(TOKEN,name)
|
||||
textField_lrzoowld = "异常" # 运行状态
|
||||
textField_lrzoowlb = "[流程]续约服务流程 未成功新建,请检查" # 信息说明
|
||||
except:
|
||||
pass
|
||||
except:
|
||||
'''校验是否新建正常'''
|
||||
FORMID = "FORM-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0"
|
||||
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 = f"[流程]续约服务流程 表单数据读取失败,请检查!{data_NGV['id_own_org'][i]}"
|
||||
res_yujing = start_instance_process(TOKEN,name)
|
||||
except:
|
||||
textField_lrzoowld = "异常" # 运行状态
|
||||
textField_lrzoowlb = "[流程]续约服务流程 表单数据读取失败,请检查" # 信息说明
|
||||
|
||||
try:
|
||||
import requests
|
||||
import json
|
||||
import numpy as np
|
||||
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 start_instance_process(token: str, send_data):
|
||||
|
||||
"""发送宜搭表单 -- 发起流程表单
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
payload = {
|
||||
"appType": "APP_TNVBVZ3K8G56HG03Z45Q",
|
||||
"systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
|
||||
"userId": "yida_pub_account",# 超级管理员账号
|
||||
"language": "zh_CN",
|
||||
"formUuid": "FORM-96D58EF2219240C7B1F55F9CA463CD2D4MGC",
|
||||
"formDataJson": json.dumps(send_data),
|
||||
"processCode":"TPROC--5Q966D918T1I1AZM68NASC6TS13P3QOL3PZRLC"
|
||||
}
|
||||
|
||||
res = requests.post(yida_api, headers=headers, json=payload)
|
||||
return res
|
||||
|
||||
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()
|
||||
import datetime
|
||||
endtime = datetime.datetime.now()
|
||||
implement = (endtime - starttime).seconds
|
||||
send_data = {
|
||||
"textField_ls01al4o": implement, #运行耗时
|
||||
"textField_lrzoowl8": "yida_xuyuedaiban_paifa", # 程序名称
|
||||
"textField_lrzoowl9": "每天早上9点重新派发续约跟进任务", # 功能简述
|
||||
"textField_lrzoowld": textField_lrzoowld, # 运行状态
|
||||
"textField_lrzoowlb": textField_lrzoowlb # 信息说明
|
||||
}
|
||||
res_yujing = start_instance_process(TOKEN,send_data)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
+117
@@ -0,0 +1,117 @@
|
||||
# 标准库
|
||||
import os
|
||||
import time
|
||||
import random
|
||||
import json
|
||||
import binascii
|
||||
from datetime import date, timedelta, datetime
|
||||
from urllib.parse import quote
|
||||
from pathlib import Path
|
||||
|
||||
# 第三方库
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
import requests
|
||||
from pyDes import des, CBC, PAD_PKCS5
|
||||
import mysql.connector
|
||||
from mysql.connector import Error
|
||||
|
||||
# PostgreSQL(如果你用到了)
|
||||
import psycopg2
|
||||
|
||||
# 自定义模块
|
||||
from config import Config
|
||||
from api import API
|
||||
from back_ground_module import CommonModule
|
||||
from log_config import configure_task_logger, configure_error_task_logger
|
||||
|
||||
logger = configure_task_logger()
|
||||
error_task_logger = configure_error_task_logger()
|
||||
api_instance = API()
|
||||
common_module = CommonModule()
|
||||
output_dir = "output" # 设置输出目录
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
|
||||
class RenewalToDo:
|
||||
def __init__(self):
|
||||
self.json_list = None
|
||||
self.data_NGV = None
|
||||
self.staff_id_list = None
|
||||
self.NGV_data_list = None
|
||||
|
||||
|
||||
@staticmethod
|
||||
def des_encrypt(s):
|
||||
"""
|
||||
DES 加密
|
||||
:param s: 原始字符串
|
||||
:return: 加密后字符串,16进制
|
||||
"""
|
||||
secret_key = 'HwdMBW8o'
|
||||
iv = secret_key
|
||||
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
|
||||
en = k.encrypt(s, padmode=PAD_PKCS5)
|
||||
return binascii.b2a_base64(en, newline=False)
|
||||
|
||||
@staticmethod
|
||||
def des_descrypt(s):
|
||||
"""
|
||||
DES 解密
|
||||
:param s: 加密后的字符串,16进制
|
||||
:return: 解密后的字符串
|
||||
"""
|
||||
secret_key = 'HwdMBW8o'
|
||||
iv = secret_key
|
||||
k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
|
||||
de = k.decrypt(binascii.a2b_base64(s), padmode=PAD_PKCS5)
|
||||
return de
|
||||
|
||||
def load_all_data(self):
|
||||
# 获取NGV数据
|
||||
payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "675bb02bd2d53c2034c665e4"}
|
||||
self.NGV_data_list = api_instance.entry_data_list(payload).get("data")
|
||||
|
||||
# 获取简道云员工id
|
||||
payload = {"api_key": "6694d3c4fcb69ca9a111a6c4",
|
||||
"entry_id": "6769204a1902c9341340a1bc",
|
||||
}
|
||||
staff_id = api_instance.entry_data_list(payload)
|
||||
self.staff_id_list = staff_id.get("data") # api请求格式,将数据封装在data字典里
|
||||
|
||||
# 省市区人员关系表
|
||||
payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "676512ac3e54dc3159460c0a"}
|
||||
json_dict = api_instance.entry_data_list(payload)
|
||||
if json_dict and "data" in json_dict:
|
||||
self.json_list = json_dict.get("data")
|
||||
else:
|
||||
print("加载省市区人员关系表失败")
|
||||
self.json_list = []
|
||||
|
||||
# 数据库获取续约回访数据
|
||||
self.data_NGV = common_module.get_renewal_details()
|
||||
|
||||
def process_data(self):
|
||||
"""
|
||||
|
||||
:return:
|
||||
"""
|
||||
|
||||
|
||||
def main(self):
|
||||
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
try:
|
||||
logger.info("任务开始")
|
||||
# step1: 获取数据
|
||||
self.load_all_data()
|
||||
logger.info("加载数据完成")
|
||||
# step2:数据处理
|
||||
self.process_data()
|
||||
|
||||
common_module.send_task_status(task_start_time, "续约回访待办")
|
||||
except Exception as e:
|
||||
error_task_logger.error(f"续约回访待办发生错误{e}")
|
||||
common_module.send_task_error(task_start_time, "续约回访待办", str(e))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
RenewalToDo().main()
|
||||
Reference in New Issue
Block a user