接车宝派发更新

This commit is contained in:
z66
2025-12-29 15:48:07 +08:00
parent 3462c8df55
commit 82c6c5f94a
7 changed files with 986 additions and 20 deletions
+106 -1
View File
@@ -4,6 +4,9 @@ import pandas as pd
from back_ground_module import CommonModule
from api import API
from log_config import configure_task_logger, configure_error_task_logger
from datetime import datetime, timedelta, timezone
import pandas as pd
import os
# 获取已经配置好的常规日志记录器
logger = configure_task_logger()
@@ -24,6 +27,7 @@ class JCBEfficientCarPickup:
def __init__(self):
# 使用 pymysql 连接数据库
self.daily_revisit_list = None
self.field_mapping = {}
self.staff_id_list = None
self.customer_service_list = None
@@ -108,7 +112,8 @@ class JCBEfficientCarPickup:
new_sign_abnormal_data = [self.row_to_dict(row, self.field_mapping) for index, row in
df.iterrows()]
data = {'api_key': Config.EFFICIENT_CAR_PICKUP_APP_ID, 'entry_id': Config.EFFICIENT_CAR_PICKUP_ENTRY_ID,
data = {'api_key': Config.EFFICIENT_CAR_PICKUP_APP_ID,
'entry_id': Config.EFFICIENT_CAR_PICKUP_ENTRY_ID,
"data_list": new_sign_abnormal_data}
result = api_instance.entry_data_batch_create(data)
@@ -137,6 +142,14 @@ class JCBEfficientCarPickup:
result2 = api_instance.entry_data_update(data2)
logger.info(f"明日派发人员信息已修改:{result2}")
def load_all_data(self):
# 获取接车宝日常回访单
payload = {"api_key": "6717470a0b3975ef583c6df1",
"entry_id": "67174710da507490d8ac12c1",
}
daily_revisit = api_instance.entry_data_list(payload)
self.daily_revisit_list = daily_revisit.get("data") # api请求格式,将数据封装在data字典里
def main(self):
task_start_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
@@ -145,6 +158,7 @@ class JCBEfficientCarPickup:
if data_JCB is None:
logger.error("获取接车宝数据失败,返回None")
raise ValueError("获取接车宝数据失败,返回None")
self.load_all_data()
logger.info(f"数据加载完成")
@@ -181,6 +195,97 @@ class JCBEfficientCarPickup:
else:
logger.info(f"新签异常待办回访无数据,跳过")
# 异常待办
current_local = datetime.now() + timedelta(days=-1) # tz-naive,代表本地时间
current_date_str = current_local.strftime("%Y-%m-%d")
# 计算30天前的本地日期(用于开户日判断)
thirty_days_ago_local = (current_local - timedelta(days=30)).date()
abnormal_data = []
for index, row in data_JCB.iterrows():
try:
# 开户日是本地日期字符串,解析为 date 对象
open_date = datetime.strptime(str(row['开户日']), "%Y-%m-%d").date()
except (ValueError, TypeError):
continue # 跳过无效日期
if (
open_date < thirty_days_ago_local
and row['近30天开单天数'] == 0
and row['客户状态'] == "留存"
):
new_row = row.copy()
new_row["日期"] = open_date.strftime("%Y-%m-%d")
abnormal_data.append(new_row)
abnormal_data = pd.DataFrame(abnormal_data) if abnormal_data else pd.DataFrame()
if not abnormal_data.empty:
abnormal_data["表单类型"] = "异常待办"
abnormal_data["派发日期"] = current_date_str
# 清洗手机号(仅去除浮点型 .0
def clean_phone(x):
if pd.isna(x) or x == "" or x == "None":
return ""
s = str(x)
if s.endswith('.0') and s[:-2].isdigit():
return s[:-2]
return s
abnormal_data['联系手机号'] = abnormal_data['联系手机号'].apply(clean_phone)
# 构建云端已派发记录 DataFrame
df_cloud = pd.DataFrame([
{
"数据id": item.get("_id", ""),
"账号": item.get("_widget_1739258942667", ""),
"提交时间": item.get("createTime", ""),
"表单类型": item.get("_widget_1739951204545", "")
}
for item in self.daily_revisit_list
])
recent_accounts = set()
if not df_cloud.empty and not abnormal_data.empty:
# 将 createTime 转为 UTC 时间(强制统一时区)
df_cloud["提交时间"] = pd.to_datetime(df_cloud["提交时间"], utc=True, errors="coerce")
df_cloud = df_cloud.dropna(subset=["提交时间"])
# 筛选“异常待办”
df_abnormal_cloud = df_cloud[df_cloud["表单类型"] == "异常待办"]
if not df_abnormal_cloud.empty:
# 每个账号保留最新一条
df_recent = df_abnormal_cloud.sort_values("提交时间").groupby("账号", as_index=False).tail(1)
current_utc = datetime.now(timezone.utc)
cutoff_utc = pd.Timestamp(current_utc) - pd.Timedelta(days=30)
# 安全比较:两边都是 UTC
recent_accounts = set(df_recent[df_recent["提交时间"] > cutoff_utc]["账号"])
# 剔除已派发账号 + 过滤有效手机号
if not abnormal_data.empty:
abnormal_data = abnormal_data[
(~abnormal_data["账号"].isin(recent_accounts)) &
(abnormal_data["联系手机号"].notna()) &
(abnormal_data["联系手机号"] != "") &
(abnormal_data["联系手机号"] != "None")
]
# # 保存结果
output_path = os.path.join(output_dir, "异常待办1.csv")
abnormal_data.to_csv(output_path, index=False)
# 发送或跳过
if not abnormal_data.empty:
abnormal_data = abnormal_data[:20]
self.send_request(abnormal_data)
logger.info(f"异常待办完成,共 {len(abnormal_data)}")
else:
logger.info("异常待办无数据,跳过")
# 优质客户转商机
# current_date = datetime.now()
thirty_days_ago = current_date - timedelta(days=30)
+1 -1
View File
@@ -274,7 +274,7 @@ class CommonModule:
else: # 如果没有数据,返回空 DataFrame
data_NGV = pd.DataFrame()
headers = [
"门店编码", "类型", "占位", "价格"
"门店编码", "类型", "订单商品名称", "价格"
]
data_NGV.columns = headers