Files
F6--/其它系统脚本/yida_xuyuedaiban_paifa.py
2026-01-30 11:28:35 +08:00

516 lines
21 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- 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")
# 获得游标对象,一个游标对象可以对数据库进行执行操作
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() # 当前工作目录
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()
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()
'''读取new加区-省市小六技术专家区域客服区域客成 '''
FORMID = "FORM-8C7E8036770B495D99862638F87FA8BFOEEN" #new加区-省市小六技术专家区域客服区域客成
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 = {}
textField_3hgho1m_V2 = {}
""" 获取全量数据 """
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_m3hchxc']]=data['formData']['textField_3hgho1m'] #小六id
textField_nc7gskc[data['formData']['textField_m3hchxc']]=data['formData']['textField_nc7gskc'] #技术专家id
textField_3hgho1m_V2[data['formData']['textField_lr7fpeut']]=data['formData']['textField_3hgho1m'] # 小六id V2
print(f'读取到new加区-省市小六技术专家区域客服区域客成表单中 {len(textField_gif29wy)} 条数据!')
'''遍历数据进行新建'''
data_NGV = data_NGV.astype('string')
data_NGV = data_NGV.fillna('',inplace=False)
group_grade = {
"普通客户(VIP":10,
"重要客户(SVIP":20,
"区域KAMVP":30,
"全国KAFMVP":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天限制日期
# 按市进行匹配
formData['employeeField_kykw5ege'] = textField_3hgho1m[formData['textField_kuj8nx01']] # 专属运营顾问
formData['employeeField_ksydghrd'] = textField_nc7gskc[formData['textField_kuj8nx01']] # 专属运营顾问
# 部分市按区维度 区分
if formData['textField_kuj8nx01'] in ['兰州市','苏州市','唐山市','西安市']:
formData['employeeField_kykw5ege'] = textField_3hgho1m_V2[data_NGV['area_name'][i]]
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'] == "区域KAMVP" or formData['textField_kycfic6o'] == "全国KAFMVP":
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
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:
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:
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:
pass