Files
F6--/其它系统脚本/宜搭小六明细定时任务.py
2026-01-30 11:28:35 +08:00

231 lines
9.0 KiB
Python

'''
连接数据库信息
对数据进行过滤
宜搭新建普通表单——字段一一对应
将读取数据写入宜搭表单
设置定时任务校验数据变动
'''
# -*- 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()
# 基础函数配置
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')//10 + 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)
print(f'读取到流程表单中 {len(ALL_DATA_staff)} 条数据!')
data_F6 = data_F6.astype('string')
data_F6 = data_F6.fillna('',inplace=False)
FORMID = "FORM-GP666M71TNE9GFK57V2O85NLM04I34CSG1TFLC" # holo_ads_report_sales_saas_commission_info_d
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],
"numberField_esmnply":data_F6["is_more_paid"][i]
}
read_new(FORMID,formData)