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

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