From 30cacc7da21cb808a022b7117d419e00e5c79108 Mon Sep 17 00:00:00 2001 From: z66 <1415243231@qq.com> Date: Thu, 18 Sep 2025 10:22:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=80=9F=E8=BD=A6=E5=AE=9D=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E7=A9=BA=E5=80=BC=E5=A4=84=E7=90=86=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.py | 2 +- .../JCB_efficient_car_pickup.py | 53 +++++---- back_ground_module/logs/error_task.log | 3 + back_ground_module/logs/task.log | 20 ++++ main.py | 2 +- test/数据库查询.ipynb | 101 ++++++++++++++++++ 6 files changed, 160 insertions(+), 21 deletions(-) create mode 100644 test/数据库查询.ipynb diff --git a/api.py b/api.py index 0e1dbfc..e2a9c45 100644 --- a/api.py +++ b/api.py @@ -548,7 +548,7 @@ class API: "username": data["username"], "instance_id": data["instance_id"], "task_id": data['task_id'], - "comment": "自动转交" + "comment": "" } ) diff --git a/back_ground_module/JCB_efficient_car_pickup.py b/back_ground_module/JCB_efficient_car_pickup.py index da33bbb..86d42d3 100644 --- a/back_ground_module/JCB_efficient_car_pickup.py +++ b/back_ground_module/JCB_efficient_car_pickup.py @@ -73,7 +73,7 @@ class JCBEfficientCarPickup: # 调换两个子列表的位置并重新组合 today_customer_service_start_list = first_part + second_part else: - # 如果没有找到“是”,保持原列表不变 + # 如果没有找到"是",保持原列表不变 today_customer_service_start_list = all_customer_service_list pass @@ -84,6 +84,10 @@ class JCBEfficientCarPickup: return today_customer_service_list, is_customer_service_data_id, all_customer_service_list def send_request(self, df): + if df is None or df.empty: # 检查DataFrame是否为None或空 + logger.info("当前派发数据为空或None,跳过此派发") + return + today_customer_service_list, is_customer_service_data_id, all_customer_service_list = self.today_customer_service_list() # 初始化派发索引 next_dispatcher_index = 0 @@ -138,6 +142,10 @@ class JCBEfficientCarPickup: try: logger.info(f"接车宝日常回访开始执行") data_JCB = common_module.get_jcb_details() + if data_JCB is None: + logger.error("获取接车宝数据失败,返回None") + raise ValueError("获取接车宝数据失败,返回None") + logger.info(f"数据加载完成") # data_JCB.to_csv(os.path.join(output_dir, 'JCB_all_data.csv'), index=False) @@ -164,12 +172,14 @@ class JCBEfficientCarPickup: row['日期'] = row["日期"].strftime("%Y-%m-%d") new_sign_abnormal.append(row) - new_sign_abnormal = pd.DataFrame(new_sign_abnormal) - new_sign_abnormal["表单类型"] = "新签异常待办" - new_sign_abnormal["派发日期"] = current_date_str - - self.send_request(new_sign_abnormal) # 发送请求 - logger.info(f"新签异常待办回访完成") + new_sign_abnormal = pd.DataFrame(new_sign_abnormal) if new_sign_abnormal else None + if new_sign_abnormal is not None and not new_sign_abnormal.empty: + new_sign_abnormal["表单类型"] = "新签异常待办" + new_sign_abnormal["派发日期"] = current_date_str + self.send_request(new_sign_abnormal) # 发送请求 + logger.info(f"新签异常待办回访完成") + else: + logger.info(f"新签异常待办回访无数据,跳过") # 优质客户转商机 # current_date = datetime.now() @@ -199,12 +209,14 @@ class JCBEfficientCarPickup: # 推送给客服 pass - customer_to_opportunity = pd.DataFrame(customer_to_opportunity) - customer_to_opportunity["表单类型"] = "续约优质客户转商机" - customer_to_opportunity["派发日期"] = current_date_str - - self.send_request(customer_to_opportunity) - logger.info(f"优质客户转商机完成") + customer_to_opportunity = pd.DataFrame(customer_to_opportunity) if customer_to_opportunity else None + if customer_to_opportunity is not None and not customer_to_opportunity.empty: + customer_to_opportunity["表单类型"] = "续约优质客户转商机" + customer_to_opportunity["派发日期"] = current_date_str + self.send_request(customer_to_opportunity) + logger.info(f"优质客户转商机完成") + else: + logger.info(f"优质客户转商机无数据,跳过") # 过期7天客服回访 # current_date = datetime.now() @@ -224,11 +236,14 @@ class JCBEfficientCarPickup: # 推送给客服 pass - outdated_30 = pd.DataFrame(outdated_30) - outdated_30["表单类型"] = "过期7天回访" - outdated_30["派发日期"] = current_date_str - self.send_request(outdated_30) - logger.info(f"过期7天客服回访完成") + outdated_30 = pd.DataFrame(outdated_30) if outdated_30 else None + if outdated_30 is not None and not outdated_30.empty: + outdated_30["表单类型"] = "过期7天回访" + outdated_30["派发日期"] = current_date_str + self.send_request(outdated_30) + logger.info(f"过期7天客服回访完成") + else: + logger.info(f"过期7天客服回访无数据,跳过") common_module.send_task_status(task_start_time, "接车宝日常派发") logger.info(f"接车宝日常派发执行完成") @@ -266,4 +281,4 @@ class JCBEfficientCarPickup: if __name__ == "__main__": start = JCBEfficientCarPickup() - start.main() + start.main() \ No newline at end of file diff --git a/back_ground_module/logs/error_task.log b/back_ground_module/logs/error_task.log index ff7edb3..c02501d 100644 --- a/back_ground_module/logs/error_task.log +++ b/back_ground_module/logs/error_task.log @@ -10,3 +10,6 @@ 2025-08-21 09:54:25,836 - update_denominator_reporting_adjustment_to_bi.py - error_task_logger - ERROR - 写入数据时发生错误: 1054 (42S22): Unknown column 'nan' in 'field list' 2025-09-05 14:57:31,453 - update_BI_CRM_info.py - error_task_logger - ERROR - 导入数据时发生错误: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'end date, Contract start date, url) VALUES ('C-241113-001', 'Haikarnyang', '全' at line 1 2025-09-05 14:57:31,894 - update_BI_CRM_info.py - error_task_logger - ERROR - 任务简道云海外项目CRM客户档案迁移BI执行失败。 +2025-09-15 14:06:08,361 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:'NoneType' object has no attribute 'iterrows' +2025-09-15 14:14:19,894 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:'NoneType' object has no attribute 'iterrows' +2025-09-15 14:17:26,819 - JCB_efficient_car_pickup.py - error_task_logger - ERROR - 接车宝日常派发执行出错:获取接车宝数据失败,返回None diff --git a/back_ground_module/logs/task.log b/back_ground_module/logs/task.log index d8ccf1e..2c01a9f 100644 --- a/back_ground_module/logs/task.log +++ b/back_ground_module/logs/task.log @@ -23912,3 +23912,23 @@ 2025-09-05 14:59:06,078 - update_BI_CRM_info.py - task_logger - INFO - 数据导入完成 2025-09-05 14:59:06,078 - update_BI_CRM_info.py - task_logger - INFO - 数据处理流程完成 2025-09-05 14:59:06,229 - common_module.py - task_logger - INFO - 任务状态发送成功: {'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-09-05T06:59:05.499Z', 'updateTime': '2025-09-05T06:59:05.499Z', 'deleteTime': None, '_widget_1744873387500': '2025-09-05T00:00:00.000Z', '_widget_1743644977694': '简道云海外项目CRM客户档案迁移BI', '_widget_1744873387501': '2025-09-05T06:59:04.000Z', '_widget_1744873387502': '2025-09-05T06:59:06.000Z', '_widget_1744873387504': '2', '_id': '68ba8a394e83b39f799f845c', 'appId': '6694d3c4fcb69ca9a111a6c4', 'entryId': '67ede908eb9c22261016466e'}} +2025-09-15 14:06:07,901 - JCB_efficient_car_pickup.py - task_logger - INFO - 接车宝日常回访开始执行 +2025-09-15 14:06:08,021 - JCB_efficient_car_pickup.py - task_logger - INFO - 数据加载完成 +2025-09-15 14:06:08,361 - common_module.py - task_logger - INFO - 任务错误发生成功: {'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-09-15T06:06:06.633Z', 'updateTime': '2025-09-15T06:06:06.633Z', 'deleteTime': None, '_widget_1744873387500': '2025-09-15T00:00:00.000Z', '_widget_1743644977694': '接车宝日常派发', '_widget_1744873387501': '2025-09-15T06:06:07.000Z', '_widget_1744873387502': '2025-09-15T06:06:08.000Z', '_widget_1744873387504': '1', '_widget_1754981992215': "'NoneType' object has no attribute 'iterrows'", '_id': '68c7acced9d53fde8e2281b1', 'appId': '6694d3c4fcb69ca9a111a6c4', 'entryId': '689ae65da00c17578e27cd74'}} +2025-09-15 14:14:19,609 - JCB_efficient_car_pickup.py - task_logger - INFO - 接车宝日常回访开始执行 +2025-09-15 14:14:19,700 - JCB_efficient_car_pickup.py - task_logger - INFO - 数据加载完成 +2025-09-15 14:14:19,894 - common_module.py - task_logger - INFO - 任务错误发生成功: {'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-09-15T06:14:18.330Z', 'updateTime': '2025-09-15T06:14:18.330Z', 'deleteTime': None, '_widget_1744873387500': '2025-09-15T00:00:00.000Z', '_widget_1743644977694': '接车宝日常派发', '_widget_1744873387501': '2025-09-15T06:14:19.000Z', '_widget_1744873387502': '2025-09-15T06:14:19.000Z', '_widget_1744873387504': '0', '_widget_1754981992215': "'NoneType' object has no attribute 'iterrows'", '_id': '68c7aebaf79ac1f9a0c31527', 'appId': '6694d3c4fcb69ca9a111a6c4', 'entryId': '689ae65da00c17578e27cd74'}} +2025-09-15 14:17:26,395 - JCB_efficient_car_pickup.py - task_logger - INFO - 接车宝日常回访开始执行 +2025-09-15 14:17:26,546 - JCB_efficient_car_pickup.py - task_logger - ERROR - 获取接车宝数据失败,返回None +2025-09-15 14:17:26,819 - common_module.py - task_logger - INFO - 任务错误发生成功: {'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-09-15T06:17:25.217Z', 'updateTime': '2025-09-15T06:17:25.217Z', 'deleteTime': None, '_widget_1744873387500': '2025-09-15T00:00:00.000Z', '_widget_1743644977694': '接车宝日常派发', '_widget_1744873387501': '2025-09-15T06:17:26.000Z', '_widget_1744873387502': '2025-09-15T06:17:26.000Z', '_widget_1744873387504': '0', '_widget_1754981992215': '获取接车宝数据失败,返回None', '_id': '68c7af751461add382445ed1', 'appId': '6694d3c4fcb69ca9a111a6c4', 'entryId': '689ae65da00c17578e27cd74'}} +2025-09-15 14:42:07,779 - JCB_efficient_car_pickup.py - task_logger - INFO - 接车宝日常回访开始执行 +2025-09-15 14:42:08,578 - JCB_efficient_car_pickup.py - task_logger - INFO - 数据加载完成 +2025-09-15 14:42:10,098 - JCB_efficient_car_pickup.py - task_logger - INFO - 新签异常待办回访无数据,跳过 +2025-09-15 14:42:11,692 - JCB_efficient_car_pickup.py - task_logger - INFO - 优质客户转商机无数据,跳过 +2025-09-15 14:42:13,277 - api.py - task_logger - INFO - 已获取 14 条数据 +2025-09-15 14:42:13,370 - api.py - task_logger - INFO - 多数据写入行数: 3 +2025-09-15 14:42:14,323 - JCB_efficient_car_pickup.py - task_logger - INFO - 数据发送成功:[{'status': 'success', 'success_count': 3, 'success_ids': ['68c7b543c5d479bfa3826a3d', '68c7b543c5d479bfa3826a3e', '68c7b543c5d479bfa3826a3f']}] +2025-09-15 14:42:14,772 - JCB_efficient_car_pickup.py - task_logger - INFO - 明日派发人员信息已修改:{'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-02-28T06:08:09.442Z', 'updateTime': '2025-09-15T06:42:13.155Z', 'deleteTime': None, '_widget_1740042824214': {'name': '郭波波', 'username': '245308451136546029', 'status': 1, 'type': 0, 'departments': [177751223], 'integrate_id': '245308451136546029'}, '_widget_1740117343937': '开', '_widget_1740042824216': '是', '_id': '67c152c923d51e787c59b40f', 'appId': '6717470a0b3975ef583c6df1', 'entryId': '67b6f2462f9ac03b783d409a'}} +2025-09-15 14:42:14,772 - JCB_efficient_car_pickup.py - task_logger - INFO - 过期7天客服回访完成 +2025-09-15 14:42:15,009 - common_module.py - task_logger - INFO - 任务状态发送成功: {'data': {'creator': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'updater': {'name': 'F6汽车科技', 'username': '#admin', 'status': 1, 'type': 0}, 'deleter': None, 'createTime': '2025-09-15T06:42:13.356Z', 'updateTime': '2025-09-15T06:42:13.356Z', 'deleteTime': None, '_widget_1744873387500': '2025-09-15T00:00:00.000Z', '_widget_1743644977694': '接车宝日常派发', '_widget_1744873387501': '2025-09-15T06:42:07.000Z', '_widget_1744873387502': '2025-09-15T06:42:14.000Z', '_widget_1744873387504': '7', '_id': '68c7b545999d6975416a1d74', 'appId': '6694d3c4fcb69ca9a111a6c4', 'entryId': '67ede908eb9c22261016466e'}} +2025-09-15 14:42:15,021 - JCB_efficient_car_pickup.py - task_logger - INFO - 接车宝日常派发执行完成 diff --git a/main.py b/main.py index 3ad45fe..dee0ba2 100644 --- a/main.py +++ b/main.py @@ -27,7 +27,7 @@ def main(): # 主循环,用于持续检查和执行定时任务 while True: schedule.run_pending() - time.sleep(1) + time.sleep(60) # 每秒检查一次 now = datetime.now() if now.hour == 23: diff --git a/test/数据库查询.ipynb b/test/数据库查询.ipynb new file mode 100644 index 0000000..941ef19 --- /dev/null +++ b/test/数据库查询.ipynb @@ -0,0 +1,101 @@ +{ + "cells": [ + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-09-15T06:38:10.678825Z", + "start_time": "2025-09-15T06:38:10.523582Z" + } + }, + "source": [ + "from datetime import datetime, timezone, timedelta, date, UTC\n", + "import holidays\n", + "from config import Config\n", + "import psycopg2\n", + "import pandas as pd\n", + "import pymysql\n", + "from api import API\n", + "from log_config import configure_task_logger, configure_error_task_logger\n", + "\n", + "\n", + "def get_jcb_details():\n", + " \"\"\"\n", + " 从固定的数据库中获取前几天的NGV明细。\n", + " 参数 `days_back` 表示相对于今天的天数偏移量,默认为1(即前一天)。\n", + " 返回包含NGV明细的pandas DataFrame。\n", + " \"\"\"\n", + " # 保存为CSV文件\n", + " output_dir = \"output\" # 设置输出目录\n", + "\n", + " # 创建输出目录(如果不存在)\n", + " import os\n", + " os.makedirs(output_dir, exist_ok=True)\n", + "\n", + " try:\n", + " # 获得连接并创建游标\n", + " conn = pymysql.connect(\n", + " host=Config.BI_CONN_host,\n", + " database=Config.BI_CONN_INFO_database,\n", + " user=Config.BI_CONN_INFO_user,\n", + " password=Config.BI_CONN_INFO_password,\n", + " # charset='utf8mb4', # 设置字符集以避免编码问题\n", + " # cursorclass=pymysql.cursors.DictCursor # 返回字典形式的结果\n", + " )\n", + " cursor = conn.cursor()\n", + "\n", + " # 获取指定天数前的日期\n", + " # now_time = datetime.now()\n", + " # target_time = now_time + timedelta(days=-days_back)\n", + " target_date_id = \"接车宝\" # 获取目标日期\n", + "\n", + " # SQL 查询语句\n", + " sql = f\"\"\"\n", + " SELECT * FROM jdy_hs_holo_dws_sales_magic_box_ngv_d;\n", + " \"\"\"\n", + "\n", + " # 执行查询并获取结果\n", + " cursor.execute(sql)\n", + " rows = cursor.fetchall() # pymysql 的 DictCursor 会返回字典列表\n", + " print(rows)\n", + " except:\n", + " pass\n", + "\n", + "get_jcb_details()" + ], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "()\n" + ] + } + ], + "execution_count": 5 + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}