246 lines
11 KiB
Plaintext
246 lines
11 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 每天早上获取9点获取前一天生成的字段对应关系,判断字段对应关系中原始字段是否存在公有+参考对应关系(存在:跳过;不存在:判断数据类型的刚需+易错字段是否都存在,存在则透出,人工判断是否作为参考对应关系)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 35,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"{} FINST-PEC66NA19K7JFJ4BBIBTN8WAIW5W33D98CITL7S5\n",
|
|
"{} FINST-1XC66H718H7JIWMK6X5L28R1X4ZN3ZROZ6ITL8F4\n",
|
|
"{} FINST-KL766581RG7JOFR06PT6X4G445ZQ39LFE6ITLMX5\n",
|
|
"{} FINST-J3D66LA1VL7JD7T99BM358GHO8613CVCT5ITL6B1\n",
|
|
"{} FINST-87D66K71O27JHVH16W1TIB40494M2CBU05ITLE01\n",
|
|
"{} FINST-OM9666B1EI7JWO0K85D9W53QXLYG3IXE54ITLYE\n",
|
|
"{} FINST-A8766Q91DH7J4IYZ64G81CIDBNQT3BZWK3ITLCE2\n",
|
|
"{} FINST-I1A66071847J6JIV6EGDA4WSS0R33VZ1O2ITL1Y3\n",
|
|
"{} FINST-EC766DB1V27JGSVQ8LYJLCSPDN433WZ4I2ITLUF\n",
|
|
"{} FINST-6JA66W91NH7JTO4B8KCUS7T9V6WC30R4H0ITL0B1\n",
|
|
"{} FINST-G0A66Z81GTTIXZZK98FZD6KQQNJ42FL403HTLDMW5\n",
|
|
"{} FINST-ROC66JB17D6JJ776BFB3W9PN8DM138M0BZGTL6OB\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"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",
|
|
"\n",
|
|
"# 生成 token,参数不需要修改\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 instances(TOKEN,formInstanceId,data_new) -> str:\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_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\" : \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\" : \"2268275546837446\", # 曹伟 id\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"useLatestVersion\" : \"false\",\n",
|
|
" \"formInstanceId\" : formInstanceId,\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",
|
|
"\n",
|
|
"def read_form_instances(token,formUuid,createFromTimeGMT,createToTimeGMT,page=1,n = 100,searchField={}):\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",
|
|
" 'currentPage':page,\n",
|
|
" 'pageSize':n,\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": formUuid,\n",
|
|
" \"createFromTimeGMT\":createFromTimeGMT,\n",
|
|
" \"createToTimeGMT\":createToTimeGMT,\n",
|
|
" \"searchFieldJson\":json.dumps(searchField)\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_form_instancesV2(token,formUuid,page=1,n = 100,searchField={}):\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",
|
|
" 'currentPage':page,\n",
|
|
" 'pageSize':n,\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": formUuid,\n",
|
|
" \"searchFieldJson\":json.dumps(searchField)\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=formData)\n",
|
|
" return res.json()\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_hour(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, hours=-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",
|
|
"def remove_duplicates(data):\n",
|
|
" new_data = {}\n",
|
|
" for key, value in data.items():\n",
|
|
" if value not in new_data.values():\n",
|
|
" new_data[key] = value\n",
|
|
" return new_data\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",
|
|
"TOKEN = generateToken()\n",
|
|
"# 对应关系维护\n",
|
|
"FORMID = 'FORM-JD8668C1CAC7X39ND7GNN4O8D2UA3L21P3ODL22' # 普通表单\n",
|
|
"stting = {\n",
|
|
" '材料数据':['材料名称','品牌','零件号','规格型号','库存数量','采购均价','计量单位'],\n",
|
|
" '材料销售历史数据':['源单号','材料名称','数量','金额','材料备注'],\n",
|
|
" '储值卡数据':['卡名称','持卡人手机号','绑定车牌号','卡号','剩余面额','剩余实额','卡有效期'],\n",
|
|
" '单据历史数据':['工单号','车牌号','里程','金额','开单时间','工单备注'],\n",
|
|
" '供应商信息数据':['供应商名称','联系人','手机','联系电话'],\n",
|
|
" '客户车辆信息':['客户姓名','车牌号','手机号码','VIN码'],\n",
|
|
" '套餐卡数据':['卡名称','持卡人姓名','持卡人手机号','绑定车牌号','卡号','卡有效期','内容名称','剩余次数','单次面额','单次实额','卡说明'],\n",
|
|
" '项目施工历史数据':['源单号','项目名称','工时数','工时费'],\n",
|
|
" '项目信息数据':['项目名称','所需工时1','工时单价1']\n",
|
|
"}\n",
|
|
"\"\"\" 24小时读取一遍数据 \"\"\"\n",
|
|
"# 获取全量公有\n",
|
|
"form_data = read_form_instancesV2(token=TOKEN, formUuid=FORMID, page=1, n=100,searchField={'selectField_ldo3qxal': '公有'})\n",
|
|
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
|
"ALL_DATA_staff = {}\n",
|
|
"\"\"\" 获取全量数据 \"\"\"\n",
|
|
"for i in range(1, PAGES+1):\n",
|
|
" form_data = read_form_instancesV2(token=TOKEN, formUuid=FORMID, page=i, n=100,searchField={'selectField_ldo3qxal': '公有'})\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_staff[data['formData']['textField_ldo3qxao'] + data['formData']['textField_ldo3qxap']]=data['formInstanceId']\n",
|
|
"# 获取前一天私有\n",
|
|
"TIME_RANGE = {'24小时内':[timeStamp(t) for t in get_time_range_hour(24)]} # 当前时刻向前推1个小时\n",
|
|
"data_siyou = read_form_instances(token=TOKEN,formUuid=FORMID,page=1,n=100,createFromTimeGMT=[*TIME_RANGE['24小时内']][0],createToTimeGMT=[*TIME_RANGE['24小时内']][1],searchField={'selectField_ldo3qxal': '私有'})\n",
|
|
"ALL_DATA_staff_V2 = {}\n",
|
|
"for i in range(0,len(data_siyou['data'])):\n",
|
|
" if set(stting[data_siyou['data'][i]['formData']['textField_ldo3qxao']]).issubset(set(json.loads(data_siyou['data'][i]['formData']['textField_ldo3qxaq']))):\n",
|
|
" ALL_DATA_staff_V2[data_siyou['data'][i]['formInstanceId']]=data_siyou['data'][i]['formData']['textField_ldo3qxao']+data_siyou['data'][i]['formData']['textField_ldo3qxap']\n",
|
|
"ALL_DATA_staff_V3 = remove_duplicates(ALL_DATA_staff_V2)\n",
|
|
"for id in ALL_DATA_staff_V3:\n",
|
|
" data_new = {\n",
|
|
" 'selectField_ldo3qxal':'公有',\n",
|
|
" 'textField_ldo3qxan':'区域公用'\n",
|
|
" }\n",
|
|
" res = instances(TOKEN,id,data_new)\n",
|
|
" print(res,id)\n",
|
|
" time.sleep(0.5)"
|
|
]
|
|
}
|
|
],
|
|
"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"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|