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

210 lines
8.1 KiB
Python

# 基础信息
import pandas as pd
import numpy as np
import requests
import json
import time
import re
import sys
from datetime import datetime
from dateutil.relativedelta import relativedelta
from pathlib import Path
from urllib.parse import quote
from datetime import date, timedelta
import datetime
from io import BytesIO
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_processes_instances(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 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 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 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
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
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()
FORMID = "FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2" # 读取新签节点化服务待办
# 读取新签节点化服务待办
form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)
PAGES = form_data.get('totalCount')//100 + 1
LIST_DATA = []
tinydict = {'开户90天_四次回访': 4, '开户60天_三次回访': 3, '开户30天_二次回访': 2, '开户7天_首次回访': 1}
""" 通过员工名称获取员工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 data in form_data_two.get('data'):
ALL_DATA_staff.append(data)
""" 获取全量数据 """
for i in range(1, PAGES+1):
form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)
for v in range(0,len(form_data.get('data'))):
# 开户日期的时间戳
expire_timestamp = form_data['data'][v]['data']['dateField_la8zs59x']/1000
# 获取距离过期日期前120天,前90天,前60天,前30天的日期
expire_date = datetime.datetime.fromtimestamp(expire_timestamp)
before_7_days = expire_date + datetime.timedelta(days=7)
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(expire_date,before_90_days,before_60_days,before_30_days,before_7_days)
# 获取当前日期
current_date = datetime.datetime.now()
code_name = 0
# 比较当前日期和(7天、前90天、前60天、前30天)的日期
if current_date > before_90_days:
code_name = 4
print("开户90天_四次回访")
elif current_date > before_60_days:
code_name = 3
print("开户60天_三次回访")
elif current_date > before_30_days:
code_name = 2
print("开户30天_二次回访")
else:
print("开户7天_首次回访")
code_name = 1
try:
# 获取当前所处节点
res_new = get_approval_records(token=TOKEN, processInstanceId=form_data['data'][v]['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')
code_list = code_name - tinydict[records_new[0]['showName']]
print(records_new[0]['showName'],code_list,form_data['data'][v]['processInstanceId'],get_staffID(TOKEN,ALL_DATA_staff,records_new[0]['operatorName'])[0])
if code_list>0 and code_name!=0:
pass
data_new = {}
res=aggree_approval(token=TOKEN, taskId=taskId_new, processInstanceId=form_data['data'][v]['processInstanceId'], formData=data_new,res_new =get_staffID(TOKEN,ALL_DATA_staff,records_new[0]['operatorName'])[0] )
print(res.json())
except:
pass