543 lines
28 KiB
Plaintext
543 lines
28 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# 含多年"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import holidays\n",
|
||
"from datetime import date\n",
|
||
"\n",
|
||
"# 创建一个中国节假日对象\n",
|
||
"cn_holidays = holidays.China()\n",
|
||
"# 获取当前日期\n",
|
||
"input_date = date.today()\n",
|
||
"switch = \"\"\n",
|
||
"# 判断日期是否为节假日\n",
|
||
"if input_date in cn_holidays:\n",
|
||
" switch = \"节假日\"\n",
|
||
" print(f\"{input_date} 是节假日\")\n",
|
||
"else:\n",
|
||
" switch = \"非节假日\"\n",
|
||
" print(f\"{input_date} 不是节假日\")\n",
|
||
"date_list = []\n",
|
||
"for data in cn_holidays:\n",
|
||
" date_list.append(str(data))\n",
|
||
"\n",
|
||
"from datetime import date, timedelta\n",
|
||
"\n",
|
||
"def get_saturdays(year):\n",
|
||
" start_date = date(year, 1, 1)\n",
|
||
" end_date = date(year, 12, 31)\n",
|
||
" saturdays = []\n",
|
||
"\n",
|
||
" while start_date <= end_date:\n",
|
||
" if start_date.weekday() == 6: # 周日的weekday值为6\n",
|
||
" saturdays.append(start_date)\n",
|
||
" start_date += timedelta(days=1)\n",
|
||
"\n",
|
||
" return saturdays\n",
|
||
"\n",
|
||
"current_year = date.today().year\n",
|
||
"saturdays = get_saturdays(current_year)\n",
|
||
"print(saturdays)\n",
|
||
"for data in saturdays:\n",
|
||
" date_list.append(str(data))\n",
|
||
"date_list = list(set(date_list))\n",
|
||
"date_list = sorted(date_list, reverse=False)\n",
|
||
"\n",
|
||
"# -*- coding: utf-8 -*-\n",
|
||
"import psycopg2\n",
|
||
"import pandas as pd\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",
|
||
"import datetime\n",
|
||
"now_time = datetime.datetime.now()\n",
|
||
"yes_time = now_time + datetime.timedelta(days=-1)\n",
|
||
"yes_time_nyr = int(yes_time.strftime('%Y%m%d'))# 获取前一天日期\n",
|
||
"# sql语句 建表\n",
|
||
"sql =f\"\"\"SELECT * FROM \"public\".\"holo_ads_report_saas_profile_ngv_detail_d\" WHERE \"date_id\" = '{yes_time_nyr}' ;\"\"\"\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_NGV = 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",
|
||
"# 将A列和B列的日期字符串转换为日期格式\n",
|
||
"data_NGV['A'] = pd.to_datetime(data_NGV['expiry_time'])\n",
|
||
"data_NGV['B'] = pd.to_datetime(data_NGV['renew_date'])\n",
|
||
"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'] != '孙玉蕾')\n",
|
||
"data_NGV = data_NGV.loc[data_NGV[\"条件\"] == True]\n",
|
||
"data_details = data_NGV.copy()\n",
|
||
"# 重置索引\n",
|
||
"data_details = data_details.reset_index(drop=True)\n",
|
||
"# 判断A列的日期是否大于B列的日期730天,如果是的话,将B列的值设置为1\n",
|
||
"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)\n",
|
||
"data_details = data_details.loc[data_details[\"条件\"] != True]\n",
|
||
"# 定义一个函数,用于将数字除以365并取整数\n",
|
||
"def divide_by_365(x):\n",
|
||
" if isinstance(x, (int, float)):\n",
|
||
" return int(x / 365)\n",
|
||
" else:\n",
|
||
" return x\n",
|
||
"# 使用applymap()函数将divide_by_365函数应用到DataFrame的每个元素\n",
|
||
"data_details['年'] = data_details['条件'].apply(divide_by_365)\n",
|
||
"# 重置索引\n",
|
||
"data_details = data_details.reset_index(drop=True)\n",
|
||
"# 创建一个新的空的DataFrame\n",
|
||
"new_df = pd.DataFrame()\n",
|
||
"# 遍历原始DataFrame的每一行\n",
|
||
"from datetime import datetime, timedelta\n",
|
||
"for index, row in data_details.iterrows():\n",
|
||
" # 根据A列的值来决定复制的次数\n",
|
||
" for i_new in range(1,row['年']):\n",
|
||
" # 修改日期\n",
|
||
" row_new = row.copy()\n",
|
||
" c = row_new[\"renew_date\"]\n",
|
||
" date_obj = datetime.strptime(c, \"%Y-%m-%d\")\n",
|
||
" new_year = date_obj.year + i_new\n",
|
||
" new_date_obj = date_obj.replace(year=new_year)\n",
|
||
" new_c = new_date_obj.strftime(\"%Y-%m-%d\")\n",
|
||
" row_new[\"renew_date\"] = new_c\n",
|
||
" # 将当前行添加到新的DataFrame中\n",
|
||
" new_df = new_df._append(row_new, ignore_index=True)\n",
|
||
"# 合并两个DataFrame\n",
|
||
"merged_df = pd.concat([data_NGV, new_df], axis=0, ignore_index=True)\n",
|
||
"data_details = merged_df.copy() # 替换名称\n",
|
||
"\n",
|
||
"data_details_not_null = data_details[data_details['renew_date'].notnull()]\n",
|
||
"data_details_not_null = data_details_not_null[data_details_not_null['renew_date'].str.contains('2023')]\n",
|
||
"data_details_not_null = data_details_not_null.sort_values(by='renew_date', ascending=True).drop_duplicates(subset='id_own_group')\n",
|
||
"# 重置索引\n",
|
||
"data_details_not_null = data_details_not_null.reset_index(drop=True)\n",
|
||
"data_details = data_details_not_null.copy() # 替换名称 v2 \n",
|
||
"data_details['saas_create_time'] = data_details['saas_create_time'].str[:10] # 截取前10位\n",
|
||
"data_details = data_details[data_details['saas_create_time'] != data_details['renew_date']] # 过滤掉等于renew_date的行\n",
|
||
"data_details = data_details.reset_index(drop=True)\n",
|
||
"from datetime import datetime\n",
|
||
"from dateutil.relativedelta import relativedelta\n",
|
||
"\n",
|
||
"# for data in date_list:\n",
|
||
"# # 将字符串转换为日期\n",
|
||
"# date = datetime.strptime(data, '%Y-%m-%d')\n",
|
||
"# # 将日期加1\n",
|
||
"# date = date + relativedelta(days=1)\n",
|
||
"# # 将日期转换回字符串格式\n",
|
||
"# date_str = date.strftime('%Y-%m-%d')\n",
|
||
"# # 遍历 renew_date 列,如果值等于 A,则将其改为 B\n",
|
||
"# data_details['renew_date'] = data_details['renew_date'].replace(data, date_str)\n",
|
||
"\n",
|
||
"\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import requests\n",
|
||
"import json\n",
|
||
"import time\n",
|
||
"import re\n",
|
||
"from datetime import datetime\n",
|
||
"from dateutil.relativedelta import relativedelta\n",
|
||
"from pathlib import Path\n",
|
||
"from urllib.parse import quote\n",
|
||
"from io import BytesIO\n",
|
||
"\n",
|
||
"ROOT = Path('.').absolute() # 当前工作目录\n",
|
||
"\n",
|
||
"\n",
|
||
"# 生成 token,参数不需要修改\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,formatted_today,formatted_today_two):\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",
|
||
" \"createFromTimeGMT\" : formatted_today,\n",
|
||
" \"createToTimeGMT\" : formatted_today_two,\n",
|
||
" \"currentPage\" : page,\n",
|
||
" \"pageSize\" : n\n",
|
||
" }\n",
|
||
"\n",
|
||
" res = requests.post(api, headers=headers, json=formData)\n",
|
||
" return res.json()\n",
|
||
"\n",
|
||
"def initiate_process(TOKEN,formUuid,processCode,formData):\n",
|
||
" \"\"\" 发起宜搭审批流程 \"\"\"\n",
|
||
" api = f'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",
|
||
" payload = {\n",
|
||
" \"appType\" : \"APP_UYZ0KG6L0CCNV80GZ66O\",\n",
|
||
" \"systemToken\" : \"XA966F81JAJOFCVVVKO64E9MIIZV1EWE5SFMKJ2\",\n",
|
||
" \"userId\" : \"yida_pub_account\",\n",
|
||
" \"language\" : \"zh_CN\",\n",
|
||
" \"formUuid\" : formUuid,\n",
|
||
" \"formDataJson\" : json.dumps(formData, cls=NpEncoder),\n",
|
||
" \"processCode\" : processCode,\n",
|
||
" }\n",
|
||
"\n",
|
||
" res = requests.post(api, headers=headers, json=payload)\n",
|
||
" return res.json()\n",
|
||
"\n",
|
||
"def read_instances_new(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_instances_ngv(token, formUuid, page, n,searchField):\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",
|
||
" \"searchFieldJson\": json.dumps(searchField),\n",
|
||
" \"currentPage\" : page,\n",
|
||
" \"pageSize\" : n\n",
|
||
" }\n",
|
||
"\n",
|
||
" res = requests.post(api, headers=headers, json=formData)\n",
|
||
" return res.json()\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",
|
||
" \n",
|
||
"TOKEN = generateToken()\n",
|
||
"'''读取员工对应关系:宜搭员工-ID对应表 '''\n",
|
||
"FORMID = \"FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\" # 宜搭员工-ID对应表 FORM-EA866E715PF9YA7ECCAGSABX91Q72PVA3WRFL6\n",
|
||
"# 读取流程表单数据\n",
|
||
"form_data = read_instances_new(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_new(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",
|
||
"FORMID = \"FORM-TP866D918DFCA4FW79YZU5X43FO32QZJQDZJL7\" #省市小六技术专家区域客服区域客成\n",
|
||
"# 读取流程表单数据\n",
|
||
"form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
||
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
||
"textField_gif29wy = {}\n",
|
||
"textField_3athky8 = {}\n",
|
||
"textField_3hgho1m = {}\n",
|
||
"textField_nc7gskc = {}\n",
|
||
"textField_qk1e5di = {}\n",
|
||
"textField_m3hchxc = {} # 市\n",
|
||
"\"\"\" 获取全量数据 \"\"\"\n",
|
||
"for i in range(1, PAGES+1):\n",
|
||
" form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
||
" for data in form_data.get('data'):\n",
|
||
" textField_gif29wy[data['formData']['textField_o7jtgf1']]=data['formData']['textField_gif29wy'] #区域客成id\n",
|
||
" textField_3athky8[data['formData']['textField_o7jtgf1']]=data['formData']['textField_3athky8'] #区域客服id\n",
|
||
" textField_3hgho1m[data['formData']['textField_o7jtgf1']]=data['formData']['textField_3hgho1m'] #小六id\n",
|
||
" textField_nc7gskc[data['formData']['textField_o7jtgf1']]=data['formData']['textField_nc7gskc'] #技术专家id\n",
|
||
" textField_qk1e5di[data['formData']['textField_o7jtgf1']]=data['formData']['textField_lntniove'] #区域经理id\n",
|
||
" textField_m3hchxc[data['formData']['textField_m3hchxc']]=data['formData']['textField_3hgho1m'] #小六id-市\n",
|
||
"print(f'读取到省市小六技术专家区域客服区域客成表单中 {len(textField_gif29wy)} 条数据!')\n",
|
||
"'''读取市-技术专家id '''\n",
|
||
"FORMID = \"FORM-A8666NA1FJDEVPBB6VVTOCMP47UP2J2L6SPML2\" #市-技术专家id\n",
|
||
"# 读取流程表单数据\n",
|
||
"form_data = read_instances_new(token=TOKEN, formUuid=FORMID, page=1, n=100)\n",
|
||
"PAGES = form_data.get('totalCount')//100 + 1\n",
|
||
"textField_lmps6q39 = {}\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_new(token=TOKEN, formUuid=FORMID, page=i, n=100)\n",
|
||
" for data in form_data.get('data'):\n",
|
||
" textField_lmps6q39[data['formData']['textField_lmps6q38']]=data['formData']['textField_lmps6q39'] #技术专家id\n",
|
||
"print(f'读取到市-技术专家id表单中 {len(textField_lmps6q39)} 条数据!')\n",
|
||
"import datetime\n",
|
||
"date_90 = 83\n",
|
||
"date_120 = 113\n",
|
||
"date_180 = 173\n",
|
||
"date_one = 1\n",
|
||
"now_time = datetime.datetime.now()\n",
|
||
"# now_time = now_time + datetime.timedelta(days=+1)\n",
|
||
"if now_time.strftime(\"%Y-%m-%d\") in date_list:\n",
|
||
" date_one = 0\n",
|
||
" print(\"开始次数:\",date_one)\n",
|
||
"print(\"当前日期:\",now_time)\n",
|
||
"\n",
|
||
"for i in range(1,10):\n",
|
||
" new_date = now_time + datetime.timedelta(days=-i)\n",
|
||
" new_date = new_date.strftime(\"%Y-%m-%d\")\n",
|
||
" print(\"遍历日期:\",new_date)\n",
|
||
" if new_date in date_list:\n",
|
||
" date_one = date_one + 1 \n",
|
||
" print(\"节假日期:\",new_date)\n",
|
||
" else:\n",
|
||
" break\n",
|
||
"print(\"遍历次数:\",date_one)\n",
|
||
"\n",
|
||
"now_time = datetime.datetime.now()\n",
|
||
"for i in range(0,date_one):\n",
|
||
" now_time = now_time + datetime.timedelta(days=-i)\n",
|
||
" today = now_time + datetime.timedelta(days=-date_90)\n",
|
||
" formatted_today_90 = today.strftime(\"%Y-%m-%d\")\n",
|
||
" today = now_time + datetime.timedelta(days=-date_120)\n",
|
||
" formatted_today_120 = today.strftime(\"%Y-%m-%d\")\n",
|
||
" today = now_time + datetime.timedelta(days=-date_180)\n",
|
||
" formatted_today_180 = today.strftime(\"%Y-%m-%d\")\n",
|
||
" print(formatted_today_90,formatted_today_120,formatted_today_180)\n",
|
||
" timestamp_ms = int(time.time() * 1000) # 当然日期时间戳 毫秒级\n",
|
||
" # 获取数据\n",
|
||
" data_details_90 = data_details.copy()\n",
|
||
" data_details_90['条件'] = (data_details_90['renew_date'] == formatted_today_90) & (data_details_90['saas_edition_fmt'] != '基础版')\n",
|
||
" data_details_90 = data_details_90.loc[data_details_90[\"条件\"] == True]\n",
|
||
" data_details_120 = data_details.copy()\n",
|
||
" data_details_120['条件'] = (data_details_120['renew_date'] == formatted_today_120) & (data_details_120['saas_edition_fmt'] == '基础版')\n",
|
||
" data_details_120 = data_details_120.loc[data_details_120[\"条件\"] == True]\n",
|
||
" data_details_180 = data_details.copy()\n",
|
||
" data_details_180['条件'] = (data_details_180['renew_date'] == formatted_today_180) & (data_details_180['saas_edition_fmt'] != '基础版')\n",
|
||
" data_details_180 = data_details_180.loc[data_details_180[\"条件\"] == True]\n",
|
||
"\n",
|
||
" text_jcb_120 = '''\n",
|
||
" 续约后120天:\n",
|
||
" 1.客户系统使用问题集中解答;\n",
|
||
" 2.跟客户查看车辆分析,推荐短信及其他营销功能;\n",
|
||
" 3.红包裂变功能介绍;\n",
|
||
" 4.说明转介绍政策,索要转介绍;\n",
|
||
" '''\n",
|
||
" text_bzb_90 = '''\n",
|
||
" 续约后90天:\n",
|
||
" 1.客户系统使用问题集中解答;\n",
|
||
" 2.跟客户查看车辆分析,推荐短信及其他营销功能;\n",
|
||
" 3.会员卡功能使用情况分析,推荐公众号引导升级;\n",
|
||
" 4.说明转介绍政策,索要转介绍;\n",
|
||
" '''\n",
|
||
" text_bzb_180 = '''\n",
|
||
" 续约后180天:\n",
|
||
" 1.客户系统使用问题集中解答;\n",
|
||
" 2.跟客户查看车辆分析,推荐短信及其他营销功能;\n",
|
||
" 3.会员卡功能使用情况分析,推荐公众号引导升级;\n",
|
||
" 4.红包裂变推荐;\n",
|
||
" '''\n",
|
||
" text_qita_90 = '''\n",
|
||
" 续约后90天:\n",
|
||
" 1.客户系统使用问题集中解答;\n",
|
||
" 2.跟客户查看车辆分析,推荐短信及其他营销功能;\n",
|
||
" 3.公众号小程序功能使用情况分析,提升系统使用深度;\n",
|
||
" 4.说明转介绍政策,索要转介绍;\n",
|
||
" '''\n",
|
||
" text_qita_180 = '''\n",
|
||
" 续约后180天:\n",
|
||
" 1.客户系统使用问题集中解答;\n",
|
||
" 2.跟客户查看车辆分析,推荐短信及其他营销功能;\n",
|
||
" 3.公众号小程序功能使用情况分析,提升系统使用深度;\n",
|
||
" 4.红包裂变推荐;\n",
|
||
" '''\n",
|
||
" data_details_90['拜访目的说明'] = \"\"\n",
|
||
" # text_bzb_90\n",
|
||
" data_details_90['拜访目的说明'] = data_details_90.apply(lambda row: text_bzb_90 if row['saas_edition_fmt'] == '标准版' else row['拜访目的说明'], axis=1)\n",
|
||
" # text_qita_90\n",
|
||
" data_details_90['拜访目的说明'] = data_details_90.apply(lambda row: text_qita_90 if row['saas_edition_fmt'] != '标准版' else row['拜访目的说明'], axis=1)\n",
|
||
"\n",
|
||
" # text_jcb_120\n",
|
||
" data_details_120['拜访目的说明'] = text_jcb_120\n",
|
||
"\n",
|
||
" data_details_180['拜访目的说明'] = \"\"\n",
|
||
" # text_bzb_180\n",
|
||
" data_details_180['拜访目的说明'] = data_details_180.apply(lambda row: text_bzb_180 if row['saas_edition_fmt'] == '标准版' else row['拜访目的说明'], axis=1)\n",
|
||
" # text_qita_180\n",
|
||
" data_details_180['拜访目的说明'] = data_details_180.apply(lambda row: text_qita_180 if row['saas_edition_fmt'] != '标准版' else row['拜访目的说明'], axis=1)\n",
|
||
" # 合并三个DataFrame\n",
|
||
" data_result = pd.concat([data_details_90, data_details_120, data_details_180], ignore_index=True)\n",
|
||
" print(len(data_result))\n",
|
||
" # 获取待回访人员信息+去重\n",
|
||
" name_list = []\n",
|
||
" for data in data_result['service_impl_principal']:\n",
|
||
" name_list.append(data)\n",
|
||
" unique_arr = []\n",
|
||
" [unique_arr.append(x) for x in name_list if x not in unique_arr]\n",
|
||
" print(unique_arr)\n",
|
||
" # 每日工作计划\n",
|
||
" formUuid = \"FORM-4V966N81OMEEH85QDP8XW4AH1AIZ2GKRLZTML21\"\n",
|
||
" processCode = \"TPROC--4V966N81OMEEH85QDP8XW4AH1AIZ21ORLZTML31\"\n",
|
||
" # 遍历数据并进行创建\n",
|
||
" from datetime import datetime\n",
|
||
" for name in unique_arr:\n",
|
||
" tableField_lnsi0v71 = {}\n",
|
||
" tableField_lnsi0v71['dateField_lmelabb1'] = \"\"\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk429'] = \"\"\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk423'] = \"\"\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk424'] = \"\"\n",
|
||
" for i in range(0,len(data_result)):\n",
|
||
" if data_result.loc[i,\"service_impl_principal\"] == name:\n",
|
||
" # 获取当前日期\n",
|
||
" today = datetime.now()\n",
|
||
" # 计算前7天的日期\n",
|
||
" seven_days_ago = today - timedelta(days=7)\n",
|
||
" # 过滤近7天有派发记录的数据\n",
|
||
" form_data_ces = read_instances_ngv(token=TOKEN, formUuid=\"FORM-KW766OD13WEEDPB6DSRTSD3IC2S131YMYKSML2\", page=1, n=100, searchField={'textField_lmeqk42b': data_result[\"org_code\"][i]})\n",
|
||
" if form_data_ces['totalCount'] == 0:\n",
|
||
" date_string = today.strftime(\"%Y-%m-%dT%H:%MZ\")\n",
|
||
" else:\n",
|
||
" date_string = form_data_ces['data'][0]['createdTimeGMT']\n",
|
||
" \n",
|
||
" date_format = \"%Y-%m-%dT%H:%MZ\"\n",
|
||
" date_object = datetime.strptime(date_string, date_format)\n",
|
||
" \n",
|
||
" if date_object > seven_days_ago:\n",
|
||
" print(\"近7天内有派发记录,不重复派发!\",data_result[\"org_code\"][i])\n",
|
||
" else:\n",
|
||
" print(textField_m3hchxc[data_result[\"city_name\"][i]]) # data_result\n",
|
||
" data_one = {} # 子表单\n",
|
||
" data_two = {} # 主表单\n",
|
||
" # 子表单\n",
|
||
" data_one['textField_lnsi0v72'] = data_result.loc[i,\"org_name\"] # 门店名称\n",
|
||
" data_one['textField_lnsi0v6s'] = data_result.loc[i,\"saas_edition_fmt\"] # 销售版本\n",
|
||
" try:\n",
|
||
" data_one['employeeField_lnsi0v6u'] = textField_nc7gskc[name] # 技术专家\n",
|
||
" data_one['employeeField_lnsi0v6v'] = textField_qk1e5di[name] # 区域经理\n",
|
||
" if textField_3hgho1m[name] ==\"\":\n",
|
||
" data_one['employeeField_lnsi0v6w'] = textField_m3hchxc[data_result[\"city_name\"][i]] # 运营顾问 \n",
|
||
" else:\n",
|
||
" data_one['employeeField_lnsi0v6w'] = textField_3hgho1m[name] # 运营顾问\n",
|
||
" except:\n",
|
||
" data_one['employeeField_lnsi0v6u'] = textField_lmps6q39[data_result[\"city_name\"][i]] # 技术专家\n",
|
||
" data_one['employeeField_lnsi0v6v'] = ALL_DATA_staff[data_result.loc[i,\"area_manager\"]] # 区域经理\n",
|
||
" data_one['employeeField_lnsi0v6w'] = textField_m3hchxc[data_result[\"city_name\"][i]] # 运营顾问\n",
|
||
" data_one['dateField_lnsi0v6x'] = str(timestamp_ms) # 计划日期\n",
|
||
" data_one['textField_lnsi0v6y'] = data_result.loc[i,\"org_name\"] # 门店名称-拷贝\n",
|
||
" data_one['textField_lnsi0v6z'] = data_result.loc[i,\"org_code\"] # 门店编码\n",
|
||
" data_one['selectField_lnsi0v6q'] = \"客情维护\" # 拜访目的\n",
|
||
" data_one['textareaField_lnsi0v6r'] = data_result.loc[i,\"拜访目的说明\"] # 拜访目的说明\n",
|
||
" data_one['textField_lnsi0v70'] = data_result.loc[i,\"id_own_group\"] # 公司id\n",
|
||
" # 加入数据\n",
|
||
" \n",
|
||
" tableField_lnsi0v71['tableField_lnsi0v71'] = [data_one]\n",
|
||
" # 主表单\n",
|
||
" tableField_lnsi0v71['dateField_lmelabb1'] = str(timestamp_ms)\n",
|
||
" try:\n",
|
||
" if textField_3hgho1m[name] ==\"\":\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk429'] = textField_m3hchxc[data_result[\"city_name\"][i]] # 小六 textField_m3hchxc[data_NGV[\"city_name\"][i]]\n",
|
||
" else:\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk429'] = textField_3hgho1m[name] # 小六\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk423'] = textField_qk1e5di[name] # 区域经理\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk424'] = textField_nc7gskc[name] # 技术专家\n",
|
||
" except:\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk429'] = textField_m3hchxc[data_result[\"city_name\"][i]] # 小六\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk423'] = ALL_DATA_staff[data_result.loc[i,\"area_manager\"]] # 区域经理\n",
|
||
" tableField_lnsi0v71['employeeField_lmeqk424'] = textField_lmps6q39[data_result[\"city_name\"][i]] # 技术专家\n",
|
||
" tableField_lnsi0v71['textField_lmu0523h'] = \"自动派发回访计划\" # 状态备用\n",
|
||
" # 富文本 超链接 NGV\n",
|
||
" try:\n",
|
||
" form_data_ngv = read_instances_ngv(token=TOKEN, formUuid=\"FORM-ZK866D91O9LA4NIHCARG2DPIPCXF3Z087PPHL91\", page=1, n=100, searchField={'textField_zc1iowp': data_result.loc[i,\"org_code\"]})\n",
|
||
" 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\n",
|
||
" except:\n",
|
||
" pass\n",
|
||
" # res=initiate_process(TOKEN,formUuid,processCode,tableField_lnsi0v71)\n",
|
||
" # print(res,tableField_lnsi0v71)\n",
|
||
" print(tableField_lnsi0v71)"
|
||
]
|
||
}
|
||
],
|
||
"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"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|