异常回访、续约回访增加默认值

新签、续约回访增加权限唯一值不存在报错
This commit is contained in:
2026-03-06 17:50:17 +08:00
parent be3af8cf51
commit 69390fd080
10 changed files with 101 additions and 61222 deletions
+58 -26
View File
@@ -19,6 +19,7 @@ error_task_logger = configure_error_task_logger()
output_dir = "output" # 设置输出目录 output_dir = "output" # 设置输出目录
os.makedirs(output_dir, exist_ok=True) os.makedirs(output_dir, exist_ok=True)
class NewExceptionTask: class NewExceptionTask:
""" """
SaaS异常回访 SaaS异常回访
@@ -175,7 +176,9 @@ class NewExceptionTask:
# print("NGV获取后的类型:", type(self.NGV_data_list)) # print("NGV获取后的类型:", type(self.NGV_data_list))
# 获取异常服务待办(添加过滤进行中的订单) # 获取异常服务待办(添加过滤进行中的订单)
payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "68340de79f116c0b66b6b0cc","filter":{"rel":"and","cond":[{ "field": "flowState", "type":"flowstate", "method":"eq","value":[0] }]}} payload = {"api_key": "675b900991ad2491c69389ca", "entry_id": "68340de79f116c0b66b6b0cc",
"filter": {"rel": "and",
"cond": [{"field": "flowState", "type": "flowstate", "method": "eq", "value": [0]}]}}
self.exception_service_todo = api_instance.entry_data_list(payload).get("data", []) self.exception_service_todo = api_instance.entry_data_list(payload).get("data", [])
# print(self.exception_service_todo) # print(self.exception_service_todo)
@@ -225,7 +228,7 @@ class NewExceptionTask:
task_start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") task_start_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
all_data =[] all_data = []
try: try:
self.load_all_data() self.load_all_data()
@@ -240,6 +243,7 @@ class NewExceptionTask:
return return
data_yichang = self.data_yichang_S.copy() data_yichang = self.data_yichang_S.copy()
# data_yichang.to_csv(os.path.join(output_dir,"data_yichang.csv"), index=False) # data_yichang.to_csv(os.path.join(output_dir,"data_yichang.csv"), index=False)
def replace_values(series): def replace_values(series):
@@ -248,7 +252,7 @@ class NewExceptionTask:
# 对整个DataFrame的所有列应用替换函数 # 对整个DataFrame的所有列应用替换函数
data_yichang = data_yichang.apply(replace_values) data_yichang = data_yichang.apply(replace_values)
error_data= [] error_data = []
for index_num, row in data_yichang.iterrows(): # 对过滤后的每一条进行派发 for index_num, row in data_yichang.iterrows(): # 对过滤后的每一条进行派发
try: try:
# 每次循环前清空省市区变量 # 每次循环前清空省市区变量
@@ -257,7 +261,7 @@ class NewExceptionTask:
area_name = None area_name = None
is_pass = False is_pass = False
for exception_service in self.exception_service_todo : for exception_service in self.exception_service_todo:
# 通过查询筛选进行中的逻辑 # 通过查询筛选进行中的逻辑
if exception_service['_widget_1748241895842'] == row['org_code']: if exception_service['_widget_1748241895842'] == row['org_code']:
is_pass = True is_pass = True
@@ -297,35 +301,36 @@ class NewExceptionTask:
NGV_data_id = None NGV_data_id = None
reason = None reason = None
create_exception =None create_exception = None
create_date = None create_date = None
# 优先从 data_yichang_S 获取省市区信息 # 优先从 data_yichang_S 获取省市区信息
province_name = row.get('province_name') province_name = row.get('province_name')
city_name = row.get('city_name') city_name = row.get('city_name')
area_name = row.get('area_name') if 'area_name' in row else row.get('district_name') area_name = row.get('area_name') if 'area_name' in row else row.get('district_name')
# 检查省市区是否完整(省市区是一体的,任意一个缺失就需要从NGV获取) # 检查省市区是否完整(省市区是一体的,任意一个缺失就需要从NGV获取)
use_ngv_location = False use_ngv_location = False
if (not province_name or province_name in ['', 'None', 'NA'] or if (not province_name or province_name in ['', 'None', 'NA'] or
not city_name or city_name in ['', 'None', 'NA'] or not city_name or city_name in ['', 'None', 'NA'] or
not area_name or area_name in ['', 'None', 'NA']): not area_name or area_name in ['', 'None', 'NA']):
use_ngv_location = True use_ngv_location = True
logger.info(f"门店 {row['org_code']} 的省市区信息不完整,将从NGV_data_list获取") logger.info(f"门店 {row['org_code']} 的省市区信息不完整,将从NGV_data_list获取")
stop_date = None
# 获取关联数据 # 获取关联数据
for NGV_Data in self.NGV_data_list: for NGV_Data in self.NGV_data_list:
# NGV_Data = NGV_Data.get("data") # NGV_Data = NGV_Data.get("data")
if row["org_code"] == NGV_Data.get("_widget_1734062123071"): # 门店编码 if row["org_code"] == NGV_Data.get("_widget_1734062123071"): # 门店编码
NGV_data_id = NGV_Data.get("_id") NGV_data_id = NGV_Data.get("_id")
# 如果需要从 NGV_data_list 获取省市区信息 # 如果需要从 NGV_data_list 获取省市区信息
if use_ngv_location: if use_ngv_location:
province_name = NGV_Data.get("_widget_1734062123090") province_name = NGV_Data.get("_widget_1734062123090")
city_name = NGV_Data.get("_widget_1734062123092") city_name = NGV_Data.get("_widget_1734062123092")
area_name = NGV_Data.get("_widget_1734062123094") area_name = NGV_Data.get("_widget_1734062123094")
logger.info(f"【从NGV获取省市区】门店 {row['org_code']}: {province_name}, {city_name}, {area_name}") logger.info(
f"【从NGV获取省市区】门店 {row['org_code']}: {province_name}, {city_name}, {area_name}")
# 门店原因 # 门店原因
reason = NGV_Data.get("_widget_1758617393828") reason = NGV_Data.get("_widget_1758617393828")
logger.info(f"获取关联数据成功:{NGV_data_id}, {province_name}, {city_name}, {area_name}") logger.info(f"获取关联数据成功:{NGV_data_id}, {province_name}, {city_name}, {area_name}")
@@ -333,8 +338,40 @@ class NewExceptionTask:
create_exception = NGV_Data.get("_widget_1758769279995") create_exception = NGV_Data.get("_widget_1758769279995")
# 获取上线日期(文本)# 202512.3改为开户日 # 获取上线日期(文本)# 202512.3改为开户日
create_date = NGV_Data.get("_widget_1734062123081") create_date = NGV_Data.get("_widget_1734062123081")
# 获取暂停派发日期
stop_date = NGV_Data.get("_widget_1772610343227", None)
break # 找到匹配的数据后退出循环 break # 找到匹配的数据后退出循环
# 定义可能的日期格式(灵活应对不同格式)
date_formats = [
"%Y-%m-%d %H:%M:%S", # 含时间
"%Y-%m-%d", # 仅日期
"%Y/%m/%d",
"%Y/%m/%d %H:%M:%S"
]
if stop_date:
# 解析暂停派发日期
parsed_stop_date = None
for fmt in date_formats:
try:
parsed_stop_date = datetime.datetime.strptime(stop_date.strip(), fmt)
logger.debug(f"使用格式 {fmt} 成功解析暂停派发日期: {parsed_stop_date}")
break
except ValueError:
continue
if parsed_stop_date:
# 获取当前UTC时间
current_utc_time = datetime.datetime.utcnow()
logger.debug(f"当前UTC时间: {current_utc_time}")
logger.debug(f"暂停派发日期: {parsed_stop_date}")
# 比较时间
if current_utc_time < parsed_stop_date:
logger.info(f"当前UTC时间低于暂停派发日期,跳过派发")
continue
# 判断门店原因 # 判断门店原因
# if reason in ["门店倒闭", "门店转让", "加盟其他连锁","切换竞品","虚拟门店","重新开户","已退款","二套系统"]: # if reason in ["门店倒闭", "门店转让", "加盟其他连锁","切换竞品","虚拟门店","重新开户","已退款","二套系统"]:
# continue # continue
@@ -347,14 +384,6 @@ class NewExceptionTask:
logger.warning("上线日期为空,跳过该记录") logger.warning("上线日期为空,跳过该记录")
continue continue
# 定义可能的日期格式(灵活应对不同格式)
date_formats = [
"%Y-%m-%d %H:%M:%S", # 含时间
"%Y-%m-%d", # 仅日期
"%Y/%m/%d",
"%Y/%m/%d %H:%M:%S"
]
parsed_date = None parsed_date = None
for fmt in date_formats: for fmt in date_formats:
try: try:
@@ -380,15 +409,14 @@ class NewExceptionTask:
logger.info(f"上线日期 {parsed_date} 在30天内,跳过处理") logger.info(f"上线日期 {parsed_date} 在30天内,跳过处理")
continue continue
if not NGV_data_id: if not NGV_data_id:
logger.warning(f"未找到关联数据,请检查门店编码: {row['org_code']}") logger.warning(f"未找到关联数据,请检查门店编码: {row['org_code']}")
# 根据省市区派发给异常回访客服 # 根据省市区派发给异常回访客服
# 检查省市区是否都有值,如果有任何一个为空,则客服为空 # 检查省市区是否都有值,如果有任何一个为空,则客服为空
if (not province_name or province_name in ['', 'None', 'NA'] or if (not province_name or province_name in ['', 'None', 'NA'] or
not city_name or city_name in ['', 'None', 'NA'] or not city_name or city_name in ['', 'None', 'NA'] or
not area_name or area_name in ['', 'None', 'NA']): not area_name or area_name in ['', 'None', 'NA']):
customer_service = None customer_service = None
logger.warning(f"【省市区信息缺失】门店 {row['org_code']} 省市区信息不完整,异常回访客服设置为空") logger.warning(f"【省市区信息缺失】门店 {row['org_code']} 省市区信息不完整,异常回访客服设置为空")
logger.warning(f"省: {province_name}, 市: {city_name}, 区: {area_name}") logger.warning(f"省: {province_name}, 市: {city_name}, 区: {area_name}")
@@ -457,6 +485,8 @@ class NewExceptionTask:
"_widget_1748512176655": {"value": "未处理"}, # 跟进状态 "_widget_1748512176655": {"value": "未处理"}, # 跟进状态
"_widget_1772761760440":{"value": "客服跟进节点"}, # 当前跟进节点
}) })
routine_follow_up_payload = { routine_follow_up_payload = {
@@ -478,7 +508,9 @@ class NewExceptionTask:
if error_data: if error_data:
error_df = pd.DataFrame(error_data) error_df = pd.DataFrame(error_data)
error_df.to_csv(os.path.join(output_dir, "异常派发错误数据.csv")) error_df.to_csv(os.path.join(output_dir, "异常派发错误数据.csv"))
common_module.send_task_error(task_start_time = task_start_time,task_name= "异常服务待办派发",error_message="详情见失败文件", df = error_df) common_module.send_task_error(task_start_time=task_start_time, task_name="异常服务待办派发",
error_message="失败文件中省市区匹配不到,需要通过门店编码在客户资料表中查询正确的省市区,并更新到省市区人员关系表中",
df=error_df)
# ndf = pd.DataFrame(all_data) # ndf = pd.DataFrame(all_data)
# ndf.to_csv(os.path.join(output_dir, "异常派发.csv")) # ndf.to_csv(os.path.join(output_dir, "异常派发.csv"))
common_module.send_task_status(task_start_time, "异常服务待办派发") common_module.send_task_status(task_start_time, "异常服务待办派发")
+3
View File
@@ -351,6 +351,9 @@ class RenewalToDo:
data_NGV['120天是否跟进'] = "主动" data_NGV['120天是否跟进'] = "主动"
data_NGV['60天是否跟进']= "主动" data_NGV['60天是否跟进']= "主动"
data_NGV['30天是否跟进']= "主动" data_NGV['30天是否跟进']= "主动"
# 新增当前所处节点默认值
data_NGV['当前所处节点'] = "120天节点"
# 格式化为字符串(去掉时区) # 格式化为字符串(去掉时区)
for col in ['过期日', '120天自动流转时间', '60天自动流转时间', '30天自动流转时间', '0天自动流转时间']: for col in ['过期日', '120天自动流转时间', '60天自动流转时间', '30天自动流转时间', '0天自动流转时间']:
data_NGV[col] = data_NGV[col].dt.strftime('%Y-%m-%d %H:%M:%S') data_NGV[col] = data_NGV[col].dt.strftime('%Y-%m-%d %H:%M:%S')
+18 -13
View File
@@ -622,7 +622,10 @@ class NewServicesRevisit:
continue continue
if not Billing: if not Billing:
logger.warning(f"权限表请求失败或者权限表无对应关系,权限唯一值是:{NGV_store_level_key}") logger.warning(f"权限表请求失败或者权限表无对应关系,权限唯一值是:{NGV_store_level_key},跳过该条派发")
error_msg = f"门店编码:{row['org_code']},权限唯一值:{NGV_store_level_key}"
common_module.send_task_error(task_start_time, "新签客户回访-权限表无匹配", error_msg)
continue
if row["active_status_fmt"] == "活跃": # 开单 是否使用 if row["active_status_fmt"] == "活跃": # 开单 是否使用
payload_dict.update({"_widget_1735004315765": {"value": ""}}) payload_dict.update({"_widget_1735004315765": {"value": ""}})
@@ -635,7 +638,7 @@ class NewServicesRevisit:
payload_dict.update({"_widget_1735106258036": {"value": ""}}) payload_dict.update({"_widget_1735106258036": {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"会员卡拥有识别:Error finding customer service: {e}") error_task_logger.error(f"会员卡拥有识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-会员卡拥有识别", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-会员卡拥有识别", str(e))
try: try:
if row["card_bill_day_count_last_30_day"] != "0": # 会员卡 是否使用 if row["card_bill_day_count_last_30_day"] != "0": # 会员卡 是否使用
payload_dict.update({"_widget_1735106258038": {"value": ""}}) payload_dict.update({"_widget_1735106258038": {"value": ""}})
@@ -643,7 +646,7 @@ class NewServicesRevisit:
payload_dict.update({"_widget_1735106258038": {"value": ""}}) payload_dict.update({"_widget_1735106258038": {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"会员卡使用识别:Error finding customer service: {e}") error_task_logger.error(f"会员卡使用识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-会员卡使用识别", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-会员卡使用识别", str(e))
# print(self.service_remind.get("_widget_1735112637045")) # print(self.service_remind.get("_widget_1735112637045"))
payload_dict["_widget_1735106258018"] = {"value": ""} payload_dict["_widget_1735106258018"] = {"value": ""}
@@ -675,11 +678,13 @@ class NewServicesRevisit:
# 近30天业务单量=0 则其它所有模块均不推荐 # 近30天业务单量=0 则其它所有模块均不推荐
try: try:
for feature_module, feature_value in feature_dict.items(): # 模块 for feature_module, feature_value in feature_dict.items(): # 模块
if row["bill_count_last_30_day"] == '0' and payload_dict[feature_value]["value"] == '': if feature_value not in payload_dict:
continue
if row["bill_count_last_30_day"] == '0' and payload_dict[feature_value].get("value") == '':
payload_dict.update({f"{feature_value}": {"value": "×"}}) payload_dict.update({f"{feature_value}": {"value": "×"}})
except Exception as e: except Exception as e:
error_task_logger.error(f"不开单识别:Error finding customer service: {e}") error_task_logger.error(f"不开单识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-不开单识别", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-不开单识别", str(e))
# 保单识别:从系统中抽取目标门店,针对门店抽取修改是否推荐 # 保单识别:从系统中抽取目标门店,针对门店抽取修改是否推荐
try: try:
@@ -687,7 +692,7 @@ class NewServicesRevisit:
payload_dict.update({'_widget_1735004315746': {"value": ""}}) payload_dict.update({'_widget_1735004315746': {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"保单识别:Error finding customer service: {e}") error_task_logger.error(f"保单识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-保单识别", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-保单识别", str(e))
# 私域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有 # 私域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有
try: try:
for item in self.private_domain: for item in self.private_domain:
@@ -700,7 +705,7 @@ class NewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"小程序识别:Error finding customer service: {e}") error_task_logger.error(f"小程序识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-小程序识别", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-小程序识别", str(e))
try: try:
high_version = ['皇冠版', '至尊版', '尊享版', '旗舰版'] high_version = ['皇冠版', '至尊版', '尊享版', '旗舰版']
if row["saas_edition_fmt"] in high_version: if row["saas_edition_fmt"] in high_version:
@@ -709,7 +714,7 @@ class NewServicesRevisit:
payload_dict.update({'_widget_1735106258141': {"value": ""}}) # SYXCX:是否拥有 payload_dict.update({'_widget_1735106258141': {"value": ""}}) # SYXCX:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"私域小程序:Error finding customer service: {e}") error_task_logger.error(f"私域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-私域小程序", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-私域小程序", str(e))
# 公域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有 # 公域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有
try: try:
@@ -723,7 +728,7 @@ class NewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"公域小程序:Error finding customer service: {e}") error_task_logger.error(f"公域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-公域小程序", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-公域小程序", str(e))
try: try:
if row["id_own_org"] in self.public_domain_list: if row["id_own_org"] in self.public_domain_list:
@@ -732,7 +737,7 @@ class NewServicesRevisit:
payload_dict.update({'_widget_1735106258112': {"value": ""}}) # GYXCX:是否拥有 payload_dict.update({'_widget_1735106258112': {"value": ""}}) # GYXCX:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"公域小程序:Error finding customer service: {e}") error_task_logger.error(f"公域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-公域小程序", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-公域小程序", str(e))
# 异业合作:根据是否存在判断是否拥有,过滤条件 商品名称包含异业两个字 # 异业合作:根据是否存在判断是否拥有,过滤条件 商品名称包含异业两个字
try: try:
@@ -742,7 +747,7 @@ class NewServicesRevisit:
payload_dict.update({'_widget_1735107355618': {"value": ""}}) # YYHZ:是否拥有 payload_dict.update({'_widget_1735107355618': {"value": ""}}) # YYHZ:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"异业合作:Error finding customer service: {e}") error_task_logger.error(f"异业合作:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-异业合作", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-异业合作", str(e))
# 短信:根据是否启动短信功能判断是否拥有,根据 # 短信:根据是否启动短信功能判断是否拥有,根据
try: try:
@@ -756,7 +761,7 @@ class NewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"短信是否使用:Error finding customer service: {e}") error_task_logger.error(f"短信是否使用:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-短信是否使用", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-短信是否使用", str(e))
try: try:
for item in self.groupnotification: for item in self.groupnotification:
@@ -769,7 +774,7 @@ class NewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"短信是否使用:Error finding customer service: {e}") error_task_logger.error(f"短信是否使用:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-短信是否使用", str(e)) common_module.send_task_error(task_start_time, "新签客户回访-短信是否使用", str(e))
NGV_data_id = None NGV_data_id = None
# 获取关联数据 # 获取关联数据
@@ -736,7 +736,10 @@ class RenewServicesRevisit:
continue continue
if not Billing: if not Billing:
logger.warning(f"权限表请求失败或者权限表无对应关系,权限唯一值是:{NGV_store_level_key}") logger.warning(f"权限表请求失败或者权限表无对应关系,权限唯一值是:{NGV_store_level_key},跳过该条派发")
error_msg = f"门店编码:{row['org_code']},权限唯一值:{NGV_store_level_key}"
common_module.send_task_error(task_start_time, "续约客户回访-权限表无匹配", error_msg)
continue # 无权限匹配时 payload_dict 缺少 _widget_1734073342350 等字段,后续会 KeyError,直接跳过
if row["active_status_fmt"] == "活跃": # 开单 是否使用 if row["active_status_fmt"] == "活跃": # 开单 是否使用
payload_dict.update({"_widget_1735004315765": {"value": ""}}) payload_dict.update({"_widget_1735004315765": {"value": ""}})
@@ -750,7 +753,7 @@ class RenewServicesRevisit:
payload_dict.update({"_widget_1735106258036": {"value": ""}}) payload_dict.update({"_widget_1735106258036": {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"会员卡拥有识别:Error finding customer service: {e}") error_task_logger.error(f"会员卡拥有识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-会员卡拥有识别", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-会员卡拥有识别", str(e))
try: try:
if row["card_bill_day_count_last_30_day"] != "0": # 会员卡 是否使用 if row["card_bill_day_count_last_30_day"] != "0": # 会员卡 是否使用
@@ -759,7 +762,7 @@ class RenewServicesRevisit:
payload_dict.update({"_widget_1735106258038": {"value": ""}}) payload_dict.update({"_widget_1735106258038": {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"会员卡使用识别:Error finding customer service: {e}") error_task_logger.error(f"会员卡使用识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-会员卡使用识别", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-会员卡使用识别", str(e))
# print(self.service_remind.get("_widget_1735112637045")) # print(self.service_remind.get("_widget_1735112637045"))
payload_dict["_widget_1735106258018"] = {"value": ""} payload_dict["_widget_1735106258018"] = {"value": ""}
@@ -792,11 +795,13 @@ class RenewServicesRevisit:
# 近30天业务单量=0 则其它所有模块均不推荐 # 近30天业务单量=0 则其它所有模块均不推荐
try: try:
for feature_module, feature_value in feature_dict.items(): # 模块 for feature_module, feature_value in feature_dict.items(): # 模块
if row["bill_count_last_30_day"] == '0' and payload_dict[feature_value]["value"] == '': if feature_value not in payload_dict:
continue # 权限未匹配时该 key 不存在,避免 KeyError
if row["bill_count_last_30_day"] == '0' and payload_dict[feature_value].get("value") == '':
payload_dict.update({f"{feature_value}": {"value": "×"}}) payload_dict.update({f"{feature_value}": {"value": "×"}})
except Exception as e: except Exception as e:
error_task_logger.error(f"不开单识别:Error finding customer service: {e}") error_task_logger.error(f"不开单识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-不开单识别", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-不开单识别", str(e))
# 保单识别:从系统中抽取目标门店,针对门店抽取修改是否推荐 # 保单识别:从系统中抽取目标门店,针对门店抽取修改是否推荐
try: try:
@@ -804,7 +809,7 @@ class RenewServicesRevisit:
payload_dict.update({'_widget_1735004315746': {"value": ""}}) payload_dict.update({'_widget_1735004315746': {"value": ""}})
except Exception as e: except Exception as e:
error_task_logger.error(f"保单识别:Error finding customer service: {e}") error_task_logger.error(f"保单识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-保单识别", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-保单识别", str(e))
# 私域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有 # 私域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有
try: try:
@@ -818,7 +823,7 @@ class RenewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"小程序识别:Error finding customer service: {e}") error_task_logger.error(f"小程序识别:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-小程序识别", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-小程序识别", str(e))
try: try:
high_version = ['皇冠版', '至尊版', '尊享版', '旗舰版'] high_version = ['皇冠版', '至尊版', '尊享版', '旗舰版']
@@ -828,7 +833,7 @@ class RenewServicesRevisit:
payload_dict.update({'_widget_1735106258141': {"value": ""}}) # SYXCX:是否拥有 payload_dict.update({'_widget_1735106258141': {"value": ""}}) # SYXCX:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"私域小程序:Error finding customer service: {e}") error_task_logger.error(f"私域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-私域小程序", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-私域小程序", str(e))
# 公域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有 # 公域小程序:根据是否开通微信小程序判断是否使用,旗舰版及以上算拥有
try: try:
@@ -842,7 +847,7 @@ class RenewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"公域小程序:Error finding customer service: {e}") error_task_logger.error(f"公域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-公域小程序", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-公域小程序", str(e))
try: try:
if row["id_own_org"] in self.public_domain_list: if row["id_own_org"] in self.public_domain_list:
@@ -851,7 +856,7 @@ class RenewServicesRevisit:
payload_dict.update({'_widget_1735106258112': {"value": ""}}) # GYXCX:是否拥有 payload_dict.update({'_widget_1735106258112': {"value": ""}}) # GYXCX:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"公域小程序:Error finding customer service: {e}") error_task_logger.error(f"公域小程序:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-公域小程序", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-公域小程序", str(e))
# 异业合作:根据是否存在判断是否拥有,过滤条件 商品名称包含异业两个字 # 异业合作:根据是否存在判断是否拥有,过滤条件 商品名称包含异业两个字
try: try:
@@ -861,7 +866,7 @@ class RenewServicesRevisit:
payload_dict.update({'_widget_1735107355618': {"value": ""}}) # YYHZ:是否拥有 payload_dict.update({'_widget_1735107355618': {"value": ""}}) # YYHZ:是否拥有
except Exception as e: except Exception as e:
error_task_logger.error(f"异业合作:Error finding customer service: {e}") error_task_logger.error(f"异业合作:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-异业合作", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-异业合作", str(e))
# 短信:根据是否启动短信功能判断是否拥有,根据 # 短信:根据是否启动短信功能判断是否拥有,根据
try: try:
@@ -875,7 +880,7 @@ class RenewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"短信是否使用:Error finding customer service: {e}") error_task_logger.error(f"短信是否使用:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-短信是否使用", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-短信是否使用", str(e))
try: try:
for item in self.groupnotification: for item in self.groupnotification:
@@ -888,7 +893,7 @@ class RenewServicesRevisit:
break break
except Exception as e: except Exception as e:
error_task_logger.error(f"短信是否使用:Error finding customer service: {e}") error_task_logger.error(f"短信是否使用:Error finding customer service: {e}")
common_module.send_task_error(task_start_time, "手动添加日常回访-短信是否使用", str(e)) common_module.send_task_error(task_start_time, "续约客户回访-短信是否使用", str(e))
NGV_data_id = None NGV_data_id = None
# 获取关联数据 # 获取关联数据
Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

-61166
View File
File diff suppressed because one or more lines are too long
+4 -4
View File
@@ -421,8 +421,8 @@
{ {
"metadata": { "metadata": {
"ExecuteTime": { "ExecuteTime": {
"end_time": "2026-02-04T06:48:00.613387900Z", "end_time": "2026-03-05T06:03:19.996979900Z",
"start_time": "2026-02-04T06:47:59.999330900Z" "start_time": "2026-03-05T06:03:19.335172700Z"
} }
}, },
"cell_type": "code", "cell_type": "code",
@@ -454,7 +454,7 @@
"\n", "\n",
" # 使用DELETE删除ID大于等于127821的数据\n", " # 使用DELETE删除ID大于等于127821的数据\n",
" # cursor.execute(f\"DELETE FROM {table_name} WHERE id >= {min_id_to_delete}\")\n", " # cursor.execute(f\"DELETE FROM {table_name} WHERE id >= {min_id_to_delete}\")\n",
" cursor.execute(f\"DELETE FROM GP_monthly_renewal_rate_new WHERE 月分区(仅用于存储每月最后一天截至数据) = '202601';\")\n", " cursor.execute(f\"DELETE FROM GP_annual_renewal_rate_new WHERE 月分区(仅用于存储每月最后一天截至数据) = '202602';\")\n",
"\n", "\n",
" connection.commit()\n", " connection.commit()\n",
"\n", "\n",
@@ -478,7 +478,7 @@
] ]
} }
], ],
"execution_count": 4 "execution_count": 2
}, },
{ {
"metadata": {}, "metadata": {},