{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 正式" ] }, { "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'))-2\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", "def read_instances_pt(token, formUuid, page, n):\n", " \"\"\" 函数功能:读取普通表单的所有数据 \"\"\"\n", "\n", " api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " formData = {\n", " \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"userId\" : \"yida_pub_account\",\n", " \"language\" : \"zh_CN\",\n", " \"formUuid\" : formUuid,\n", " \"currentPage\" : page,\n", " \"pageSize\" : n\n", " }\n", "\n", " res = requests.post(api, headers=headers, json=formData)\n", " return res.json()\n", "def 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')//100 + 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", "form_data = read_instances_pt(token=TOKEN, formUuid=\"FORM-E6766M8103CDA5M3CJ06JDRCLSKV2FJ6Z3CLLA\" , page=1, n=100)\n", "PAGES = form_data.get('totalCount')//100 + 1\n", "ALL_DATA = []\n", "\"\"\" 获取全量数据 \"\"\"\n", "for i in range(1, PAGES+1):\n", " form_data = read_instances_pt(token=TOKEN, formUuid=\"FORM-E6766M8103CDA5M3CJ06JDRCLSKV2FJ6Z3CLLA\" , page=i, n=100)\n", " for data in form_data.get('data'):\n", " ALL_DATA.append([data['formData'][\"textField_dv032lp\"],data['formData'][\"textField_cwqfrcq\"],data['formData'][\"textField_qplm0p9\"]+data['formData'][\"textField_wy749n8\"]])\n", "print(f'读取到流程表中 {len(ALL_DATA)} 条数据')\n", "df_DataFrame = pd.DataFrame(ALL_DATA, columns=[ '优惠券金额', '提前续约优惠', '公司名称门店名称'])\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", " try:\n", " if data_details[\"franchise_group_name\"][i] ==\"\":\n", " data_details[\"franchise_group_name\"][i] = \"普通SAAS\"\n", " except:\n", " pass\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", " 'textField_llm3mclm':\"0\" #\"提前续约优惠\"\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", " try:\n", " group_name_org_name = formData['textField_ntc1mqo'] + formData['textField_nk98j1i']\n", " row_numbers = df_DataFrame.index[df_DataFrame['公司名称门店名称'] == group_name_org_name].tolist()\n", " if row_numbers[0]>0:\n", " pandan_new = int(float(df_DataFrame.loc[row_numbers,'优惠券金额'].values[0])) - int(float(formData['textField_pkyoug6']))\n", " if pandan_new == 0 or df_DataFrame.loc[row_numbers,'优惠券金额'].values[0] == \"0\":\n", " formData['textField_llm3mclm'] = df_DataFrame.loc[row_numbers[0],'提前续约优惠'] # 提前续约优惠\n", " except:\n", " formData['textField_llm3mclm'] = \"0\"\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" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:\n", "c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\.libs\\libopenblas.EL2C6PLE4ZYW3ECEVIV3OXXGRN2NRFM2.gfortran-win_amd64.dll\n", "c:\\Users\\admin\\.conda\\envs\\F6processing\\lib\\site-packages\\numpy\\.libs\\libopenblas64__v0.3.21-gcc_10_3_0.dll\n", " warnings.warn(\"loaded more than 1 DLL from .libs:\"\n" ] } ], "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", "from datetime import date, timedelta\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 transcation(token,FORMID,data_new):\n", " \"\"\" 函数功能:更新表单内容 \"\"\"\n", " api = f'https://api.dingtalk.com//v1.0/yida/forms/instances'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " payload = {\n", " \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"userId\" : \"2268275546837446\", # 曹伟 id\n", " \"language\" : \"zh_CN\",\n", " \"useLatestVersion\" : \"false\",\n", " \"formInstanceId\" : FORMID,\n", " \"updateFormDataJson\" : json.dumps(data_new, cls=NpEncoder),\n", " }\n", "\n", " res = requests.put(api, headers=headers, json=payload)\n", "\n", " return res.json()\n", "def aggree_approval(token: str, taskId: str, processInstanceId: str, formData: dict,res_new):\n", " \"\"\" 函数功能:同意审批节点 --F6客户服务 应用 \"\"\"\n", " api = f'https://api.dingtalk.com/v1.0/yida/tasks/execute'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " payload = {\n", " \"outResult\": \"AGREE\",\n", " \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"remark\": \"同意(接口自动)\",\n", " \"formDataJson\": json.dumps(formData, cls=NpEncoder),\n", " \"processInstanceId\": processInstanceId,\n", " # \"userId\": \"yida_pub_account\",\n", " \"userId\": res_new, \n", " \"language\": \"zh_CN\",\n", " \"taskId\": int(taskId)\n", " }\n", "\n", " res = requests.post(api, headers=headers, json=payload)\n", " # print('同意审批节点')\n", " return res\n", "def read_instances_new(token, formUuid, page, n):\n", " \"\"\" 函数功能:读取流程表单的所有数据 \"\"\"\n", "\n", " api = f'https://api.dingtalk.com//v1.0/yida/processes/instances?pageNumber={page}&pageSize={n}'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " formData = {\n", " \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"userId\": \"yida_pub_account\", # 超级管理员账号\n", " \"language\": \"zh_CN\",\n", " \"formUuid\": formUuid,\n", " # \"searchFieldJson\": json.dumps(searchField), # 如果增加上这一项会要求升级宜搭存储\n", " \"instanceStatus\": \"RUNNING\"\n", " }\n", "\n", " res = requests.post(api, headers=headers, json=formData)\n", " return res.json()\n", "def get_approval_records(token: str, processInstanceId: str):\n", " \"\"\" 函数功能:获取流程表单的审批记录 --F6客户服务 应用 \"\"\"\n", " appType = \"APP_UYZ0KG6L0CCNV80GZ66O\"\n", " systemToken = \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\"\n", " userId = \"yida_pub_account\"\n", "\n", " api = f'https://api.dingtalk.com/v1.0/yida/processes/operationRecords?appType={appType}&systemToken={systemToken}&userId={userId}&language=zh_CN&processInstanceId={processInstanceId}'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " res = requests.get(api, headers=headers)\n", " # print('获取流程表单的审批记录')\n", " return res.json()\n", "def read_instances_pt(token, formUuid, page, n):\n", " \"\"\" 函数功能:读取普通表单的所有数据 \"\"\"\n", "\n", " api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " formData = {\n", " \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"userId\" : \"yida_pub_account\",\n", " \"language\" : \"zh_CN\",\n", " \"formUuid\" : formUuid,\n", " \"currentPage\" : page,\n", " \"pageSize\" : n\n", " }\n", "\n", " res = requests.post(api, headers=headers, json=formData)\n", " return res.json()\n", "def read_processes(token, formUuid, page, n):\n", " \"\"\" 函数功能:读取普通表单的所有数据 \"\"\"\n", "\n", " api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": token\n", " }\n", "\n", " formData = {\n", " \"appType\": \"APP_UYZ0KG6L0CCNV80GZ66O\",\n", " \"systemToken\": \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n", " \"userId\": \"yida_pub_account\", # 超级管理员账号\n", " \"language\": \"zh_CN\",\n", " \"formUuid\": formUuid,\n", " 'currentPage':page,\n", " 'pageSize':n\n", " }\n", "\n", " res = requests.post(api, headers=headers, json=formData)\n", " return res.json()\n", "def instances_id(TOKEN,id):\n", " \"\"\" 函数功能:查询表单实例 \"\"\"\n", " api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/{id}?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": TOKEN\n", " }\n", "\n", " res = requests.get(api, headers=headers)\n", "\n", " return res.json()\n", "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 component_id(id,TOKEN):\n", " api = f'https://api.dingtalk.com/v1.0/yida/processes/instancesInfos/{id}?appType=APP_UYZ0KG6L0CCNV80GZ66O&systemToken=XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2&userId=yida_pub_account&language=zh_CN'\n", "\n", " headers = {\n", " \"Content-Type\": \"application/json\",\n", " \"x-acs-dingtalk-access-token\": TOKEN\n", " }\n", " \n", " res = requests.get(api, headers=headers)\n", "\n", " return res.json()\n", "def find_indexes(daichuli_mendian_name,i_two):\n", " indexes = [i for i, x in enumerate(daichuli_mendian_name) if x == i_two]\n", " return indexes\n", "def get_staffID(TOKEN: str,ALL_DATA_staff,staff_name):\n", " res_new = [v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== staff_name]\n", " # print('通过员工名称获取员工id')\n", " return res_new\n", "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" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "读取到流程表中 76 条数据\n" ] } ], "source": [ "TOKEN = generateToken()\n", "form_data = read_instances_pt(token=TOKEN, formUuid=\"FORM-E6766M8103CDA5M3CJ06JDRCLSKV2FJ6Z3CLLA\" , page=1, n=100)\n", "PAGES = form_data.get('totalCount')//100 + 1\n", "ALL_DATA = []\n", "\"\"\" 获取全量数据 \"\"\"\n", "for i in range(1, PAGES+1):\n", " form_data = read_instances_pt(token=TOKEN, formUuid=\"FORM-E6766M8103CDA5M3CJ06JDRCLSKV2FJ6Z3CLLA\" , page=i, n=100)\n", " for data in form_data.get('data'):\n", " ALL_DATA.append([data['formData'][\"textField_dv032lp\"],data['formData'][\"textField_cwqfrcq\"],data['formData'][\"textField_qplm0p9\"]+data['formData'][\"textField_wy749n8\"]])\n", "print(f'读取到流程表中 {len(ALL_DATA)} 条数据')\n", "df_DataFrame = pd.DataFrame(ALL_DATA, columns=[ '优惠券金额', '提前续约优惠', '公司名称门店名称'])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | 优惠券金额 | \n", "提前续约优惠 | \n", "公司名称门店名称 | \n", "
|---|---|---|---|
| 0 | \n", "0.00 | \n", "0.00 | \n", "青岛山高汽车科技服务有限公司赛轮养车延安三路店 | \n", "
| 1 | \n", "600.00 | \n", "0.00 | \n", "顺德汽修顺德汽修 | \n", "
| 2 | \n", "800.00 | \n", "0.00 | \n", "天津市红桥区祥三汽车维修中心天津市红桥区祥三汽车维修中心 | \n", "
| 3 | \n", "2000.00 | \n", "0.00 | \n", "胜达养车胜达汽车服务 | \n", "
| 4 | \n", "600.00 | \n", "0.00 | \n", "瑞安市攸正汽车美容中心瑞安市攸正汽车维修中心 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "
| 71 | \n", "600.00 | \n", "0.00 | \n", "上海天冠汽车服务有限公司知车汇快修连锁(龙飞店) | \n", "
| 72 | \n", "600.00 | \n", "0.00 | \n", "上海天冠汽车服务有限公司知车汇快修连锁(临江店) | \n", "
| 73 | \n", "600.00 | \n", "0.00 | \n", "上海天冠汽车服务有限公司知车汇快修连锁(嘉罗店) | \n", "
| 74 | \n", "600.00 | \n", "0.00 | \n", "上海天冠汽车服务有限公司知车汇快修连锁杨鑫路店 | \n", "
| 75 | \n", "600.00 | \n", "0.00 | \n", "怡邦名车专修中心怡邦汽车维修服务中心 | \n", "
76 rows × 3 columns
\n", "