421 lines
16 KiB
Python
421 lines
16 KiB
Python
import datetime
|
|
starttime = datetime.datetime.now()
|
|
|
|
# 基础函数配置
|
|
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
|
|
import datetime
|
|
|
|
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-L8966281PTZA73CDBTGQBDLM628M2P4X1OYHL0",
|
|
"formDataJson" : json.dumps(formData, cls=NpEncoder),
|
|
"processCode" : "TPROC--L8966281PTZA73CDBTGQBDLM628M2Q7X1OYHL1",
|
|
}
|
|
|
|
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_new(token, formUuid, page, n,modifiedFromTimeGMT,modifiedToTimeGMT):
|
|
""" 函数功能:读取流程表单的所有数据 """
|
|
|
|
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,
|
|
"modifiedFromTimeGMT":modifiedFromTimeGMT,
|
|
"modifiedToTimeGMT":modifiedToTimeGMT,
|
|
"instanceStatus" : "RUNNING"
|
|
}
|
|
res = requests.post(api, headers=headers, json=formData)
|
|
return res.json()
|
|
def read_gengxing(formInstanceId,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" : formInstanceId,
|
|
"updateFormDataJson" : json.dumps(data_new, cls=NpEncoder),
|
|
}
|
|
|
|
res = requests.put(api, headers=headers, json=payload)
|
|
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)
|
|
PAGES = form_data.get('totalCount')//100 + 1
|
|
ALL_DATA_staff = {}
|
|
""" 获取全量数据 """
|
|
for i in range(1, PAGES+1):
|
|
form_data = read_instances(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']
|
|
print(f'读取到宜搭员工-ID对应表表单中 {len(ALL_DATA_staff)} 条数据!')
|
|
|
|
'''[流程]续约服务流程 读取近期修改的的流程------------------------------------------------------------------------------------------------------------------------'''
|
|
FORMID = "FORM-PE866MD1MJMU0WGLYRFLYEN5YN9L1I55Z7ZUK22" # [流程]续约服务流程
|
|
# 获取当前日期
|
|
now_time = datetime.datetime.now()
|
|
yes_time = now_time + datetime.timedelta(days=-30)
|
|
yes_time_nyr1 = now_time.strftime('%Y-%m-%d')
|
|
yes_time_nyr2 = yes_time.strftime('%Y-%m-%d')# 获取前1天日期
|
|
# 读取流程表单数据
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100,modifiedFromTimeGMT=yes_time_nyr2,modifiedToTimeGMT=yes_time_nyr1)
|
|
PAGES = form_data.get('totalCount')//100 + 1
|
|
ALL_DATA = []
|
|
""" 获取全量数据 """
|
|
for i in range(1, PAGES+1):
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100,modifiedFromTimeGMT=yes_time_nyr2,modifiedToTimeGMT=yes_time_nyr1)
|
|
for data in form_data.get('data'):
|
|
ALL_DATA.append(data)
|
|
print(f'[流程]续约服务流程 表单中 {len(ALL_DATA)} 条数据!')
|
|
|
|
data_list = ['employeeField_kykw5ege','employeeField_ksydght0','employeeField_ksirro5o','employeeField_ksydghrd','employeeField_ksydghre']
|
|
for v in data_list:
|
|
for i in range(0,len(ALL_DATA)):
|
|
try:
|
|
if "(" in str(ALL_DATA[i]['data'][v]) and ")" in str(ALL_DATA[i]['data'][v]):
|
|
# print("符号 () 存在",ALL_DATA[i]['data'][v])
|
|
pass
|
|
else:
|
|
print("符号 () 不存在",ALL_DATA[i]['data'][v],ALL_DATA[i]['processInstanceId'],i,v)
|
|
data_new = {
|
|
v:[ALL_DATA_staff[ALL_DATA[i]['data'][v][0]]]
|
|
}
|
|
res = read_gengxing(ALL_DATA[i]['processInstanceId'],data_new)
|
|
print(res)
|
|
except Exception as e:
|
|
textField_lrzoowld = "正常" # 运行状态
|
|
textField_lrzoowlb = str(e) # 信息说明
|
|
|
|
'''新签节点化服务待办 读取近期修改的的流程------------------------------------------------------------------------------------------------------------------------'''
|
|
FORMID = "FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2" # 新签节点化服务待办
|
|
# 获取当前日期
|
|
now_time = datetime.datetime.now()
|
|
yes_time = now_time + datetime.timedelta(days=-1)
|
|
yes_time_nyr1 = now_time.strftime('%Y-%m-%d')
|
|
yes_time_nyr2 = yes_time.strftime('%Y-%m-%d')# 获取前1天日期
|
|
# 读取流程表单数据
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100,modifiedFromTimeGMT=yes_time_nyr2,modifiedToTimeGMT=yes_time_nyr1)
|
|
PAGES = form_data.get('totalCount')//100 + 1
|
|
ALL_DATA = []
|
|
""" 获取全量数据 """
|
|
for i in range(1, PAGES+1):
|
|
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100,modifiedFromTimeGMT=yes_time_nyr2,modifiedToTimeGMT=yes_time_nyr1)
|
|
for data in form_data.get('data'):
|
|
ALL_DATA.append(data)
|
|
print(f'新签节点化服务待办 表单中 {len(ALL_DATA)} 条数据!')
|
|
|
|
data_list = ['employeeField_la8zs59w','employeeField_la80kj0k','employeeField_lc5wh9h4','employeeField_lc8vmo70','employeeField_lc8w7jl9']
|
|
for v in data_list:
|
|
for i in range(0,len(ALL_DATA)):
|
|
try:
|
|
if "(" in str(ALL_DATA[i]['data'][v]) and ")" in str(ALL_DATA[i]['data'][v]):
|
|
# print("符号 () 存在",ALL_DATA[i]['data'][v])
|
|
pass
|
|
else:
|
|
print("符号 () 不存在",ALL_DATA[i]['data'][v],ALL_DATA[i]['processInstanceId'],i,v)
|
|
data_new = {
|
|
v:[ALL_DATA_staff[ALL_DATA[i]['data'][v][0]]]
|
|
}
|
|
res = read_gengxing(ALL_DATA[i]['processInstanceId'],data_new)
|
|
print(res)
|
|
except Exception as e:
|
|
textField_lrzoowld = "正常" # 运行状态
|
|
textField_lrzoowlb = str(e) # 信息说明
|
|
|
|
'''新签回访跟进表 读取近期修改的的流程------------------------------------------------------------------------------------------------------------------------'''
|
|
FORMID = "FORM-JK866XA1BAO5QVCP84CBA7GLPA692DGJ1I0BLQ2" # 新签回访跟进表
|
|
# 读取流程表单数据
|
|
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
|
PAGES = form_data.get('totalCount')//100 + 1
|
|
ALL_DATA = []
|
|
""" 获取全量数据 """
|
|
for i in range(1, PAGES+1):
|
|
form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)
|
|
for data in form_data.get('data'):
|
|
ALL_DATA.append(data)
|
|
print(f'新签回访跟进表 表单中 {len(ALL_DATA)} 条数据!')
|
|
|
|
data_list = ['employeeField_ll09j3bv','employeeField_lb0i2m7x','employeeField_lb0i2m7y','employeeField_lb0i2m7z']
|
|
for v in data_list:
|
|
for i in range(0,len(ALL_DATA)):
|
|
try:
|
|
if "(" in str(ALL_DATA[i]['formData'][v]) and ")" in str(ALL_DATA[i]['formData'][v]):
|
|
# print("符号 () 存在",ALL_DATA[i]['data'][v])
|
|
pass
|
|
else:
|
|
print("符号 () 不存在",ALL_DATA[i]['formData'][v],ALL_DATA[i]['formInstanceId'],i,v)
|
|
data_new = {
|
|
v:[ALL_DATA_staff[ALL_DATA[i]['formData'][v][0]]]
|
|
}
|
|
res = read_gengxing(ALL_DATA[i]['formInstanceId'],data_new)
|
|
print(res)
|
|
except Exception as e:
|
|
textField_lrzoowld = "正常" # 运行状态
|
|
textField_lrzoowlb = str(e) # 信息说明
|
|
|
|
|
|
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_renyuan_name_chongfu", # 程序名称
|
|
"textField_lrzoowl9": "每天早上6/13 读取新建节点化服务代办 + 续约服务流程中的成员字段 改成带工号", # 功能简述
|
|
"textField_lrzoowld": textField_lrzoowld, # 运行状态
|
|
"textField_lrzoowlb": textField_lrzoowlb # 信息说明
|
|
}
|
|
res_yujing = start_instance_process(TOKEN,send_data)
|
|
except:
|
|
pass |