Files
F6--/其它系统脚本/获取新签节点化待办审批记录_批量获取.ipynb
T
2026-01-30 11:28:35 +08:00

290 lines
17 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# 基础信息\n",
"import pandas as pd\n",
"import numpy as np\n",
"import requests\n",
"import json\n",
"import time\n",
"import re\n",
"import sys\n",
"from datetime import datetime\n",
"from dateutil.relativedelta import relativedelta\n",
"from pathlib import Path\n",
"from urllib.parse import quote\n",
"from datetime import date, timedelta\n",
"import datetime\n",
"from io import BytesIO\n",
"\n",
"ROOT = Path('.').absolute() # 当前工作目录\n",
"\n",
"def generateToken() -> str:\n",
" \"\"\" 生成 token \"\"\"\n",
"\n",
" token_api = 'https://api.dingtalk.com/v1.0/oauth2/accessToken'\n",
"\n",
" # 该信息在钉钉开放应用中\n",
" data = {\n",
" \"appKey\": \"ding5kqocon5s9oph5uq\",\n",
" \"appSecret\": 'HL1jgsIIfLAC0eTH0A1m4mwxUDqbgsiPeCCGGE3ocM6qJBTIW7Ivt9drxF_Z4Kb_'\n",
" }\n",
"\n",
" res = requests.post(token_api, json=data)\n",
" token = res.json()['accessToken']\n",
"\n",
" return token\n",
"\n",
"def read_processes_instances(token, formUuid, page, n):\n",
" \"\"\" 函数功能:读取流程表单的所有数据 \"\"\"\n",
"\n",
" api = f'https://api.dingtalk.com/v1.0/yida/processes/instances?pageNumber={page}&pageSize={n}'\n",
"\n",
" headers = {\n",
" \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" formData = {\n",
" \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
" \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
" \"userId\": \"yida_pub_account\", # 超级管理员账号\n",
" \"language\": \"zh_CN\",\n",
" \"formUuid\": formUuid,\n",
" # \"searchFieldJson\": json.dumps(searchField), # 如果增加上这一项会要求升级宜搭存储\n",
" # \"instanceStatus\": \"RUNNING\" # 运行中\n",
" }\n",
"\n",
" res = requests.post(api, headers=headers, json=formData)\n",
" return res.json()\n",
"\n",
"def read_processes(token, formUuid, page, n):\n",
" \"\"\" 函数功能:读取普通表单的所有数据 \"\"\"\n",
"\n",
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'\n",
"\n",
" headers = {\n",
" \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" formData = {\n",
" \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
" \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
" \"userId\": \"yida_pub_account\", # 超级管理员账号\n",
" \"language\": \"zh_CN\",\n",
" \"formUuid\": formUuid,\n",
" 'currentPage':page,\n",
" 'pageSize':n\n",
" }\n",
"\n",
" res = requests.post(api, headers=headers, json=formData)\n",
" return res.json()\n",
"\n",
"def get_approval_records(token: str, processInstanceId: str):\n",
" \"\"\" 函数功能:获取流程表单的审批记录 --F6客户服务 应用 \"\"\"\n",
" appType = \"APP_UYZ0KG6L0CCNV80GZ66O\"\n",
" systemToken = \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\"\n",
" userId = \"yida_pub_account\"\n",
"\n",
" api = f'https://api.dingtalk.com/v1.0/yida/processes/operationRecords?appType={appType}&systemToken={systemToken}&userId={userId}&language=zh_CN&processInstanceId={processInstanceId}'\n",
"\n",
" headers = {\n",
" \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" res = requests.get(api, headers=headers)\n",
" # print('获取流程表单的审批记录')\n",
" return res.json()\n",
"\n",
"def get_staffID(TOKEN: str,ALL_DATA_staff,staff_name):\n",
" res_new = [v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== staff_name]\n",
" # print('通过员工名称获取员工id')\n",
" return res_new\n",
"\n",
"def aggree_approval(token: str, taskId: str, processInstanceId: str, formData: dict,res_new):\n",
" \"\"\" 函数功能:同意审批节点 --F6客户服务 应用 \"\"\"\n",
" api = f'https://api.dingtalk.com/v1.0/yida/tasks/execute'\n",
"\n",
" headers = {\n",
" \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" payload = {\n",
" \"outResult\": \"AGREE\",\n",
" \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
" \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
" \"remark\": \"同意(接口自动)\",\n",
" \"formDataJson\": json.dumps(formData, cls=NpEncoder),\n",
" \"processInstanceId\": processInstanceId,\n",
" # \"userId\": \"yida_pub_account\",\n",
" \"userId\": res_new, \n",
" \"language\": \"zh_CN\",\n",
" \"taskId\": int(taskId)\n",
" }\n",
"\n",
" res = requests.post(api, headers=headers, json=payload)\n",
" # print('同意审批节点')\n",
" return res\n",
"\n",
"def get_approval_records_Batch(token, processInstanceId):\n",
" \"\"\" 函数功能:批量获取流程表单的审批记录 --F6客户服务 应用 \"\"\"\n",
" appType = \"APP_UYZ0KG6L0CCNV80GZ66O\"\n",
" systemToken = \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\"\n",
" userId = \"yida_pub_account\"\n",
"\n",
" api = f'https://api.dingtalk.com/v1.0/yida/processes/instances/searchWithIds?appType={appType}&systemToken={systemToken}&userId={userId}&language=zh_CN&processInstanceId={processInstanceId}'\n",
"\n",
" headers = {\n",
" # \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" res = requests.get(api, headers=headers)\n",
" return res.json()\n",
"\n",
"class NpEncoder(json.JSONEncoder):\n",
" def default(self, obj):\n",
" if isinstance(obj, np.integer):\n",
" return int(obj)\n",
" elif isinstance(obj, np.floating):\n",
" return float(obj)\n",
" elif isinstance(obj, np.ndarray):\n",
" return obj.tolist()\n",
" else:\n",
" return super(NpEncoder, self).default(obj)\n",
"\n",
"\"\"\" 处理流程开始 \"\"\"\n",
"TOKEN = generateToken()\n",
"FORMID = \"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\" # 读取新签节点化服务待办\n",
"# 读取新签节点化服务待办\n",
"form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
"print(form_data.get('totalCount'))\n",
"PAGES = form_data.get('totalCount')//100 + 1\n",
"df_data = pd.DataFrame(columns=['showName', 'operatorName','action', 'operateTimeGMT'])\n",
"\"\"\" 获取全量数据 \"\"\"\n",
"for i in range(1, PAGES+1): # PAGES+1\n",
" form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
" # processInstanceId_list = []\n",
" processInstanceId_list = \"\"\n",
" for v in range(0,len(form_data.get('data'))):\n",
" # processInstanceId_list.append(form_data['data'][v]['processInstanceId']) \n",
" if processInstanceId_list == \"\":\n",
" processInstanceId_list = processInstanceId_list + form_data['data'][v]['processInstanceId']\n",
" else:\n",
" processInstanceId_list = processInstanceId_list + \",\" + form_data['data'][v]['processInstanceId']\n",
" res=get_approval_records_Batch(TOKEN,processInstanceId_list)\n",
" print(res)\n",
"# # 获取当前所处节点\n",
"# res_new = get_approval_records(token=TOKEN, processInstanceId=form_data['data'][v]['processInstanceId'])\n",
"# records_new = res_new.get('result')\n",
"# for a in range(0,len(records_new)):\n",
"# try:\n",
"# df_data = df_data._append({'showName': records_new[a]['showName'], 'operatorName': records_new[a]['operatorName'], 'action': records_new[a]['action'], 'operateTimeGMT': records_new[a]['operateTimeGMT'], 'processInstanceId': records_new[a]['processInstanceId']}, ignore_index=True)\n",
"# except:\n",
"# pass\n",
"# print(i,v)\n",
"# df_data.to_excel(r\"C:\\Users\\admin\\Desktop\\新签节点化待办审批明细.xlsx\")"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"https://api.dingtalk.com/v1.0/yida/processes/instances/searchWithIds?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&processInstanceIds=3c2ea9a9-3881-4d37-af7a-492f12925578\n",
"{'result': [{'processInstanceId': '3c2ea9a9-3881-4d37-af7a-492f12925578', 'formUuid': 'FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2', 'data': {'textareaField_l7zihz2l': '', 'textField_la80kiym': '河北省', 'textareaField_la80kizp': '', 'radioField_lc8w7jl8_id': '否', 'employeeField_lc8w7jl9': ['关磊(60566)'], 'employeeField_lc8w7jl9_id': ['1218085201677303'], 'textField_la80kiyv': '13630821314', 'textField_lbahat09': '', 'textField_la80kiyu': '杨立鹏', 'employeeField_la8zs59w_id': ['416944291218848'], 'employeeField_la8zs59w': ['陈晨(702836)'], 'selectField_ku6juya0': 'E.S(旧)', 'employeeField_lc8vmo70_id': ['055512041727184572'], 'employeeField_lc5wh9h4': ['申晓勇(60367)'], 'radioField_lc8w7jl8': '否', 'textField_la80kiyf': '基础版', 'textField_lc8vmo71': '普通客户(VIP', 'textareaField_l9mm6c2w': '', 'radioField_lc8vmo72_id': 'B', 'textField_la80kiyd': 'CHS202306050233131', 'employeeField_la80kj0k': ['申晓勇(60367)'], 'textField_la80kiye': '喜憨儿洗车中心', 'textareaField_l9mm4a0y': '', 'textareaField_l9mk6fg2': '', 'textareaField_l9mm6c2z': '', 'employeeField_la80kj0k_id': ['171201105229666119'], 'dateField_la8zs59x': 1685927820000, 'selectField_ku6juya0_id': '10', 'textField_lc8v74lq': '', 'employeeField_lc8vmo70': ['武宏超(700385)'], 'textareaField_l9mk6fg5': '', 'textField_lbahat0d': '', 'employeeField_lc5wh9h4_id': ['171201105229666119'], 'radioField_lc8vmo72': 'B', 'textareaField_l9mm4a11': ''}, 'processCode': 'TPROC--L89662816B04LXH893M4K50Q7MIZ1TVQI08ALV2', 'actionExecutor': [{'name': {'nameInChinese': '申晓勇', 'nameInEnglish': '申晓勇', 'type': 'i18n'}, 'userId': '171201105229666119'}], 'originator': {'name': {'nameInChinese': '刘光春', 'nameInEnglish': '刘光春', 'type': 'i18n'}, 'userId': '171128505620867604'}, 'title': '刘光春发起的新签节点化服务待办', 'instanceStatus': 'RUNNING'}]}\n"
]
}
],
"source": [
"def get_approval_records_Batch(token, processInstanceId):\n",
" \"\"\" 函数功能:批量获取流程表单的审批记录 --F6客户服务 应用 \"\"\"\n",
" appType = \"APP_UYZ0KG6L0CCNV80GZ66O\"\n",
" systemToken = \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\"\n",
" userId = \"yida_pub_account\"\n",
" language = \"zh_CN\"\n",
"\n",
" api = f'https://api.dingtalk.com/v1.0/yida/processes/instances/searchWithIds?appType={appType}&systemToken={systemToken}&userId={userId}&language={language}&processInstanceIds={processInstanceId}'\n",
" print(api)\n",
" headers = {\n",
" # \"Content-Type\": \"application/json\",\n",
" \"x-acs-dingtalk-access-token\": token\n",
" }\n",
"\n",
" res = requests.get(api, headers=headers)\n",
" return res.json()\n",
"TOKEN = generateToken()\n",
"res=get_approval_records_Batch(TOKEN,\"3c2ea9a9-3881-4d37-af7a-492f12925578\")\n",
"print(res)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"processInstanceId_list = \"\"\n",
"if processInstanceId_list == \"\":\n",
" processInstanceId_list = processInstanceId_list + form_data['data'][v]['processInstanceId']\n",
"else:\n",
" processInstanceId_list = processInstanceId_list + \",\" + form_data['data'][v]['processInstanceId']"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'9f59d64d-9fe6-436d-95b9-e752432e93d0,df581bac-9b01-4cce-9e5b-78198248b47b,63287299-dae8-4c6c-b848-2476644ca194,b3bede8c-6250-4387-996e-b10f92dbc889,ff49c2fb-2c4b-42f1-94fa-1e041042cf4a,87f288ce-c9ef-4026-aed1-6e32bae98404,1e5c9ee5-0696-4cfc-9753-6ddb83399222,b34a8d67-1e47-433e-8ad7-6429cb685b1b,dcab0a3e-a07b-4acd-a7a0-e7bb59a95ae1,2eb1eb0d-2358-48cf-ac38-d5ef6b710c4c,20be6dc9-8dcf-492d-a8e7-7b1891ce6c18,cc8c8255-3ece-4aa5-8dd1-4ed35b9a8367,15c60c3f-2ff3-49fd-ad68-50eb4846129f,a2a93bbf-f81c-4d96-a20d-adfe2dabe3e6,31b1c4b0-0fdc-40e3-991b-c48d451fb17a,1a785262-3acc-46ef-b9c4-53947f5778b6,a8302a13-1dc5-4b39-a8a3-98f63d5371f8,3d2fb40e-52cd-4762-ac44-2c182b6135bb,3ffcb08f-0860-413e-8872-f12fe3f06a57,7daab61d-f749-4830-a074-2ad4be2c06c0,4af87973-a1b3-4ab7-b496-726cb979ffaa,4852d7cd-06eb-4c4d-8f72-ee215a296a5d,6e83e35f-d9b0-4854-9d71-4d5581567973,abac8d19-7f1b-4615-b43c-f9bd68ee6e98,5a460bd8-103d-4725-9636-ed4e91e41424,83c3cd4f-5874-4d22-a5f1-731886d221db,981841be-3df7-4451-89d7-3d5fb1c1686b,eeb79bf8-357b-4f5e-b11a-1d37e6d5ba3f,93ec66a4-d384-47f5-a191-d9aab5d88de4,5b151095-f578-4d3b-8fbb-d440a796de8b,4bb66e89-1743-4e18-ba43-9e7d9bc34a81,467d6133-3872-4ab3-80df-eb2d5db568a2,65a97364-0c4b-4910-aad8-8fc37814d884,f0c816f5-3f2d-4446-a71c-be986fb3beb8,7716c643-1f2b-40fd-86ce-d79a2a841fe7,40e8343c-0435-440b-ba30-ea3118a20d2f,38287588-b0b5-4b57-baf0-959e533d31c2,12672f76-22b2-4c9d-ad78-bff4105eea4f,a26a9814-78f2-4f24-9349-916367c52305,515fc34b-8064-44e8-8a4b-64044acc117f,57ece0c4-fab6-464b-9632-bcbbbaa1e663,2eb8b4f4-d1f7-4d45-a599-0761405dd8ec,25e62351-98b8-4e53-bfbb-e956839f67c2,9dcae814-0e19-4498-9b26-8ee3fdeadb3d,5f85cc1b-d9e6-4b2b-b2ae-f56b5e377587,03bb5986-1da4-47e1-8834-f96913e87cb7,269318cf-5744-4e84-a96a-a73454b77d66,e847d1aa-325f-4fb7-96ba-1adf457107ae,e6d29952-282b-48e4-ac38-83b42db90470,4207b475-a1d8-4e36-8516-220a40e69a51,9c871c69-19fc-4591-bc48-a40a70b5b3e5,cb9020be-a000-4d99-970f-f4d62c44ed98,9ef67f86-6385-4082-881b-5335f4108e4d,1db21f89-cd20-4e38-8f62-c1d0b3804ced,50e824da-5fab-481c-ae28-7f295b04bc55,369127dc-29fa-4385-a713-f6865c4b8f29,6b93e1b9-2916-485d-8a7d-b62a00c9230e,048750ff-0855-4981-a238-c1c72d6155d9,55f221a1-d9a1-4429-89b5-632636112e7f,91108d6b-6f0d-4d08-9782-da08a98b7e27,7be6100d-f434-4b45-ae04-7ea6d7767931,50f52172-d4af-4ae1-891d-a7ac7b918585,37734bbf-dbb2-491c-9152-bf55f1e58b62,47530f2f-c4b1-4e27-9778-0e771c133091,f2c88dd2-d3e9-4556-8f5b-1d31e64ef92b,16e4840a-9c50-421c-860d-2827ef4e900c,1ab1efe0-d596-4c64-9994-2123af4233d2,4c6a88a3-460d-48cc-bcb3-84123ee0a9b9,1fc9d0ab-9ba1-413a-b059-a1bc0daaa38f,53944efd-5795-4884-a127-85c1d13f79b4,fb4bdc18-5bd1-4360-9dbe-7b386a81e3d8,29403565-4509-43b3-b4ec-193eeb51bd91,9b6ed1c0-ea2f-4fff-9763-6fbe7bb3d82b,67e989f7-c51a-4f05-bc5b-4ad9e5edc072,a35c1fb8-f5f1-44cf-8b81-0fd811d4c959,f88f98e3-97cd-443b-90c9-5b026cf69730,2c5ebcda-4694-42ce-84c5-77bf1a113857,b72ecc1f-5857-4032-983f-7012f577cc3b,1583bbfa-1d29-4588-8258-b3be7dbb6060,d64754d5-cd60-4df1-9163-82060aa859d4,81de8ff9-9590-49d3-a4e7-eee87835fc11,ed269d03-a884-46b3-9e4a-573ca6b9ea8f,5e3b42fd-81b4-4a9e-9d97-0f20651e65bc,f19a5ba7-e131-4574-86c7-8e223fb5abc4,d689215c-dc9c-4da0-9eb9-d6ce2c40187f,6ad0edbd-5bef-4ff7-ae13-315e816baa6f,8c64abf5-09e7-4f9e-bbc7-4696eddd3631,2ba7208b-fd65-4204-8988-cf3c3e688674,f5c4b2d5-d922-4c5a-97ff-66ff9e27d426,6e68ff4e-a3c0-47f9-8bd6-8d87fa66cdc3,0620d96f-6a6b-4f20-a57a-6a3deaa78d05,56c4294a-b6fe-4465-a785-b43affddf7f9,3fc87b17-f50e-4dba-aaa5-8b7233c77f87,31ef172e-a367-4d7b-8c03-a3c90234264b,b4f522cb-207d-4d92-a3a0-4a9e394df5e9,9713b36b-1c35-4aab-8f56-f6b8903388c0,d5900c12-0ebc-4770-a660-b77f8fe07684,618dc75e-8beb-4880-a7da-234ee069feed,3304bf9c-3aba-4abc-804f-09fa1c5212a9,6a742ba6-49f9-477d-9caa-266969caba8e'"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"processInstanceId_list"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "F6processing",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.4"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}