''' 连接数据库信息 对数据进行过滤 宜搭新建普通表单——字段一一对应 将读取数据写入宜搭表单 设置定时任务校验数据变动 ''' # -*- coding: utf-8 -*- import psycopg2 import pandas as pd # 获得连接 conn = psycopg2.connect(database="f6_bi", user="BASIC$ro_caowei", password="!ro_caowei123", host="hgprecn-cn-nif1vnv0y002-cn-shanghai.hologres.aliyuncs.com", port="80") # 获得游标对象,一个游标对象可以对数据库进行执行操作 cursor = conn.cursor() import datetime now_time = datetime.datetime.now() yes_time = now_time + datetime.timedelta(days=-1) yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期 # sql语句 建表 sql =f"""SELECT * FROM "public"."holo_ads_report_sales_saas_commission_info_d" WHERE "date_fmt" LIKE '%{yes_time_nyr}%' AND "org_type" LIKE '%一般%' ;""" # 执行语句 cursor.execute(sql) # 获取结果集的每一行 rows = cursor.fetchall() # 获取所有字段名 all_fields = cursor.description #执行结果转化为dataframe col = [] for i in all_fields: col.append(i[0]) data_F6 = pd.DataFrame(list(rows),columns=col) # data_F6.to_excel(r'C:\Users\admin\Desktop\小六提成明细.xlsx') # 关闭数据库连接 cursor.close() conn.close() print(len(data_F6)) # 基础函数配置 import pandas as pd import pandas as pd import requests from pathlib import Path from urllib.parse import quote import json import numpy as np import time ROOT = Path('.').absolute() # 当前工作目录 def generateToken() -> str: """ 生成 token """ token_api = 'https://api.dingtalk.com/v1.0/oauth2/accessToken' # 该信息在钉钉开放应用中 data = { "appKey": "ding5kqocon5s9oph5uq", "appSecret": 'HL1jgsIIfLAC0eTH0A1m4mwxUDqbgsiPeCCGGE3ocM6qJBTIW7Ivt9drxF_Z4Kb_' } res = requests.post(token_api, json=data) token = res.json()['accessToken'] return token def read_instances(token, formUuid, page, n): """ 函数功能:读取普通表单的所有数据 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances/search' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": token } formData = { "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "userId" : "yida_pub_account", "language" : "zh_CN", "formUuid" : formUuid, "currentPage" : page, "pageSize" : n } res = requests.post(api, headers=headers, json=formData) return res.json() def read_delete(token, formInstanceId): """ 函数功能:调用本接口删除表单数据。 """ api = f'https://api.dingtalk.com//v1.0/yida/forms/instances' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": token } formData = { "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "userId" : "yida_pub_account", "language" : "zh_CN", "formInstanceId" : formInstanceId } res = requests.delete(api, headers=headers, json=formData) return res.json() def read_new(FORMID,formData): """ 通过实例id 获取表单内容 """ api = f'https://api.dingtalk.com/v1.0/yida/forms/instances' headers = { "Content-Type": "application/json", "x-acs-dingtalk-access-token": TOKEN } payload = { "formUuid" : FORMID, "appType" : "APP_UYZ0KG6L0CCNV80GZ66O", "formDataJson" : json.dumps(formData, cls=NpEncoder), "systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2", "language" : "zh_CN", "userId" : "yida_pub_account" } res = requests.post(api, headers=headers, json=payload) print(res.json()) return res.json() class NpEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, np.integer): return int(obj) elif isinstance(obj, np.floating): return float(obj) elif isinstance(obj, np.ndarray): return obj.tolist() else: return super(NpEncoder, self).default(obj) # 读取员工对应关系:宜搭员工-ID对应表 TOKEN = generateToken() FORMID = "FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6 # 读取流程表单数据 form_data = read_instances(token=TOKEN, formUuid=FORMID, page=1, n=100) PAGES = form_data.get('totalCount')//100 + 1 ALL_DATA_staff = [] """ 获取全量数据 """ for i in range(1, PAGES+1): # form_data = read_processes_instances(token=TOKEN, formUuid=FORMID, createFromTimeGMT=CREATE_FROM, createToTimeGMT=CREATE_TO, page=i, n=100, searchField={'textField_l7if5ff9': '否'}) form_data = read_instances(token=TOKEN, formUuid=FORMID, page=i, n=100) for data in form_data.get('data'): ALL_DATA_staff.append(data) FORMID = "FORM-GP666M71TNE9GFK57V2O85NLM04I34CSG1TFLC" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6 data_F6 = data_F6.astype('string') data_F6 = data_F6.fillna('',inplace=False) for i in range(0,len(data_F6)): if data_F6["saas_create_time"][i] =="": data_F6["saas_create_time"][i] = '2000-01-01 00:00:00' if data_F6["pay_date"][i] =="": data_F6["pay_date"][i] = '2000-01-01' if data_F6["etl_time"][i] =="": data_F6["etl_time"][i] = '2000-01-01 00:00:00' if data_F6["date_fmt_2"][i] =="": data_F6["date_fmt_2"][i] = '2000-01-01' if data_F6["saas_create_time_2"][i] =="": data_F6["saas_create_time_2"][i] = '2000-01-01 00:00:00' if data_F6["pay_date_2"][i] =="": data_F6["pay_date_2"][i] = '2000-01-01' formData = { "textField_xgaye7b":data_F6["date_fmt"][i], "textField_5aunjjz":data_F6["to_grant_employee_id"][i], "employeeField_lft1hn2e":[v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== data_F6["to_grant_person"][i]], "employeeField_lft1hn2f":[v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== data_F6["area_manager"][i]], "textField_3qsnt9b":data_F6["region_name"][i], "textField_ua446tp":data_F6["province_name"][i], "textField_j9ljlkf":data_F6["commission_type_1st"][i], "textField_b0zcpw7":data_F6["commission_type_2nd"][i], "textField_07mm4y7":data_F6["order_id"][i], "textField_m3fpjk2":data_F6["order_no"][i], "textField_6glka3o":data_F6["org_id"][i], "textField_dfvhslm":data_F6["org_code"][i], "textField_syljyve":data_F6["org_name"][i], "textField_xindatc":data_F6["org_crm_id"][i], "textField_ewa0fov":data_F6["group_id"][i], "textField_kqi0lgg":data_F6["group_name"][i], "dateField_9rmplmj":int(time.mktime(time.strptime(data_F6["saas_create_time"][i], "%Y-%m-%d %H:%M:%S"))*1000), "textField_gkzyime":data_F6["saas_edition_fmt"][i], "textField_nz7bokd":data_F6["spu_id"][i], "textField_czwr4gi":data_F6["spu_name"][i], "numberField_u2uxl9r":data_F6["is_upgrade_order"][i], "numberField_zriq77s":data_F6["is_finish_follow"][i], "numberField_zwvyzuw":data_F6["is_first_renew"][i], "dateField_dezcysa":int(time.mktime(time.strptime(data_F6["pay_date"][i], "%Y-%m-%d"))*1000), "numberField_7soucf9":data_F6["order_trade_amount"][i], "numberField_vbubqg5":data_F6["amount_real_base"][i], "numberField_322ap3t":data_F6["amount_real_beyond"][i], "numberField_9r0pqjh":data_F6["r_within_base"][i], "numberField_86nt5n9":data_F6["r_beyond_base"][i], "numberField_4zq0um5":data_F6["commission_proportion"][i], "numberField_4udpris":data_F6["over_commission_proportion"][i], "numberField_t7q2mf8":data_F6["commission_base"][i], "numberField_26r5qhn":data_F6["satisfy_score"][i], "numberField_z56c377":data_F6["deduction_factor"][i], "dateField_7bb5a3w":int(time.mktime(time.strptime(data_F6["etl_time"][i], "%Y-%m-%d %H:%M:%S"))*1000), "textField_nir0f7g":data_F6["branch_name"][i], "textField_x72zywz":data_F6["city_name"][i], "employeeField_lft1hn2g":[v['formData']['textField_lfrw3u59'] for v in ALL_DATA_staff if v['formData']['textField_lfrw3u58']== data_F6["technician"][i]], "textField_o65xr8r":data_F6["to_grant_employee_code"][i], "textField_m48obfc":data_F6["is_first_add_purchase"][i], "textField_3w926j1":data_F6["month_fmt"][i], "textField_1st9ba2":data_F6["ding_user_id"][i], "textField_mxlhhx6":data_F6["org_type"][i], "numberField_tnr50pm":data_F6["new_stage_flag"][i], "dateField_0tk0bj2":int(time.mktime(time.strptime(data_F6["date_fmt_2"][i], "%Y-%m-%d"))*1000), "dateField_vl6p1ds":int(time.mktime(time.strptime(data_F6["saas_create_time_2"][i], "%Y-%m-%d %H:%M:%S"))*1000), "dateField_3oc57kk":int(time.mktime(time.strptime(data_F6["pay_date_2"][i], "%Y-%m-%d"))*1000), "textField_br8o1wy":data_F6["month_fmt_2"][i], "numberField_pkt6w2o":data_F6["order_period_year_number"][i], "textField_9solcme":data_F6["business_type"][i], "textField_lld2doy7":data_F6["franchise_group_name"][i], "numberField_esmnply":data_F6["is_more_paid"][i], "textField_llyskpc6":data_F6["is_more_paid"][i], "textField_llyskpc6":str(data_F6["date_fmt"][i]) + str(i) } if formData['textField_lld2doy7']=="修工坊全国运营中心" or formData['textField_lld2doy7']=="CC养车" or formData['textField_lld2doy7']=="金铁橡全国运营中心": if formData['textField_gkzyime'] == "基础版": formData['numberField_7soucf9'] = 500 if formData['textField_gkzyime'] == "尊享版": formData['numberField_7soucf9'] = 1500 read_new(FORMID,formData) data_F6 = data_F6.astype(str) data_F6.to_excel(r'C:\Users\admin\Desktop\小六提成明细'+str(yes_time_nyr)+'.xlsx')