403 lines
16 KiB
Plaintext
403 lines
16 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:\n",
|
|
"c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\.libs\\libopenblas.EL2C6PLE4ZYW3ECEVIV3OXXGRN2NRFM2.gfortran-win_amd64.dll\n",
|
|
"c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll\n",
|
|
" warnings.warn(\"loaded more than 1 DLL from .libs:\"\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"读取到 [流程]新签服务流程表中 274 条数据!\n",
|
|
"读取到 新签节点化服务待办表单中 1959 条数据!\n",
|
|
"读取到 [正式]企微添加表单中 1776 条数据!\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\n",
|
|
"import requests\n",
|
|
"from pathlib import Path\n",
|
|
"from urllib.parse import quote\n",
|
|
"import json\n",
|
|
"import numpy as np\n",
|
|
"import time\n",
|
|
"import datetime\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_instances_new(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",
|
|
"def read_instances(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",
|
|
"def transcation(FORMID,data_new):\n",
|
|
" \"\"\" 函数功能:更新表单内容 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\", # 曹伟 id\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"useLatestVersion\" : \"false\",\n",
|
|
" \"formInstanceId\" : FORMID,\n",
|
|
" \"updateFormDataJson\" : json.dumps(data_new, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.put(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def update_instances(TOKEN, processInstanceId,code,name):\n",
|
|
" \"\"\" 更新表单实例 \"\"\"\n",
|
|
"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" data_new= {\n",
|
|
" code : name \n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : processInstanceId,\n",
|
|
" \"useLatestVersion\" : 'false',\n",
|
|
" \"updateFormDataJson\" : json.dumps(data_new, cls=NpEncoder) #json.dumps(data_new, cls=NpEncoder)\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.put(api, headers=headers,json =payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def instances_id(TOKEN,FORMID,id):\n",
|
|
" \"\"\" 函数功能:查询表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/{id}?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=2268275546837446&language=zh_CN'\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",
|
|
"\n",
|
|
" return res.json()\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",
|
|
"TOKEN = generateToken() \n",
|
|
"'''新签服务流程实例状态字段,动态传入到 节点化回访流程表单中'''\n",
|
|
"FORMID = \"FORM-9X766NA1SOATBRSH2K42D8BJCX7L326HI64TKG5\" # [流程]新签服务流程\n",
|
|
"# 读取[流程]新签服务流程表单\n",
|
|
"form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
|
"ALL_DATA_code = []\n",
|
|
"\"\"\" 获取全量数据 \"\"\"\n",
|
|
"for i in range(1, PAGES+1):\n",
|
|
" form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_code.append(data[\"data\"][\"orgCode\"])\n",
|
|
"print(f'读取到 [流程]新签服务流程表中 {len(ALL_DATA_code)} 条数据!')\n",
|
|
"\n",
|
|
"\n",
|
|
"# 读取节点化回访流程表单\n",
|
|
"FORMID = \"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\" # 新签节点化服务待办\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
|
"ALL_DATA_node = []\n",
|
|
"\"\"\" 获取全量数据 \"\"\"\n",
|
|
"for i in range(1, PAGES+1):\n",
|
|
" # form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100, searchField={'textField_l7if5ff9': '否'})\n",
|
|
" form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_node.append(data)\n",
|
|
"print(f'读取到 新签节点化服务待办表单中 {len(ALL_DATA_node)} 条数据!')\n",
|
|
"\n",
|
|
"# [正式]企微添加表单\n",
|
|
"FORMID = \"FORM-EA866E71PER3VJXR7BVCK8ZHIEFU2ALKFIZ7LX\" # [正式]企微添加表单\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
|
"ALL_DATA_wx = {}\n",
|
|
"\"\"\" 获取全量数据 \"\"\"\n",
|
|
"for i in range(1, PAGES+1):\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" try:\n",
|
|
" ALL_DATA_wx[data['formData']['textField_l7zihz1u']]=data['formData']['radioField_l7zihz2k']\n",
|
|
" except:\n",
|
|
" pass\n",
|
|
"print(f'读取到 [正式]企微添加表单中 {len(ALL_DATA_wx)} 条数据!')\n",
|
|
"\n",
|
|
"# 校验状态\n",
|
|
"for i in range(0,len(ALL_DATA_node)):\n",
|
|
" try:\n",
|
|
" if ALL_DATA_node[i]['data']['textField_la80kiyd'] in ALL_DATA_code and ALL_DATA_node[i]['data']['radioField_lfth6zsc'] !=\"运行中\":\n",
|
|
" update_instances(TOKEN,ALL_DATA_node[i]['processInstanceId'],'radioField_lfth6zsc',\"运行中\")\n",
|
|
" print(i,\"运行中\",ALL_DATA_node[i]['data']['textField_la80kiyd'])\n",
|
|
" except:\n",
|
|
" pass \n",
|
|
" try:\n",
|
|
" if ALL_DATA_node[i]['data']['textField_la80kiyd'] not in ALL_DATA_code and ALL_DATA_node[i]['data']['radioField_lfth6zsc'] !=\"已完成\":\n",
|
|
" update_instances(TOKEN,ALL_DATA_node[i]['processInstanceId'],'radioField_lfth6zsc',\"已完成\")\n",
|
|
" print(i,\"已完成\",ALL_DATA_node[i]['data']['textField_la80kiyd'])\n",
|
|
" except:\n",
|
|
" pass \n",
|
|
" try:\n",
|
|
" if ALL_DATA_node[i]['data']['textField_la80kiyd'] in ALL_DATA_wx :\n",
|
|
" update_instances(TOKEN,ALL_DATA_node[i]['processInstanceId'],'radioField_lcsj520d',ALL_DATA_wx[ALL_DATA_node[i]['data']['textField_la80kiyd']])\n",
|
|
" print(i,\"更新企微添加状态\",ALL_DATA_node[i]['data']['textField_la80kiyd'])\n",
|
|
" except:\n",
|
|
" pass \n",
|
|
" try:\n",
|
|
" res = instances_id(TOKEN,\"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\",ALL_DATA_node[i]['processInstanceId'])\n",
|
|
" timestamp = int(res['formData']['dateField_la8zs59x'])\n",
|
|
" # 输出结果为:1672493600000\n",
|
|
" # 将时间戳转换为日期对象\n",
|
|
" date_obj = datetime.datetime.fromtimestamp(timestamp / 1000)\n",
|
|
" # 将日期对象的时分秒毫秒部分设置为0\n",
|
|
" date_obj = date_obj.replace(hour=0, minute=0, second=0, microsecond=0)\n",
|
|
" # 将日期对象的年份、月份和日期部分拼接成字符串\n",
|
|
" date_str = date_obj.strftime('%Y-%m-%d')\n",
|
|
" # 将字符串转换为日期对象\n",
|
|
" date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')\n",
|
|
" # 将日期对象转换为时间戳(单位为毫秒)\n",
|
|
" timestamp = int(date_obj.timestamp() * 1000)\n",
|
|
" formData = {}\n",
|
|
" # 获取距离过期日期前120天,前90天,前60天,前30天的日期\n",
|
|
" formData['dateField_ljzefdm4'] = str(timestamp+2592000000) # 90天限制日期\n",
|
|
" formData['dateField_ljzefdm5'] = str(timestamp+5184000000) # 60天限制日期\n",
|
|
" formData['dateField_ljzefdm6'] = str(timestamp+7776000000) # 30天限制日期\n",
|
|
" res = transcation(ALL_DATA_node[i]['processInstanceId'],formData)\n",
|
|
" print(res,ALL_DATA_node[i]['processInstanceId'],timestamp,formData)\n",
|
|
" except:\n",
|
|
" pass "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{}"
|
|
]
|
|
},
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"res = instances_id(TOKEN,\"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\",ALL_DATA_node[i]['processInstanceId'])\n",
|
|
"res['formData']['checkboxField_liviovx6']\n",
|
|
"formData = {\n",
|
|
" 'checkboxField_liviovx6':res['formData']['checkboxField_liviovx6']\n",
|
|
"}\n",
|
|
"transcation(ALL_DATA_node[i]['processInstanceId'],formData)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{}"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"res = instances_id(TOKEN,\"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\",\"b24d43cb-6cfc-4a6f-9f29-dad9adc869c4\")\n",
|
|
"res['formData']['checkboxField_liviovx6']\n",
|
|
"formData = {\n",
|
|
" 'checkboxField_liviovx6':res['formData']['checkboxField_liviovx6']\n",
|
|
"}\n",
|
|
"transcation(\"b24d43cb-6cfc-4a6f-9f29-dad9adc869c4\",formData)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"{'checkboxField_liviovx6': ['问题']}"
|
|
]
|
|
},
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"formData"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"'14182226-a47c-4ad1-b716-16ddb4215c7b'"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"ALL_DATA_node[i]['processInstanceId']"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"res = instances_id(TOKEN,\"FORM-L89662816B04LXH893M4K50Q7MIZ1SVQI08ALU2\",ALL_DATA_node[i]['processInstanceId'])\n",
|
|
"timestamp = int(res['formData']['dateField_la8zs59x'])\n",
|
|
"# 输出结果为:1672493600000\n",
|
|
"# 将时间戳转换为日期对象\n",
|
|
"date_obj = datetime.datetime.fromtimestamp(timestamp / 1000)\n",
|
|
"# 将日期对象的时分秒毫秒部分设置为0\n",
|
|
"date_obj = date_obj.replace(hour=0, minute=0, second=0, microsecond=0)\n",
|
|
"# 将日期对象的年份、月份和日期部分拼接成字符串\n",
|
|
"date_str = date_obj.strftime('%Y-%m-%d')\n",
|
|
"# 将字符串转换为日期对象\n",
|
|
"date_obj = datetime.datetime.strptime(date_str, '%Y-%m-%d')\n",
|
|
"# 将日期对象转换为时间戳(单位为毫秒)\n",
|
|
"timestamp = int(date_obj.timestamp() * 1000)\n",
|
|
"formData = {}\n",
|
|
"# 获取距离过期日期前120天,前90天,前60天,前30天的日期\n",
|
|
"formData['dateField_ljzefdm4'] = str(timestamp+2592000000) # 90天限制日期\n",
|
|
"formData['dateField_ljzefdm5'] = str(timestamp+5184000000) # 60天限制日期\n",
|
|
"formData['dateField_ljzefdm6'] = str(timestamp+7776000000) # 30天限制日期\n",
|
|
"res = transcation(ALL_DATA_node[i]['processInstanceId'],formData)\n",
|
|
"print(res,ALL_DATA_node[i]['processInstanceId'],timestamp,formData)"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|