瀏覽代碼

修复schema_tools.schema_workflow_orchestrator执行时的bug.

wangxq 1 周之前
父節點
當前提交
abcb498d06

+ 363 - 0
citu_app.py

@@ -12,6 +12,11 @@ import chainlit as cl
 import json
 from flask import session  # 添加session导入
 from common.redis_conversation_manager import RedisConversationManager  # 添加Redis对话管理器导入
+
+from common.qa_feedback_manager import QAFeedbackManager
+from common.result import success_response, bad_request_response, not_found_response, internal_error_response
+
+
 from common.result import (  # 统一导入所有需要的响应函数
     bad_request_response, service_unavailable_response, 
     agent_success_response, agent_error_response,
@@ -1759,6 +1764,364 @@ def embedding_cache_cleanup():
         )), 500
 
 
+# ==================== QA反馈系统接口 ====================
+# 全局反馈管理器实例
+qa_feedback_manager = None
+
+def get_qa_feedback_manager():
+    """获取QA反馈管理器实例(懒加载)- 复用Vanna连接版本"""
+    global qa_feedback_manager
+    if qa_feedback_manager is None:
+        try:
+            # 优先尝试复用vanna连接
+            vanna_instance = None
+            try:
+                # 尝试获取现有的vanna实例
+                if 'get_citu_langraph_agent' in globals():
+                    agent = get_citu_langraph_agent()
+                    if hasattr(agent, 'vn'):
+                        vanna_instance = agent.vn
+                elif 'vn' in globals():
+                    vanna_instance = vn
+                else:
+                    print("[INFO] 未找到可用的vanna实例,将创建新的数据库连接")
+            except Exception as e:
+                print(f"[INFO] 获取vanna实例失败: {e},将创建新的数据库连接")
+                vanna_instance = None
+            
+            qa_feedback_manager = QAFeedbackManager(vanna_instance=vanna_instance)
+            print("[CITU_APP] QA反馈管理器实例创建成功")
+        except Exception as e:
+            print(f"[CRITICAL] QA反馈管理器创建失败: {str(e)}")
+            raise Exception(f"QA反馈管理器初始化失败: {str(e)}")
+    return qa_feedback_manager
+
+
+@app.flask_app.route('/api/v0/qa_feedback/query', methods=['POST'])
+def qa_feedback_query():
+    """
+    查询反馈记录API
+    支持分页、筛选和排序功能
+    """
+    try:
+        req = request.get_json(force=True)
+        
+        # 解析参数,设置默认值
+        page = req.get('page', 1)
+        page_size = req.get('page_size', 20)
+        is_thumb_up = req.get('is_thumb_up')
+        create_time_start = req.get('create_time_start')
+        create_time_end = req.get('create_time_end')
+        is_in_training_data = req.get('is_in_training_data')
+        sort_by = req.get('sort_by', 'create_time')
+        sort_order = req.get('sort_order', 'desc')
+        
+        # 参数验证
+        if page < 1:
+            return jsonify(bad_request_response(
+                response_text="页码必须大于0",
+                invalid_params=["page"]
+            )), 400
+        
+        if page_size < 1 or page_size > 100:
+            return jsonify(bad_request_response(
+                response_text="每页大小必须在1-100之间",
+                invalid_params=["page_size"]
+            )), 400
+        
+        # 获取反馈管理器并查询
+        manager = get_qa_feedback_manager()
+        records, total = manager.query_feedback(
+            page=page,
+            page_size=page_size,
+            is_thumb_up=is_thumb_up,
+            create_time_start=create_time_start,
+            create_time_end=create_time_end,
+            is_in_training_data=is_in_training_data,
+            sort_by=sort_by,
+            sort_order=sort_order
+        )
+        
+        # 计算分页信息
+        total_pages = (total + page_size - 1) // page_size
+        
+        return jsonify(success_response(
+            response_text=f"查询成功,共找到 {total} 条记录",
+            data={
+                "records": records,
+                "pagination": {
+                    "page": page,
+                    "page_size": page_size,
+                    "total": total,
+                    "total_pages": total_pages,
+                    "has_next": page < total_pages,
+                    "has_prev": page > 1
+                }
+            }
+        ))
+        
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_query执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="查询反馈记录失败,请稍后重试"
+        )), 500
+
+@app.flask_app.route('/api/v0/qa_feedback/delete/<int:feedback_id>', methods=['DELETE'])
+def qa_feedback_delete(feedback_id):
+    """
+    删除反馈记录API
+    """
+    try:
+        manager = get_qa_feedback_manager()
+        success = manager.delete_feedback(feedback_id)
+        
+        if success:
+            return jsonify(success_response(
+                response_text=f"反馈记录删除成功",
+                data={"deleted_id": feedback_id}
+            ))
+        else:
+            return jsonify(not_found_response(
+                response_text=f"反馈记录不存在 (ID: {feedback_id})"
+            )), 404
+            
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_delete执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="删除反馈记录失败,请稍后重试"
+        )), 500
+
+@app.flask_app.route('/api/v0/qa_feedback/update/<int:feedback_id>', methods=['PUT'])
+def qa_feedback_update(feedback_id):
+    """
+    更新反馈记录API
+    """
+    try:
+        req = request.get_json(force=True)
+        
+        # 提取允许更新的字段
+        allowed_fields = ['question', 'sql', 'is_thumb_up', 'user_id', 'is_in_training_data']
+        update_data = {}
+        
+        for field in allowed_fields:
+            if field in req:
+                update_data[field] = req[field]
+        
+        if not update_data:
+            return jsonify(bad_request_response(
+                response_text="没有提供有效的更新字段",
+                missing_params=allowed_fields
+            )), 400
+        
+        manager = get_qa_feedback_manager()
+        success = manager.update_feedback(feedback_id, **update_data)
+        
+        if success:
+            return jsonify(success_response(
+                response_text="反馈记录更新成功",
+                data={
+                    "updated_id": feedback_id,
+                    "updated_fields": list(update_data.keys())
+                }
+            ))
+        else:
+            return jsonify(not_found_response(
+                response_text=f"反馈记录不存在或无变化 (ID: {feedback_id})"
+            )), 404
+            
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_update执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="更新反馈记录失败,请稍后重试"
+        )), 500
+
+@app.flask_app.route('/api/v0/qa_feedback/add_to_training', methods=['POST'])
+def qa_feedback_add_to_training():
+    """
+    将反馈记录添加到训练数据集API
+    支持混合批量处理:正向反馈加入SQL训练集,负向反馈加入error_sql训练集
+    """
+    try:
+        req = request.get_json(force=True)
+        feedback_ids = req.get('feedback_ids', [])
+        
+        if not feedback_ids or not isinstance(feedback_ids, list):
+            return jsonify(bad_request_response(
+                response_text="缺少有效的反馈ID列表",
+                missing_params=["feedback_ids"]
+            )), 400
+        
+        manager = get_qa_feedback_manager()
+        
+        # 获取反馈记录
+        records = manager.get_feedback_by_ids(feedback_ids)
+        
+        if not records:
+            return jsonify(not_found_response(
+                response_text="未找到任何有效的反馈记录"
+            )), 404
+        
+        # 分别处理正向和负向反馈
+        positive_count = 0  # 正向训练计数
+        negative_count = 0  # 负向训练计数
+        already_trained_count = 0  # 已训练计数
+        error_count = 0  # 错误计数
+        
+        successfully_trained_ids = []  # 成功训练的ID列表
+        
+        for record in records:
+            try:
+                # 检查是否已经在训练数据中
+                if record['is_in_training_data']:
+                    already_trained_count += 1
+                    continue
+                
+                if record['is_thumb_up']:
+                    # 正向反馈 - 加入标准SQL训练集
+                    training_id = vn.train(
+                        question=record['question'], 
+                        sql=record['sql']
+                    )
+                    positive_count += 1
+                    print(f"[TRAINING] 正向训练成功 - ID: {record['id']}, TrainingID: {training_id}")
+                else:
+                    # 负向反馈 - 加入错误SQL训练集
+                    training_id = vn.train_error_sql(
+                        question=record['question'], 
+                        sql=record['sql']
+                    )
+                    negative_count += 1
+                    print(f"[TRAINING] 负向训练成功 - ID: {record['id']}, TrainingID: {training_id}")
+                
+                successfully_trained_ids.append(record['id'])
+                
+            except Exception as e:
+                print(f"[ERROR] 训练失败 - 反馈ID: {record['id']}, 错误: {e}")
+                error_count += 1
+        
+        # 更新训练状态
+        if successfully_trained_ids:
+            updated_count = manager.mark_training_status(successfully_trained_ids, True)
+            print(f"[TRAINING] 批量更新训练状态完成,影响 {updated_count} 条记录")
+        
+        # 构建响应
+        total_processed = positive_count + negative_count + already_trained_count + error_count
+        
+        return jsonify(success_response(
+            response_text=f"训练数据添加完成,成功处理 {positive_count + negative_count} 条记录",
+            data={
+                "summary": {
+                    "total_requested": len(feedback_ids),
+                    "total_processed": total_processed,
+                    "positive_trained": positive_count,
+                    "negative_trained": negative_count,
+                    "already_trained": already_trained_count,
+                    "errors": error_count
+                },
+                "successfully_trained_ids": successfully_trained_ids,
+                "training_details": {
+                    "sql_training_count": positive_count,
+                    "error_sql_training_count": negative_count
+                }
+            }
+        ))
+        
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_add_to_training执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="添加训练数据失败,请稍后重试"
+        )), 500
+
+@app.flask_app.route('/api/v0/qa_feedback/add', methods=['POST'])
+def qa_feedback_add():
+    """
+    添加反馈记录API
+    用于前端直接创建反馈记录
+    """
+    try:
+        req = request.get_json(force=True)
+        question = req.get('question')
+        sql = req.get('sql')
+        is_thumb_up = req.get('is_thumb_up')
+        user_id = req.get('user_id', 'guest')
+        
+        # 参数验证
+        if not question:
+            return jsonify(bad_request_response(
+                response_text="缺少必需参数:question",
+                missing_params=["question"]
+            )), 400
+        
+        if not sql:
+            return jsonify(bad_request_response(
+                response_text="缺少必需参数:sql",
+                missing_params=["sql"]
+            )), 400
+        
+        if is_thumb_up is None:
+            return jsonify(bad_request_response(
+                response_text="缺少必需参数:is_thumb_up",
+                missing_params=["is_thumb_up"]
+            )), 400
+        
+        manager = get_qa_feedback_manager()
+        feedback_id = manager.add_feedback(
+            question=question,
+            sql=sql,
+            is_thumb_up=bool(is_thumb_up),
+            user_id=user_id
+        )
+        
+        return jsonify(success_response(
+            response_text="反馈记录创建成功",
+            data={
+                "feedback_id": feedback_id,
+                "message": "Feedback record created successfully"
+            }
+        ))
+        
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_add执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="创建反馈记录失败,请稍后重试"
+        )), 500
+
+@app.flask_app.route('/api/v0/qa_feedback/stats', methods=['GET'])
+def qa_feedback_stats():
+    """
+    反馈统计API
+    返回反馈数据的统计信息
+    """
+    try:
+        manager = get_qa_feedback_manager()
+        
+        # 查询各种统计数据
+        all_records, total_count = manager.query_feedback(page=1, page_size=1)
+        positive_records, positive_count = manager.query_feedback(page=1, page_size=1, is_thumb_up=True)
+        negative_records, negative_count = manager.query_feedback(page=1, page_size=1, is_thumb_up=False)
+        trained_records, trained_count = manager.query_feedback(page=1, page_size=1, is_in_training_data=True)
+        untrained_records, untrained_count = manager.query_feedback(page=1, page_size=1, is_in_training_data=False)
+        
+        return jsonify(success_response(
+            response_text="统计信息获取成功",
+            data={
+                "total_feedback": total_count,
+                "positive_feedback": positive_count,
+                "negative_feedback": negative_count,
+                "trained_feedback": trained_count,
+                "untrained_feedback": untrained_count,
+                "positive_rate": round(positive_count / max(total_count, 1) * 100, 2),
+                "training_rate": round(trained_count / max(total_count, 1) * 100, 2)
+            }
+        ))
+        
+    except Exception as e:
+        print(f"[ERROR] qa_feedback_stats执行失败: {str(e)}")
+        return jsonify(internal_error_response(
+            response_text="获取统计信息失败,请稍后重试"
+        )), 500
+
+
 # ==================== 问答缓存管理接口 ====================
 
 @app.flask_app.route('/api/v0/qa_cache_stats', methods=['GET'])

+ 3 - 0
docs/Schema Tools 使用说明.md

@@ -97,6 +97,9 @@ python -m schema_tools.schema_workflow_orchestrator \
   --no-modify-file
 ```
 
+python -m schema_tools.schema_workflow_orchestrator --db-connection "postgresql://postgres:postgres@localhost:6432/highway_db" --table-list ./schema_tools/tables.txt --business-context "高速公路服务区管理系统"  --db-name highway_db --output-dir ./output
+
+
 ### 3.3 编程方式使用
 
 ```python

+ 3 - 3
output/bss_business_day_data.ddl

@@ -1,7 +1,7 @@
--- 中文名: 记录各服务区每日业务统计数据
--- 描述: 记录各服务区每日业务统计数据,包含统计日期及基础信息,用于运营分析与管理
+-- 中文名: 服务区营业日数据表
+-- 描述: 服务区营业日数据表,记录各服务区每日业务统计及版本信息
 create table public.bss_business_day_data (
-  id varchar(32) not null     -- 主键ID,主键,
+  id varchar(32) not null     -- 主键标识,主键,
   version integer not null    -- 版本号,
   create_ts timestamp         -- 创建时间,
   created_by varchar(50)      -- 创建人,

+ 3 - 3
output/bss_business_day_data_detail.md

@@ -1,7 +1,7 @@
-## bss_business_day_data(记录各服务区每日业务统计数据
-bss_business_day_data 表记录各服务区每日业务统计数据,包含统计日期及基础信息,用于运营分析与管理
+## bss_business_day_data(服务区营业日数据表
+bss_business_day_data 表服务区营业日数据表,记录各服务区每日业务统计及版本信息
 字段列表:
-- id (varchar(32)) - 主键ID [主键, 非空] [示例: 00827DFF993D415488EA1F07CAE6C440, 00e799048b8cbb8ee758eac9c8b4b820]
+- id (varchar(32)) - 主键标识 [主键, 非空] [示例: 00827DFF993D415488EA1F07CAE6C440, 00e799048b8cbb8ee758eac9c8b4b820]
 - version (integer) - 版本号 [非空] [示例: 1]
 - create_ts (timestamp) - 创建时间 [示例: 2023-04-02 08:31:51, 2023-04-02 02:30:08]
 - created_by (varchar(50)) - 创建人 [示例: xingba]

+ 7 - 7
output/bss_car_day_count.ddl

@@ -1,14 +1,14 @@
--- 中文名: 服务区车辆日统计
--- 描述: 服务区车辆日统计表,记录车辆类型及数量用于交通流量分析与管理决策
+-- 中文名: 表注释:高速公路服务区每日车辆通行统计及类型分析
+-- 描述: 表注释:高速公路服务区每日车辆通行统计及类型分析表
 create table public.bss_car_day_count (
-  id varchar(32) not null     -- 主键ID,主键,
+  id varchar(32) not null     -- 主键标识,主键,
   version integer not null    -- 版本号,
   create_ts timestamp         -- 创建时间,
-  created_by varchar(50)      -- 创建人,
-  update_ts timestamp         -- 最后更新时间,
-  updated_by varchar(50)      -- 最后更新人,
+  created_by varchar(50)      -- 创建人ID,
+  update_ts timestamp         -- 更新时间,
+  updated_by varchar(50)      -- 更新人ID,
   delete_ts timestamp         -- 删除时间,
-  deleted_by varchar(50)      -- 删除人,
+  deleted_by varchar(50)      -- 删除人ID,
   customer_count bigint       -- 车辆数量,
   car_type varchar(100)       -- 车辆类别,
   count_date date             -- 统计日期,

+ 7 - 7
output/bss_car_day_count_detail.md

@@ -1,14 +1,14 @@
-## bss_car_day_count(服务区车辆日统计表)
-bss_car_day_count 表服务区车辆日统计表,记录车辆类型及数量用于交通流量分析与管理决策
+## bss_car_day_count(表注释:高速公路服务区每日车辆通行统计及类型分析表)
+bss_car_day_count 表表注释:高速公路服务区每日车辆通行统计及类型分析表
 字段列表:
-- id (varchar(32)) - 主键ID [主键, 非空] [示例: 00022c1c99ff11ec86d4fa163ec0f8fc, 00022caa99ff11ec86d4fa163ec0f8fc]
+- id (varchar(32)) - 主键标识 [主键, 非空] [示例: 00022c1c99ff11ec86d4fa163ec0f8fc, 00022caa99ff11ec86d4fa163ec0f8fc]
 - version (integer) - 版本号 [非空] [示例: 1]
 - create_ts (timestamp) - 创建时间 [示例: 2022-03-02 16:01:43, 2022-02-02 14:18:55]
-- created_by (varchar(50)) - 创建人
-- update_ts (timestamp) - 最后更新时间 [示例: 2022-03-02 16:01:43, 2022-02-02 14:18:55]
-- updated_by (varchar(50)) - 最后更新人
+- created_by (varchar(50)) - 创建人ID
+- update_ts (timestamp) - 更新时间 [示例: 2022-03-02 16:01:43, 2022-02-02 14:18:55]
+- updated_by (varchar(50)) - 更新人ID
 - delete_ts (timestamp) - 删除时间
-- deleted_by (varchar(50)) - 删除人
+- deleted_by (varchar(50)) - 删除人ID
 - customer_count (bigint) - 车辆数量 [示例: 1114, 295]
 - car_type (varchar(100)) - 车辆类别 [示例: 其他]
 - count_date (date) - 统计日期 [示例: 2022-03-02, 2022-02-02]

+ 2 - 2
output/bss_company.ddl

@@ -1,5 +1,5 @@
--- 中文名: 存储服务区入驻公司的基本信息及变更记录
--- 描述: 存储服务区入驻公司的基本信息及变更记录,包含公司名称与编码,支持多版本审计。
+-- 中文名: 公司信息管理表
+-- 描述: 公司信息管理表,存储服务区运营公司基础信息及变更记录
 create table public.bss_company (
   id varchar(32) not null     -- 主键ID,主键,
   version integer not null    -- 版本号,

+ 2 - 2
output/bss_company_detail.md

@@ -1,5 +1,5 @@
-## bss_company(存储服务区入驻公司的基本信息及变更记录
-bss_company 表存储服务区入驻公司的基本信息及变更记录,包含公司名称与编码,支持多版本审计。
+## bss_company(公司信息管理表
+bss_company 表公司信息管理表,存储服务区运营公司基础信息及变更记录
 字段列表:
 - id (varchar(32)) - 主键ID [主键, 非空] [示例: 30675d85ba5044c31acfa243b9d16334, 47ed0bb37f5a85f3d9245e4854959b81]
 - version (integer) - 版本号 [非空] [示例: 1, 2]

+ 6 - 6
output/bss_section_route.ddl

@@ -1,16 +1,16 @@
--- 中文名: 路段路线关联表
--- 描述: 路段路线关联表,维护高速公路路段与行驶路线的映射关系
+-- 中文名: 路段路线关联配置
+-- 描述: 路段与路线关联配置表,存储路段名称与所属路线名称的对应关系,用于高速公路服务区的布局规划和路线管理。
 create table public.bss_section_route (
   id varchar(32) not null     -- 主键ID,主键,
   version integer not null    -- 版本号,
   create_ts timestamp         -- 创建时间,
-  created_by varchar(50)      -- 创建,
+  created_by varchar(50)      -- 创建,
   update_ts timestamp         -- 更新时间,
-  updated_by varchar(50)      -- 更新,
+  updated_by varchar(50)      -- 更新,
   delete_ts timestamp         -- 删除时间,
-  deleted_by varchar(50)      -- 删除,
+  deleted_by varchar(50)      -- 删除,
   section_name varchar(255)   -- 路段名称,
   route_name varchar(255)     -- 路线名称,
-  code varchar(255)           -- 路段编号,
+  code varchar(255)           -- 编号,
   primary key (id)
 );

+ 2 - 2
output/bss_section_route_area_link.ddl

@@ -1,5 +1,5 @@
--- 中文名: 路线与服务区关联表
--- 描述: 路线与服务区关联表
+-- 中文名: 路段路线与服务区关联表
+-- 描述: 路段路线与服务区关联表,用于维护高速公路路段与其对应服务区的映射关系。
 create table public.bss_section_route_area_link (
   section_route_id varchar(32) not null -- 路段路线ID,主键,
   service_area_id varchar(32) not null -- 服务区ID,主键,

+ 2 - 2
output/bss_section_route_area_link_detail.md

@@ -1,5 +1,5 @@
-## bss_section_route_area_link(路线与服务区关联表)
-bss_section_route_area_link 表路线与服务区关联表
+## bss_section_route_area_link(路段路线与服务区关联表)
+bss_section_route_area_link 表路段路线与服务区关联表,用于维护高速公路路段与其对应服务区的映射关系。
 字段列表:
 - section_route_id (varchar(32)) - 路段路线ID [主键, 非空] [示例: v8elrsfs5f7lt7jl8a6p87smfzesn3rz, hxzi2iim238e3s1eajjt1enmh9o4h3wp]
 - service_area_id (varchar(32)) - 服务区ID [主键, 非空] [示例: 08e01d7402abd1d6a4d9fdd5df855ef8, 091662311d2c737029445442ff198c4c]

+ 6 - 6
output/bss_section_route_detail.md

@@ -1,16 +1,16 @@
-## bss_section_route(路段路线关联表)
-bss_section_route 表路段路线关联表,维护高速公路路段与行驶路线的映射关系
+## bss_section_route(路段路线关联配置表)
+bss_section_route 表路段与路线关联配置表,存储路段名称与所属路线名称的对应关系,用于高速公路服务区的布局规划和路线管理。
 字段列表:
 - id (varchar(32)) - 主键ID [主键, 非空] [示例: 04ri3j67a806uw2c6o6dwdtz4knexczh, 0g5mnefxxtukql2cq6acul7phgskowy7]
 - version (integer) - 版本号 [非空] [示例: 1, 0]
 - create_ts (timestamp) - 创建时间 [示例: 2021-10-29 19:43:50, 2022-03-04 16:07:16]
-- created_by (varchar(50)) - 创建 [示例: admin]
+- created_by (varchar(50)) - 创建 [示例: admin]
 - update_ts (timestamp) - 更新时间
-- updated_by (varchar(50)) - 更新
+- updated_by (varchar(50)) - 更新
 - delete_ts (timestamp) - 删除时间
-- deleted_by (varchar(50)) - 删除
+- deleted_by (varchar(50)) - 删除
 - section_name (varchar(255)) - 路段名称 [示例: 昌栗, 昌宁]
 - route_name (varchar(255)) - 路线名称 [示例: 昌栗, 昌韶]
-- code (varchar(255)) - 路段编号 [示例: SR0001, SR0002]
+- code (varchar(255)) - 编号 [示例: SR0001, SR0002]
 字段补充说明:
 - id 为主键

+ 8 - 8
output/bss_service_area.ddl

@@ -1,19 +1,19 @@
--- 中文名: 高速公路服务区基础信息
--- 描述: 高速公路服务区基础信息表,包含名称、编码及状态管理
+-- 中文名: 存储高速公路服务区基础信息
+-- 描述: 存储高速公路服务区基础信息,包含名称、编码及版本控制,支持服务区运营维护与变更追踪。
 create table public.bss_service_area (
-  id varchar(32) not null     -- 主键ID,主键,
+  id varchar(32) not null     -- 主键标识,主键,
   version integer not null    -- 版本号,
   create_ts timestamp         -- 创建时间,
-  created_by varchar(50)      -- 创建人,
+  created_by varchar(50)      -- 创建人ID,
   update_ts timestamp         -- 更新时间,
-  updated_by varchar(50)      -- 更新人,
+  updated_by varchar(50)      -- 更新人ID,
   delete_ts timestamp         -- 删除时间,
-  deleted_by varchar(50)      -- 删除人,
+  deleted_by varchar(50)      -- 删除人ID,
   service_area_name varchar(255) -- 服务区名称,
   service_area_no varchar(255) -- 服务区编码,
   company_id varchar(32)      -- 所属公司ID,
-  service_position varchar(255) -- 经纬度坐标,
+  service_position varchar(255) -- 服务区地理坐标,
   service_area_type varchar(50) -- 服务区类型,
-  service_state varchar(50)   -- 运营状态,
+  service_state varchar(50)   -- 服务区状态,
   primary key (id)
 );

+ 8 - 8
output/bss_service_area_detail.md

@@ -1,20 +1,20 @@
-## bss_service_area(高速公路服务区基础信息
-bss_service_area 表高速公路服务区基础信息表,包含名称、编码及状态管理
+## bss_service_area(存储高速公路服务区基础信息)
+bss_service_area 表存储高速公路服务区基础信息,包含名称、编码及版本控制,支持服务区运营维护与变更追踪。
 字段列表:
-- id (varchar(32)) - 主键ID [主键, 非空] [示例: 0271d68ef93de9684b7ad8c7aae600b6, 08e01d7402abd1d6a4d9fdd5df855ef8]
+- id (varchar(32)) - 主键标识 [主键, 非空] [示例: 0271d68ef93de9684b7ad8c7aae600b6, 08e01d7402abd1d6a4d9fdd5df855ef8]
 - version (integer) - 版本号 [非空] [示例: 3, 6]
 - create_ts (timestamp) - 创建时间 [示例: 2021-05-21 13:26:40.589000, 2021-05-20 19:51:46.314000]
-- created_by (varchar(50)) - 创建人 [示例: admin]
+- created_by (varchar(50)) - 创建人ID [示例: admin]
 - update_ts (timestamp) - 更新时间 [示例: 2021-07-10 15:41:28.795000, 2021-07-11 09:33:08.455000]
-- updated_by (varchar(50)) - 更新人 [示例: admin]
+- updated_by (varchar(50)) - 更新人ID [示例: admin]
 - delete_ts (timestamp) - 删除时间
-- deleted_by (varchar(50)) - 删除人 [示例: ]
+- deleted_by (varchar(50)) - 删除人ID [示例: ]
 - service_area_name (varchar(255)) - 服务区名称 [示例: 白鹭湖停车区, 南昌南服务区]
 - service_area_no (varchar(255)) - 服务区编码 [示例: H0814, H0105]
 - company_id (varchar(32)) - 所属公司ID [示例: b1629f07c8d9ac81494fbc1de61f1ea5, ee9bf1180a2b45003f96e597a4b7f15a]
-- service_position (varchar(255)) - 经纬度坐标 [示例: 114.574721,26.825584, 115.910549,28.396355]
+- service_position (varchar(255)) - 服务区地理坐标 [示例: 114.574721,26.825584, 115.910549,28.396355]
 - service_area_type (varchar(50)) - 服务区类型 [示例: 信息化服务区]
-- service_state (varchar(50)) - 运营状态 [示例: 开放, 关闭]
+- service_state (varchar(50)) - 服务区状态 [示例: 开放, 关闭]
 字段补充说明:
 - id 为主键
 - service_area_type 为枚举字段,包含取值:信息化服务区、智能化服务区

+ 14 - 14
output/bss_service_area_mapper.ddl

@@ -1,18 +1,18 @@
--- 中文名: 服务区与系统映射表
--- 描述: 服务区与系统映射表,维护服务区名称/编码关联及版本控制
+-- 中文名: BSS服务区信息映射表
+-- 描述: BSS服务区信息映射表,记录服务区名称、编码及版本操作记录
 create table public.bss_service_area_mapper (
-  id varchar(32) not null     -- 主键ID,主键,
-  version integer not null    -- 版本号,
-  create_ts timestamp         -- 创建时间,
-  created_by varchar(50)      -- 创建人,
-  update_ts timestamp         -- 更新时间,
-  updated_by varchar(50)      -- 更新人,
-  delete_ts timestamp         -- 删除时间,
-  deleted_by varchar(50)      -- 删除人,
-  service_name varchar(255)   -- 服务区名称,
-  service_no varchar(255)     -- 服务区编码,
-  service_area_id varchar(32) -- 服务区ID,
+  id varchar(32) not null     -- 主键标识符,主键,
+  version integer not null    -- 记录版本号,
+  create_ts timestamp         -- 记录创建时间,
+  created_by varchar(50)      -- 记录创建人,
+  update_ts timestamp         -- 最后更新时间,
+  updated_by varchar(50)      -- 最后更新人,
+  delete_ts timestamp         -- 删除时间(软删除),
+  deleted_by varchar(50)      -- 删除操作人,
+  service_name varchar(255)   -- 服务区中文名称,
+  service_no varchar(255)     -- 服务区编码编号,
+  service_area_id varchar(32) -- 服务区唯一标识,
   source_system_type varchar(50) -- 数据来源系统类型,
-  source_type integer         -- 数据来源类别ID,
+  source_type integer         -- 数据来源类别代码,
   primary key (id)
 );

+ 14 - 14
output/bss_service_area_mapper_detail.md

@@ -1,19 +1,19 @@
-## bss_service_area_mapper(服务区与系统映射表)
-bss_service_area_mapper 表服务区与系统映射表,维护服务区名称/编码关联及版本控制
+## bss_service_area_mapper(BSS服务区信息映射表)
+bss_service_area_mapper 表BSS服务区信息映射表,记录服务区名称、编码及版本操作记录
 字段列表:
-- id (varchar(32)) - 主键ID [主键, 非空] [示例: 00e1e893909211ed8ee6fa163eaf653f, 013867f5962211ed8ee6fa163eaf653f]
-- version (integer) - 版本号 [非空] [示例: 1]
-- create_ts (timestamp) - 创建时间 [示例: 2023-01-10 10:54:03, 2023-01-17 12:47:29]
-- created_by (varchar(50)) - 创建人 [示例: admin]
-- update_ts (timestamp) - 更新时间 [示例: 2023-01-10 10:54:07, 2023-01-17 12:47:32]
-- updated_by (varchar(50)) - 更新人
-- delete_ts (timestamp) - 删除时间
-- deleted_by (varchar(50)) - 删除人
-- service_name (varchar(255)) - 服务区名称 [示例: 信丰西服务区, 南康北服务区]
-- service_no (varchar(255)) - 服务区编码 [示例: 1067, 1062]
-- service_area_id (varchar(32)) - 服务区ID [示例: 97cd6cd516a551409a4d453a58f9e170, fdbdd042962011ed8ee6fa163eaf653f]
+- id (varchar(32)) - 主键标识符 [主键, 非空] [示例: 00e1e893909211ed8ee6fa163eaf653f, 013867f5962211ed8ee6fa163eaf653f]
+- version (integer) - 记录版本号 [非空] [示例: 1]
+- create_ts (timestamp) - 记录创建时间 [示例: 2023-01-10 10:54:03, 2023-01-17 12:47:29]
+- created_by (varchar(50)) - 记录创建人 [示例: admin]
+- update_ts (timestamp) - 最后更新时间 [示例: 2023-01-10 10:54:07, 2023-01-17 12:47:32]
+- updated_by (varchar(50)) - 最后更新人
+- delete_ts (timestamp) - 删除时间(软删除)
+- deleted_by (varchar(50)) - 删除操作
+- service_name (varchar(255)) - 服务区中文名称 [示例: 信丰西服务区, 南康北服务区]
+- service_no (varchar(255)) - 服务区编码编号 [示例: 1067, 1062]
+- service_area_id (varchar(32)) - 服务区唯一标识 [示例: 97cd6cd516a551409a4d453a58f9e170, fdbdd042962011ed8ee6fa163eaf653f]
 - source_system_type (varchar(50)) - 数据来源系统类型 [示例: 驿美, 驿购]
-- source_type (integer) - 数据来源类别ID [示例: 3, 1]
+- source_type (integer) - 数据来源类别代码 [示例: 3, 1]
 字段补充说明:
 - id 为主键
 - source_system_type 为枚举字段,包含取值:司乘管理、商业管理、驿购、驿美、手工录入

+ 1 - 1
output/filename_mapping.txt

@@ -2,7 +2,7 @@
 # 格式: 原始表名 -> 实际文件名
 
 public.bss_business_day_data -> bss_business_day_data_detail.md
-public.bss_car_day_count -> bss_car_day_count_detail_1.md
+public.bss_car_day_count -> bss_car_day_count_detail.md
 public.bss_company -> bss_company_detail.md
 public.bss_section_route -> bss_section_route_detail.md
 public.bss_section_route_area_link -> bss_section_route_area_link_detail.md

+ 0 - 186
output/qs_highway_db_20250623_192120_pair.json

@@ -1,186 +0,0 @@
-[
-  {
-    "question": "最近7天各服务区总收入趋势分析(按日期排序)",
-    "sql": "SELECT oper_date AS 统计日期, service_name AS 服务区名称, SUM(pay_sum) AS 日总收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND oper_date >= CURRENT_DATE - 7 GROUP BY oper_date, service_name ORDER BY oper_date;"
-  },
-  {
-    "question": "本月与上月收入对比分析(按月份分组)",
-    "sql": "SELECT DATE_TRUNC('month', oper_date) AS 月份, SUM(pay_sum) AS 月总收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND oper_date >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' AND oper_date < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month' GROUP BY DATE_TRUNC('month', oper_date) ORDER BY 月份;"
-  },
-  {
-    "question": "累计收入排名前5的服务区(按总支付金额排序)",
-    "sql": "SELECT service_name AS 服务区名称, SUM(pay_sum) AS 累计总收入 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY service_name ORDER BY 累计总收入 DESC LIMIT 5;"
-  },
-  {
-    "question": "各支付方式占比分析(微信/支付宝/现金/其他)",
-    "sql": "SELECT '微信' AS 支付方式, ROUND(SUM(wx)/SUM(pay_sum)*100,2) AS 占比百分比 FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '支付宝', ROUND(SUM(zfb)/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '现金', ROUND(SUM(rmb)/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '其他支付', ROUND((SUM(xs)+SUM(jd))/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL ORDER BY 占比百分比 DESC;"
-  },
-  {
-    "question": "异常数据监控:单日收入突增超过平均值200%的服务区记录",
-    "sql": "WITH daily_avg AS (SELECT AVG(pay_sum) AS avg_income FROM bss_business_day_data WHERE delete_ts IS NULL) SELECT a.oper_date, a.service_name, a.pay_sum, ROUND(a.pay_sum/daily_avg.avg_income,2) AS 倍数 FROM bss_business_day_data a, daily_avg WHERE a.delete_ts IS NULL AND a.pay_sum > daily_avg.avg_income * 2 ORDER BY a.oper_date DESC;"
-  },
-  {
-    "question": "各档口客单价对比分析(按平均订单金额排序)",
-    "sql": "SELECT branch_name AS 档口名称, ROUND(SUM(pay_sum)/SUM(order_sum),2) AS 客单价 FROM bss_business_day_data WHERE delete_ts IS NULL AND order_sum > 0 GROUP BY branch_name ORDER BY 客单价 DESC;"
-  },
-  {
-    "question": "周末与工作日收入差异分析(统计星期几收入分布)",
-    "sql": "SELECT CASE WHEN EXTRACT(DOW FROM oper_date) IN (0,6) THEN '周末' ELSE '工作日' END AS 日期类型, AVG(pay_sum) AS 平均日收入 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY CASE WHEN EXTRACT(DOW FROM oper_date) IN (0,6) THEN '周末' ELSE '工作日' END;"
-  },
-  {
-    "question": "微信支付金额月环比增长趋势分析",
-    "sql": "SELECT DATE_TRUNC('month', oper_date) AS 月份, SUM(wx) AS 微信支付总额, ROUND((SUM(wx) - LAG(SUM(wx),1,0) OVER(ORDER BY DATE_TRUNC('month', oper_date)))/LAG(SUM(wx),1,0) OVER(ORDER BY DATE_TRUNC('month', oper_date))*100,2) AS 环比增长率 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY DATE_TRUNC('month', oper_date) ORDER BY 月份;"
-  },
-  {
-    "question": "庐山服务区各档口收入排名(按支付金额降序排列)",
-    "sql": "SELECT branch_name AS 档口名称, SUM(pay_sum) AS 累计收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND service_name = '庐山服务区' GROUP BY branch_name ORDER BY 累计收入 DESC;"
-  },
-  {
-    "question": "分析不同车辆类型(危化品/城际/过境/其他)对应的服务区平均消费金额差异",
-    "sql": "SELECT c.car_type AS 车辆类型, AVG(b.pay_sum) AS 平均消费金额 FROM bss_business_day_data b JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL GROUP BY c.car_type;"
-  },
-  {
-    "question": "找出最近7天车流量排名前10但订单转化率(订单数/车流量)低于5%的服务区",
-    "sql": "SELECT c.service_area_id AS 服务区ID, SUM(c.customer_count) AS 总车流量, SUM(b.order_sum) AS 总订单数, (SUM(b.order_sum)/SUM(c.customer_count)*100)::numeric(5,2) AS 转化率 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 7 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY c.service_area_id HAVING SUM(b.order_sum)/SUM(c.customer_count) < 0.05 ORDER BY 总车流量 DESC LIMIT 10;"
-  },
-  {
-    "question": "统计各服务区近一月日均车流量与日均消费金额的线性相关性",
-    "sql": "SELECT c.service_area_id AS 服务区ID, CORR(c.customer_count, b.pay_sum) AS 相关性系数 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 30 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY c.service_area_id HAVING COUNT(*) > 20;"
-  },
-  {
-    "question": "对比各分公司管辖服务区的月均车流量和客单价(消费金额/订单数)",
-    "sql": "SELECT com.company_name AS 所属公司, AVG(c.customer_count) AS 月均车流量, AVG(b.pay_sum/b.order_sum) AS 客单价 FROM bss_car_day_count c JOIN bss_service_area s ON c.service_area_id = s.id AND s.delete_ts IS NULL JOIN bss_company com ON s.company_id = com.id AND com.delete_ts IS NULL JOIN bss_service_area_mapper m ON s.id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE EXTRACT(MONTH FROM c.count_date) = EXTRACT(MONTH FROM CURRENT_DATE) AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY com.company_name;"
-  },
-  {
-    "question": "识别昨日车流量超过该服务区历史平均值200%且消费金额下降超过30%的异常服务区",
-    "sql": "WITH daily_avg AS (SELECT service_area_id, AVG(customer_count) AS avg_count FROM bss_car_day_count WHERE delete_ts IS NULL GROUP BY service_area_id) SELECT c.service_area_id AS 服务区ID, c.customer_count AS 昨日车流, a.avg_count AS 历史均值, b.pay_sum AS 昨日消费 FROM bss_car_day_count c JOIN daily_avg a ON c.service_area_id = a.service_area_id JOIN bss_business_day_data b ON c.count_date = b.oper_date JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL AND m.service_name = b.service_name WHERE c.count_date = CURRENT_DATE - 1 AND c.customer_count > 2*a.avg_count AND b.pay_sum < 0.7*(SELECT AVG(pay_sum) FROM bss_business_day_data WHERE service_name = m.service_name AND delete_ts IS NULL);"
-  },
-  {
-    "question": "分析周末与工作日的车型分布变化及对应消费差异",
-    "sql": "SELECT CASE WHEN EXTRACT(ISODOW FROM c.count_date) IN (6,7) THEN '周末' ELSE '工作日' END AS 日期类型, c.car_type AS 车型, COUNT(*) AS 记录次数, AVG(c.customer_count) AS 平均车流, AVG(b.pay_sum) AS 平均消费 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 30 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY ROLLUP(日期类型, 车型);"
-  },
-  {
-    "question": "统计各服务区档口微信支付占比(微信金额/总支付金额)与车流高峰时段的关系",
-    "sql": "SELECT m.service_name AS 服务区名称, b.branch_name AS 档口名称, (b.wx/SUM(b.pay_sum) OVER(PARTITION BY b.service_name, b.oper_date)) * 100 AS 微信占比, CASE WHEN c.customer_count > (SELECT PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY customer_count) FROM bss_car_day_count) THEN '高峰时段' ELSE '非高峰' END AS 车流时段 FROM bss_business_day_data b JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL;"
-  },
-  {
-    "question": "找出最近3天连续出现车流量下降超过15%且消费金额波动异常的服务区",
-    "sql": "WITH daily_diff AS (SELECT service_area_id, count_date, customer_count - LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date) AS flow_diff, (customer_count - LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date))/NULLIF(LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date),0) * 100 AS flow_rate FROM bss_car_day_count WHERE delete_ts IS NULL) SELECT DISTINCT service_area_id AS 服务区ID FROM daily_diff WHERE count_date >= CURRENT_DATE -3 AND flow_rate < -15 GROUP BY service_area_id HAVING COUNT(*) =3;"
-  },
-  {
-    "question": "各管理公司最近一个月平均每车次收入及订单转化率排名",
-    "sql": "SELECT c.company_name AS 公司名称, \n       ROUND(SUM(b.pay_sum)/SUM(car.customer_count), 2) AS 单位车次收入,\n       ROUND(SUM(b.order_sum)*100/SUM(car.customer_count), 2) AS 订单转化率\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id AND sa.delete_ts IS NULL\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-03-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY c.company_name\nORDER BY 单位车次收入 DESC\nLIMIT 10;"
-  },
-  {
-    "question": "不同季度各管理公司人均产出对比分析",
-    "sql": "SELECT c.company_name AS 公司名称,\n       DATE_TRUNC('quarter', b.oper_date) AS 季度,\n       ROUND(SUM(b.pay_sum)/COUNT(DISTINCT b.created_by), 2) AS 人均产出\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id AND sa.delete_ts IS NULL\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nWHERE b.oper_date BETWEEN '2022-01-01' AND '2023-12-31'\nGROUP BY c.company_name, DATE_TRUNC('quarter', b.oper_date)\nORDER BY 季度, 人均产出 DESC;"
-  },
-  {
-    "question": "危化品车辆占比超过10%的服务区运营效率分析",
-    "sql": "SELECT sa.service_area_name AS 服务区名称,\n       c.company_name AS 管理公司,\n       ROUND(SUM(b.pay_sum)/SUM(car.customer_count), 2) AS 单位车次收入,\n       ROUND(SUM(car_chem.customer_count)*100/SUM(car.customer_count), 2) AS 危化品占比\nFROM bss_service_area sa\nJOIN bss_company c ON sa.company_id = c.id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nJOIN bss_car_day_count car_chem ON sa.id = car_chem.service_area_id\nWHERE car.count_date = b.oper_date\n  AND car_chem.car_type = '危化品'\nGROUP BY sa.service_area_name, c.company_name\nHAVING SUM(car_chem.customer_count)*100/SUM(car.customer_count) > 10\nORDER BY 危化品占比 DESC;"
-  },
-  {
-    "question": "城际车辆流量与夜间收入占比关系分析(20:00-6:00时段)",
-    "sql": "SELECT c.company_name AS 管理公司,\n       SUM(car.customer_count) AS 城际车流量,\n       ROUND(SUM(CASE WHEN EXTRACT(HOUR FROM b.create_ts) BETWEEN 20 AND 23 OR EXTRACT(HOUR FROM b.create_ts) BETWEEN 0 AND 6 THEN b.pay_sum ELSE 0 END)*100/SUM(b.pay_sum), 2) AS 夜间收入占比\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE car.car_type = '城际'\n  AND car.count_date = b.oper_date\nGROUP BY c.company_name\nORDER BY 城际车流量 DESC;"
-  },
-  {
-    "question": "各支付方式订单转化率区域分布热力图",
-    "sql": "SELECT sa.service_position AS 坐标,\n       ROUND(SUM(b.wx_order + b.zf_order + b.rmb_order)*100/SUM(car.customer_count), 2) AS 综合转化率,\n       ROUND(SUM(b.wx_order)*100/SUM(b.order_sum), 2) AS 微信占比\nFROM bss_service_area sa\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY sa.service_position;"
-  },
-  {
-    "question": "资源闲置率最高的5个服务区(连续3个月营收下降)",
-    "sql": "WITH monthly_revenue AS (\n  SELECT service_no,\n         DATE_TRUNC('month', oper_date) AS 月份,\n         SUM(pay_sum) AS 总营收\n  FROM bss_business_day_data\n  WHERE oper_date BETWEEN '2022-12-01' AND '2023-02-28'\n  GROUP BY service_no, DATE_TRUNC('month', oper_date)\n),\nrevenue_trend AS (\n  SELECT service_no,\n         ARRAY_AGG(总营收 ORDER BY 月份) AS 收益序列\n  FROM monthly_revenue\n  GROUP BY service_no\n)\nSELECT sa.service_area_name AS 服务区名称,\n       r.收益序列[3] - r.收益序列[1] AS 下降幅度\nFROM revenue_trend r\nJOIN bss_service_area sa ON r.service_no = sa.service_area_no\nWHERE r.收益序列[3] < r.收益序列[2] AND r.收益序列[2] < r.收益序列[1]\nORDER BY 下降幅度 ASC\nLIMIT 5;"
-  },
-  {
-    "question": "节假日与工作日运营效率差异对比(春节假期 vs 常规周)",
-    "sql": "SELECT \n  CASE WHEN b.oper_date BETWEEN '2023-01-21' AND '2023-01-27' THEN '春节假期' ELSE '常规周' END AS 时段类型,\n  ROUND(AVG(b.pay_sum/car.customer_count), 2) AS 平均单车收入,\n  ROUND(AVG(b.order_sum/car.customer_count), 2) AS 平均转化率\nFROM bss_business_day_data b\nJOIN bss_car_day_count car ON b.service_no = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-01-10' AND '2023-02-10'\n  AND car.count_date = b.oper_date\nGROUP BY \n  CASE WHEN b.oper_date BETWEEN '2023-01-21' AND '2023-01-27' THEN '春节假期' ELSE '常规周' END;"
-  },
-  {
-    "question": "新入驻公司首月运营效率达标情况检查",
-    "sql": "SELECT c.company_name AS 公司名称,\n       sa.service_area_name AS 服务区,\n       ROUND(SUM(b.pay_sum)/COUNT(DISTINCT b.oper_date), 2) AS 日均营收,\n       ROUND(SUM(b.order_sum)/COUNT(DISTINCT b.oper_date), 2) AS 日均订单量\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nWHERE sa.create_ts BETWEEN '2023-01-01' AND '2023-03-31'\nGROUP BY c.company_name, sa.service_area_name\nHAVING SUM(b.pay_sum)/COUNT(DISTINCT b.oper_date) < 5000;"
-  },
-  {
-    "question": "重点路线服务区运营效率矩阵分析(昌栗高速路段)",
-    "sql": "SELECT sa.service_area_name AS 服务区,\n       ROUND(AVG(b.pay_sum/car.customer_count), 2) AS 单位车次收入,\n       ROUND(AVG(b.order_sum/car.customer_count), 4) AS 转化率\nFROM bss_section_route sr\nJOIN bss_section_route_area_link link ON sr.id = link.section_route_id\nJOIN bss_service_area sa ON link.service_area_id = sa.id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE sr.section_name = '昌栗'\n  AND b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY sa.service_area_name\nORDER BY 单位车次收入 DESC, 转化率 DESC;"
-  },
-  {
-    "question": "各路段车流量分布情况?",
-    "sql": "SELECT section.section_name AS 路段名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY section.section_name ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "对比不同日期各路段的车流量变化趋势?",
-    "sql": "SELECT car.count_date AS 统计日期, section.section_name AS 路段名称, SUM(car.customer_count) AS 日车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY car.count_date, section.section_name ORDER BY 统计日期 ASC;"
-  },
-  {
-    "question": "车流量最高的五个服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id JOIN bss_service_area area ON link.service_area_id = area.id WHERE car.delete_ts IS NULL AND area.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 总车流量 DESC LIMIT 5;"
-  },
-  {
-    "question": "分析工作日与周末的平均车流量差异?",
-    "sql": "SELECT CASE WHEN EXTRACT(DOW FROM car.count_date) IN (0,6) THEN '周末' ELSE '工作日' END AS 日期类型, AVG(customer_count) AS 平均车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE car.delete_ts IS NULL GROUP BY CASE WHEN EXTRACT(DOW FROM car.count_date) IN (0,6) THEN '周末' ELSE '工作日' END;"
-  },
-  {
-    "question": "危化品车辆较多的服务区分布?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(car.customer_count) AS 危化品车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id JOIN bss_service_area area ON link.service_area_id = area.id WHERE car.car_type = '危化品' AND car.delete_ts IS NULL AND area.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 危化品车流量 DESC;"
-  },
-  {
-    "question": "统计每个路段连接的服务区数量?",
-    "sql": "SELECT section.section_name AS 路段名称, COUNT(link.service_area_id) AS 服务区数量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id WHERE section.delete_ts IS NULL GROUP BY section.section_name ORDER BY 服务区数量 DESC;"
-  },
-  {
-    "question": "分析特定路段(如昌栗)的车辆类型分布?",
-    "sql": "SELECT car.car_type AS 车辆类型, SUM(car.customer_count) AS 总车流量, ROUND(SUM(car.customer_count)*100.0/(SELECT SUM(customer_count) FROM bss_car_day_count car2 JOIN bss_section_route_area_link link2 ON car2.service_area_id = link2.service_area_id JOIN bss_section_route sec2 ON link2.section_route_id = sec2.id WHERE sec2.section_name = '昌栗' AND car2.delete_ts IS NULL AND sec2.delete_ts IS NULL),2) AS 占比百分比 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.section_name = '昌栗' AND section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY car.car_type ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "检查是否存在未关联任何路段的服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称 FROM bss_service_area area LEFT JOIN bss_section_route_area_link link ON area.id = link.service_area_id WHERE link.section_route_id IS NULL AND area.delete_ts IS NULL;"
-  },
-  {
-    "question": "最近7天各路段的车流量统计?",
-    "sql": "SELECT section.section_name AS 路段名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL AND car.count_date >= CURRENT_DATE - 7 GROUP BY section.section_name ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "找出订单总数与车流量相关性高的服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(business.order_sum) AS 总订单数, SUM(car.customer_count) AS 总车流量, ROUND(SUM(business.order_sum)*1.0/SUM(car.customer_count),4) AS 订单车流比 FROM bss_service_area area JOIN bss_business_day_data business ON area.service_area_name = business.service_name JOIN bss_car_day_count car ON area.id = car.service_area_id WHERE area.delete_ts IS NULL AND business.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 订单车流比 DESC;"
-  },
-  {
-    "question": "不同数据来源类别的业务数据记录数量对比",
-    "sql": "SELECT sa.source_type AS 数据来源类别, COUNT(*) AS 记录数量 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY sa.source_type ORDER BY 记录数量 DESC;"
-  },
-  {
-    "question": "近30天各服务区微信支付金额波动趋势分析",
-    "sql": "SELECT oper_date AS 统计日期, service_name AS 服务区名称, SUM(wx) AS 微信支付总额 FROM bss_business_day_data WHERE oper_date >= CURRENT_DATE - 30 AND delete_ts IS NULL GROUP BY oper_date, service_name ORDER BY oper_date DESC LIMIT 100;"
-  },
-  {
-    "question": "版本变更次数超过5次的服务区映射信息",
-    "sql": "SELECT service_name AS 服务区名称, COUNT(version) AS 版本变更次数 FROM bss_service_area_mapper WHERE delete_ts IS NULL GROUP BY service_name HAVING COUNT(version) > 5 ORDER BY 版本变更次数 DESC;"
-  },
-  {
-    "question": "检查服务区编码与名称的匹配一致性",
-    "sql": "SELECT bdd.service_no AS 业务数据编码, bdd.service_name AS 业务数据名称, sa.service_name AS 映射表名称 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.service_name != sa.service_name AND bdd.delete_ts IS NULL LIMIT 50;"
-  },
-  {
-    "question": "最近7天每日新增业务数据量的时效性分析",
-    "sql": "SELECT DATE(create_ts) AS 创建日期, COUNT(*) AS 新增记录数 FROM bss_business_day_data WHERE create_ts >= CURRENT_DATE - 7 AND delete_ts IS NULL GROUP BY DATE(create_ts) ORDER BY 创建日期 DESC;"
-  },
-  {
-    "question": "不同支付方式订单占比分布统计",
-    "sql": "SELECT '微信' AS 支付方式, SUM(wx_order) AS 订单数 FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '支付宝', SUM(zf_order) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '现金', SUM(rmb_order) FROM bss_business_day_data WHERE delete_ts IS NULL ORDER BY 订单数 DESC;"
-  },
-  {
-    "question": "检查超过30天未更新的业务数据记录",
-    "sql": "SELECT service_name AS 服务区名称, oper_date AS 统计日期, update_ts AS 最后更新时间 FROM bss_business_day_data WHERE update_ts < CURRENT_DATE - 30 AND delete_ts IS NULL ORDER BY update_ts ASC LIMIT 50;"
-  },
-  {
-    "question": "各服务区不同数据源支付总额差异分析",
-    "sql": "SELECT sa.service_name AS 服务区名称, bdd.source_type AS 数据源类型, SUM(bdd.pay_sum) AS 支付总额 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY sa.service_name, bdd.source_type HAVING SUM(bdd.pay_sum) > 10000 ORDER BY 支付总额 DESC LIMIT 20;"
-  },
-  {
-    "question": "手工录入数据每月占比变化趋势",
-    "sql": "SELECT DATE_TRUNC('month', bdd.create_ts) AS 月份, COUNT(CASE WHEN sa.source_system_type = '手工录入' THEN 1 END) * 100.0 / COUNT(*) AS 手工录入占比 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY DATE_TRUNC('month', bdd.create_ts) ORDER BY 月份 DESC;"
-  },
-  {
-    "question": "检查同一天同一服务区的重复数据记录",
-    "sql": "SELECT oper_date AS 统计日期, service_area_id AS 服务区ID, COUNT(*) AS 重复次数 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY oper_date, service_area_id HAVING COUNT(*) > 1 ORDER BY 重复次数 DESC LIMIT 30;"
-  }
-]

+ 0 - 202
output/qs_highway_db_20250623_192120_pair.json.backup

@@ -1,202 +0,0 @@
-[
-  {
-    "question": "最近7天各服务区总收入趋势分析(按日期排序)",
-    "sql": "SELECT oper_date AS 统计日期, service_name AS 服务区名称, SUM(pay_sum) AS 日总收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND oper_date >= CURRENT_DATE - 7 GROUP BY oper_date, service_name ORDER BY oper_date;"
-  },
-  {
-    "question": "本月与上月收入对比分析(按月份分组)",
-    "sql": "SELECT DATE_TRUNC('month', oper_date) AS 月份, SUM(pay_sum) AS 月总收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND oper_date >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1 month' AND oper_date < DATE_TRUNC('month', CURRENT_DATE) + INTERVAL '1 month' GROUP BY DATE_TRUNC('month', oper_date) ORDER BY 月份;"
-  },
-  {
-    "question": "累计收入排名前5的服务区(按总支付金额排序)",
-    "sql": "SELECT service_name AS 服务区名称, SUM(pay_sum) AS 累计总收入 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY service_name ORDER BY 累计总收入 DESC LIMIT 5;"
-  },
-  {
-    "question": "各支付方式占比分析(微信/支付宝/现金/其他)",
-    "sql": "SELECT '微信' AS 支付方式, ROUND(SUM(wx)/SUM(pay_sum)*100,2) AS 占比百分比 FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '支付宝', ROUND(SUM(zfb)/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '现金', ROUND(SUM(rmb)/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '其他支付', ROUND((SUM(xs)+SUM(jd))/SUM(pay_sum)*100,2) FROM bss_business_day_data WHERE delete_ts IS NULL ORDER BY 占比百分比 DESC;"
-  },
-  {
-    "question": "异常数据监控:单日收入突增超过平均值200%的服务区记录",
-    "sql": "WITH daily_avg AS (SELECT AVG(pay_sum) AS avg_income FROM bss_business_day_data WHERE delete_ts IS NULL) SELECT a.oper_date, a.service_name, a.pay_sum, ROUND(a.pay_sum/daily_avg.avg_income,2) AS 倍数 FROM bss_business_day_data a, daily_avg WHERE a.delete_ts IS NULL AND a.pay_sum > daily_avg.avg_income * 2 ORDER BY a.oper_date DESC;"
-  },
-  {
-    "question": "各档口客单价对比分析(按平均订单金额排序)",
-    "sql": "SELECT branch_name AS 档口名称, ROUND(SUM(pay_sum)/SUM(order_sum),2) AS 客单价 FROM bss_business_day_data WHERE delete_ts IS NULL AND order_sum > 0 GROUP BY branch_name ORDER BY 客单价 DESC;"
-  },
-  {
-    "question": "周末与工作日收入差异分析(统计星期几收入分布)",
-    "sql": "SELECT CASE WHEN EXTRACT(DOW FROM oper_date) IN (0,6) THEN '周末' ELSE '工作日' END AS 日期类型, AVG(pay_sum) AS 平均日收入 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY CASE WHEN EXTRACT(DOW FROM oper_date) IN (0,6) THEN '周末' ELSE '工作日' END;"
-  },
-  {
-    "question": "微信支付金额月环比增长趋势分析",
-    "sql": "SELECT DATE_TRUNC('month', oper_date) AS 月份, SUM(wx) AS 微信支付总额, ROUND((SUM(wx) - LAG(SUM(wx),1,0) OVER(ORDER BY DATE_TRUNC('month', oper_date)))/LAG(SUM(wx),1,0) OVER(ORDER BY DATE_TRUNC('month', oper_date))*100,2) AS 环比增长率 FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY DATE_TRUNC('month', oper_date) ORDER BY 月份;"
-  },
-  {
-    "question": "庐山服务区各档口收入排名(按支付金额降序排列)",
-    "sql": "SELECT branch_name AS 档口名称, SUM(pay_sum) AS 累计收入 FROM bss_business_day_data WHERE delete_ts IS NULL AND service_name = '庐山服务区' GROUP BY branch_name ORDER BY 累计收入 DESC;"
-  },
-  {
-    "question": "车辆数量与订单量相关性分析(关联车流数据)",
-    "sql": "SELECT a.oper_date, a.order_sum AS 订单数量, b.customer_count AS 车辆数量, ROUND(CORR(a.order_sum, b.customer_count),2) AS 相关系数 FROM (SELECT oper_date, SUM(order_sum) AS order_sum FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY oper_date) a JOIN (SELECT count_date, SUM(customer_count) AS customer_count FROM bss_car_day_count GROUP BY count_date) b ON a.oper_date = b.count_date GROUP BY a.oper_date;"
-  },
-  {
-    "question": "分析不同车辆类型(危化品/城际/过境/其他)对应的服务区平均消费金额差异",
-    "sql": "SELECT c.car_type AS 车辆类型, AVG(b.pay_sum) AS 平均消费金额 FROM bss_business_day_data b JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL GROUP BY c.car_type;"
-  },
-  {
-    "question": "找出最近7天车流量排名前10但订单转化率(订单数/车流量)低于5%的服务区",
-    "sql": "SELECT c.service_area_id AS 服务区ID, SUM(c.customer_count) AS 总车流量, SUM(b.order_sum) AS 总订单数, (SUM(b.order_sum)/SUM(c.customer_count)*100)::numeric(5,2) AS 转化率 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 7 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY c.service_area_id HAVING SUM(b.order_sum)/SUM(c.customer_count) < 0.05 ORDER BY 总车流量 DESC LIMIT 10;"
-  },
-  {
-    "question": "统计各服务区近一月日均车流量与日均消费金额的线性相关性",
-    "sql": "SELECT c.service_area_id AS 服务区ID, CORR(c.customer_count, b.pay_sum) AS 相关性系数 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 30 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY c.service_area_id HAVING COUNT(*) > 20;"
-  },
-  {
-    "question": "对比各分公司管辖服务区的月均车流量和客单价(消费金额/订单数)",
-    "sql": "SELECT com.company_name AS 所属公司, AVG(c.customer_count) AS 月均车流量, AVG(b.pay_sum/b.order_sum) AS 客单价 FROM bss_car_day_count c JOIN bss_service_area s ON c.service_area_id = s.id AND s.delete_ts IS NULL JOIN bss_company com ON s.company_id = com.id AND com.delete_ts IS NULL JOIN bss_service_area_mapper m ON s.id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE EXTRACT(MONTH FROM c.count_date) = EXTRACT(MONTH FROM CURRENT_DATE) AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY com.company_name;"
-  },
-  {
-    "question": "识别昨日车流量超过该服务区历史平均值200%且消费金额下降超过30%的异常服务区",
-    "sql": "WITH daily_avg AS (SELECT service_area_id, AVG(customer_count) AS avg_count FROM bss_car_day_count WHERE delete_ts IS NULL GROUP BY service_area_id) SELECT c.service_area_id AS 服务区ID, c.customer_count AS 昨日车流, a.avg_count AS 历史均值, b.pay_sum AS 昨日消费 FROM bss_car_day_count c JOIN daily_avg a ON c.service_area_id = a.service_area_id JOIN bss_business_day_data b ON c.count_date = b.oper_date JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL AND m.service_name = b.service_name WHERE c.count_date = CURRENT_DATE - 1 AND c.customer_count > 2*a.avg_count AND b.pay_sum < 0.7*(SELECT AVG(pay_sum) FROM bss_business_day_data WHERE service_name = m.service_name AND delete_ts IS NULL);"
-  },
-  {
-    "question": "分析周末与工作日的车型分布变化及对应消费差异",
-    "sql": "SELECT CASE WHEN EXTRACT(ISODOW FROM c.count_date) IN (6,7) THEN '周末' ELSE '工作日' END AS 日期类型, c.car_type AS 车型, COUNT(*) AS 记录次数, AVG(c.customer_count) AS 平均车流, AVG(b.pay_sum) AS 平均消费 FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE c.count_date >= CURRENT_DATE - 30 AND c.delete_ts IS NULL AND b.delete_ts IS NULL GROUP BY ROLLUP(日期类型, 车型);"
-  },
-  {
-    "question": "统计各服务区档口微信支付占比(微信金额/总支付金额)与车流高峰时段的关系",
-    "sql": "SELECT m.service_name AS 服务区名称, b.branch_name AS 档口名称, (b.wx/SUM(b.pay_sum) OVER(PARTITION BY b.service_name, b.oper_date)) * 100 AS 微信占比, CASE WHEN c.customer_count > (SELECT PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY customer_count) FROM bss_car_day_count) THEN '高峰时段' ELSE '非高峰' END AS 车流时段 FROM bss_business_day_data b JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL;"
-  },
-  {
-    "question": "预测未来一周各服务区基于历史车流与消费数据的消费趋势(使用线性回归)",
-    "sql": "SELECT service_area_id AS 服务区ID, date, REGR_INTERCEPT(pay_sum, day_num) + REGR_SLOPE(pay_sum, day_num) * EXTRACT(EPOCH FROM date)/86400 AS 预测消费 FROM (SELECT c.service_area_id, b.oper_date AS date, EXTRACT(EPOCH FROM b.oper_date - CURRENT_DATE + 7) AS day_num, b.pay_sum FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE b.oper_date BETWEEN CURRENT_DATE - 30 AND CURRENT_DATE AND c.delete_ts IS NULL AND b.delete_ts IS NULL) sub GROUP BY service_area_id, date;"
-  },
-  {
-    "question": "找出最近3天连续出现车流量下降超过15%且消费金额波动异常的服务区",
-    "sql": "WITH daily_diff AS (SELECT service_area_id, count_date, customer_count - LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date) AS flow_diff, (customer_count - LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date))/NULLIF(LAG(customer_count,1) OVER(PARTITION BY service_area_id ORDER BY count_date),0) * 100 AS flow_rate FROM bss_car_day_count WHERE delete_ts IS NULL) SELECT DISTINCT service_area_id AS 服务区ID FROM daily_diff WHERE count_date >= CURRENT_DATE -3 AND flow_rate < -15 GROUP BY service_area_id HAVING COUNT(*) =3;"
-  },
-  {
-    "question": "分析不同档口类型(餐饮/零售/其他)的消费转化率与车流密度(车流量/营业面积)的关系",
-    "sql": "SELECT b.branch_type AS 档口类型, c.customer_count / NULLIF(s.area,0) AS 车流密度, SUM(b.order_sum)/SUM(c.customer_count) AS 转化率 FROM bss_business_day_data b JOIN (SELECT branch_name, CASE WHEN branch_name LIKE '%餐饮%' THEN '餐饮' WHEN branch_name LIKE '%零售%' THEN '零售' ELSE '其他' END AS branch_type FROM bss_business_day_data GROUP BY branch_name) t ON b.branch_name = t.branch_name JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date JOIN (SELECT id, (RANDOM()*1000+500)::INT AS area FROM bss_service_area) s ON m.service_area_id = s.id WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL GROUP BY ROLLUP(branch_type);"
-  },
-  {
-    "question": "各管理公司最近一个月平均每车次收入及订单转化率排名",
-    "sql": "SELECT c.company_name AS 公司名称, \n       ROUND(SUM(b.pay_sum)/SUM(car.customer_count), 2) AS 单位车次收入,\n       ROUND(SUM(b.order_sum)*100/SUM(car.customer_count), 2) AS 订单转化率\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id AND sa.delete_ts IS NULL\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-03-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY c.company_name\nORDER BY 单位车次收入 DESC\nLIMIT 10;"
-  },
-  {
-    "question": "不同季度各管理公司人均产出对比分析",
-    "sql": "SELECT c.company_name AS 公司名称,\n       DATE_TRUNC('quarter', b.oper_date) AS 季度,\n       ROUND(SUM(b.pay_sum)/COUNT(DISTINCT b.created_by), 2) AS 人均产出\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id AND sa.delete_ts IS NULL\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nWHERE b.oper_date BETWEEN '2022-01-01' AND '2023-12-31'\nGROUP BY c.company_name, DATE_TRUNC('quarter', b.oper_date)\nORDER BY 季度, 人均产出 DESC;"
-  },
-  {
-    "question": "危化品车辆占比超过10%的服务区运营效率分析",
-    "sql": "SELECT sa.service_area_name AS 服务区名称,\n       c.company_name AS 管理公司,\n       ROUND(SUM(b.pay_sum)/SUM(car.customer_count), 2) AS 单位车次收入,\n       ROUND(SUM(car_chem.customer_count)*100/SUM(car.customer_count), 2) AS 危化品占比\nFROM bss_service_area sa\nJOIN bss_company c ON sa.company_id = c.id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nJOIN bss_car_day_count car_chem ON sa.id = car_chem.service_area_id\nWHERE car.count_date = b.oper_date\n  AND car_chem.car_type = '危化品'\nGROUP BY sa.service_area_name, c.company_name\nHAVING SUM(car_chem.customer_count)*100/SUM(car.customer_count) > 10\nORDER BY 危化品占比 DESC;"
-  },
-  {
-    "question": "城际车辆流量与夜间收入占比关系分析(20:00-6:00时段)",
-    "sql": "SELECT c.company_name AS 管理公司,\n       SUM(car.customer_count) AS 城际车流量,\n       ROUND(SUM(CASE WHEN EXTRACT(HOUR FROM b.create_ts) BETWEEN 20 AND 23 OR EXTRACT(HOUR FROM b.create_ts) BETWEEN 0 AND 6 THEN b.pay_sum ELSE 0 END)*100/SUM(b.pay_sum), 2) AS 夜间收入占比\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE car.car_type = '城际'\n  AND car.count_date = b.oper_date\nGROUP BY c.company_name\nORDER BY 城际车流量 DESC;"
-  },
-  {
-    "question": "各支付方式订单转化率区域分布热力图",
-    "sql": "SELECT sa.service_position AS 坐标,\n       ROUND(SUM(b.wx_order + b.zf_order + b.rmb_order)*100/SUM(car.customer_count), 2) AS 综合转化率,\n       ROUND(SUM(b.wx_order)*100/SUM(b.order_sum), 2) AS 微信占比\nFROM bss_service_area sa\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY sa.service_position;"
-  },
-  {
-    "question": "资源闲置率最高的5个服务区(连续3个月营收下降)",
-    "sql": "WITH monthly_revenue AS (\n  SELECT service_no,\n         DATE_TRUNC('month', oper_date) AS 月份,\n         SUM(pay_sum) AS 总营收\n  FROM bss_business_day_data\n  WHERE oper_date BETWEEN '2022-12-01' AND '2023-02-28'\n  GROUP BY service_no, DATE_TRUNC('month', oper_date)\n),\nrevenue_trend AS (\n  SELECT service_no,\n         ARRAY_AGG(总营收 ORDER BY 月份) AS 收益序列\n  FROM monthly_revenue\n  GROUP BY service_no\n)\nSELECT sa.service_area_name AS 服务区名称,\n       r.收益序列[3] - r.收益序列[1] AS 下降幅度\nFROM revenue_trend r\nJOIN bss_service_area sa ON r.service_no = sa.service_area_no\nWHERE r.收益序列[3] < r.收益序列[2] AND r.收益序列[2] < r.收益序列[1]\nORDER BY 下降幅度 ASC\nLIMIT 5;"
-  },
-  {
-    "question": "节假日与工作日运营效率差异对比(春节假期 vs 常规周)",
-    "sql": "SELECT \n  CASE WHEN b.oper_date BETWEEN '2023-01-21' AND '2023-01-27' THEN '春节假期' ELSE '常规周' END AS 时段类型,\n  ROUND(AVG(b.pay_sum/car.customer_count), 2) AS 平均单车收入,\n  ROUND(AVG(b.order_sum/car.customer_count), 2) AS 平均转化率\nFROM bss_business_day_data b\nJOIN bss_car_day_count car ON b.service_no = car.service_area_id\nWHERE b.oper_date BETWEEN '2023-01-10' AND '2023-02-10'\n  AND car.count_date = b.oper_date\nGROUP BY \n  CASE WHEN b.oper_date BETWEEN '2023-01-21' AND '2023-01-27' THEN '春节假期' ELSE '常规周' END;"
-  },
-  {
-    "question": "各区域管理公司单位能耗产出对比(需结合能耗表)",
-    "sql": "SELECT c.company_name AS 公司名称,\n       ROUND(SUM(b.pay_sum)/SUM(e.energy_consumption), 2) AS 单位能耗产出\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\n-- 假设存在能耗表 energy_consumption_table e\n-- JOIN energy_consumption_table e ON sa.id = e.service_area_id\nWHERE b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'\nGROUP BY c.company_name\nORDER BY 单位能耗产出 DESC;"
-  },
-  {
-    "question": "新入驻公司首月运营效率达标情况检查",
-    "sql": "SELECT c.company_name AS 公司名称,\n       sa.service_area_name AS 服务区,\n       ROUND(SUM(b.pay_sum)/COUNT(DISTINCT b.oper_date), 2) AS 日均营收,\n       ROUND(SUM(b.order_sum)/COUNT(DISTINCT b.oper_date), 2) AS 日均订单量\nFROM bss_company c\nJOIN bss_service_area sa ON c.id = sa.company_id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nWHERE sa.create_ts BETWEEN '2023-01-01' AND '2023-03-31'\nGROUP BY c.company_name, sa.service_area_name\nHAVING SUM(b.pay_sum)/COUNT(DISTINCT b.oper_date) < 5000;"
-  },
-  {
-    "question": "重点路线服务区运营效率矩阵分析(昌栗高速路段)",
-    "sql": "SELECT sa.service_area_name AS 服务区,\n       ROUND(AVG(b.pay_sum/car.customer_count), 2) AS 单位车次收入,\n       ROUND(AVG(b.order_sum/car.customer_count), 4) AS 转化率\nFROM bss_section_route sr\nJOIN bss_section_route_area_link link ON sr.id = link.section_route_id\nJOIN bss_service_area sa ON link.service_area_id = sa.id\nJOIN bss_business_day_data b ON sa.service_area_no = b.service_no\nJOIN bss_car_day_count car ON sa.id = car.service_area_id\nWHERE sr.section_name = '昌栗'\n  AND b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'\n  AND car.count_date = b.oper_date\nGROUP BY sa.service_area_name\nORDER BY 单位车次收入 DESC, 转化率 DESC;"
-  },
-  {
-    "question": "各路段车流量分布情况?",
-    "sql": "SELECT section.section_name AS 路段名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY section.section_name ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "对比不同日期各路段的车流量变化趋势?",
-    "sql": "SELECT car.count_date AS 统计日期, section.section_name AS 路段名称, SUM(car.customer_count) AS 日车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY car.count_date, section.section_name ORDER BY 统计日期 ASC;"
-  },
-  {
-    "question": "车流量最高的五个服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id JOIN bss_service_area area ON link.service_area_id = area.id WHERE car.delete_ts IS NULL AND area.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 总车流量 DESC LIMIT 5;"
-  },
-  {
-    "question": "分析工作日与周末的平均车流量差异?",
-    "sql": "SELECT CASE WHEN EXTRACT(DOW FROM car.count_date) IN (0,6) THEN '周末' ELSE '工作日' END AS 日期类型, AVG(customer_count) AS 平均车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE car.delete_ts IS NULL GROUP BY CASE WHEN EXTRACT(DOW FROM car.count_date) IN (0,6) THEN '周末' ELSE '工作日' END;"
-  },
-  {
-    "question": "危化品车辆较多的服务区分布?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(car.customer_count) AS 危化品车流量 FROM bss_section_route_area_link link JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id JOIN bss_service_area area ON link.service_area_id = area.id WHERE car.car_type = '危化品' AND car.delete_ts IS NULL AND area.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 危化品车流量 DESC;"
-  },
-  {
-    "question": "统计每个路段连接的服务区数量?",
-    "sql": "SELECT section.section_name AS 路段名称, COUNT(link.service_area_id) AS 服务区数量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id WHERE section.delete_ts IS NULL GROUP BY section.section_name ORDER BY 服务区数量 DESC;"
-  },
-  {
-    "question": "分析特定路段(如昌栗)的车辆类型分布?",
-    "sql": "SELECT car.car_type AS 车辆类型, SUM(car.customer_count) AS 总车流量, ROUND(SUM(car.customer_count)*100.0/(SELECT SUM(customer_count) FROM bss_car_day_count car2 JOIN bss_section_route_area_link link2 ON car2.service_area_id = link2.service_area_id JOIN bss_section_route sec2 ON link2.section_route_id = sec2.id WHERE sec2.section_name = '昌栗' AND car2.delete_ts IS NULL AND sec2.delete_ts IS NULL),2) AS 占比百分比 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.section_name = '昌栗' AND section.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY car.car_type ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "检查是否存在未关联任何路段的服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称 FROM bss_service_area area LEFT JOIN bss_section_route_area_link link ON area.id = link.service_area_id WHERE link.section_route_id IS NULL AND area.delete_ts IS NULL;"
-  },
-  {
-    "question": "最近7天各路段的车流量统计?",
-    "sql": "SELECT section.section_name AS 路段名称, SUM(car.customer_count) AS 总车流量 FROM bss_section_route section JOIN bss_section_route_area_link link ON section.id = link.section_route_id JOIN bss_car_day_count car ON link.service_area_id = car.service_area_id WHERE section.delete_ts IS NULL AND car.delete_ts IS NULL AND car.count_date >= CURRENT_DATE - 7 GROUP BY section.section_name ORDER BY 总车流量 DESC;"
-  },
-  {
-    "question": "找出订单总数与车流量相关性高的服务区?",
-    "sql": "SELECT area.service_area_name AS 服务区名称, SUM(business.order_sum) AS 总订单数, SUM(car.customer_count) AS 总车流量, ROUND(SUM(business.order_sum)*1.0/SUM(car.customer_count),4) AS 订单车流比 FROM bss_service_area area JOIN bss_business_day_data business ON area.service_area_name = business.service_name JOIN bss_car_day_count car ON area.id = car.service_area_id WHERE area.delete_ts IS NULL AND business.delete_ts IS NULL AND car.delete_ts IS NULL GROUP BY area.service_area_name ORDER BY 订单车流比 DESC;"
-  },
-  {
-    "question": "不同数据来源类别的业务数据记录数量对比",
-    "sql": "SELECT sa.source_type AS 数据来源类别, COUNT(*) AS 记录数量 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY sa.source_type ORDER BY 记录数量 DESC;"
-  },
-  {
-    "question": "近30天各服务区微信支付金额波动趋势分析",
-    "sql": "SELECT oper_date AS 统计日期, service_name AS 服务区名称, SUM(wx) AS 微信支付总额 FROM bss_business_day_data WHERE oper_date >= CURRENT_DATE - 30 AND delete_ts IS NULL GROUP BY oper_date, service_name ORDER BY oper_date DESC LIMIT 100;"
-  },
-  {
-    "question": "版本变更次数超过5次的服务区映射信息",
-    "sql": "SELECT service_name AS 服务区名称, COUNT(version) AS 版本变更次数 FROM bss_service_area_mapper WHERE delete_ts IS NULL GROUP BY service_name HAVING COUNT(version) > 5 ORDER BY 版本变更次数 DESC;"
-  },
-  {
-    "question": "检查服务区编码与名称的匹配一致性",
-    "sql": "SELECT bdd.service_no AS 业务数据编码, bdd.service_name AS 业务数据名称, sa.service_name AS 映射表名称 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.service_name != sa.service_name AND bdd.delete_ts IS NULL LIMIT 50;"
-  },
-  {
-    "question": "最近7天每日新增业务数据量的时效性分析",
-    "sql": "SELECT DATE(create_ts) AS 创建日期, COUNT(*) AS 新增记录数 FROM bss_business_day_data WHERE create_ts >= CURRENT_DATE - 7 AND delete_ts IS NULL GROUP BY DATE(create_ts) ORDER BY 创建日期 DESC;"
-  },
-  {
-    "question": "不同支付方式订单占比分布统计",
-    "sql": "SELECT '微信' AS 支付方式, SUM(wx_order) AS 订单数 FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '支付宝', SUM(zf_order) FROM bss_business_day_data WHERE delete_ts IS NULL UNION ALL SELECT '现金', SUM(rmb_order) FROM bss_business_day_data WHERE delete_ts IS NULL ORDER BY 订单数 DESC;"
-  },
-  {
-    "question": "检查超过30天未更新的业务数据记录",
-    "sql": "SELECT service_name AS 服务区名称, oper_date AS 统计日期, update_ts AS 最后更新时间 FROM bss_business_day_data WHERE update_ts < CURRENT_DATE - 30 AND delete_ts IS NULL ORDER BY update_ts ASC LIMIT 50;"
-  },
-  {
-    "question": "各服务区不同数据源支付总额差异分析",
-    "sql": "SELECT service_name AS 服务区名称, source_type AS 数据源类型, SUM(pay_sum) AS 支付总额 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY service_name, source_type HAVING SUM(pay_sum) > 10000 ORDER BY 支付总额 DESC LIMIT 20;"
-  },
-  {
-    "question": "手工录入数据每月占比变化趋势",
-    "sql": "SELECT DATE_TRUNC('month', bdd.create_ts) AS 月份, COUNT(CASE WHEN sa.source_system_type = '手工录入' THEN 1 END) * 100.0 / COUNT(*) AS 手工录入占比 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY DATE_TRUNC('month', bdd.create_ts) ORDER BY 月份 DESC;"
-  },
-  {
-    "question": "检查同一天同一服务区的重复数据记录",
-    "sql": "SELECT oper_date AS 统计日期, service_area_id AS 服务区ID, COUNT(*) AS 重复次数 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY oper_date, service_area_id HAVING COUNT(*) > 1 ORDER BY 重复次数 DESC LIMIT 30;"
-  }
-]

+ 0 - 74
output/sql_validation_20250623_220723_summary.txt

@@ -1,74 +0,0 @@
-SQL验证报告
-==================================================
-
-输入文件: output\qs_highway_db_20250623_192120_pair.json
-验证时间: 2025-06-23T22:07:23.116709
-验证耗时: 0.65秒
-
-验证结果摘要:
-  总SQL数量: 50
-  有效SQL: 45
-  无效SQL: 5
-  成功率: 90.00%
-  平均耗时: 0.057秒
-  重试次数: 0
-
-SQL修复统计:
-  尝试修复: 0
-  修复成功: 0
-  修复失败: 0
-
-原始文件修改统计:
-  修改的SQL: 0
-  删除的无效项: 0
-  修改失败: 0
-
-错误详情(共5个):
-==================================================
-
-1. 问题: 车辆数量与订单量相关性分析(关联车流数据)
-   错误: 函数 round(double precision, integer) 不存在
-HINT:  没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
-   LLM修复尝试: 未尝试
-   完整SQL:
-   SELECT a.oper_date, a.order_sum AS 订单数量, b.customer_count AS 车辆数量, ROUND(CORR(a.order_sum, b.customer_count),2) AS 相关系数 FROM (SELECT oper_date, SUM(order_sum) AS order_sum FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY oper_date) a JOIN (SELECT count_date, SUM(customer_count) AS customer_count FROM bss_car_day_count GROUP BY count_date) b ON a.oper_date = b.count_date GROUP BY a.oper_date;
-   ----------------------------------------
-
-2. 问题: 预测未来一周各服务区基于历史车流与消费数据的消费趋势(使用线性回归)
-   错误: 函数 pg_catalog.extract(unknown, integer) 不存在
-HINT:  没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
-   LLM修复尝试: 未尝试
-   完整SQL:
-   SELECT service_area_id AS 服务区ID, date, REGR_INTERCEPT(pay_sum, day_num) + REGR_SLOPE(pay_sum, day_num) * EXTRACT(EPOCH FROM date)/86400 AS 预测消费 FROM (SELECT c.service_area_id, b.oper_date AS date, EXTRACT(EPOCH FROM b.oper_date - CURRENT_DATE + 7) AS day_num, b.pay_sum FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE b.oper_date BETWEEN CURRENT_DATE - 30 AND CURRENT_DATE AND c.delete_ts IS NULL AND b.delete_ts IS NULL) sub GROUP BY service_area_id, date;
-   ----------------------------------------
-
-3. 问题: 分析不同档口类型(餐饮/零售/其他)的消费转化率与车流密度(车流量/营业面积)的关系
-   错误: 字段 b.branch_type 不存在
-HINT:  也许您想要引用列"t.branch_type"。
-   LLM修复尝试: 未尝试
-   完整SQL:
-   SELECT b.branch_type AS 档口类型, c.customer_count / NULLIF(s.area,0) AS 车流密度, SUM(b.order_sum)/SUM(c.customer_count) AS 转化率 FROM bss_business_day_data b JOIN (SELECT branch_name, CASE WHEN branch_name LIKE '%餐饮%' THEN '餐饮' WHEN branch_name LIKE '%零售%' THEN '零售' ELSE '其他' END AS branch_type FROM bss_business_day_data GROUP BY branch_name) t ON b.branch_name = t.branch_name JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date JOIN (SELECT id, (RANDOM()*1000+500)::INT AS area FROM bss_service_area) s ON m.service_area_id = s.id WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL GROUP BY ROLLUP(branch_type);
-   ----------------------------------------
-
-4. 问题: 各区域管理公司单位能耗产出对比(需结合能耗表)
-   错误: 对于表"e",丢失FROM子句项
-   LLM修复尝试: 未尝试
-   完整SQL:
-   SELECT c.company_name AS 公司名称,
-       ROUND(SUM(b.pay_sum)/SUM(e.energy_consumption), 2) AS 单位能耗产出
-FROM bss_company c
-JOIN bss_service_area sa ON c.id = sa.company_id
-JOIN bss_business_day_data b ON sa.service_area_no = b.service_no
--- 假设存在能耗表 energy_consumption_table e
--- JOIN energy_consumption_table e ON sa.id = e.service_area_id
-WHERE b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'
-GROUP BY c.company_name
-ORDER BY 单位能耗产出 DESC;
-   ----------------------------------------
-
-5. 问题: 各服务区不同数据源支付总额差异分析
-   错误: 字段关联 "service_name" 是不明确的
-   LLM修复尝试: 未尝试
-   完整SQL:
-   SELECT service_name AS 服务区名称, source_type AS 数据源类型, SUM(pay_sum) AS 支付总额 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY service_name, source_type HAVING SUM(pay_sum) > 10000 ORDER BY 支付总额 DESC LIMIT 20;
-   ----------------------------------------

+ 0 - 81
output/sql_validation_20250623_221222_summary.txt

@@ -1,81 +0,0 @@
-SQL验证报告
-==================================================
-
-输入文件: output\qs_highway_db_20250623_192120_pair.json
-验证时间: 2025-06-23T22:12:22.207844
-验证耗时: 213.11秒
-
-验证结果摘要:
-  总SQL数量: 50
-  有效SQL: 46
-  无效SQL: 4
-  成功率: 92.00%
-  平均耗时: 0.075秒
-  重试次数: 0
-
-SQL修复统计:
-  尝试修复: 5
-  修复成功: 1
-  修复失败: 4
-  修复成功率: 20.00%
-
-原始文件修改统计:
-  修改的SQL: 1
-  删除的无效项: 4
-  修改失败: 0
-
-错误详情(共4个):
-==================================================
-
-1. 问题: 车辆数量与订单量相关性分析(关联车流数据)
-   错误: 函数 round(double precision, integer) 不存在
-HINT:  没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
-   LLM修复尝试: 失败
-   修复失败原因: LLM修复失败或返回空结果
-   完整SQL:
-   SELECT a.oper_date, a.order_sum AS 订单数量, b.customer_count AS 车辆数量, ROUND(CORR(a.order_sum, b.customer_count),2) AS 相关系数 FROM (SELECT oper_date, SUM(order_sum) AS order_sum FROM bss_business_day_data WHERE delete_ts IS NULL GROUP BY oper_date) a JOIN (SELECT count_date, SUM(customer_count) AS customer_count FROM bss_car_day_count GROUP BY count_date) b ON a.oper_date = b.count_date GROUP BY a.oper_date;
-   ----------------------------------------
-
-2. 问题: 预测未来一周各服务区基于历史车流与消费数据的消费趋势(使用线性回归)
-   错误: 函数 pg_catalog.extract(unknown, integer) 不存在
-HINT:  没有匹配指定名称和参数类型的函数. 您也许需要增加明确的类型转换.
-   LLM修复尝试: 失败
-   修复失败原因: LLM修复失败或返回空结果
-   完整SQL:
-   SELECT service_area_id AS 服务区ID, date, REGR_INTERCEPT(pay_sum, day_num) + REGR_SLOPE(pay_sum, day_num) * EXTRACT(EPOCH FROM date)/86400 AS 预测消费 FROM (SELECT c.service_area_id, b.oper_date AS date, EXTRACT(EPOCH FROM b.oper_date - CURRENT_DATE + 7) AS day_num, b.pay_sum FROM bss_car_day_count c JOIN bss_service_area_mapper m ON c.service_area_id = m.service_area_id AND m.delete_ts IS NULL JOIN bss_business_day_data b ON m.service_name = b.service_name AND c.count_date = b.oper_date WHERE b.oper_date BETWEEN CURRENT_DATE - 30 AND CURRENT_DATE AND c.delete_ts IS NULL AND b.delete_ts IS NULL) sub GROUP BY service_area_id, date;
-   ----------------------------------------
-
-3. 问题: 分析不同档口类型(餐饮/零售/其他)的消费转化率与车流密度(车流量/营业面积)的关系
-   错误: 字段 b.branch_type 不存在
-HINT:  也许您想要引用列"t.branch_type"。
-   LLM修复尝试: 失败
-   修复失败原因: 字段 "c.customer_count" 必须出现在 GROUP BY 子句中或者在聚合函数中使用
-   完整SQL:
-   SELECT b.branch_type AS 档口类型, c.customer_count / NULLIF(s.area,0) AS 车流密度, SUM(b.order_sum)/SUM(c.customer_count) AS 转化率 FROM bss_business_day_data b JOIN (SELECT branch_name, CASE WHEN branch_name LIKE '%餐饮%' THEN '餐饮' WHEN branch_name LIKE '%零售%' THEN '零售' ELSE '其他' END AS branch_type FROM bss_business_day_data GROUP BY branch_name) t ON b.branch_name = t.branch_name JOIN bss_service_area_mapper m ON b.service_name = m.service_name AND m.delete_ts IS NULL JOIN bss_car_day_count c ON m.service_area_id = c.service_area_id AND b.oper_date = c.count_date JOIN (SELECT id, (RANDOM()*1000+500)::INT AS area FROM bss_service_area) s ON m.service_area_id = s.id WHERE b.delete_ts IS NULL AND c.delete_ts IS NULL GROUP BY ROLLUP(branch_type);
-   ----------------------------------------
-
-4. 问题: 各区域管理公司单位能耗产出对比(需结合能耗表)
-   错误: 对于表"e",丢失FROM子句项
-   LLM修复尝试: 失败
-   修复失败原因: 关系 "energy_consumption_table" 不存在
-   完整SQL:
-   SELECT c.company_name AS 公司名称,
-       ROUND(SUM(b.pay_sum)/SUM(e.energy_consumption), 2) AS 单位能耗产出
-FROM bss_company c
-JOIN bss_service_area sa ON c.id = sa.company_id
-JOIN bss_business_day_data b ON sa.service_area_no = b.service_no
--- 假设存在能耗表 energy_consumption_table e
--- JOIN energy_consumption_table e ON sa.id = e.service_area_id
-WHERE b.oper_date BETWEEN '2023-01-01' AND '2023-03-31'
-GROUP BY c.company_name
-ORDER BY 单位能耗产出 DESC;
-   ----------------------------------------
-
-成功修复的SQL(共1个):
-==================================================
-
-1. 问题: 各服务区不同数据源支付总额差异分析
-   原始错误: 字段关联 "service_name" 是不明确的
-   修复后SQL:
-   SELECT sa.service_name AS 服务区名称, bdd.source_type AS 数据源类型, SUM(bdd.pay_sum) AS 支付总额 FROM bss_business_day_data bdd JOIN bss_service_area_mapper sa ON bdd.service_no = sa.service_no WHERE bdd.delete_ts IS NULL GROUP BY sa.service_name, bdd.source_type HAVING SUM(bdd.pay_sum) > 10000 ORDER BY 支付总额 DESC LIMIT 20;
-   ----------------------------------------

+ 1 - 1
schema_tools/qs_agent.py

@@ -217,7 +217,7 @@ class QuestionSQLGenerationAgent:
             qs_pairs = self._parse_qs_response(response)
             
             # 验证和清理
-            validated_pairs = self._validate_qs_pairs(qs_pairs, theme['name'])
+            validated_pairs = self._validate_qs_pairs(qs_pairs, theme_name)
             
             # 保存中间结果
             await self._save_theme_results(theme_name, validated_pairs)

+ 1 - 2
schema_tools/qs_generator.py

@@ -78,8 +78,7 @@ async def main():
     # 设置日志
     setup_logging(
         verbose=args.verbose,
-        log_file=args.log_file,
-        log_dir=os.path.join(args.output_dir, 'logs') if args.output_dir else None
+        log_file=args.log_file
     )
     
     # 验证参数

+ 4 - 3
schema_tools/schema_workflow_orchestrator.py

@@ -94,10 +94,12 @@ class SchemaWorkflowOrchestrator:
             else:
                 self.logger.info("⏭️ 跳过SQL验证步骤")
             
+            # 设置结束时间
+            self.workflow_state["end_time"] = time.time()
+            
             # 生成最终报告
             final_report = await self._generate_final_report()
             
-            self.workflow_state["end_time"] = time.time()
             self.logger.info("✅ Schema工作流编排完成")
             
             return final_report
@@ -519,8 +521,7 @@ async def main():
     # 设置日志
     setup_logging(
         verbose=args.verbose,
-        log_file=args.log_file,
-        log_dir=os.path.join(args.output_dir, 'logs') if args.output_dir else None
+        log_file=args.log_file
     )
     
     # 验证输入文件

+ 1 - 1
schema_tools/sql_validation_agent.py

@@ -229,7 +229,7 @@ class SQLValidationAgent:
         timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
         
         # 只保存文本格式摘要(便于查看)
-        txt_file = self.output_dir / f"{self.config['report_file_prefix']}_{timestamp}_summary.txt"
+        txt_file = self.output_dir / f"{self.config['report_file_prefix']}_{timestamp}_summary.log"
         with open(txt_file, 'w', encoding='utf-8') as f:
             f.write(f"SQL验证报告\n")
             f.write(f"=" * 50 + "\n\n")

+ 1 - 2
schema_tools/sql_validator.py

@@ -189,8 +189,7 @@ async def main():
     # 设置日志
     setup_logging(
         verbose=args.verbose,
-        log_file=args.log_file,
-        log_dir=os.path.join(args.output_dir, 'logs') if args.output_dir else None
+        log_file=args.log_file
     )
     
     # 验证参数