脚本
This commit is contained in:
@@ -0,0 +1,591 @@
|
||||
import datetime
|
||||
starttime = datetime.datetime.now()
|
||||
|
||||
import holidays
|
||||
from datetime import date
|
||||
|
||||
# 创建一个中国节假日对象
|
||||
cn_holidays = holidays.China()
|
||||
# 获取当前日期
|
||||
input_date = date.today()
|
||||
switch = ""
|
||||
# 判断日期是否为节假日
|
||||
if input_date in cn_holidays:
|
||||
switch = "节假日"
|
||||
print(f"{input_date} 是节假日")
|
||||
else:
|
||||
switch = "非节假日"
|
||||
print(f"{input_date} 不是节假日")
|
||||
date_list = []
|
||||
for data in cn_holidays:
|
||||
date_list.append(str(data))
|
||||
|
||||
from datetime import date, timedelta
|
||||
|
||||
def get_saturdays(year):
|
||||
start_date = date(year, 1, 1)
|
||||
end_date = date(year, 12, 31)
|
||||
saturdays = []
|
||||
|
||||
while start_date <= end_date:
|
||||
if start_date.weekday() == 6: # 周日的weekday值为6
|
||||
saturdays.append(start_date)
|
||||
start_date += timedelta(days=1)
|
||||
|
||||
return saturdays
|
||||
|
||||
current_year = date.today().year
|
||||
saturdays = get_saturdays(current_year)
|
||||
print(saturdays)
|
||||
for data in saturdays:
|
||||
date_list.append(str(data))
|
||||
date_list = list(set(date_list))
|
||||
date_list = sorted(date_list, reverse=False)
|
||||
|
||||
# -*- 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_saas_profile_ngv_detail_d" WHERE "date_id" = '{yes_time_nyr}' ;"""
|
||||
# 执行语句
|
||||
cursor.execute(sql)
|
||||
# 获取结果集的每一行
|
||||
rows = cursor.fetchall()
|
||||
# 获取所有字段名
|
||||
all_fields = cursor.description
|
||||
#执行结果转化为dataframe
|
||||
col = []
|
||||
for i in all_fields:
|
||||
col.append(i[0])
|
||||
data_NGV = pd.DataFrame(list(rows),columns=col)
|
||||
# data_NGV.to_excel(r'C:\Users\admin\Desktop\NGV明细.xlsx')
|
||||
# 关闭数据库连接
|
||||
cursor.close()
|
||||
conn.close()
|
||||
# 将A列和B列的日期字符串转换为日期格式
|
||||
data_NGV['A'] = pd.to_datetime(data_NGV['expiry_time'])
|
||||
data_NGV['B'] = pd.to_datetime(data_NGV['renew_date'])
|
||||
data_NGV['条件'] = (data_NGV['org_type'] == "一般") & (data_NGV['org_status'] == '留存') & (data_NGV['group_grade'] != '区域KA(MVP)') & (data_NGV['group_grade'] != '全国KA(FMVP)')& (data_NGV['area_manager'] != '殷昊')& (data_NGV['area_manager'] != '孙玉蕾')
|
||||
data_NGV = data_NGV.loc[data_NGV["条件"] == True]
|
||||
data_details = data_NGV.copy()
|
||||
# 重置索引
|
||||
data_details = data_details.reset_index(drop=True)
|
||||
# 判断A列的日期是否大于B列的日期730天,如果是的话,将B列的值设置为1
|
||||
data_details['条件'] = data_details.apply(lambda row: (row['A'] - row['B']).days if row['A'] - row['B'] >= pd.Timedelta(days=730) else row['条件'], axis=1)
|
||||
data_details = data_details.loc[data_details["条件"] != True]
|
||||
# 定义一个函数,用于将数字除以365并取整数
|
||||
def divide_by_365(x):
|
||||
if isinstance(x, (int, float)):
|
||||
return int(x / 365)
|
||||
else:
|
||||
return x
|
||||
# 使用applymap()函数将divide_by_365函数应用到DataFrame的每个元素
|
||||
data_details['年'] = data_details['条件'].apply(divide_by_365)
|
||||
# 重置索引
|
||||
data_details = data_details.reset_index(drop=True)
|
||||
# 创建一个新的空的DataFrame
|
||||
new_df = pd.DataFrame()
|
||||
# 遍历原始DataFrame的每一行
|
||||
from datetime import datetime, timedelta
|
||||
for index, row in data_details.iterrows():
|
||||
# 根据A列的值来决定复制的次数
|
||||
if row["renew_date"] != "2024-02-29":
|
||||
for i_new in range(1,row['年']):
|
||||
# 修改日期
|
||||
row_new = row.copy()
|
||||
c = row_new["renew_date"]
|
||||
date_obj = datetime.strptime(c, "%Y-%m-%d")
|
||||
new_year = date_obj.year + i_new
|
||||
new_date_obj = date_obj.replace(year=new_year)
|
||||
new_c = new_date_obj.strftime("%Y-%m-%d")
|
||||
row_new["renew_date"] = new_c
|
||||
# 将当前行添加到新的DataFrame中
|
||||
new_df = new_df._append(row_new, ignore_index=True)
|
||||
# 合并两个DataFrame
|
||||
merged_df = pd.concat([data_NGV, new_df], axis=0, ignore_index=True)
|
||||
data_details = merged_df.copy() # 替换名称
|
||||
|
||||
data_details_not_null = data_details[data_details['renew_date'].notnull()]
|
||||
# 重置索引
|
||||
data_details_not_null = data_details_not_null.reset_index(drop=True)
|
||||
data_details = data_details_not_null.copy() # 替换名称 v2
|
||||
data_details['saas_create_time'] = data_details['saas_create_time'].str[:10] # 截取前10位
|
||||
data_details = data_details[data_details['saas_create_time'] != data_details['renew_date']] # 过滤掉等于renew_date的行
|
||||
data_details = data_details.reset_index(drop=True)
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
|
||||
# for data in date_list:
|
||||
# # 将字符串转换为日期
|
||||
# date = datetime.strptime(data, '%Y-%m-%d')
|
||||
# # 将日期加1
|
||||
# date = date + relativedelta(days=1)
|
||||
# # 将日期转换回字符串格式
|
||||
# date_str = date.strftime('%Y-%m-%d')
|
||||
# # 遍历 renew_date 列,如果值等于 A,则将其改为 B
|
||||
# data_details['renew_date'] = data_details['renew_date'].replace(data, date_str)
|
||||
|
||||
|
||||
|
||||
import pandas as pd
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
import re
|
||||
from datetime import datetime
|
||||
from dateutil.relativedelta import relativedelta
|
||||
from pathlib import Path
|
||||
from urllib.parse import quote
|
||||
from io import BytesIO
|
||||
|
||||
ROOT = Path('.').absolute() # 当前工作目录
|
||||
textField_lrzoowld = "正常" # 运行状态
|
||||
textField_lrzoowlb = "" # 信息说明
|
||||
|
||||
# 生成 token,参数不需要修改
|
||||
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,formatted_today,formatted_today_two):
|
||||
""" 函数功能:读取普通表单的所有数据 """
|
||||
|
||||
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,
|
||||
"createFromTimeGMT" : formatted_today,
|
||||
"createToTimeGMT" : formatted_today_two,
|
||||
"currentPage" : page,
|
||||
"pageSize" : n
|
||||
}
|
||||
|
||||
res = requests.post(api, headers=headers, json=formData)
|
||||
return res.json()
|
||||
|
||||
def initiate_process(TOKEN,formUuid,processCode,formData):
|
||||
""" 发起宜搭审批流程 """
|
||||
api = f'https://api.dingtalk.com//v1.0/yida/processes/instances/start'
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"x-acs-dingtalk-access-token": TOKEN
|
||||
}
|
||||
payload = {
|
||||
"appType" : "APP_UYZ0KG6L0CCNV80GZ66O",
|
||||
"systemToken" : "XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2",
|
||||
"userId" : "yida_pub_account",
|
||||
"language" : "zh_CN",
|
||||
"formUuid" : formUuid,
|
||||
"formDataJson" : json.dumps(formData, cls=NpEncoder),
|
||||
"processCode" : processCode,
|
||||
}
|
||||
|
||||
res = requests.post(api, headers=headers, json=payload)
|
||||
return res.json()
|
||||
|
||||
def read_instances_new(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_instances_ngv(token, formUuid, page, n,searchField):
|
||||
""" 函数功能:读取普通表单的所有数据 """
|
||||
|
||||
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,
|
||||
"searchFieldJson": json.dumps(searchField),
|
||||
"currentPage" : page,
|
||||
"pageSize" : n
|
||||
}
|
||||
|
||||
res = requests.post(api, headers=headers, json=formData)
|
||||
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)
|
||||
|
||||
TOKEN = generateToken()
|
||||
'''读取员工对应关系:宜搭员工-ID对应表 '''
|
||||
FORMID = "FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6
|
||||
# 读取流程表单数据
|
||||
form_data = read_instances_new(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_new(token=TOKEN, formUuid=FORMID, page=i, n=100)
|
||||
for data in form_data.get('data'):
|
||||
ALL_DATA_staff[data['formData']['textField_lfrw3u58']]=data['formData']['textField_lfrw3u59']
|
||||
'''读取省市小六技术专家区域客服区域客成 '''
|
||||
FORMID = "FORM-TP866D918DFCA4FW79YZU5X43FO32QZJQDZJL7" #省市小六技术专家区域客服区域客成
|
||||
# 读取流程表单数据
|
||||
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
||||
PAGES = form_data.get('totalCount')//100 + 1
|
||||
textField_gif29wy = {}
|
||||
textField_3athky8 = {}
|
||||
textField_3hgho1m = {}
|
||||
textField_nc7gskc = {}
|
||||
textField_qk1e5di = {}
|
||||
textField_m3hchxc = {} # 市
|
||||
""" 获取全量数据 """
|
||||
for i in range(1, PAGES+1):
|
||||
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100)
|
||||
for data in form_data.get('data'):
|
||||
textField_gif29wy[data['formData']['textField_o7jtgf1']]=data['formData']['textField_gif29wy'] #区域客成id
|
||||
textField_3athky8[data['formData']['textField_o7jtgf1']]=data['formData']['textField_3athky8'] #区域客服id
|
||||
textField_3hgho1m[data['formData']['textField_o7jtgf1']]=data['formData']['textField_3hgho1m'] #小六id
|
||||
textField_nc7gskc[data['formData']['textField_o7jtgf1']]=data['formData']['textField_nc7gskc'] #技术专家id
|
||||
textField_qk1e5di[data['formData']['textField_o7jtgf1']]=data['formData']['textField_lntniove'] #区域经理id
|
||||
textField_m3hchxc[data['formData']['textField_m3hchxc']]=data['formData']['textField_3hgho1m'] #小六id-市
|
||||
print(f'读取到省市小六技术专家区域客服区域客成表单中 {len(textField_gif29wy)} 条数据!')
|
||||
'''读取市-技术专家id '''
|
||||
FORMID = "FORM-A8666NA1FJDEVPBB6VVTOCMP47UP2J2L6SPML2" #市-技术专家id
|
||||
# 读取流程表单数据
|
||||
form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)
|
||||
PAGES = form_data.get('totalCount')//100 + 1
|
||||
textField_lmps6q39 = {}
|
||||
""" 获取全量数据 """
|
||||
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_new(token=TOKEN, formUuid=FORMID, page=i, n=100)
|
||||
for data in form_data.get('data'):
|
||||
textField_lmps6q39[data['formData']['textField_lmps6q38']]=data['formData']['textField_lmps6q39'] #技术专家id
|
||||
print(f'读取到市-技术专家id表单中 {len(textField_lmps6q39)} 条数据!')
|
||||
import datetime
|
||||
date_90 = 83
|
||||
date_120 = 113
|
||||
date_180 = 173
|
||||
date_one = 1
|
||||
now_time = datetime.datetime.now()
|
||||
# now_time = now_time + datetime.timedelta(days=+1)
|
||||
if now_time.strftime("%Y-%m-%d") in date_list:
|
||||
date_one = 0
|
||||
print("开始次数:",date_one)
|
||||
print("当前日期:",now_time)
|
||||
|
||||
for i in range(1,10):
|
||||
new_date = now_time + datetime.timedelta(days=-i)
|
||||
new_date = new_date.strftime("%Y-%m-%d")
|
||||
print("遍历日期:",new_date)
|
||||
if new_date in date_list:
|
||||
date_one = date_one + 1
|
||||
print("节假日期:",new_date)
|
||||
else:
|
||||
break
|
||||
print("遍历次数:",date_one)
|
||||
|
||||
now_time = datetime.datetime.now()
|
||||
for i in range(0,date_one):
|
||||
import datetime
|
||||
now_time = now_time + datetime.timedelta(days=-i)
|
||||
today = now_time + datetime.timedelta(days=-date_90)
|
||||
formatted_today_90 = today.strftime("%Y-%m-%d")
|
||||
today = now_time + datetime.timedelta(days=-date_120)
|
||||
formatted_today_120 = today.strftime("%Y-%m-%d")
|
||||
today = now_time + datetime.timedelta(days=-date_180)
|
||||
formatted_today_180 = today.strftime("%Y-%m-%d")
|
||||
print(formatted_today_90,formatted_today_120,formatted_today_180)
|
||||
timestamp_ms = int(time.time() * 1000) # 当然日期时间戳 毫秒级
|
||||
# 获取数据
|
||||
data_details_90 = data_details.copy()
|
||||
data_details_90['条件'] = (data_details_90['renew_date'] == formatted_today_90) & (data_details_90['saas_edition_fmt'] != '基础版')
|
||||
data_details_90 = data_details_90.loc[data_details_90["条件"] == True]
|
||||
data_details_120 = data_details.copy()
|
||||
data_details_120['条件'] = (data_details_120['renew_date'] == formatted_today_120) & (data_details_120['saas_edition_fmt'] == '基础版')
|
||||
data_details_120 = data_details_120.loc[data_details_120["条件"] == True]
|
||||
data_details_180 = data_details.copy()
|
||||
data_details_180['条件'] = (data_details_180['renew_date'] == formatted_today_180) & (data_details_180['saas_edition_fmt'] != '基础版')
|
||||
data_details_180 = data_details_180.loc[data_details_180["条件"] == True]
|
||||
|
||||
text_jcb_120 = '''
|
||||
续约后120天:
|
||||
1.客户系统使用问题集中解答;
|
||||
2.跟客户查看车辆分析,推荐短信及其他营销功能;
|
||||
3.红包裂变功能介绍;
|
||||
4.说明转介绍政策,索要转介绍;
|
||||
'''
|
||||
text_bzb_90 = '''
|
||||
续约后90天:
|
||||
1.客户系统使用问题集中解答;
|
||||
2.跟客户查看车辆分析,推荐短信及其他营销功能;
|
||||
3.会员卡功能使用情况分析,推荐公众号引导升级;
|
||||
4.说明转介绍政策,索要转介绍;
|
||||
'''
|
||||
text_bzb_180 = '''
|
||||
续约后180天:
|
||||
1.客户系统使用问题集中解答;
|
||||
2.跟客户查看车辆分析,推荐短信及其他营销功能;
|
||||
3.会员卡功能使用情况分析,推荐公众号引导升级;
|
||||
4.红包裂变推荐;
|
||||
'''
|
||||
text_qita_90 = '''
|
||||
续约后90天:
|
||||
1.客户系统使用问题集中解答;
|
||||
2.跟客户查看车辆分析,推荐短信及其他营销功能;
|
||||
3.公众号小程序功能使用情况分析,提升系统使用深度;
|
||||
4.说明转介绍政策,索要转介绍;
|
||||
'''
|
||||
text_qita_180 = '''
|
||||
续约后180天:
|
||||
1.客户系统使用问题集中解答;
|
||||
2.跟客户查看车辆分析,推荐短信及其他营销功能;
|
||||
3.公众号小程序功能使用情况分析,提升系统使用深度;
|
||||
4.红包裂变推荐;
|
||||
'''
|
||||
data_details_90['拜访目的说明'] = ""
|
||||
try:
|
||||
# text_bzb_90
|
||||
data_details_90['拜访目的说明'] = data_details_90.apply(lambda row: text_bzb_90 if row['saas_edition_fmt'] == '标准版' else row['拜访目的说明'], axis=1)
|
||||
# text_qita_90
|
||||
data_details_90['拜访目的说明'] = data_details_90.apply(lambda row: text_qita_90 if row['saas_edition_fmt'] != '标准版' else row['拜访目的说明'], axis=1)
|
||||
except:
|
||||
pass
|
||||
|
||||
# text_jcb_120
|
||||
data_details_120['拜访目的说明'] = text_jcb_120
|
||||
|
||||
data_details_180['拜访目的说明'] = ""
|
||||
try:
|
||||
# text_bzb_180
|
||||
data_details_180['拜访目的说明'] = data_details_180.apply(lambda row: text_bzb_180 if row['saas_edition_fmt'] == '标准版' else row['拜访目的说明'], axis=1)
|
||||
# text_qita_180
|
||||
data_details_180['拜访目的说明'] = data_details_180.apply(lambda row: text_qita_180 if row['saas_edition_fmt'] != '标准版' else row['拜访目的说明'], axis=1)
|
||||
except:
|
||||
pass
|
||||
# 合并三个DataFrame
|
||||
data_result = pd.concat([data_details_90, data_details_120, data_details_180], ignore_index=True)
|
||||
data_result = data_result.sort_values(by='renew_date', ascending=True).drop_duplicates(subset='id_own_group')
|
||||
print(len(data_result))
|
||||
# 获取待回访人员信息+去重
|
||||
name_list = []
|
||||
for data in data_result['service_impl_principal']:
|
||||
name_list.append(data)
|
||||
unique_arr = []
|
||||
[unique_arr.append(x) for x in name_list if x not in unique_arr]
|
||||
print(unique_arr)
|
||||
# 每日工作计划
|
||||
formUuid = "FORM-4V966N81OMEEH85QDP8XW4AH1AIZ2GKRLZTML21"
|
||||
processCode = "TPROC--4V966N81OMEEH85QDP8XW4AH1AIZ21ORLZTML31"
|
||||
# 遍历数据并进行创建
|
||||
from datetime import datetime
|
||||
for name in unique_arr:
|
||||
tableField_lnsi0v71 = {}
|
||||
tableField_lnsi0v71['dateField_lmelabb1'] = ""
|
||||
tableField_lnsi0v71['employeeField_lmeqk429'] = ""
|
||||
tableField_lnsi0v71['employeeField_lmeqk423'] = ""
|
||||
tableField_lnsi0v71['employeeField_lmeqk424'] = ""
|
||||
for i in range(0,len(data_result)):
|
||||
try:
|
||||
if data_result.loc[i,"service_impl_principal"] == name:
|
||||
# 获取当前日期
|
||||
today = datetime.now()
|
||||
# 计算前7天的日期
|
||||
seven_days_ago = today - timedelta(days=7)
|
||||
# 过滤近7天有派发记录的数据
|
||||
form_data_ces = read_instances_ngv(token=TOKEN, formUuid="FORM-KW766OD13WEEDPB6DSRTSD3IC2S131YMYKSML2", page=1, n=100, searchField={'textField_lmeqk42b': data_result["org_code"][i]})
|
||||
if form_data_ces['totalCount'] == 0:
|
||||
date_object = seven_days_ago
|
||||
else:
|
||||
date_string = form_data_ces['data'][0]['createdTimeGMT']
|
||||
|
||||
date_format = "%Y-%m-%dT%H:%MZ"
|
||||
date_object = datetime.strptime(date_string, date_format)
|
||||
|
||||
if date_object > seven_days_ago:
|
||||
print("近7天内有派发记录,不重复派发!",data_result["org_code"][i])
|
||||
else:
|
||||
print(textField_m3hchxc[data_result["city_name"][i]]) # data_result
|
||||
data_one = {} # 子表单
|
||||
data_two = {} # 主表单
|
||||
# 子表单
|
||||
data_one['textField_lnsi0v72'] = data_result.loc[i,"org_name"] # 门店名称
|
||||
data_one['textField_lnsi0v6s'] = data_result.loc[i,"saas_edition_fmt"] # 销售版本
|
||||
try:
|
||||
data_one['employeeField_lnsi0v6u'] = textField_nc7gskc[name] # 技术专家
|
||||
data_one['employeeField_lnsi0v6v'] = textField_qk1e5di[name] # 区域经理
|
||||
if textField_3hgho1m[name] =="":
|
||||
data_one['employeeField_lnsi0v6w'] = textField_m3hchxc[data_result["city_name"][i]] # 运营顾问
|
||||
else:
|
||||
data_one['employeeField_lnsi0v6w'] = textField_3hgho1m[name] # 运营顾问
|
||||
except:
|
||||
data_one['employeeField_lnsi0v6u'] = textField_lmps6q39[data_result["city_name"][i]] # 技术专家
|
||||
data_one['employeeField_lnsi0v6v'] = ALL_DATA_staff[data_result.loc[i,"area_manager"]] # 区域经理
|
||||
data_one['employeeField_lnsi0v6w'] = textField_m3hchxc[data_result["city_name"][i]] # 运营顾问
|
||||
data_one['dateField_lnsi0v6x'] = str(timestamp_ms) # 计划日期
|
||||
data_one['textField_lnsi0v6y'] = data_result.loc[i,"org_name"] # 门店名称-拷贝
|
||||
data_one['textField_lnsi0v6z'] = data_result.loc[i,"org_code"] # 门店编码
|
||||
data_one['selectField_lnsi0v6q'] = "客情维护" # 拜访目的
|
||||
data_one['textareaField_lnsi0v6r'] = data_result.loc[i,"拜访目的说明"] # 拜访目的说明
|
||||
data_one['textField_lnsi0v70'] = data_result.loc[i,"id_own_group"] # 公司id
|
||||
# 加入数据
|
||||
|
||||
tableField_lnsi0v71['tableField_lnsi0v71'] = [data_one]
|
||||
# 主表单
|
||||
tableField_lnsi0v71['dateField_lmelabb1'] = str(timestamp_ms)
|
||||
try:
|
||||
if textField_3hgho1m[name] =="":
|
||||
tableField_lnsi0v71['employeeField_lmeqk429'] = textField_m3hchxc[data_result["city_name"][i]] # 小六 textField_m3hchxc[data_NGV["city_name"][i]]
|
||||
else:
|
||||
tableField_lnsi0v71['employeeField_lmeqk429'] = textField_3hgho1m[name] # 小六
|
||||
tableField_lnsi0v71['employeeField_lmeqk423'] = textField_qk1e5di[name] # 区域经理
|
||||
tableField_lnsi0v71['employeeField_lmeqk424'] = textField_nc7gskc[name] # 技术专家
|
||||
except:
|
||||
tableField_lnsi0v71['employeeField_lmeqk429'] = textField_m3hchxc[data_result["city_name"][i]] # 小六
|
||||
tableField_lnsi0v71['employeeField_lmeqk423'] = ALL_DATA_staff[data_result.loc[i,"area_manager"]] # 区域经理
|
||||
tableField_lnsi0v71['employeeField_lmeqk424'] = textField_lmps6q39[data_result["city_name"][i]] # 技术专家
|
||||
tableField_lnsi0v71['textField_lmu0523h'] = "自动派发回访计划" # 状态备用
|
||||
# 富文本 超链接 NGV
|
||||
try:
|
||||
form_data_ngv = read_instances_ngv(token=TOKEN, formUuid="FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91", page=1, n=100, searchField={'textField_zc1iowp': data_result.loc[i,"org_code"]})
|
||||
tableField_lnsi0v71['editorField_lodoplg0'] = ["root",{},["p",{},["span",{"data-type":"text"},["span",{"data-type":"leaf"},""]],["a",{"href":"https://f6car.aliwork.com/APP_UYZ0KG6L0CCNV80GZ66O/formDetail/FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91?formInstId="+form_data_ngv['data'][0]['formInstanceId']+"&isAdmin=true"},["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},"点击查看门店NGV"]]],["span",{"data-type":"text"},["span",{"unlink":{},"data-type":"leaf"},""]]]] # 富文本 超链接 NGV
|
||||
except:
|
||||
pass
|
||||
res=initiate_process(TOKEN,formUuid,processCode,tableField_lnsi0v71)
|
||||
print(res,tableField_lnsi0v71)
|
||||
except Exception as e:
|
||||
textField_lrzoowld = "异常" # 运行状态
|
||||
textField_lrzoowlb = str(e) # 信息说明
|
||||
try:
|
||||
import requests
|
||||
import json
|
||||
import numpy as np
|
||||
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 start_instance_process(token: str, send_data):
|
||||
|
||||
"""发送宜搭表单 -- 发起流程表单
|
||||
|
||||
Args:
|
||||
token
|
||||
data:需要发送的数据字典
|
||||
"""
|
||||
|
||||
yida_api = "https://api.dingtalk.com/v1.0/yida/processes/instances/start"
|
||||
|
||||
headers = {
|
||||
"Content-Type": "application/json",
|
||||
"x-acs-dingtalk-access-token": token
|
||||
}
|
||||
|
||||
payload = {
|
||||
"appType": "APP_TNVBVZ3K8G56HG03Z45Q",
|
||||
"systemToken": "CH7669818R0WN18TYTYJ42PE6GY22WZN0BYWKD1",
|
||||
"userId": "yida_pub_account",# 超级管理员账号
|
||||
"language": "zh_CN",
|
||||
"formUuid": "FORM-96D58EF2219240C7B1F55F9CA463CD2D4MGC",
|
||||
"formDataJson": json.dumps(send_data),
|
||||
"processCode":"TPROC--5Q966D918T1I1AZM68NASC6TS13P3QOL3PZRLC"
|
||||
}
|
||||
|
||||
res = requests.post(yida_api, headers=headers, json=payload)
|
||||
return res
|
||||
|
||||
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)
|
||||
'''校验是否正常运行'''
|
||||
TOKEN = generateToken()
|
||||
import datetime
|
||||
endtime = datetime.datetime.now()
|
||||
implement = (endtime - starttime).seconds
|
||||
send_data = {
|
||||
"textField_ls01al4o": implement, #运行耗时
|
||||
"textField_lrzoowl8": "huifang_xuyue_90_120_180", # 程序名称
|
||||
"textField_lrzoowl9": "续约回访90-120-180天派发", # 功能简述
|
||||
"textField_lrzoowld": textField_lrzoowld, # 运行状态
|
||||
"textField_lrzoowlb": textField_lrzoowlb # 信息说明
|
||||
}
|
||||
res_yujing = start_instance_process(TOKEN,send_data)
|
||||
except:
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user