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

354 lines
12 KiB
Python

# -*- coding: utf-8 -*-
import psycopg2
import pandas as pd
# 获得连接
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=-1)
yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期
# sql语句 建表
sql =f"""SELECT * FROM "public"."holo_ads_report_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}';"""
# 执行语句
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
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_RTPWHV37ENXPQUZHTL25",
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
"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_instances_TEBIE(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_RTPWHV37ENXPQUZHTL25",
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
"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_RTPWHV37ENXPQUZHTL25",
"formDataJson" : json.dumps(formData, cls=NpEncoder),
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
"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_RTPWHV37ENXPQUZHTL25",
# "formDataJson" : json.dumps(formData, cls=NpEncoder),
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
# "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" : "true",
"formUuid" : FORMID,
"appType" : "APP_RTPWHV37ENXPQUZHTL25",
"asynchronousExecution" : "true",
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
"keepRunningAfterException" : "true",
"userId" : "yida_pub_account",
"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_RTPWHV37ENXPQUZHTL25",
"asynchronousExecution" : "true",
"systemToken" : "IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6",
"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_RTPWHV37ENXPQUZHTL25&systemToken=IA766O61SHFZT6UB0WNOB58GI5RW2K58KCU1LL6&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_TEBIE(token=TOKEN, formUuid=FORMID, page=1, n=100)
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_TEBIE(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']
'''批量删除NGV数据'''
for i in range(0,10):
default = True
while default:
FORMID = "FORM-08866RA1DJ2EILGD9AVPY3VCL8OD3N68R7AML5"
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
PAGES = form_data.get('totalCount')//100 +1
PAGES = PAGES * 2
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} 数据!')
time.sleep(60)
'''遍历数据进行新建'''
data_NGV = data_NGV.astype('string')
data_NGV = data_NGV.fillna('',inplace=False)
for a in range(0,len(data_NGV["date_fmt"]),100):
try:
ALL_formData = []
for i in range(a,a+100): # for i in range(len(data_NGV["date_fmt"])):
try:
formData = {
'textField_11ebiwp': data_NGV["saas_edition_fmt"][i],
'dateField_yubgpmy': int(time.mktime(time.strptime(data_NGV["last_end_date"][i], "%Y-%m-%d"))*1000) if data_NGV["last_end_date"][i] !='' else '',
'dateField_o1v1emn': int(time.mktime(time.strptime(data_NGV["saas_create_time"][i], "%Y-%m-%d %H:%M:%S"))*1000) if data_NGV["saas_create_time"][i] !='' else '',
'textField_cjkvqpn': data_NGV["saas_use_year"][i],
'textField_lma7s24z': data_NGV["group_name"][i],
'textField_lma7s24y': data_NGV["org_name"][i],
'textField_lma7s24x': data_NGV["org_code"][i]
}
try:
formData['employeeField_lma7s255'] = ALL_DATA_staff[data_NGV["service_impl_principal"][i]] # 运营负责人_成员字段
except:
formData['employeeField_lma7s255'] = ""
try:
formData['employeeField_lma7s253'] = ALL_DATA_staff[data_NGV["area_manager"][i]] # 区域经理_成员字段
except:
formData['employeeField_lma7s253'] = ""
ALL_formData.append(json.dumps(formData, cls=NpEncoder))
except:
pass
FORMID = "FORM-08866RA1DJ2EILGD9AVPY3VCL8OD3N68R7AML5"
res_new = Batch_creation(FORMID,TOKEN,ALL_formData)
print("新建第",i,"条数据!")
time.sleep(10)
except:
pass
'''校验是否新建正常'''
time.sleep(120)
FORMID = "FORM-08866RA1DJ2EILGD9AVPY3VCL8OD3N68R7AML5"
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
if int(form_data.get('totalCount')) ==len(data_NGV):
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 = "XINQIAN_XUYUE_NGV明细数据新建条数不正确!"
res_yujing = start_instance_process(TOKEN,name)
except:
pass