112 lines
4.2 KiB
Python
112 lines
4.2 KiB
Python
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()
|
||
# 获取已经配置好的错误任务日志记录器
|
||
error_task_logger = configure_error_task_logger()
|
||
# 保存为CSV文件
|
||
output_dir = "output" # 设置输出目录
|
||
# 创建输出目录(如果不存在)
|
||
import os
|
||
|
||
os.makedirs(output_dir, exist_ok=True)
|
||
common_module = CommonModule()
|
||
api_instance = API()
|
||
|
||
data_JCB = common_module.get_jcb_details()
|
||
output_path = os.path.join(output_dir, "借车包明细.csv")
|
||
data_JCB.to_csv(output_path, index=False)
|
||
|
||
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()
|
||
payload = {"api_key": "6717470a0b3975ef583c6df1",
|
||
"entry_id": "67174710da507490d8ac12c1",
|
||
}
|
||
daily_revisit = api_instance.entry_data_list(payload)
|
||
daily_revisit_list = daily_revisit.get("data") # api请求格式,将数据封装在data字典里
|
||
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()
|
||
output_path = os.path.join(output_dir, "异常待办.csv")
|
||
abnormal_data.to_csv(output_path, index=False)
|
||
|
||
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 daily_revisit_list
|
||
])
|
||
output_path = os.path.join(output_dir, "异常待办云端.csv")
|
||
df_cloud.to_csv(output_path, index=False)
|
||
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) |