506 lines
28 KiB
Plaintext
506 lines
28 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": [
|
|
"读取到流程表单中 0 条数据!\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"import requests\n",
|
|
"import json\n",
|
|
"import time\n",
|
|
"import re\n",
|
|
"from datetime import datetime\n",
|
|
"from dateutil.relativedelta import relativedelta\n",
|
|
"from pathlib import Path\n",
|
|
"from urllib.parse import quote\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, createFromTimeGMT, createToTimeGMT, 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",
|
|
" \"createFromTimeGMT\": createFromTimeGMT,\n",
|
|
" \"createToTimeGMT\": createToTimeGMT,\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_instances(token, formUuid, createFromTimeGMT, createToTimeGMT, page, n):\n",
|
|
" \"\"\" 函数功能:读取流程表单的所有数据 \"\"\"\n",
|
|
"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search?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 timeStamp(timeNum):\n",
|
|
" \"\"\" 函数功能:将时间戳(毫秒) 转化为时间日期格式\"\"\"\n",
|
|
" timeStamp = float(timeNum/1000)\n",
|
|
" timeArray = time.localtime(timeStamp)\n",
|
|
" otherStyleTime = time.strftime(\"%Y-%m-%d %H:%M:%S\", timeArray)\n",
|
|
" return otherStyleTime\n",
|
|
"\n",
|
|
"def get_time_range_minute(n):\n",
|
|
" \"\"\" 获取近n分钟的时间戳(单位是毫秒)\"\"\"\n",
|
|
"\n",
|
|
" def delay_time(time_str, years=0, months=0, days=0, hours=0, minutes=0, seconds=0):\n",
|
|
" if type(time_str) == str:\n",
|
|
" time_str = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S')\n",
|
|
" ret = time_str + relativedelta(years=years, months=months, days=days, hours=hours, minutes=minutes, seconds=seconds)\n",
|
|
" return ret\n",
|
|
"\n",
|
|
" # 获得当前时间\n",
|
|
" now_time = datetime.now()\n",
|
|
" endTime = int(time.mktime(time.strptime(now_time.strftime('%Y/%m/%d %H:%M:%S'), '%Y/%m/%d %H:%M:%S'))) * 1000 - 1000\n",
|
|
" # n小时前的时间\n",
|
|
" ret2 = delay_time(now_time, minutes=-n)\n",
|
|
" startTime = int(time.mktime(time.strptime(ret2.strftime('%Y/%m/%d %H:%M:%S'), '%Y/%m/%d %H:%M:%S'))) * 1000\n",
|
|
"\n",
|
|
" # print(f'时间区间:[{startTime}-{endTime}]')\n",
|
|
" return startTime, endTime\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 forms_isDone(TOKEN: str, FORMID: str, CREATE_FROM, CREATE_TO,PAGES,processInstanceId,isDone_id):\n",
|
|
" '''\n",
|
|
" 返回isDone_id 对应的控件内容\n",
|
|
" '''\n",
|
|
" for i in range(1, PAGES+1):\n",
|
|
" form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" processInstanceId_1 = data.get('processInstanceId')\n",
|
|
" if processInstanceId_1 == processInstanceId:\n",
|
|
" isDone = data.get('data').get(isDone_id)\n",
|
|
" return isDone\n",
|
|
"\n",
|
|
"def aggree_approval(token: str, taskId: str, processInstanceId: str, formData: dict):\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\": \"2268275546837446\", \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 switch(token: str, processInstanceId: str, formData: dict):\n",
|
|
" \"\"\" 函数说明:\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",
|
|
" payload = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\", # 管理员\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"useLatestVersion\" : \"false\",\n",
|
|
" \"formInstanceId\" : processInstanceId,\n",
|
|
" \"updateFormDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.put(api, headers=headers, json=payload)\n",
|
|
" print('开关 程序调用时避免 重复进行(执行间隔 小于 单次执行时间时 发送 重复处理)')\n",
|
|
"\n",
|
|
"def update_form_staff(TOKEN: str,processInstanceId,staff_id,ModifiedField_value):\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",
|
|
" data_new = {\n",
|
|
" ModifiedField_value:[staff_id]\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\" : processInstanceId,\n",
|
|
" \"updateFormDataJson\" : json.dumps(data_new, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.put(api, headers=headers, json=payload)\n",
|
|
" print('员工更新表单内容')\n",
|
|
" return res\n",
|
|
"\n",
|
|
"def get_staffID(TOKEN: str,staff_name):\n",
|
|
" \"\"\" 函数功能:通过员工名称获取员工id\"\"\"\n",
|
|
" api = f'https://f6car.aliwork.com/query/userservice/searchUsersOrDepts.json?start=0&size=50&key='+staff_name+'&_csrf_token='+TOKEN\n",
|
|
" # api = f'https://f6car.aliwork.com/query/userservice/searchUsersOrDepts.json?start=0&size=50&key=曹伟&_csrf_token=bd612bb6-5dd1-48a7-a2d1-9fd690e53007'\n",
|
|
"\n",
|
|
" cookies_str = 'cna=/rsGGCJMiRICAd3ikLSdYaLe; x-hng=lang=zh-CN; _hjSessionUser_2824842=eyJpZCI6Ijk5N2RlODIwLTllZjQtNTFmMC04ODBlLTM2NjhlNGI5N2IzNCIsImNyZWF0ZWQiOjE2NjE5MzEyNDI5ODUsImV4aXN0aW5nIjp0cnVlfQ==; xlly_s=1; corp_id=dinga88e3d35525b86ca; account=oauth_k1:/hIZRg2OU0B772BRzF/oMeyebWbOer3T9N3k1ooNnTnJ/3uiTeXBJGoEkxrQUouqzxKZ24GFX++sWmVz4TdTXKy+UlhfcaLmlheDyqjN7rM=; login_type=514E440D8469FCA0F295D0E60E2491CD; tianshu_corp_id=dinga88e3d35525b86ca; corp_industry_info={\"hasIndustryAddressBook\":false,\"industryType\":\"INDUSTRY_GENERAL\"}; yida_user_cookie=340FE517680AA52A8CDA4B096BBA4C25FA4F70F848A9D6250EA4813FB1FB8D9C566FC0D0099E946D10CF82B46D6C9D2141F852DCD3C154D83ADF82D00E06F4B9232A86564625252386D9CC32091DDB3ADC5B29E4C29248111ED255208CF0ECF34EBDBE635E10395BE7A52DF4A835D5385B86D0CBDE4E441D2EB2CFA346709E84F836F4C53A121D24CD09DB1BA76BE4F54A5E200737F4FF8C5CA04C434C882362B175C5DB7668465907C6A60FD5B133827EAACF7A99BD40B4043BED329B24748476993349702AA729C414D14C3F0A8B74636D7E76DBD9B9150A4682A50564D3BE3F71A39407A2B49DE6EF7969F5D6D3947C0D05BE0841E70BCFCEB6D64A4F0BA6FDFF665C4D0B6A6C43C1F8D3D0D7EDAFE7733A8D5BD507FAEDC40BDC572B1C75EE3289B8EAC1B9C78EFBA9CEC317BE9D2970BAFCF0E8CDAAF870A81B8D0288E989F4B2BFA2651BA779F14A863E36749EEAF42903E223A33D2331F62486F14829; tianshu_user_identity={\"inIndustry\":false,\"innerCorp\":true,\"userIdentitySet\":[\"CORP_INNER\"]}; tianshu_corp_user=dinga88e3d35525b86ca_2268275546837446; tianshu_csrf_token=b3ce6701-d979-4315-abb6-b698bfdab876; c_csrf=b3ce6701-d979-4315-abb6-b698bfdab876; tianshu_app_type=APP_UYZ0KG6L0CCNV80GZ66O; due=286F5DFA5EFE869F087F051377C0240834D7422C0AEAC057E93DBFC8F8CFEE11; JSESSIONID=03B5873C9F8B54A6463B77F40F9A8517; isg=BHFxLDDXsUBTQBgK6RB2nBfEgP0LXuXQpWi26lOG_zhyepLMm6yioLHbnA4c1n0I'\n",
|
|
" cookies_str = cookies_str.encode('utf-8').decode('latin-1')\n",
|
|
"\n",
|
|
" cookie_dict = {item.split('=')[0]: item.split('=')[1]\n",
|
|
" for item in cookies_str.split('; ')}\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',\n",
|
|
" \"Content-Type\": \"application/json, text/plain, */*\",\n",
|
|
" 'referer': 'https://f6car.aliwork.com/APP_UYZ0KG6L0CCNV80GZ66O/submission/FORM-KH766OB1QYGTWE0A17ZHY873SEX82VSQLQCTKD4?isRenderNav=false&iframeState=admin'\n",
|
|
" }\n",
|
|
" res = requests.get(api,headers=headers,cookies=cookie_dict)\n",
|
|
" res_new = res.json().get('content').get('values')[0].get('id')\n",
|
|
" print('通过员工名称获取员工id')\n",
|
|
" return res_new\n",
|
|
"\n",
|
|
"def get_type(TOKEN: str,ModifiedField_value,Form_id):\n",
|
|
" \"\"\" 函数功能:通过唯一标识获取控件类型\"\"\"\n",
|
|
" api = f'https://api.dingtalk.com/v1.0/yida/forms/formFields?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&formUuid='+Form_id+'&userId=yida_pub_account'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers)\n",
|
|
" cnew = res.json().get('result')\n",
|
|
" componentName = [i.get('componentName') for i in cnew if i.get('fieldId')== ModifiedField_value ]\n",
|
|
" print('通过唯一标识获取控件类型')\n",
|
|
" return componentName\n",
|
|
"\n",
|
|
"def update_text(TOKEN: str, processInstanceId, formData):\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",
|
|
" payload = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\", # 管理员\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"useLatestVersion\" : \"false\",\n",
|
|
" \"formInstanceId\" : processInstanceId,\n",
|
|
" \"updateFormDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.put(api, headers=headers, json=payload)\n",
|
|
" print('更新单行文本控件内容')\n",
|
|
" return res\n",
|
|
"\n",
|
|
"def pass_on(TOKEN: str,taskId, processInstanceId, staffid):\n",
|
|
" \"\"\" 函数功能:转交审批节点 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/tasks/redirect'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"processInstanceId\" : processInstanceId,\n",
|
|
" \"byManager\" : \"y\",\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"remark\" : \"转交(接口自动)\",\n",
|
|
" \"nowActionExecutorId\" : staffid,\n",
|
|
" \"userId\" : \"2268275546837446\",\n",
|
|
" \"taskId\" : int(taskId)\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print('转交审批节点')\n",
|
|
" return res\n",
|
|
"\n",
|
|
"def read_instances_new(token, formUuid, createFromTimeGMT, createToTimeGMT, 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",
|
|
" # \"searchFieldJson\": json.dumps(searchField), # 如果增加上这一项会要求升级宜搭存储\n",
|
|
" 'currentPage':page,\n",
|
|
" 'pageSize':n\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=formData)\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-VJ866081RYI8TPPMDNZKR4DER6092QO7ZOXEL7\" # 发起批量修改需求\n",
|
|
"FORMID2 = \"FORM-PR8667D1V3U81BJAFE7PI6JWMHU02DI91NXEL1\" # 修改明细表\n",
|
|
"# 10分钟时间间隔\n",
|
|
"CREATE_FROM, CREATE_TO = [timeStamp(t) for t in get_time_range_minute(100000000)]\n",
|
|
"\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
|
"\n",
|
|
"ALL_DATA = []\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_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA.append(data)\n",
|
|
"\n",
|
|
"\n",
|
|
"print(f'读取到流程表单中 {len(ALL_DATA)} 条数据!')\n",
|
|
"\n",
|
|
"for data in ALL_DATA:\n",
|
|
" processInstanceId = data.get('processInstanceId')\n",
|
|
" USEWRID = data.get('originator').get('userId')\n",
|
|
" print('USEWRID:',USEWRID) \n",
|
|
" switch_value = data.get('data').get('textField_lexoznc4') # 状态\n",
|
|
"\n",
|
|
" if switch_value == \"待处理\":\n",
|
|
" # 状态——修改为:处理中\n",
|
|
" formData = {'textField_lexoznc4':'处理中'}\n",
|
|
" switch(TOKEN,processInstanceId,formData)\n",
|
|
"\n",
|
|
" # 获取表单名称、表单id、功能选择、修改字段名称、关联编码\n",
|
|
" Form_value = data.get('data').get('selectField_lexoznbw') # 表单名称\n",
|
|
" Form_id = data.get('data').get('selectField_lexoznbw_id') # 表单id\n",
|
|
" Function_value = data.get('data').get('selectField_lexoznbx') # 功能选择\n",
|
|
" ModifiedField_value = data.get('data').get('textField_lexoznc5') # 修改字段唯一标识符\n",
|
|
" Relevancy_value = data.get('data').get('textField_lexoznby') # 关联编码\n",
|
|
" print(Form_value,Form_id,Function_value,ModifiedField_value,Relevancy_value)\n",
|
|
"\n",
|
|
" # 读取修改明细表全量数据\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID2, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=1, n=10)\n",
|
|
" PAGES = form_data.get('totalCount')//10 + 1\n",
|
|
"\n",
|
|
" LIST_DATA = []\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=FORMID2, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=10)\n",
|
|
" for data_update in form_data.get('data'):\n",
|
|
" LIST_DATA.append(data_update)\n",
|
|
" if len(LIST_DATA)>0:\n",
|
|
" for data_amend in LIST_DATA:\n",
|
|
" try:\n",
|
|
" # 遍历:筛选出关联编码 = Relevancy_value 状态为未处理\n",
|
|
" if Relevancy_value == data_amend.get('formData').get('textField_lez31l31') and data_amend.get('formData').get('textField_lexootfr') == \"已处理\": \n",
|
|
" # 获取明细表单数据\n",
|
|
" revise_name = [i.get('fieldData') for i in json.loads(data_amend.get('instanceValue')) if i.get('fieldId')== 'textField_lexootfo' ][0]['value'] # 修改内容 textField_lexootfo\n",
|
|
" example_id = [i.get('fieldData') for i in json.loads(data_amend.get('instanceValue')) if i.get('fieldId')== 'textField_lexootfn' ][0]['value'] # 实例id textField_lexootfn\n",
|
|
" state_name = [i.get('fieldData') for i in json.loads(data_amend.get('instanceValue')) if i.get('fieldId')== 'textField_lexootfr' ][0]['value'] # 状态(默认:未处理) textField_lexootfr\n",
|
|
" formInstanceId = data_amend.get('formInstanceId') # 修改明细表 实例id\n",
|
|
"\n",
|
|
" # 判断 功能选择————————————————————————————————————————————————————————————————————\n",
|
|
" if Function_value == \"修改内容\":\n",
|
|
" # 判断需要修改的类型\n",
|
|
" componentName_new = get_type(TOKEN,ModifiedField_value,Form_id)\n",
|
|
" if componentName_new ==['EmployeeField']: # 成员字段\n",
|
|
" staffid = get_staffID(TOKEN,revise_name) # 获取员工id\n",
|
|
" update_form_staff(TOKEN,example_id,staffid,ModifiedField_value) # 修改 实例id textField_lexootfn 对应的内容\n",
|
|
" # formData = {'textField_lexoznc4':'已处理'}\n",
|
|
" # update_text(TOKEN, processInstanceId, formData) # 发起批量修改需求_状态为_已处理\n",
|
|
" formData = {'textField_lexootfr':'已处理'}\n",
|
|
" update_text(TOKEN, formInstanceId, formData) # 修改明细_状态为_已处理\n",
|
|
" else:\n",
|
|
" formData = {ModifiedField_value:revise_name}\n",
|
|
" update_text(TOKEN, example_id, formData) # 修改 实例id textField_lexootfn 对应的内容\n",
|
|
" # formData = {'textField_lexoznc4':'已处理'}\n",
|
|
" # update_text(TOKEN, processInstanceId, formData) # 发起批量修改需求_状态为_已处理\n",
|
|
" formData = {'textField_lexootfr':'已处理'}\n",
|
|
" update_text(TOKEN, formInstanceId, formData) # 修改明细_状态为_已处理\n",
|
|
" elif Function_value == \"转交\":\n",
|
|
" # 判断需要修改的类型\n",
|
|
" componentName_new = get_type(TOKEN,ModifiedField_value,Form_id)\n",
|
|
" if componentName_new ==['EmployeeField']: # 成员字段\n",
|
|
" staffid = get_staffID(TOKEN,revise_name) # 获取员工id\n",
|
|
" # 获取审批记录\n",
|
|
" res_new = get_approval_records(token=TOKEN, processInstanceId=example_id)\n",
|
|
" records_new = res_new.get('result')\n",
|
|
" # 获取审批节点的 taskId\n",
|
|
" records_new = [item for item in records_new if item.get('type') == \"TODO\"]\n",
|
|
" taskId_new = records_new[0].get('taskId')\n",
|
|
" pass_on(TOKEN=TOKEN, taskId=taskId_new, processInstanceId=example_id, staffid=staffid)\n",
|
|
"\n",
|
|
" # 修改明细表和需求表\n",
|
|
" formData = {'textField_lexootfr':'已处理'}\n",
|
|
" update_text(TOKEN, formInstanceId, formData) # 修改明细_状态为_已处理\n",
|
|
" elif Function_value == \"修改内容并转交\":\n",
|
|
" # 判断需要修改的类型\n",
|
|
" componentName_new = get_type(TOKEN,ModifiedField_value,Form_id)\n",
|
|
" if componentName_new ==['EmployeeField']: # 成员字段\n",
|
|
" staffid = get_staffID(TOKEN,revise_name) # 获取员工id\n",
|
|
" update_form_staff(TOKEN,example_id,staffid,ModifiedField_value) # 修改 实例id textField_lexootfn 对应的内容 下面再进行转交\n",
|
|
" # 获取审批记录\n",
|
|
" res_new = get_approval_records(token=TOKEN, processInstanceId=example_id)\n",
|
|
" records_new = res_new.get('result')\n",
|
|
" # 获取审批节点的 taskId\n",
|
|
" records_new = [item for item in records_new if item.get('type') == \"TODO\"]\n",
|
|
" taskId_new = records_new[0].get('taskId')\n",
|
|
" pass_on(TOKEN=TOKEN, taskId=taskId_new, processInstanceId=example_id, staffid=staffid)\n",
|
|
"\n",
|
|
" # 修改明细表和需求表\n",
|
|
" formData = {'textField_lexootfr':'已处理'}\n",
|
|
" update_text(TOKEN, formInstanceId, formData) # 修改明细_状态为_已处理\n",
|
|
" except:\n",
|
|
" example_id = [i.get('fieldData') for i in json.loads(data_amend.get('instanceValue')) if i.get('fieldId')== 'textField_lexootfn' ][0]['value'] # 实例id textField_lexootfn\n",
|
|
" print('错误',example_id)\n",
|
|
" # 同意流程 + 发起批量修改需求_状态为_已处理\n",
|
|
" res_new = get_approval_records(token=TOKEN, processInstanceId=processInstanceId)\n",
|
|
" records_new = res_new.get('result')\n",
|
|
" # 获取审批节点的 taskId\n",
|
|
" records_new = [item for item in records_new if item.get('type') == \"TODO\"]\n",
|
|
" taskId_new = records_new[0].get('taskId')\n",
|
|
" data_new = {'textField_lexoznc4':'已处理'}\n",
|
|
" aggree_approval(token=TOKEN, taskId=taskId_new, processInstanceId=processInstanceId, formData=data_new)"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|