2065 lines
116 KiB
Plaintext
2065 lines
116 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 1、月度续费率分母:holo_ads_report_sales_saas_to_renew_org_regular_income_d \n",
|
|
"分区:pt=日,分区即应续约日(如\"20230501\"<=pt<='20230531' ,即5月应续约门店)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# -*- coding: utf-8 -*-\n",
|
|
"import psycopg2\n",
|
|
"import pandas as pd\n",
|
|
"import calendar\n",
|
|
"import datetime\n",
|
|
"# 获得连接\n",
|
|
"conn = psycopg2.connect(database=\"f6_bi\", user=\"BASIC$ro_caowei\", password=\"!ro_caowei123\", host=\"hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com\", port=\"80\")\n",
|
|
"# 获得游标对象,一个游标对象可以对数据库进行执行操作\n",
|
|
"cursor = conn.cursor()\n",
|
|
"\n",
|
|
"# 获取当前日期\n",
|
|
"today = datetime.date.today()\n",
|
|
"# 获取当月的第一天\n",
|
|
"first_day_of_month = int(today.replace(day=1).strftime('%Y%m%d'))\n",
|
|
"# 获取当月的最后一天\n",
|
|
"last_day_of_month = int(today.replace(day=calendar.monthrange(today.year, today.month)[1]).strftime('%Y%m%d'))\n",
|
|
"\n",
|
|
"# sql语句 建表\n",
|
|
"sql =f\"\"\"SELECT * FROM \"public\".\"holo_ads_report_sales_saas_to_renew_org_regular_income_d\" WHERE \"pt\" >= '{first_day_of_month}' AND \"pt\" <= '{last_day_of_month}';\"\"\"\n",
|
|
"# 执行语句\n",
|
|
"cursor.execute(sql)\n",
|
|
"# 获取结果集的每一行\n",
|
|
"rows = cursor.fetchall()\n",
|
|
"# 获取所有字段名\n",
|
|
"all_fields = cursor.description\n",
|
|
"#执行结果转化为dataframe\n",
|
|
"col = []\n",
|
|
"for i in all_fields:\n",
|
|
" col.append(i[0])\n",
|
|
"data_details = pd.DataFrame(list(rows),columns=col)\n",
|
|
"# data_NGV.to_excel(r'C:\\Users\\admin\\Desktop\\NGV明细.xlsx')\n",
|
|
"# 关闭数据库连接\n",
|
|
"cursor.close()\n",
|
|
"conn.close()\n",
|
|
"\n",
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\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",
|
|
"\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(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 read_delete(token, formInstanceId):\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",
|
|
" formData = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : formInstanceId\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.delete(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_new(FORMID,formData):\n",
|
|
" \"\"\" 通过实例id 获取表单内容 \"\"\"\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",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print(res.json())\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"\n",
|
|
"def component(FORMID,TOKEN):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" # \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def Batch_creation(FORMID,TOKEN,ALL_formData):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"noExecuteExpression\" : \"true\",\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"keepRunningAfterException\" : \"true\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"formDataJsonList\" : json.dumps(ALL_formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):\n",
|
|
" \"\"\" 批量删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"formInstanceIdList\" : json.dumps(ALL_DATA_instance, cls=NpEncoder),\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"executeExpression\" : \"false\" # 不触发\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in(TOKEN,formInstanceIdList):\n",
|
|
" \"\"\" 逐条删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" res = requests.delete(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",
|
|
"TOKEN = generateToken() \n",
|
|
"'''读取员工对应关系:宜搭员工-ID对应表 '''\n",
|
|
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//10 + 1\n",
|
|
"ALL_DATA_staff = {}\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(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59']\n",
|
|
"\n",
|
|
"'''获取表内控件信息 '''\n",
|
|
"FORMID = \"FORM-XN966G71FGWAWFJU6P9MA5MPMC6829BG110ILU\"\n",
|
|
"component_list = component(FORMID,TOKEN)\n",
|
|
"for i in range(len(component_list['result'])):\n",
|
|
" componentName = component_list['result'][i]['componentName']\n",
|
|
" name_value = component_list['result'][i]['label']['value']\n",
|
|
" fieldId = component_list['result'][i]['fieldId']\n",
|
|
" print(\"'\",fieldId,\"':\",\"data_details[\",name_value,\"][i], # \",name_value)\n",
|
|
"\n",
|
|
"\n",
|
|
"# '''批量删除NGV数据'''\n",
|
|
"for i in range(0,10):\n",
|
|
" default = True\n",
|
|
" while default:\n",
|
|
" FORMID = \"FORM-XN966G71FGWAWFJU6P9MA5MPMC6829BG110ILU\" \n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" PAGES = form_data.get('totalCount')//100 +1 \n",
|
|
" print(form_data.get('totalCount'))\n",
|
|
" if form_data.get('totalCount')<=0:\n",
|
|
" default = False\n",
|
|
" for i in range(PAGES, 1,-1):\n",
|
|
" ALL_DATA_instance = []\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_instance.append(data['formInstanceId'])\n",
|
|
" print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!')\n",
|
|
" red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance)\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" formInstanceId = data['formInstanceId']\n",
|
|
" delete_in(TOKEN,formInstanceId)\n",
|
|
" print(f'单条删除 {formInstanceId} 数据!')\n",
|
|
"\n",
|
|
"'''遍历数据进行新建'''\n",
|
|
"data_details = data_details.astype('string')\n",
|
|
"data_details = data_details.fillna('',inplace=False)\n",
|
|
"for a in range(0,len(data_details[\"date_fmt\"]),100):\n",
|
|
" ALL_formData = []\n",
|
|
" for i in range(a,a+100): # for i in range(len(data_NGV[\"date_fmt\"])):\n",
|
|
" try:\n",
|
|
" formData = {\n",
|
|
" 'textField_05ktjv3':data_details[\"date_fmt\"][i],#\"date_fmt\"\n",
|
|
" 'textField_sjt4g4u':data_details[\"org_crm_id\"][i],#\"org_crm_id\"\n",
|
|
" 'textField_dninbhg':data_details[\"org_id\"][i],#\"org_id\"\n",
|
|
" 'textField_v4p3wpf':data_details[\"org_code\"][i],#\"org_code\"\n",
|
|
" 'textField_rt77wej':data_details[\"org_name\"][i],#\"org_name\"\n",
|
|
" 'textField_iwoh6hs':data_details[\"is_main_org\"][i],#\"is_main_org\"\n",
|
|
" 'textField_x43bdsp':data_details[\"group_id\"][i],#\"group_id\"\n",
|
|
" 'textField_ciih4ya':data_details[\"group_name\"][i],#\"group_name\"\n",
|
|
" 'dateField_d9qfuns':int(time.mktime(time.strptime(data_details[\"saas_create_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"saas_create_time\"][i] !='' else '',#\"saas_create_time\"\n",
|
|
" 'dateField_5ypoy57':int(time.mktime(time.strptime(data_details[\"to_renew_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"to_renew_time\"][i] !='' else '',#\"to_renew_time\"\n",
|
|
" 'textField_qdfzzs0':data_details[\"saas_edition_fmt\"][i],#\"saas_edition_fmt\"\n",
|
|
" 'textField_t8435fj':data_details[\"version_amount_total\"][i],#\"version_amount_total\"\n",
|
|
" 'textField_7t38y19':data_details[\"version_amount_saas\"][i],#\"version_amount_saas\"\n",
|
|
" 'textField_byiv4dl':data_details[\"version_amount_other\"][i],#\"version_amount_other\"\n",
|
|
" 'textField_h4kdrs7':data_details[\"unversion_amount_total\"][i],#\"unversion_amount_total\"\n",
|
|
" 'textField_exj8c95':data_details[\"unversion_amount_mngv\"][i],#\"unversion_amount_mngv\"\n",
|
|
" 'textField_mw4xx1u':data_details[\"unversion_amount_message\"][i],#\"unversion_amount_message\"\n",
|
|
" # 'employeeField_li011zja':ALL_DATA_staff[data_details[\"service_impl_principal\"][i]] if data_details[\"service_impl_principal\"][i] !='' else '',#\"service_impl_principal\"\n",
|
|
" # 'employeeField_li011zjb':ALL_DATA_staff[data_details[\"area_manager\"][i]] if data_details[\"area_manager\"][i] !='' else '',#\"area_manager\"\n",
|
|
" 'textField_dws7nm0':data_details[\"region_name\"][i],#\"region_name\"\n",
|
|
" 'textField_cko12i7':data_details[\"branch_name\"][i],#\"branch_name\"\n",
|
|
" 'dateField_emp5rqh':int(time.mktime(time.strptime(data_details[\"etl_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"etl_time\"][i] !='' else '',#\"etl_time\"\n",
|
|
" 'textField_rvee4bk':data_details[\"group_grade\"][i],#\"group_grade\"\n",
|
|
" 'textField_wicoruo':data_details[\"province_name\"][i],#\"province_name\"\n",
|
|
" 'textField_lodaran':data_details[\"city_name\"][i],#\"city_name\"\n",
|
|
" # 'employeeField_li011zjc':ALL_DATA_staff[data_details[\"technician\"][i]] if data_details[\"technician\"][i] !='' else '',#\"technician\"\n",
|
|
" 'textField_ss0efql':data_details[\"from_flag_fmt\"][i],#\"from_flag_fmt\"\n",
|
|
" 'textField_0rq00hg':data_details[\"franchise_group_name\"][i],#\"franchise_group_name\"\n",
|
|
" 'textField_pmy2x21':data_details[\"pt\"][i],#\"pt\"\n",
|
|
" }\n",
|
|
" try:\n",
|
|
" formData['employeeField_li011zjc'] = ALL_DATA_staff[data_details[\"technician\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li011zjc'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li011zjb'] = ALL_DATA_staff[data_details[\"area_manager\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li011zjb'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li011zja'] = ALL_DATA_staff[data_details[\"service_impl_principal\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li011zja'] = \"\"\n",
|
|
"\n",
|
|
" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) \n",
|
|
" except:\n",
|
|
" pass\n",
|
|
" FORMID = \"FORM-XN966G71FGWAWFJU6P9MA5MPMC6829BG110ILU\" \n",
|
|
" res_new = Batch_creation(FORMID,TOKEN,ALL_formData)\n",
|
|
" print(\"新建第\",i,\"条数据!\",res_new)\n",
|
|
" time.sleep(10)\n",
|
|
"\n",
|
|
"'''校验是否新建正常'''\n",
|
|
"time.sleep(120)\n",
|
|
"FORMID = \"FORM-XN966G71FGWAWFJU6P9MA5MPMC6829BG110ILU\" \n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"if int(form_data.get('totalCount')) ==len(data_details):\n",
|
|
" print(\"数据新建成功!\")\n",
|
|
"else:\n",
|
|
" \n",
|
|
" def start_instance_process(token: str, name):\n",
|
|
"\n",
|
|
" \"\"\"发送宜搭表单 -- 发起流程表单\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" token \n",
|
|
" data:需要发送的数据字典\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" yida_api = \"https://api.dingtalk.com/v1.0/yida/processes/instances/start\"\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": token\n",
|
|
" }\n",
|
|
"\n",
|
|
" send_data = {\n",
|
|
" \"textField_l9fe0uiw\": name,\n",
|
|
" \"textField_l9fe0uiv\": name\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",# 超级管理员账号\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": \"FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2\",\n",
|
|
" \"formDataJson\": json.dumps(send_data),\n",
|
|
" \"processCode\":\"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(yida_api, headers=headers, json=payload)\n",
|
|
" return res\n",
|
|
" try:\n",
|
|
" name = \"1、月度续费率分母:holo_ads_report_sales_saas_to_renew_org_regular_income_d 新建条数不正确!\"\n",
|
|
" res_yujing = start_instance_process(TOKEN,name)\n",
|
|
" except:\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 2、月度续费率分子:holo_ads_report_sales_saas_to_renew_org_summary_income_d\n",
|
|
"分区:pt=月,分区记录当月的续费率分子(如pt=\"202305\",即5月分子)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# -*- coding: utf-8 -*-\n",
|
|
"import psycopg2\n",
|
|
"import pandas as pd\n",
|
|
"import calendar\n",
|
|
"import datetime\n",
|
|
"# 获得连接\n",
|
|
"conn = psycopg2.connect(database=\"f6_bi\", user=\"BASIC$ro_caowei\", password=\"!ro_caowei123\", host=\"hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com\", port=\"80\")\n",
|
|
"# 获得游标对象,一个游标对象可以对数据库进行执行操作\n",
|
|
"cursor = conn.cursor()\n",
|
|
"\n",
|
|
"# 获取当前日期\n",
|
|
"today = datetime.date.today()\n",
|
|
"# 获取当月\n",
|
|
"first_day_of_month = int(today.replace().strftime('%Y%m'))\n",
|
|
"\n",
|
|
"\n",
|
|
"# sql语句 建表\n",
|
|
"sql =f\"\"\"SELECT * FROM \"public\".\"holo_ads_report_sales_saas_to_renew_org_summary_income_d\" WHERE \"pt\" = '{first_day_of_month}';\"\"\"\n",
|
|
"# 执行语句\n",
|
|
"cursor.execute(sql)\n",
|
|
"# 获取结果集的每一行\n",
|
|
"rows = cursor.fetchall()\n",
|
|
"# 获取所有字段名\n",
|
|
"all_fields = cursor.description\n",
|
|
"#执行结果转化为dataframe\n",
|
|
"col = []\n",
|
|
"for i in all_fields:\n",
|
|
" col.append(i[0])\n",
|
|
"data_details = pd.DataFrame(list(rows),columns=col)\n",
|
|
"# data_NGV.to_excel(r'C:\\Users\\admin\\Desktop\\NGV明细.xlsx')\n",
|
|
"# 关闭数据库连接\n",
|
|
"cursor.close()\n",
|
|
"conn.close()\n",
|
|
"\n",
|
|
"from decimal import Decimal\n",
|
|
"data_details['version_amount_total'] = data_details['version_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_saas'] = data_details['version_amount_saas'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_other'] = data_details['version_amount_other'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_total'] = data_details['unversion_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_mngv'] = data_details['unversion_amount_mngv'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_message'] = data_details['unversion_amount_message'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_total'] = data_details['irregular_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_activity'] = data_details['irregular_amount_activity'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_service'] = data_details['irregular_amount_service'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"\n",
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\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",
|
|
"\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(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 read_delete(token, formInstanceId):\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",
|
|
" formData = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : formInstanceId\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.delete(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_new(FORMID,formData):\n",
|
|
" \"\"\" 通过实例id 获取表单内容 \"\"\"\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",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print(res.json())\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"\n",
|
|
"def component(FORMID,TOKEN):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" # \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def Batch_creation(FORMID,TOKEN,ALL_formData):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"noExecuteExpression\" : \"true\",\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"keepRunningAfterException\" : \"true\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"formDataJsonList\" : json.dumps(ALL_formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):\n",
|
|
" \"\"\" 批量删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"formInstanceIdList\" : json.dumps(ALL_DATA_instance, cls=NpEncoder),\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"executeExpression\" : \"false\" # 不触发\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in(TOKEN,formInstanceIdList):\n",
|
|
" \"\"\" 逐条删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" res = requests.delete(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",
|
|
"TOKEN = generateToken() \n",
|
|
"'''读取员工对应关系:宜搭员工-ID对应表 '''\n",
|
|
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//10 + 1\n",
|
|
"ALL_DATA_staff = {}\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(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59']\n",
|
|
"\n",
|
|
"'''获取表内控件信息 '''\n",
|
|
"FORMID = \"FORM-Q4A664A1BT0BVKD1AZJZD5YHUYJ62OFI220IL0\"\n",
|
|
"component_list = component(FORMID,TOKEN)\n",
|
|
"for i in range(len(component_list['result'])):\n",
|
|
" componentName = component_list['result'][i]['componentName']\n",
|
|
" name_value = component_list['result'][i]['label']['value']\n",
|
|
" fieldId = component_list['result'][i]['fieldId']\n",
|
|
" print(\"'\",fieldId,\"':\",\"data_details[\",name_value,\"][i], # \",name_value)\n",
|
|
"\n",
|
|
"\n",
|
|
"# '''批量删除NGV数据'''\n",
|
|
"for i in range(0,10):\n",
|
|
" default = True\n",
|
|
" while default:\n",
|
|
" FORMID = \"FORM-Q4A664A1BT0BVKD1AZJZD5YHUYJ62OFI220IL0\" \n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" PAGES = form_data.get('totalCount')//100 +1 \n",
|
|
" print(form_data.get('totalCount'))\n",
|
|
" if form_data.get('totalCount')<=0:\n",
|
|
" default = False\n",
|
|
" for i in range(PAGES, 1,-1):\n",
|
|
" ALL_DATA_instance = []\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_instance.append(data['formInstanceId'])\n",
|
|
" print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!')\n",
|
|
" red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance)\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" formInstanceId = data['formInstanceId']\n",
|
|
" delete_in(TOKEN,formInstanceId)\n",
|
|
" print(f'单条删除 {formInstanceId} 数据!')\n",
|
|
"\n",
|
|
"'''遍历数据进行新建'''\n",
|
|
"data_details = data_details.astype('string')\n",
|
|
"data_details = data_details.fillna('',inplace=False)\n",
|
|
"for a in range(0,len(data_details[\"date_fmt\"]),100):\n",
|
|
" ALL_formData = []\n",
|
|
" for i in range(a,a+100): # for i in range(len(data_NGV[\"date_fmt\"])):\n",
|
|
" try:\n",
|
|
" formData = {\n",
|
|
" 'textField_xhuz5sf':data_details[\"date_fmt\"][i],#\"date_fmt\"\n",
|
|
" 'textField_uxtuvoq':data_details[\"org_crm_id\"][i],#\"org_crm_id\"\n",
|
|
" 'textField_az562wk':data_details[\"org_id\"][i],#\"org_id\"\n",
|
|
" 'textField_fztifyw':data_details[\"org_code\"][i],#\"org_code\"\n",
|
|
" 'textField_gfd6yje':data_details[\"org_name\"][i],#\"org_name\"\n",
|
|
" 'textField_parg16c':data_details[\"is_main_org\"][i],#\"is_main_org\"\n",
|
|
" 'textField_ny44eb5':data_details[\"group_id\"][i],#\"group_id\"\n",
|
|
" 'textField_0ba9ono':data_details[\"group_name\"][i],#\"group_name\"\n",
|
|
" 'dateField_amip622':int(time.mktime(time.strptime(data_details[\"saas_create_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"saas_create_time\"][i] !='' else '',#\"saas_create_time\"\n",
|
|
" 'dateField_d498rsx':int(time.mktime(time.strptime(data_details[\"to_renew_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"to_renew_time\"][i] !='' else '',#\"to_renew_time\"\n",
|
|
" 'textField_ujg6a7f':data_details[\"saas_edition_fmt\"][i],#\"saas_edition_fmt\"\n",
|
|
" 'textField_fyl38xa':data_details[\"version_amount_total\"][i],#\"version_amount_total\"\n",
|
|
" 'textField_g6rkx8k':data_details[\"version_amount_saas\"][i],#\"version_amount_saas\"\n",
|
|
" 'textField_bt75ped':data_details[\"version_amount_other\"][i],#\"version_amount_other\"\n",
|
|
" 'textField_4q542vb':data_details[\"unversion_amount_total\"][i],#\"unversion_amount_total\"\n",
|
|
" 'textField_q7pf942':data_details[\"unversion_amount_mngv\"][i],#\"unversion_amount_mngv\"\n",
|
|
" 'textField_vh6yz7p':data_details[\"unversion_amount_message\"][i],#\"unversion_amount_message\"\n",
|
|
" 'textField_zrgo8w4':data_details[\"irregular_amount_total\"][i],#\"irregular_amount_total\"\n",
|
|
" 'textField_70wr156':data_details[\"irregular_amount_activity\"][i],#\"irregular_amount_activity\"\n",
|
|
" 'textField_17kj4dv':data_details[\"irregular_amount_service\"][i],#\"irregular_amount_service\"\n",
|
|
" # 'employeeField_li022upx':ALL_DATA_staff[data_details[\"service_impl_principal\"][i]] if data_details[\"service_impl_principal\"][i] !='' else '',#\"service_impl_principal\"\n",
|
|
" # 'employeeField_li022upy':ALL_DATA_staff[data_details[\"area_manager\"][i]] if data_details[\"area_manager\"][i] !='' else '',#\"area_manager\"\n",
|
|
" 'textField_eholn8e':data_details[\"region_name\"][i],#\"region_name\"\n",
|
|
" 'textField_33lfgw4':data_details[\"branch_name\"][i],#\"branch_name\"\n",
|
|
" 'dateField_crxj192':int(time.mktime(time.strptime(data_details[\"etl_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"etl_time\"][i] !='' else '',#\"etl_time\"\n",
|
|
" 'textField_18sgd8t':data_details[\"group_grade\"][i],#\"group_grade\"\n",
|
|
" 'textField_0et812k':data_details[\"province_name\"][i],#\"province_name\"\n",
|
|
" 'textField_hzxff94':data_details[\"city_name\"][i],#\"city_name\"\n",
|
|
" # 'employeeField_li022upz':ALL_DATA_staff[data_details[\"technician\"][i]] if data_details[\"technician\"][i] !='' else '',#\"technician\"\n",
|
|
" 'textField_kdsrwdm':data_details[\"coupon_amount\"][i],#\"coupon_amount\"\n",
|
|
" 'textField_sqrwp65':data_details[\"from_flag_fmt\"][i],#\"from_flag_fmt\"\n",
|
|
" 'textField_6u4j5j2':data_details[\"franchise_group_name\"][i],#\"franchise_group_name\"\n",
|
|
" 'textField_rzv2xy1':data_details[\"pt\"][i],#\"pt\"\n",
|
|
" }\n",
|
|
" try:\n",
|
|
" formData['employeeField_li022upz'] = ALL_DATA_staff[data_details[\"technician\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li022upz'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li022upy'] = ALL_DATA_staff[data_details[\"area_manager\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li022upy'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li022upx'] = ALL_DATA_staff[data_details[\"service_impl_principal\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li022upx'] = \"\"\n",
|
|
"\n",
|
|
" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) \n",
|
|
" except:\n",
|
|
" pass\n",
|
|
" FORMID = \"FORM-Q4A664A1BT0BVKD1AZJZD5YHUYJ62OFI220IL0\" \n",
|
|
" res_new = Batch_creation(FORMID,TOKEN,ALL_formData)\n",
|
|
" print(\"新建第\",i,\"条数据!\")\n",
|
|
" time.sleep(10)\n",
|
|
" \n",
|
|
"'''校验是否新建正常'''\n",
|
|
"time.sleep(120)\n",
|
|
"FORMID = \"FORM-Q4A664A1BT0BVKD1AZJZD5YHUYJ62OFI220IL0\" \n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"if int(form_data.get('totalCount')) ==len(data_details):\n",
|
|
" print(\"数据新建成功!\")\n",
|
|
"else:\n",
|
|
" \n",
|
|
" def start_instance_process(token: str, name):\n",
|
|
"\n",
|
|
" \"\"\"发送宜搭表单 -- 发起流程表单\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" token \n",
|
|
" data:需要发送的数据字典\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" yida_api = \"https://api.dingtalk.com/v1.0/yida/processes/instances/start\"\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": token\n",
|
|
" }\n",
|
|
"\n",
|
|
" send_data = {\n",
|
|
" \"textField_l9fe0uiw\": name,\n",
|
|
" \"textField_l9fe0uiv\": name\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",# 超级管理员账号\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": \"FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2\",\n",
|
|
" \"formDataJson\": json.dumps(send_data),\n",
|
|
" \"processCode\":\"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(yida_api, headers=headers, json=payload)\n",
|
|
" return res\n",
|
|
" try:\n",
|
|
" name = \"2、月度续费率分子:holo_ads_report_sales_saas_to_renew_org_summary_income_d 新建条数不正确!\"\n",
|
|
" res_yujing = start_instance_process(TOKEN,name)\n",
|
|
" except:\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 3、年度滚动续费率分母:holo_ads_report_sales_saas_regular_income_snapshot_m \n",
|
|
"分区:pt=月,分区记录每月应续约的门店(如202301<=pt=202305,即2023年1-5月应续约门店)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# -*- coding: utf-8 -*-\n",
|
|
"import psycopg2\n",
|
|
"import pandas as pd\n",
|
|
"import calendar\n",
|
|
"import datetime\n",
|
|
"# 获得连接\n",
|
|
"conn = psycopg2.connect(database=\"f6_bi\", user=\"BASIC$ro_caowei\", password=\"!ro_caowei123\", host=\"hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com\", port=\"80\")\n",
|
|
"# 获得游标对象,一个游标对象可以对数据库进行执行操作\n",
|
|
"cursor = conn.cursor()\n",
|
|
"\n",
|
|
"# 获取当前日期\n",
|
|
"today = datetime.date.today()\n",
|
|
"# 获取当月\n",
|
|
"first_day_of_month = int(today.replace().strftime('%Y%m'))\n",
|
|
"\n",
|
|
"\n",
|
|
"# sql语句 建表\n",
|
|
"sql =f\"\"\"SELECT * FROM \"public\".\"holo_ads_report_sales_saas_regular_income_snapshot_m\" WHERE \"pt\" >= '202301' AND \"pt\" <= '{first_day_of_month}'\"\"\"\n",
|
|
"# 执行语句\n",
|
|
"cursor.execute(sql)\n",
|
|
"# 获取结果集的每一行\n",
|
|
"rows = cursor.fetchall()\n",
|
|
"# 获取所有字段名\n",
|
|
"all_fields = cursor.description\n",
|
|
"#执行结果转化为dataframe\n",
|
|
"col = []\n",
|
|
"for i in all_fields:\n",
|
|
" col.append(i[0])\n",
|
|
"data_details = pd.DataFrame(list(rows),columns=col)\n",
|
|
"# data_NGV.to_excel(r'C:\\Users\\admin\\Desktop\\NGV明细.xlsx')\n",
|
|
"# 关闭数据库连接\n",
|
|
"cursor.close()\n",
|
|
"conn.close()\n",
|
|
"print(len(data_details))\n",
|
|
"\n",
|
|
"\n",
|
|
"from decimal import Decimal\n",
|
|
"data_details['version_amount_total'] = data_details['version_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_saas'] = data_details['version_amount_saas'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_other'] = data_details['version_amount_other'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_total_renew'] = data_details['version_amount_total_renew'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_saas_renew'] = data_details['version_amount_saas_renew'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_other_renew'] = data_details['version_amount_other_renew'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['coupon_amount'] = data_details['coupon_amount'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\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",
|
|
"\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(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 read_delete(token, formInstanceId):\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",
|
|
" formData = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : formInstanceId\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.delete(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_new(FORMID,formData):\n",
|
|
" \"\"\" 通过实例id 获取表单内容 \"\"\"\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",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print(res.json())\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"\n",
|
|
"def component(FORMID,TOKEN):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" # \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def Batch_creation(FORMID,TOKEN,ALL_formData):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"noExecuteExpression\" : \"true\",\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"keepRunningAfterException\" : \"true\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"formDataJsonList\" : json.dumps(ALL_formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):\n",
|
|
" \"\"\" 批量删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"formInstanceIdList\" : json.dumps(ALL_DATA_instance, cls=NpEncoder),\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"executeExpression\" : \"false\" # 不触发\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in(TOKEN,formInstanceIdList):\n",
|
|
" \"\"\" 逐条删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" res = requests.delete(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",
|
|
"TOKEN = generateToken() \n",
|
|
"'''读取员工对应关系:宜搭员工-ID对应表 '''\n",
|
|
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//10 + 1\n",
|
|
"ALL_DATA_staff = {}\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(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59']\n",
|
|
"\n",
|
|
"'''获取表内控件信息 '''\n",
|
|
"FORMID = \"FORM-EA866E71ZOWAG1M67SFF37AR7PRT2CCJQ20ILL\"\n",
|
|
"component_list = component(FORMID,TOKEN)\n",
|
|
"for i in range(len(component_list['result'])):\n",
|
|
" componentName = component_list['result'][i]['componentName']\n",
|
|
" name_value = component_list['result'][i]['label']['value']\n",
|
|
" fieldId = component_list['result'][i]['fieldId']\n",
|
|
" print(\"'\",fieldId,\"':\",\"data_details[\",name_value,\"][i], # \",name_value)\n",
|
|
"\n",
|
|
"# '''批量删除NGV数据'''\n",
|
|
"for i in range(0,10):\n",
|
|
" default = True\n",
|
|
" while default:\n",
|
|
" FORMID = \"FORM-EA866E71ZOWAG1M67SFF37AR7PRT2CCJQ20ILL\" \n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" PAGES = form_data.get('totalCount')//100 +1 \n",
|
|
" print(form_data.get('totalCount'))\n",
|
|
" if form_data.get('totalCount')<=0:\n",
|
|
" default = False\n",
|
|
" for i in range(PAGES, 1,-1):\n",
|
|
" ALL_DATA_instance = []\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_instance.append(data['formInstanceId'])\n",
|
|
" print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!')\n",
|
|
" red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance)\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" formInstanceId = data['formInstanceId']\n",
|
|
" delete_in(TOKEN,formInstanceId)\n",
|
|
" print(f'单条删除 {formInstanceId} 数据!')\n",
|
|
"\n",
|
|
"'''遍历数据进行新建'''\n",
|
|
"data_details = data_details.astype('string')\n",
|
|
"data_details = data_details.fillna('',inplace=False)\n",
|
|
"for a in range(0,len(data_details[\"month_id\"]),100):\n",
|
|
" ALL_formData = []\n",
|
|
" for i in range(a,a+100): # for i in range(len(data_NGV[\"date_fmt\"])):\n",
|
|
" try:\n",
|
|
" formData = {\n",
|
|
" 'textField_bsp60hb':data_details[\"month_id\"][i],#\"month_id\"\n",
|
|
" 'textField_ilso6hg':data_details[\"org_crm_id\"][i],#\"org_crm_id\"\n",
|
|
" 'textField_58qfhc3':data_details[\"id_deleted_his\"][i],#\"id_deleted_his\"\n",
|
|
" 'textField_wttytti':data_details[\"org_id\"][i],#\"org_id\"\n",
|
|
" 'textField_mhncv5b':data_details[\"org_code\"][i],#\"org_code\"\n",
|
|
" 'textField_9p4y2on':data_details[\"org_name\"][i],#\"org_name\"\n",
|
|
" 'textField_33dscdq':data_details[\"is_main_org\"][i],#\"is_main_org\"\n",
|
|
" 'textField_tmgv5wb':data_details[\"group_id\"][i],#\"group_id\"\n",
|
|
" 'textField_ucui6ff':data_details[\"group_name\"][i],#\"group_name\"\n",
|
|
" 'textField_qi5gpdj':data_details[\"org_status\"][i],#\"org_status\"\n",
|
|
" 'dateField_zoh7nqn':int(time.mktime(time.strptime(data_details[\"saas_create_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"saas_create_time\"][i] !='' else '',#\"saas_create_time\"\n",
|
|
" 'textField_qc0hq6c':data_details[\"saas_use_year\"][i],#\"saas_use_year\"\n",
|
|
" 'dateField_xttx6bc':int(time.mktime(time.strptime(data_details[\"to_renew_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"to_renew_time\"][i] !='' else '',#\"to_renew_time\"\n",
|
|
" 'textField_8k9qa00':data_details[\"saas_edition_fmt\"][i],#\"saas_edition_fmt\"\n",
|
|
" 'textField_jzdnckg':data_details[\"version_amount_total\"][i],#\"version_amount_total\"\n",
|
|
" 'textField_kc4vc5b':data_details[\"version_amount_saas\"][i],#\"version_amount_saas\"\n",
|
|
" 'textField_3c1vkle':data_details[\"version_amount_other\"][i],#\"version_amount_other\"\n",
|
|
" # 'employeeField_li02quti':ALL_DATA_staff[data_details[\"service_impl_principal\"][i]] if data_details[\"service_impl_principal\"][i] !='' else '',#\"service_impl_principal\"\n",
|
|
" # 'employeeField_li02qutj':ALL_DATA_staff[data_details[\"area_manager\"][i]] if data_details[\"area_manager\"][i] !='' else '',#\"area_manager\"\n",
|
|
" 'textField_ju5lwc8':data_details[\"region_name\"][i],#\"region_name\"\n",
|
|
" 'textField_alfkqae':data_details[\"branch_name\"][i],#\"branch_name\"\n",
|
|
" 'textField_nt0ymex':data_details[\"group_grade\"][i],#\"group_grade\"\n",
|
|
" 'textField_gbupbr1':data_details[\"province_name\"][i],#\"province_name\"\n",
|
|
" 'textField_llw4vl7':data_details[\"city_name\"][i],#\"city_name\"\n",
|
|
" 'textField_ro83a0k':data_details[\"version_amount_total_renew\"][i],#\"version_amount_total_renew\"\n",
|
|
" 'textField_bdqwv17':data_details[\"version_amount_saas_renew\"][i],#\"version_amount_saas_renew\"\n",
|
|
" 'textField_xnhbxsi':data_details[\"version_amount_other_renew\"][i],#\"version_amount_other_renew\"\n",
|
|
" 'dateField_is6u6ub':int(time.mktime(time.strptime(data_details[\"renew_date\"][i], \"%Y-%m-%d\"))*1000) if data_details[\"renew_date\"][i] !='' else '',#\"renew_date\"\n",
|
|
" 'textField_pqubfpr':data_details[\"is_renew\"][i],#\"is_renew\"\n",
|
|
" 'dateField_d97awb6':int(time.mktime(time.strptime(data_details[\"etl_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"etl_time\"][i] !='' else '',#\"etl_time\"\n",
|
|
" 'textField_r3qicl9':data_details[\"renew_saas_edition_fmt\"][i],#\"renew_saas_edition_fmt\"\n",
|
|
" # 'employeeField_li02qutk':ALL_DATA_staff[data_details[\"technician\"][i]] if data_details[\"technician\"][i] !='' else '',#\"technician\"\n",
|
|
" 'textField_rcv7viu':data_details[\"coupon_amount\"][i],#\"coupon_amount\"\n",
|
|
" 'textField_44zj8ho':data_details[\"franchise_group_name\"][i],#\"franchise_group_name\"\n",
|
|
" 'textField_0yyb08y':data_details[\"pt\"][i],#\"pt\"\n",
|
|
" }\n",
|
|
" try:\n",
|
|
" formData['employeeField_li02qutk'] = ALL_DATA_staff[data_details[\"technician\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li02qutk'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li02qutj'] = ALL_DATA_staff[data_details[\"area_manager\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li02qutj'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li02quti'] = ALL_DATA_staff[data_details[\"service_impl_principal\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li02quti'] = \"\"\n",
|
|
"\n",
|
|
" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) \n",
|
|
" except:\n",
|
|
" pass\n",
|
|
" FORMID = \"FORM-EA866E71ZOWAG1M67SFF37AR7PRT2CCJQ20ILL\" \n",
|
|
" res_new = Batch_creation(FORMID,TOKEN,ALL_formData)\n",
|
|
" print(\"新建第\",i,\"条数据!\")\n",
|
|
" time.sleep(10)\n",
|
|
"\n",
|
|
"'''校验是否新建正常'''\n",
|
|
"time.sleep(120)\n",
|
|
"FORMID = \"FORM-EA866E71ZOWAG1M67SFF37AR7PRT2CCJQ20ILL\" \n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"if int(form_data.get('totalCount')) ==len(data_details):\n",
|
|
" print(\"数据新建成功!\")\n",
|
|
"else:\n",
|
|
" \n",
|
|
" def start_instance_process(token: str, name):\n",
|
|
"\n",
|
|
" \"\"\"发送宜搭表单 -- 发起流程表单\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" token \n",
|
|
" data:需要发送的数据字典\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" yida_api = \"https://api.dingtalk.com/v1.0/yida/processes/instances/start\"\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": token\n",
|
|
" }\n",
|
|
"\n",
|
|
" send_data = {\n",
|
|
" \"textField_l9fe0uiw\": name,\n",
|
|
" \"textField_l9fe0uiv\": name\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",# 超级管理员账号\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": \"FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2\",\n",
|
|
" \"formDataJson\": json.dumps(send_data),\n",
|
|
" \"processCode\":\"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(yida_api, headers=headers, json=payload)\n",
|
|
" return res\n",
|
|
" try:\n",
|
|
" name = \"3、年度滚动续费率分母:holo_ads_report_sales_saas_regular_income_snapshot_m 新建条数不正确!\"\n",
|
|
" res_yujing = start_instance_process(TOKEN,name)\n",
|
|
" except:\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 4、年度滚动续费率分子:holo_ads_report_sales_saas_org_summary_income_m \n",
|
|
"分区:pt=月,分区记录年度累计分子(如pt=‘202305’,即2023年1-5月累计分子)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"# -*- coding: utf-8 -*-\n",
|
|
"import psycopg2\n",
|
|
"import pandas as pd\n",
|
|
"import calendar\n",
|
|
"import datetime\n",
|
|
"# 获得连接\n",
|
|
"conn = psycopg2.connect(database=\"f6_bi\", user=\"BASIC$ro_caowei\", password=\"!ro_caowei123\", host=\"hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com\", port=\"80\")\n",
|
|
"# 获得游标对象,一个游标对象可以对数据库进行执行操作\n",
|
|
"cursor = conn.cursor()\n",
|
|
"\n",
|
|
"# 获取当前日期\n",
|
|
"today = datetime.date.today()\n",
|
|
"# 获取当月\n",
|
|
"first_day_of_month = int(today.replace().strftime('%Y%m'))\n",
|
|
"\n",
|
|
"# sql语句 建表\n",
|
|
"sql =f\"\"\"SELECT * FROM \"public\".\"holo_ads_report_sales_saas_org_summary_income_m\" WHERE \"pt\" = '{first_day_of_month}'\"\"\"\n",
|
|
"# 执行语句\n",
|
|
"cursor.execute(sql)\n",
|
|
"# 获取结果集的每一行\n",
|
|
"rows = cursor.fetchall()\n",
|
|
"# 获取所有字段名\n",
|
|
"all_fields = cursor.description\n",
|
|
"#执行结果转化为dataframe\n",
|
|
"col = []\n",
|
|
"for i in all_fields:\n",
|
|
" col.append(i[0])\n",
|
|
"data_details = pd.DataFrame(list(rows),columns=col)\n",
|
|
"# data_NGV.to_excel(r'C:\\Users\\admin\\Desktop\\NGV明细.xlsx')\n",
|
|
"# 关闭数据库连接\n",
|
|
"cursor.close()\n",
|
|
"conn.close()\n",
|
|
"print(len(data_details))\n",
|
|
"\n",
|
|
"\n",
|
|
"from decimal import Decimal\n",
|
|
"data_details['version_amount_total'] = data_details['version_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_saas'] = data_details['version_amount_saas'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['version_amount_other'] = data_details['version_amount_other'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_total'] = data_details['unversion_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_mngv'] = data_details['unversion_amount_mngv'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['unversion_amount_message'] = data_details['unversion_amount_message'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_total'] = data_details['irregular_amount_total'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_activity'] = data_details['irregular_amount_activity'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['irregular_amount_service'] = data_details['irregular_amount_service'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"data_details['coupon_amount'] = data_details['coupon_amount'].apply(lambda x: float(x) if isinstance(x, Decimal) else x)\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"\n",
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\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",
|
|
"\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(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 read_delete(token, formInstanceId):\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",
|
|
" formData = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : formInstanceId\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.delete(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_new(FORMID,formData):\n",
|
|
" \"\"\" 通过实例id 获取表单内容 \"\"\"\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",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print(res.json())\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"\n",
|
|
"def component(FORMID,TOKEN):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" # \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def Batch_creation(FORMID,TOKEN,ALL_formData):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"noExecuteExpression\" : \"true\",\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"keepRunningAfterException\" : \"true\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"formDataJsonList\" : json.dumps(ALL_formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):\n",
|
|
" \"\"\" 批量删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"formInstanceIdList\" : json.dumps(ALL_DATA_instance, cls=NpEncoder),\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"executeExpression\" : \"false\" # 不触发\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in(TOKEN,formInstanceIdList):\n",
|
|
" \"\"\" 逐条删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" res = requests.delete(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",
|
|
"TOKEN = generateToken() \n",
|
|
"'''读取员工对应关系:宜搭员工-ID对应表 '''\n",
|
|
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
|
"# 读取流程表单数据\n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"PAGES = form_data.get('totalCount')//10 + 1\n",
|
|
"ALL_DATA_staff = {}\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(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59']\n",
|
|
"\n",
|
|
"'''获取表内控件信息 '''\n",
|
|
"FORMID = \"FORM-GI666T81ZBWAFJZVABUMA80PJSDC2YCOZ20ILZ\"\n",
|
|
"component_list = component(FORMID,TOKEN)\n",
|
|
"for i in range(len(component_list['result'])):\n",
|
|
" componentName = component_list['result'][i]['componentName']\n",
|
|
" name_value = component_list['result'][i]['label']['value']\n",
|
|
" fieldId = component_list['result'][i]['fieldId']\n",
|
|
" print(\"'\",fieldId,\"':\",\"data_details[\",name_value,\"][i], # \",name_value)\n",
|
|
"\n",
|
|
"# '''批量删除NGV数据'''\n",
|
|
"for i in range(0,10):\n",
|
|
" default = True\n",
|
|
" while default:\n",
|
|
" FORMID = \"FORM-GI666T81ZBWAFJZVABUMA80PJSDC2YCOZ20ILZ\" \n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" PAGES = form_data.get('totalCount')//100 +1 \n",
|
|
" print(form_data.get('totalCount'))\n",
|
|
" if form_data.get('totalCount')<=0:\n",
|
|
" default = False\n",
|
|
" for i in range(PAGES, 1,-1):\n",
|
|
" ALL_DATA_instance = []\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_instance.append(data['formInstanceId'])\n",
|
|
" print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!')\n",
|
|
" red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance)\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" formInstanceId = data['formInstanceId']\n",
|
|
" delete_in(TOKEN,formInstanceId)\n",
|
|
" print(f'单条删除 {formInstanceId} 数据!')\n",
|
|
"\n",
|
|
"'''遍历数据进行新建'''\n",
|
|
"data_details = data_details.astype('string')\n",
|
|
"data_details = data_details.fillna('',inplace=False)\n",
|
|
"for a in range(0,len(data_details[\"year_id\"]),100):\n",
|
|
" ALL_formData = []\n",
|
|
" for i in range(a,a+100): # for i in range(len(data_NGV[\"date_fmt\"])):\n",
|
|
" try:\n",
|
|
" formData = {\n",
|
|
" 'textField_l556qrj':data_details[\"year_id\"][i],#\"year_id\"\n",
|
|
" 'textField_ioghzon':data_details[\"org_crm_id\"][i],#\"org_crm_id\"\n",
|
|
" 'textField_kr3pc6c':data_details[\"org_id\"][i],#\"org_id\"\n",
|
|
" 'textField_sv3xmix':data_details[\"org_code\"][i],#\"org_code\"\n",
|
|
" 'textField_nk98j1i':data_details[\"org_name\"][i],#\"org_name\"\n",
|
|
" 'textField_gvdimtj':data_details[\"group_id\"][i],#\"group_id\"\n",
|
|
" 'textField_ntc1mqo':data_details[\"group_name\"][i],#\"group_name\"\n",
|
|
" 'textField_dssu351':data_details[\"group_grade\"][i],#\"group_grade\"\n",
|
|
" 'dateField_hgp5gh8':int(time.mktime(time.strptime(data_details[\"saas_create_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"saas_create_time\"][i] !='' else '',#\"saas_create_time\"\n",
|
|
" 'textField_m6wvkhp':data_details[\"from_flag_fmt\"][i],#\"from_flag_fmt\"\n",
|
|
" 'textField_rzrq44v':data_details[\"franchise_group_name\"][i],#\"franchise_group_name\"\n",
|
|
" 'textField_s8u1211':data_details[\"region_name\"][i],#\"region_name\"\n",
|
|
" 'textField_bifjpqz':data_details[\"branch_name\"][i],#\"branch_name\"\n",
|
|
" 'textField_zz547i2':data_details[\"province_name\"][i],#\"province_name\"\n",
|
|
" 'textField_j86bqku':data_details[\"city_name\"][i],#\"city_name\"\n",
|
|
" # 'employeeField_li0304o0':ALL_DATA_staff[data_details[\"area_manager\"][i]] if data_details[\"area_manager\"][i] !='' else '',#\"area_manager\"\n",
|
|
" # 'employeeField_li0304o1':ALL_DATA_staff[data_details[\"service_impl_principal\"][i]] if data_details[\"service_impl_principal\"][i] !='' else '',#\"service_impl_principal\"\n",
|
|
" # 'employeeField_li0304o2':ALL_DATA_staff[data_details[\"technician\"][i]] if data_details[\"technician\"][i] !='' else '',#\"technician\"\n",
|
|
" 'dateField_f7cjejs':int(time.mktime(time.strptime(data_details[\"to_renew_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"to_renew_time\"][i] !='' else '',#\"to_renew_time\"\n",
|
|
" 'textField_4a171yy':data_details[\"saas_edition_fmt\"][i],#\"saas_edition_fmt\"\n",
|
|
" 'textField_9cja7t3':data_details[\"version_amount_total\"][i],#\"version_amount_total\"\n",
|
|
" 'textField_tdd8vic':data_details[\"version_amount_saas\"][i],#\"version_amount_saas\"\n",
|
|
" 'textField_yc1liag':data_details[\"version_amount_other\"][i],#\"version_amount_other\"\n",
|
|
" 'textField_sazuktm':data_details[\"unversion_amount_total\"][i],#\"unversion_amount_total\"\n",
|
|
" 'textField_dzyddir':data_details[\"unversion_amount_mngv\"][i],#\"unversion_amount_mngv\"\n",
|
|
" 'textField_rimc2k8':data_details[\"unversion_amount_message\"][i],#\"unversion_amount_message\"\n",
|
|
" 'textField_whlq8rb':data_details[\"irregular_amount_total\"][i],#\"irregular_amount_total\"\n",
|
|
" 'textField_jm29spy':data_details[\"irregular_amount_activity\"][i],#\"irregular_amount_activity\"\n",
|
|
" 'textField_hf46l34':data_details[\"irregular_amount_service\"][i],#\"irregular_amount_service\"\n",
|
|
" 'textField_pkyoug6':data_details[\"coupon_amount\"][i],#\"coupon_amount\"\n",
|
|
" 'dateField_uwztkat':int(time.mktime(time.strptime(data_details[\"etl_time\"][i], \"%Y-%m-%d %H:%M:%S\"))*1000) if data_details[\"etl_time\"][i] !='' else '',#\"etl_time\"\n",
|
|
" 'textField_s6mf0at':data_details[\"pt\"][i],#\"pt\"\n",
|
|
" }\n",
|
|
" try:\n",
|
|
" formData['employeeField_li0304o2'] = ALL_DATA_staff[data_details[\"technician\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li0304o2'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li0304o1'] = ALL_DATA_staff[data_details[\"service_impl_principal\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li0304o1'] = \"\"\n",
|
|
" try:\n",
|
|
" formData['employeeField_li0304o0'] = ALL_DATA_staff[data_details[\"area_manager\"][i]]\n",
|
|
" except:\n",
|
|
" formData['employeeField_li0304o0'] = \"\"\n",
|
|
"\n",
|
|
" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) \n",
|
|
" except:\n",
|
|
" pass\n",
|
|
" FORMID = \"FORM-GI666T81ZBWAFJZVABUMA80PJSDC2YCOZ20ILZ\" \n",
|
|
" res_new = Batch_creation(FORMID,TOKEN,ALL_formData)\n",
|
|
" print(\"新建第\",i,\"条数据!\")\n",
|
|
" time.sleep(10)\n",
|
|
" \n",
|
|
"'''校验是否新建正常'''\n",
|
|
"time.sleep(120)\n",
|
|
"FORMID = \"FORM-GI666T81ZBWAFJZVABUMA80PJSDC2YCOZ20ILZ\" \n",
|
|
"form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
"if int(form_data.get('totalCount')) ==len(data_details):\n",
|
|
" print(\"数据新建成功!\")\n",
|
|
"else:\n",
|
|
" \n",
|
|
" def start_instance_process(token: str, name):\n",
|
|
"\n",
|
|
" \"\"\"发送宜搭表单 -- 发起流程表单\n",
|
|
"\n",
|
|
" Args:\n",
|
|
" token \n",
|
|
" data:需要发送的数据字典\n",
|
|
" \"\"\"\n",
|
|
"\n",
|
|
" yida_api = \"https://api.dingtalk.com/v1.0/yida/processes/instances/start\"\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": token\n",
|
|
" }\n",
|
|
"\n",
|
|
" send_data = {\n",
|
|
" \"textField_l9fe0uiw\": name,\n",
|
|
" \"textField_l9fe0uiv\": name\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"appType\": \"APP_TNVBVZ3K8G56HG03Z45Q\",\n",
|
|
" \"systemToken\": \"CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1\",\n",
|
|
" \"userId\": \"yida_pub_account\",# 超级管理员账号\n",
|
|
" \"language\": \"zh_CN\",\n",
|
|
" \"formUuid\": \"FORM-UX866Q61GNLAZBCIEDF77BGVIIR83K82WYPHLH2\",\n",
|
|
" \"formDataJson\": json.dumps(send_data),\n",
|
|
" \"processCode\":\"TPROC--UX866Q61GNLAZBCIEDF77BGVIIR83M92WYPHLI2\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(yida_api, headers=headers, json=payload)\n",
|
|
" return res\n",
|
|
" try:\n",
|
|
" name = \"4、年度滚动续费率分子:holo_ads_report_sales_saas_org_summary_income_m 新建条数不正确!\"\n",
|
|
" res_yujing = start_instance_process(TOKEN,name)\n",
|
|
" except:\n",
|
|
" pass"
|
|
]
|
|
},
|
|
{
|
|
"attachments": {},
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# 员工id信息更新"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"156\n",
|
|
"读取到表单中 100 条数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILF9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILE9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILD9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILC9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILB9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILA9X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL99X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL89X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL79X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL69X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL59X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL49X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL39X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL29X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL19X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL09X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILZ8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILY8X 数据!\n",
|
|
"57\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILX8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILW8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILV8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILU8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILT8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILS8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILR8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILQ8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILP8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILO8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILN8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILM8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILL8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILK8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILJ8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILI8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILH8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILG8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILF8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILE8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILD8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILC8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILB8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILA8X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL98X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL88X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL78X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL68X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL58X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL48X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL38X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL28X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL18X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8IL08X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILZ7X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILY7X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILX7X 数据!\n",
|
|
"单条删除 FINST-QF9669D1CY0BHQW79KPTSC9DP2BG2QHBRA8ILW7X 数据!\n",
|
|
"30\n",
|
|
"54\n",
|
|
"54\n",
|
|
"54\n",
|
|
"30\n",
|
|
"54\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"35\n",
|
|
"54\n",
|
|
"54\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"54\n",
|
|
"54\n",
|
|
"30\n",
|
|
"54\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"26\n",
|
|
"30\n",
|
|
"21\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"21\n",
|
|
"30\n",
|
|
"30\n",
|
|
"21\n",
|
|
"27\n",
|
|
"21\n",
|
|
"18\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"0\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"21\n",
|
|
"0\n",
|
|
"21\n",
|
|
"0\n",
|
|
"5\n",
|
|
"5\n",
|
|
"0\n",
|
|
"5\n",
|
|
"5\n",
|
|
"5\n",
|
|
"0\n",
|
|
"0\n",
|
|
"5\n",
|
|
"0\n",
|
|
"5\n",
|
|
"5\n",
|
|
"5\n",
|
|
"0\n",
|
|
"5\n",
|
|
"0\n",
|
|
"5\n",
|
|
"5\n",
|
|
"0\n",
|
|
"{'result': ['FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILVA', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILWA', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILXA', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILYA', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILZA', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL0B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL1B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL2B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL3B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL4B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL5B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL6B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL7B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL8B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL9B', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILAB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILBB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILCB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILDB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILEB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILFB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILGB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILHB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILIB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILJB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILKB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILLB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILMB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILNB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILOB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILPB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILQB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILRB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILSB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILTB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILUB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILVB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILWB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILXB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILYB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8ILZB', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL0C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL1C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL2C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL3C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL4C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL5C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL6C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL7C', 'FINST-7C766871XI3BMAGFFCAD542A2EXE22VV7B8IL8C']}\n",
|
|
"{'result': ['FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILN3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILO3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILP3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILQ3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILR3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILS3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILT3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILU3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILV3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILW3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILX3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILY3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILZ3', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL04', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL14', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL24', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL34', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL44', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL54', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL64', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL74', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL84', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL94', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILA4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILB4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILC4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILD4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILE4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILF4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILG4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILH4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILI4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILJ4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILK4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILL4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILM4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILN4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILO4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILP4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILQ4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILR4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILS4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILT4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILU4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILV4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILW4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILX4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILY4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8ILZ4', 'FINST-TD666Z91YQ3BXDOZBDYAJ6ODLOKD2IP38B8IL05']}\n",
|
|
"{'result': ['FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILBD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILCD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILDD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILED', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILFD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILGD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILHD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILID', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILJD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILKD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILLD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILMD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILND', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILOD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILPD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILQD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILRD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILSD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILTD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILUD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILVD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILWD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILXD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILYD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILZD', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL0E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL1E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL2E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL3E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL4E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL5E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL6E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL7E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL8E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8IL9E', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILAE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILBE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILCE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILDE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILEE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILFE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILGE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILHE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILIE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILJE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILKE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILLE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILME', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILNE', 'FINST-9I6666D1N86BQM0O9CRMB63YJ3RF3HLB8B8ILOE']}\n",
|
|
"{'result': ['FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILM', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILN', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILO', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILP', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILQ', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILR', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILS', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILT', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILU', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILV', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILW', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILX', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILY', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILZ', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL01', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL11', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL21', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL31', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL41', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL51', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL61', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL71', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL81', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8IL91', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILA1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILB1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILC1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILD1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILE1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILF1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILG1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILH1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILI1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILJ1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILK1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILL1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILM1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILN1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILO1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILP1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILQ1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILR1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILS1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILT1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILU1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILV1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILW1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILX1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILY1', 'FINST-IS866HB1KN6BSK2SF74POC0053G82XBL8B8ILZ1']}\n",
|
|
"{'result': ['FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILY51', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILZ51', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL061', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL161', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL261', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL361', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL461', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL561', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL661', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL761', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL861', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL961', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILA61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILB61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILC61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILD61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILE61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILF61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILG61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILH61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILI61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILJ61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILK61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILL61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILM61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILN61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILO61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILP61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILQ61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILR61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILS61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILT61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILU61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILV61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILW61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILX61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILY61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILZ61', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL071', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL171', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL271', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL371', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL471', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL571', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL671', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL771', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL871', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8IL971', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILA71', 'FINST-QL966X81GL2B2VU9CPHEYB6AINK334UU8B8ILB71']}\n",
|
|
"{'result': ['FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILRC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILSC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILTC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILUC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILVC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILWC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILXC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILYC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILZC1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL0D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL1D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL2D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL3D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL4D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL5D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL6D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL7D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL8D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL9D1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILAD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILBD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILCD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILDD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILED1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILFD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILGD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILHD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILID1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILJD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILKD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILLD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILMD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILND1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILOD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILPD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILQD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILRD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILSD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILTD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILUD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILVD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILWD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILXD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILYD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8ILZD1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL0E1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL1E1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL2E1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL3E1', 'FINST-CA966X91SY1BB4H6BV0P29KNE5H938U29B8IL4E1']}\n",
|
|
"{'result': ['FINST-6F966H81M42BOVJXCS8XY51N8TKV2AMB9B8IL771', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL871', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL971', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILA71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILB71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILC71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILD71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILE71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILF71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILG71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILH71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILI71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILJ71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILK71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILL71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILM71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILN71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILO71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILP71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILQ71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILR71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILS71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILT71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILU71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILV71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILW71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILX71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILY71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILZ71', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL081', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL181', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL281', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL381', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL481', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL581', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL681', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL781', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL881', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8IL981', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILA81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILB81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILC81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILD81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILE81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILF81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILG81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILH81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILI81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILJ81', 'FINST-6F966H81M42BOVJXCS8XY51N8TKV2BMB9B8ILK81']}\n",
|
|
"{'result': ['FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILP6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILQ6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILR6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILS6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILT6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILU6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILV6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILW6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILX6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILY6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILZ6', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL07', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL17', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL27', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL37', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL47', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL57', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL67', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL77', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL87', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL97', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILA7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILB7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILC7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILD7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILE7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILF7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILG7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILH7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILI7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILJ7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILK7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILL7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILM7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILN7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILO7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILP7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILQ7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILR7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILS7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILT7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILU7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILV7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILW7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILX7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILY7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8ILZ7', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL08', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL18', 'FINST-VU966YB14L2BT1ZF8MXU98PYW3BN28EJ9B8IL28']}\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"# 基础函数配置\n",
|
|
"import pandas as pd\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",
|
|
"\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(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 read_delete(token, formInstanceId):\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",
|
|
" formData = {\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"formInstanceId\" : formInstanceId\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.delete(api, headers=headers, json=formData)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def read_new(FORMID,formData):\n",
|
|
" \"\"\" 通过实例id 获取表单内容 \"\"\"\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",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" print(res.json())\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"\n",
|
|
"def component(FORMID,TOKEN):\n",
|
|
" \"\"\" 获取组件信息 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/formFields'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" # \"language\" : \"zh_CN\",\n",
|
|
" \"userId\" : \"yida_pub_account\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.get(api, headers=headers, json=payload)\n",
|
|
"\n",
|
|
" return res.json()\n",
|
|
"def Batch_creation(FORMID,TOKEN,ALL_formData):\n",
|
|
" \"\"\" 批量新建 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchSave'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" payload = {\n",
|
|
" # \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
|
" \"noExecuteExpression\" : \"true\",\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"keepRunningAfterException\" : \"true\",\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"formDataJsonList\" : json.dumps(ALL_formData, cls=NpEncoder),\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in_batches(FORMID,TOKEN,ALL_DATA_instance):\n",
|
|
" \"\"\" 批量删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/batchRemove'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
" \"formUuid\" : FORMID,\n",
|
|
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
|
" \"asynchronousExecution\" : \"true\",\n",
|
|
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
|
" \"formInstanceIdList\" : json.dumps(ALL_DATA_instance, cls=NpEncoder),\n",
|
|
" \"userId\" : \"yida_pub_account\",\n",
|
|
" \"executeExpression\" : \"false\" # 不触发\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, headers=headers, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def delete_in(TOKEN,formInstanceIdList):\n",
|
|
" \"\"\" 逐条删除表单实例 \"\"\"\n",
|
|
" api = f'https://api.dingtalk.com//v1.0/yida/forms/instances?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN&formInstanceId={formInstanceIdList}'\n",
|
|
"\n",
|
|
" headers = {\n",
|
|
" \"Content-Type\": \"application/json\",\n",
|
|
" \"x-acs-dingtalk-access-token\": TOKEN\n",
|
|
" }\n",
|
|
" res = requests.delete(api, headers=headers)\n",
|
|
" return res.json()\n",
|
|
"def Retrieve_employee_id(TOKEN,offset):\n",
|
|
" \"\"\" 获取在职员工列表 \"\"\"\n",
|
|
" api = f'https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob?access_token={TOKEN}'\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
"\t\"offset\":offset,\n",
|
|
"\t\"size\":50,\n",
|
|
"\t\"status_list\":\"3\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\n",
|
|
"def Retrieve_employee_list(TOKEN,userid):\n",
|
|
" \"\"\" 获取员工花名册字段信息 \"\"\"\n",
|
|
" api = f'https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/v2/list?access_token={TOKEN}'\n",
|
|
"\n",
|
|
" payload = {\n",
|
|
"\t\"userid_list\":userid,\n",
|
|
"\t\"field_filter_list\":\"sys00-name\",\n",
|
|
"\t\"agentid\":\"1405052868\"\n",
|
|
" }\n",
|
|
"\n",
|
|
" res = requests.post(api, json=payload)\n",
|
|
" return res.json()\n",
|
|
"\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",
|
|
"TOKEN = generateToken() \n",
|
|
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
|
"\n",
|
|
"'''批量删除NGV数据'''\n",
|
|
"for i in range(0,10):\n",
|
|
" default = True\n",
|
|
" while default:\n",
|
|
" try:\n",
|
|
" FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" \n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" PAGES = form_data.get('totalCount')//100 +1 \n",
|
|
" print(form_data.get('totalCount'))\n",
|
|
" if form_data.get('totalCount')<=0:\n",
|
|
" default = False\n",
|
|
" for i in range(PAGES, 1,-1):\n",
|
|
" ALL_DATA_instance = []\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" ALL_DATA_instance.append(data['formInstanceId'])\n",
|
|
" print(f'读取到表单中 {len(ALL_DATA_instance)} 条数据!')\n",
|
|
" red_delete = delete_in_batches(FORMID,TOKEN,ALL_DATA_instance)\n",
|
|
" form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
|
" for data in form_data.get('data'):\n",
|
|
" formInstanceId = data['formInstanceId']\n",
|
|
" delete_in(TOKEN,formInstanceId)\n",
|
|
" print(f'单条删除 {formInstanceId} 数据!')\n",
|
|
" except:\n",
|
|
" pass\n",
|
|
"\n",
|
|
"'''遍历数据进行新建'''\n",
|
|
"offset = 0\n",
|
|
"for i in range(0,20):\n",
|
|
" try:\n",
|
|
" ALL_formData = []\n",
|
|
" res_list = Retrieve_employee_id(TOKEN,offset)\n",
|
|
" offset = res_list[\"result\"][\"next_cursor\"]\n",
|
|
" res_list[\"result\"][\"data_list\"]\n",
|
|
" for a in range(0,len(res_list[\"result\"][\"data_list\"])):\n",
|
|
" formData = {\n",
|
|
" 'textField_lfrw3u59':res_list[\"result\"][\"data_list\"][a],# 员工ID\n",
|
|
" 'textField_lfrw3u58':Retrieve_employee_list(TOKEN,res_list[\"result\"][\"data_list\"][a])[\"result\"][0]['field_data_list'][0]['field_value_list'][0]['label']# 员工名称\n",
|
|
" }\n",
|
|
" ALL_formData.append(json.dumps(formData, cls=NpEncoder)) \n",
|
|
" res_new = Batch_creation(FORMID,TOKEN,ALL_formData)\n",
|
|
" print(res_new)\n",
|
|
" except:\n",
|
|
" pass"
|
|
]
|
|
}
|
|
],
|
|
"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
|
|
}
|