337 lines
16 KiB
Python
337 lines
16 KiB
Python
# 基础函数配置
|
|
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 transcation(token,FORMID,data_new):
|
|
""" 函数功能:更新表单内容 """
|
|
api = f'https://api.dingtalk.com//v1.0/yida/forms/instances'
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"x-acs-dingtalk-access-token": token
|
|
}
|
|
|
|
payload = {
|
|
"appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
|
|
"systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
|
|
"userId" : "2268275546837446", # 曹伟 id
|
|
"language" : "zh_CN",
|
|
"useLatestVersion" : "false",
|
|
"formInstanceId" : FORMID,
|
|
"updateFormDataJson" : json.dumps(data_new, cls=NpEncoder),
|
|
}
|
|
|
|
res = requests.put(api, headers=headers, json=payload)
|
|
|
|
return res.json()
|
|
def aggree_approval(token: str, taskId: str, processInstanceId: str, formData: dict,res_new):
|
|
""" 函数功能:同意审批节点 --F6客户服务 应用 """
|
|
api = f'https://api.dingtalk.com/v1.0/yida/tasks/execute'
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"x-acs-dingtalk-access-token": token
|
|
}
|
|
|
|
payload = {
|
|
"outResult": "AGREE",
|
|
"appType": "APP_UYZ0KG6L0CCNV80GZ66O",
|
|
"systemToken": "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
|
|
"remark": "同意(接口自动)",
|
|
"formDataJson": json.dumps(formData, cls=NpEncoder),
|
|
"processInstanceId": processInstanceId,
|
|
# "userId": "yida_pub_account",
|
|
"userId": res_new,
|
|
"language": "zh_CN",
|
|
"taskId": int(taskId)
|
|
}
|
|
|
|
res = requests.post(api, headers=headers, json=payload)
|
|
# print('同意审批节点')
|
|
return res
|
|
def read_instances_new(token, formUuid, page, n):
|
|
""" 函数功能:读取流程表单的所有数据 """
|
|
|
|
api = f'https://api.dingtalk.com//v1.0/yida/processes/instances?pageNumber={page}&pageSize={n}'
|
|
|
|
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), # 如果增加上这一项会要求升级宜搭存储
|
|
"instanceStatus": "RUNNING"
|
|
}
|
|
|
|
res = requests.post(api, headers=headers, json=formData)
|
|
return res.json()
|
|
def get_approval_records(token: str, processInstanceId: str):
|
|
""" 函数功能:获取流程表单的审批记录 --F6客户服务 应用 """
|
|
appType = "APP_UYZ0KG6L0CCNV80GZ66O"
|
|
systemToken = "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2"
|
|
userId = "yida_pub_account"
|
|
|
|
api = f'https://api.dingtalk.com/v1.0/yida/processes/operationRecords?appType={appType}&systemToken={systemToken}&userId={userId}&language=zh_CN&processInstanceId={processInstanceId}'
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"x-acs-dingtalk-access-token": token
|
|
}
|
|
|
|
res = requests.get(api, headers=headers)
|
|
# print('获取流程表单的审批记录')
|
|
return res.json()
|
|
def read_instances_pt(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_processes(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 instances_id(TOKEN,id):
|
|
""" 函数功能:查询表单实例 """
|
|
api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/{id}?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN'
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"x-acs-dingtalk-access-token": TOKEN
|
|
}
|
|
|
|
res = requests.get(api, headers=headers)
|
|
|
|
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 component_id(id,TOKEN):
|
|
api = f'https://api.dingtalk.com/v1.0/yida/processes/instancesInfos/{id}?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN'
|
|
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
"x-acs-dingtalk-access-token": TOKEN
|
|
}
|
|
|
|
res = requests.get(api, headers=headers)
|
|
|
|
return res.json()
|
|
def find_indexes(daichuli_mendian_name,i_two):
|
|
indexes = [i for i, x in enumerate(daichuli_mendian_name) if x == i_two]
|
|
return indexes
|
|
def get_staffID(TOKEN: str,ALL_DATA_staff,staff_name):
|
|
res_new = [v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== staff_name]
|
|
# print('通过员工名称获取员工id')
|
|
return res_new
|
|
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()
|
|
ALL_DATA_id = []
|
|
tinydict = {'0天处理情况': 1, '30天联系情况': 2, '60天联系情况': 3, '90天联系情况': 4, '120天联系情况': 5}
|
|
CODE_NAME = ['radioField_kuntp6fm','radioField_ksydghrf','dateField_ksydghri','textField_ksydghrg','dateField_ksydghrj','radioField_ksydghrk','dateField_ksydghrl','textField_ksydghrm','textField_livc8bjj','dateField_lifr1fdv','radioField_kuntp6fn','radioField_kuhnydlp','dateField_kuhnydlr','textField_kuhnydls','dateField_kuhnydlt','radioField_kuhnydlu','dateField_kuhnydlv','textField_kuhnydlw','textField_livc8bjk','dateField_lifr1fdw','radioField_kurxyhvp','radioField_kuhnydmd','dateField_kuhnydmf','textField_kuhnydmg','dateField_kuhnydmh','radioField_kuhnydmi','dateField_kuhnydmj','textField_kuhnydmk','textField_livc8bjl','dateField_lifr1fdx','radioField_kurxyhvq','radioField_kuhnydn0','dateField_kuhnydn2','textField_kuhnydn3','dateField_kuhnydn4','radioField_kuhnydn5','dateField_kuhnydn6','textField_kuhnydn7','textField_livc8bjm','dateField_lifr1fdy','radioField_l85ppdia','dateField_l85ppdib','textField_lbodyv8i','textField_l85ppdic','dateField_l85ppdid','dateField_l85ppdif','textField_l85ppdig','radioField_r3yeqvd','textAreaField_972lhkt','employeeField_lhbkudx0','textField_lhbnuvtn','selectField_lb0gxmq8','selectField_lb5xhwk4','selectField_lc70femm','radioField_l85ppdie','textField_livcjyvr','dateField_livcjyvp','selectField_l31clxfy','selectField_l31clxfz','selectField_l31clxg0','selectField_l31clxg1','selectField_l31clxg2','selectField_l31clxg3','textareaField_l31clxg4','radioField_ljqi5we3','textareaField_liviovx0','radioField_la7x32mq','textField_la7x32mp','imageField_la7x32mt']
|
|
# 读取 [流程]续约服务流程
|
|
FORMID = "FORM-PE866MD1MJMU0WGLYRFLYEN5YN9L1I55Z7ZUK22"
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
|
PAGES = form_data.get('totalCount')//100 + 1
|
|
""" 获取全量数据 """
|
|
for v in range(1, PAGES+1):
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=v, n=100)
|
|
for data in form_data.get('data'):
|
|
ALL_DATA_id.append(data["processInstanceId"])
|
|
# ALL_DATA_data.append(data["instanceValue"])
|
|
# ALL_DATA_mengdian_name.append(data['formData']['textField_ksirro5j'])
|
|
print(f'读取到流程表中 {len(ALL_DATA_id)} 条数据!')
|
|
""" 获取待处理数据 """
|
|
for i in range(1, PAGES+1):
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100)
|
|
for dataAA in form_data.get('data'):
|
|
try:
|
|
dataAA['data']['multiSelectField_ll5x02m5']
|
|
ALL_DATA = "正确"
|
|
except:
|
|
ALL_DATA = "错误"
|
|
if ALL_DATA == "正确":
|
|
# 获取到数据开始处理
|
|
""" 通过员工名称获取员工id"""
|
|
# 读取员工对应关系:宜搭员工-ID对应表
|
|
FORMID_two = "FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6
|
|
# 读取流程表单数据
|
|
form_data_two = read_processes(token=TOKEN, formUuid=FORMID_two, page=1, n=100)
|
|
PAGES_two = form_data_two.get('totalCount')//100 + 1
|
|
ALL_DATA_staff = []
|
|
""" 获取员工全量数据 """
|
|
for i in range(1, PAGES_two+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_two = read_processes(token=TOKEN, formUuid=FORMID_two, page=i, n=100)
|
|
for dataBB in form_data_two.get('data'):
|
|
ALL_DATA_staff.append(dataBB)
|
|
# -*- 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')
|
|
# data_NGV = pd.read_excel(r'C:\Users\admin\Desktop\NGV明细.xlsx')
|
|
# 关闭数据库连接
|
|
cursor.close()
|
|
conn.close()
|
|
'''进行处理操作'''
|
|
# 获取可更新内容 updateFormDataJson
|
|
data_json = instances_id(TOKEN,data["processInstanceId"])
|
|
updateFormDataJson = {}
|
|
for list_name in CODE_NAME:
|
|
try:
|
|
updateFormDataJson[list_name] = data_json['formData'][list_name]
|
|
except:
|
|
pass
|
|
print(updateFormDataJson)
|
|
# 获取当前流程节点
|
|
res_new = get_approval_records(token=TOKEN, processInstanceId=data["processInstanceId"])
|
|
records_new = res_new.get('result')
|
|
# 获取审批节点的 taskId
|
|
records_new = [item for item in records_new if item.get('type') == "TODO"]
|
|
taskId_new = records_new[0].get('taskId')
|
|
print(taskId_new,records_new[0]['showName'])
|
|
# 获取待同步表单实例id
|
|
gongsi_id = component_id(data["processInstanceId"],TOKEN)["data"]['textField_kuntp6fj'] # 获取公司id
|
|
gongsi_name = component_id(data["processInstanceId"],TOKEN)["data"]['textField_ksirm9xx'] # 获取公司id
|
|
# NGV中获取当前公司id对应的内容
|
|
row_indexes = data_NGV[data_NGV['id_own_group'] == int(gongsi_id)].index.tolist()
|
|
org_name_list = []
|
|
org_id_list = []
|
|
for i_one in row_indexes:
|
|
org_name_list.append(data_NGV.loc[i_one,"org_name"])
|
|
org_id_list.append(data_NGV.loc[i_one,"id_own_org"])
|
|
print(org_name_list,org_id_list)
|
|
# 根据门店名称获取单号 + 校验公司名称是否相同,不同则继续查找
|
|
for i_two in org_name_list:
|
|
i_two_list = find_indexes(data['data']['textField_ksirro5j'],i_two)[0]
|
|
if data['data']['textField_ksirm9xx'] == gongsi_name and i_two == data['data']['textField_ksirro5j'] :
|
|
# 开始同步数据
|
|
res_three = transcation(TOKEN,ALL_DATA_id[i_two_list],updateFormDataJson)
|
|
# print(res_three,daichuli_gongsi_name[i_two_list],ALL_DATA_id[i_two_list],ALL_DATA_mengdian_name[i_two_list])
|
|
# 开始同步节点
|
|
# print(ALL_DATA_id[i_two_list])
|
|
res_new_one = get_approval_records(token=TOKEN, processInstanceId=ALL_DATA_id[i_two_list])
|
|
records_new_one = res_new_one.get('result')
|
|
# 获取审批节点的 taskId
|
|
records_new_one = [item for item in records_new_one if item.get('type') == "TODO"]
|
|
taskId_new_one = records_new_one[0].get('taskId')
|
|
print(taskId_new_one,records_new_one[0]['showName'])
|
|
if tinydict[records_new_one[0]['showName']] > tinydict[records_new[0]['showName']] :
|
|
data_new = {}
|
|
res=aggree_approval(token=TOKEN, taskId=taskId_new_one, processInstanceId=ALL_DATA_id[i_two_list], formData=data_new,res_new =get_staffID(TOKEN,ALL_DATA_staff,records_new_one[0]['operatorName'])[0] )
|
|
print(res.json())
|
|
updateFormDataJson_new = {'multiSelectField_ll5x02m5':""}
|
|
transcation(TOKEN,data["processInstanceId"],updateFormDataJson_new)
|
|
print(f'读取到流程表中 {len(ALL_DATA_id)} 条数据!') |