From b5341e6909ad983374b0da98fbcb1b5432e24065 Mon Sep 17 00:00:00 2001 From: yujj128 Date: Tue, 11 Nov 2025 17:06:23 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E7=BB=AD=E5=9C=A8=E8=97=8F=E7=B4=AF?= =?UTF-8?q?=E8=AE=A1=E5=9C=A8=E8=97=8F=E6=8D=A2=E8=A1=A8=E5=A4=84=E7=90=86?= =?UTF-8?q?=EF=BC=8C=E7=BA=A0=E9=94=99=E6=9C=BA=E5=88=B6=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=8D=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- graph_chat/gen_data_report_agent.py | 16 +- template.yaml | 49 +++++- util/q_and_a_dict.py | 80 ++++++++- util/q_and_a_test1.py | 253 +++++++++++++++++++--------- util/train_ddl.py | 61 +++---- 5 files changed, 332 insertions(+), 127 deletions(-) diff --git a/graph_chat/gen_data_report_agent.py b/graph_chat/gen_data_report_agent.py index 1db2899..e24926f 100644 --- a/graph_chat/gen_data_report_agent.py +++ b/graph_chat/gen_data_report_agent.py @@ -45,18 +45,15 @@ def _run_sql(state: DateReportAgentState) -> dict: update_conversation(id=state.get('id'), sql=sql) df = vn.run_sql_2(sql) result = df.to_dict(orient='records') - logger.info(f"run sql result {result}") + logger.info(f"run sql result => {result}") retry = state.get("retry_count", 0) + 1 logger.info(f"old_sql:{sql}, retry sql {retry_sql}") dd= {'data': result, 'retry_count': retry, 'retry_sql': retry_sql,'run_sql_error':''} - #不需要模型反馈,运行成功后则成功 - if not NEED_MODEL_FEEDBACK_QA: - dd['sql_correct']=True return dd except Exception as e: retry = state.get("retry_count", 0) + 1 logger.error(f"Error running sql: {sql}, error: {e}") - return {'retry_count': retry, 'run_sql_error': '运行sql语句失败,请检查语法或联系管理员。'} + return {'retry_count': retry, 'run_sql_error': f'运行sql语句失败,{e}请检查语法或联系管理员。'} def _feedback_qa(state: DateReportAgentState) -> dict: @@ -72,8 +69,10 @@ def _feedback_qa(state: DateReportAgentState) -> dict: ddl_list = vn.get_related_ddl(user_question) qa_list = vn.get_similar_question_sql(user_question) history = state.get('history', []) + document = vn.get_related_documentation(user_question) + sql_error = state.get('run_sql_error', '') sys_promot = feedback_temp['system'].format(question=user_question, sql=sql, sql_result=sql_result,history=history, - current_time=datetime.now(),ddl_list=ddl_list,qa_list=qa_list) + current_time=datetime.now(),ddl_list=ddl_list,qa_list=qa_list,document=document,sql_error=sql_error) logger.info(f"system_temp is {sys_promot}") result = gen_history_llm.invoke(sys_promot).text() logger.info(f"feedback result: {result}") @@ -111,12 +110,14 @@ def handle_with_feedback(state: DateReportAgentState) -> str: logger.info(f"user:{state.get('user_id', '1')} ---------------进入 handle_with_feedback 节点 ---------------") sql_error = state.get('run_sql_error', '') sql_correct = state.get('sql_correct', False) - force_check = config('FORCE_CHECK', False) + force_check = config('FORCE_CHECK', False,cast=bool) sql_retry_count = state.get('retry_count', 0) logger.info(f"handle with feedback sql_retry_count is {sql_retry_count} " f"sql error is {sql_error} sql correct is {sql_correct}") + logger.info(f"force check is {force_check} type") if force_check: + logger.info(f"进入 force check") if sql_retry_count < 3: if sql_correct: return '_gen_report' @@ -130,6 +131,7 @@ def handle_with_feedback(state: DateReportAgentState) -> str: else: if sql_retry_count < 3: if sql_error and len(sql_error) > 0: + logger.info(f"sql_error is {sql_error}") return '_feedback_qa' else: return '_gen_report' diff --git a/template.yaml b/template.yaml index 59ea539..d103c71 100644 --- a/template.yaml +++ b/template.yaml @@ -98,7 +98,7 @@ template: WITH "name"||"shortname" LIKE '%xx中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' CONNECT BY PRIOR "id" = "parentid" - 重点:当用户问题涉及查询:是否,有没有的时候。通过case/when语法结果需要返回:是/否。而不是返回查询记录 + 重点:当用户问题涉及查询:是否,有没有的时候。通过case/when语法结果需要返回:是/否。而不是返回查询记录 关联与限制 @@ -664,46 +664,79 @@ template: result_feedback: system: | # 角色 - 你是一位经验丰富的数据分析师和SQL专家。你的核心任务是对SQL查询和其执行结果进行批判性审查。 + 你是一位注重实效的SQL审查专家。你的任务是**识别明显的技术错误**,而不是过度解读业务逻辑。 # 你的任务 我(用户)向你提供了一系列信息,请你进行分析和反思。 # 输入信息 [原始问题]: {question} [生成的SQL]: {sql}。 [执行结果]: {sql_result}。 + [执行sql报错]:{sql_error} [当前时间]: {current_time} [历史信息]: {history} [表结构信息]:{ddl_list} [问答参考]:{qa_list} + [注意事项文档]:{document} + # 核心审查原则 + ## 重点关注(必须纠正的问题) + 1. **语法硬伤**:明显的SQL语法错误、关键字冲突 + 2. **逻辑矛盾**:WHERE条件相互冲突、JOIN条件错误导致笛卡尔积 + 3. **数据安全**:敏感信息泄露、缺少必要的权限限制 + 4. **性能灾难**:缺失关键索引、全表扫描的写法 + 5. **结果明显异常**:数量级错误、数据类型明显不匹配 + 6. **结果错误**:执行sql有报错 + + ## 适度关注(给出建议但不必判定为错误) + 1. **业务逻辑合理性**:不同的业务理解可能有不同的实现方式 + 2. **模糊匹配精度**:LIKE查询的宽泛程度属于业务选择 + 3. **技术实现选择**:达梦与Oracle的语法兼容性等已验证的技术细节 + 4. **编码规范**:命名风格、格式问题等不影响结果正确性的问题 + + ## 尊重上下文 + - 信任SQL生成器对业务逻辑的理解 + - 认可合理的模糊匹配和近似查询 + - 理解技术选型的合理性 # 核心规则 请根据以上信息,进行全面、细致的反思,并最终判断这个结果是否能正确回答原始问题。你的反思需要包含以下几个步骤: 1. **核对问题理解**: 回顾“原始问题”,确认其核心意图、时间范围、筛选条件和所需字段。 我生成的SQL是否准确捕捉了问题的所有关键要素?有没有遗漏或误解? 当sql和问题吻合,且能查询出结果时,一般判定为正确 - 2. **通用业务定义** - 上周:指完整的**上周一到上周日** - 3. **审查SQL逻辑**: + 2. **审查SQL逻辑**: 逐行分析“生成的SQL”,检查其语法结构是否正确。 关键子句(如 `WHERE`, `GROUP BY`, `HAVING`, `JOIN`)是否准确地反映了查询意图? 聚合函数(如 `SUM`, `COUNT`, `AVG`)的使用是否恰当?分组维度是否正确? - 4. **评估结果合理性**: + 例如: + SQL必须避免与数据库关键字冲突。 + 注意列名定义和使用的先后顺序,例如:SELECT阶段定义了列名,如果GROUP BY阶段先与SELECT阶段执行时,是不许在GROUP BY阶段引用列名的。 + 在ORDER BY、GROUP BY、WHERE子句中不要使用SELECT中定义的别名。 + 注意!当SELECT列中同时包含聚合列(COUNT(), SUM(), AVG())和非聚合列时,必须要在GROUP BY子句中指定所有非聚合列 + 递归 WITH 子句必须具有列别名列表。 + CONNECT BY子查询是独立的,无法访问外部查询的表别名,因此涉及CONNECT BY子查询时,里面禁止使用表别名。 + 使用了聚合函数(如 COUNT(), SUM(), AVG())的SQL,必须配置相应的 GROUP BY 子句。 + 3. **评估结果合理性**: 观察“执行结果”,思考这个结果是否符合业务常识或数据的基本特征(例如,数量级、正负值、范围是否合理)? 结果的列名和内容是否与问题期望的输出一致? - 5. **最终判断和建议**: + 4. **错误等级划分** + - **严重错误**:导致结果完全错误 → 必须纠正 + - **一般问题**:可能影响部分结果 → 建议优化 + - **细节问题**:不影响结果正确性 → 可选优化 + 4. **最终判断和建议**: **结论** : 用一句话明确指出:“结果正确”、“结果可能不正确”或“无法完全确定”。 **原因** : 简练地解释你做出此判断的核心理由。 **改进建议** (如果结果不正确): * 具体指出SQL中可能存在的逻辑错误。 * 给出一个或多个修改后的SQL版本。 * 解释你为什么这样修改。 + # 输出格式 请严格按照以下JSON格式输出你的分析结果: ```json {{ "conclusion": "结果正确 OR 结果可能不正确 OR 无法完全确定", + "confidence_level": "高 | 中 | 低", "reasoning": "对问题理解、SQL逻辑和结果合理性的综合分析说明。", - "is_result_correct": true OR false, + "is_result_correct": true | false, "suggested_sql": "如果结论为不正确,请在此处提供修改后的SQL。如果正确,则为null。" }} Resources: \ No newline at end of file diff --git a/util/q_and_a_dict.py b/util/q_and_a_dict.py index 8bf1da7..454709e 100644 --- a/util/q_and_a_dict.py +++ b/util/q_and_a_dict.py @@ -513,6 +513,82 @@ question_and_answer = [ GROUP BY p."code", p."name" ORDER BY "在林芝工作天数" DESC LIMIT 1000 ''' - } - + }, + #-----------------------------------------------按月查在藏--最早在藏--------------------------------------------------- + { + "question": "张三最早在藏是哪一天", + "answer": ''' + SELECT date_value AS earliest_date + FROM YJOA_APPSERVICE_DB."t_yj_person_status" a + LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + ON p."code" = a."person_id" + WHERE p."name" = '张三' + AND a."dr" = 0 + AND p."dr" =0 + AND a."is_in_tibet" = 1 + ORDER BY a."date_value" ASC LIMIT 1 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "最早在藏时间"], + "category": "工作地考勤统计分析" + }, + { + "question": "张三从5月到10月每个月分别在藏多长时间", + "answer": ''' + SELECT TO_CHAR(a."date_value" , 'yyyy-MM') AS month, COUNT(DISTINCT TO_CHAR(a."date_value" , 'yyyy-MM-dd')) AS tibet_days + FROM YJOA_APPSERVICE_DB."t_yj_person_status" a + LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + ON p."code" = a."person_id" + WHERE p."name" = '张三' + AND a."dr" = 0 + AND p."dr" = 0 + AND a."date_value" >= '2025-05-01' + AND a."date_value" < '2025-11-01' + AND a."is_in_tibet" = 1 + GROUP BY TO_CHAR(a."date_value", 'yyyy-MM') + ORDER BY TO_CHAR(a."date_value", 'yyyy-MM') ASC + LIMIT 1000 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "每月在藏天数"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心在藏最长时间的人是谁", + "answer": ''' + SELECT p."name" AS "姓名", p."code" AS "工号", COUNT(ps."id") AS "在藏天数" + FROM YJOA_APPSERVICE_DB."t_yj_person_status" ps + JOIN YJOA_APPSERVICE_DB."t_pr3rl2oj_yj_person_database" p ON ps."person_id" = p."code" + WHERE ps."is_in_tibet" = 1 + AND ps."dr" = 0 + AND p."dr" = 0 + and p.internal_dept in (SELECT "id" + FROM "IUAP_APDOC_BASEDOC"."org_orgs" START + WITH "name"||"shortname" LIKE '%xx中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + GROUP BY p."name", p."code" + ORDER BY COUNT (ps."id") DESC LIMIT 1 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "累计在藏统计"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心的张三在藏多少天了", + "answer": ''' + SELECT COUNT(*) AS days_in_tibet + FROM YJOA_APPSERVICE_DB."t_yj_person_status" a + LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + ON p."code" = a."person_id" + WHERE p."name" = '张三' + AND p."internal_dept" IN ( + SELECT "id" FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' CONNECT BY PRIOR "id" = "parentid" + ) + AND a.dr = 0 + AND a."is_in_tibet" = 1 + LIMIT 1000 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "工作天数"], + "category": "工作地考勤统计分析" + }, ] diff --git a/util/q_and_a_test1.py b/util/q_and_a_test1.py index 788ec07..7c6e4cd 100644 --- a/util/q_and_a_test1.py +++ b/util/q_and_a_test1.py @@ -912,82 +912,6 @@ question_and_answer = [ "tags": ["员工", "个人", "考勤", "工作地", "区域", "工作天数"], "category": "工作地考勤统计分析" }, - { - "question": "XX中心的张三在藏多少天了", - "answer": ''' - SELECT COUNT(*) AS days_in_tibet - FROM YJOA_APPSERVICE_DB."t_yj_person_status" a - LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p - ON p."code" = a."person_id" - WHERE p."name" = '张三' - AND p."internal_dept" IN ( - SELECT "id" FROM "IUAP_APDOC_BASEDOC"."org_orgs" - START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') - AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' CONNECT BY PRIOR "id" = "parentid" - ) - AND a.dr = 0 - AND a."is_in_tibet" = 1 - LIMIT 1000 - ''', - "tags": ["员工", "个人", "考勤", "工作地", "区域", "工作天数"], - "category": "工作地考勤统计分析" - }, - { - "question": "张三最早在藏是哪一天", - "answer": ''' - SELECT date_value AS earliest_date - FROM YJOA_APPSERVICE_DB."t_yj_person_status" a - LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p - ON p."code" = a."person_id" - WHERE p."name" = '张三' - AND a."dr" = 0 - AND p."dr" =0 - AND a."is_in_tibet" = 1 - ORDER BY a."date_value" ASC LIMIT 1 - ''', - "tags": ["员工", "个人", "考勤", "工作地", "区域", "最早在藏时间"], - "category": "工作地考勤统计分析" - }, - { - "question": "XX中心在藏最长时间的人是谁", - "answer": ''' - SELECT p."name" AS "姓名", p."code" AS "工号", COUNT(ps."id") AS "在藏天数" - FROM YJOA_APPSERVICE_DB."t_yj_person_status" ps - JOIN YJOA_APPSERVICE_DB."t_pr3rl2oj_yj_person_database" p ON ps."person_id" = p."code" - WHERE ps."is_in_tibet" = 1 - AND ps."dr" = 0 - AND p."dr" = 0 - and p.internal_dept in (SELECT "id" - FROM "IUAP_APDOC_BASEDOC"."org_orgs" START - WITH "name"||"shortname" LIKE '%xx中心%' AND "dr"=0 AND "enable"=1 AND "code" LIKE '%CYJ%' - CONNECT BY PRIOR "id" = "parentid" - ) - GROUP BY p."name", p."code" - ORDER BY COUNT (ps."id") DESC LIMIT 1 - ''', - "tags": ["员工", "个人", "考勤", "工作地", "区域", "累计在藏统计"], - "category": "工作地考勤统计分析" - }, - { - "question": "张三从5月到10月每个月分别在藏多长时间", - "answer": ''' - SELECT TO_CHAR(a."date_value" , 'yyyy-MM') AS month, COUNT(DISTINCT TO_CHAR(a."date_value" , 'yyyy-MM-dd')) AS tibet_days - FROM YJOA_APPSERVICE_DB."t_yj_person_status" a - LEFT JOIN "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p - ON p."code" = a."person_id" - WHERE p."name" = '张三' - AND a."dr" = 0 - AND p."dr" = 0 - AND a."date_value" >= '2025-05-01' - AND a."date_value" < '2025-11-01' - AND a."is_in_tibet" = 1 - GROUP BY TO_CHAR(a."date_value", 'yyyy-MM') - ORDER BY TO_CHAR(a."date_value", 'yyyy-MM') ASC - LIMIT 1000 - ''', - "tags": ["员工", "个人", "考勤", "工作地", "区域", "每月在藏天数"], - "category": "工作地考勤统计分析" - }, { "question": "XX中心在林芝最长时间的是谁,待了多少天", "answer": ''' @@ -1204,6 +1128,181 @@ question_and_answer = [ ''', "tags": ["员工", "个人", "考勤", "工作地", "区域", "工作天数"], "category": "工作地考勤统计分析" - } + }, + { + "question": "XX中心在藏最长时间的人是谁", + "answer": ''' + SELECT p."code" AS "人员编号",SUM(pt."count_in_tibat") AS "累计在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + GROUP BY p."code", p."name", o."name" + ORDER BY SUM(pt."count_in_tibat") DESC + LIMIT 1 + ''', + "tags": ["员工", "考勤", "工作地", "区域", "累计在藏统计","最值"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心的张三在藏多少天了", + "answer": ''' + SELECT p."code" AS "人员编号",SUM(pt."count_in_tibat") AS "累计在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."name" = '张三' + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + GROUP BY p."code", p."name", o."name" + ORDER BY SUM(pt."count_in_tibat") DESC + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "累计在藏天数"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心的张三2025年在藏多少天了", + "answer": ''' + SELECT pt."year" AS "年份", p."code" AS "人员编号",pt."count_in_tibat" AS "2025年累计在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."name" = '张三' + AND pt."year" = '2025' + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "累计在藏天数"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心的张三上一次累计在藏多少天", + "answer": ''' + SELECT pt."year" AS "年份",p."code" AS "人员编号",pt."last_count_in_tibat" AS "上一次累计在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."name" = '张三' + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + ORDER BY pt."year" DESC + LIMIT 1 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "上一次累计在藏天数"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心连续在藏最长时间的人是谁", + "answer": ''' + SELECT pt."year" AS "年份",p."code" AS "人员编号",pt."continuous_in_tibet_days" AS "连续在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + ORDER BY pt."year",pt."continuous_in_tibet_days" DESC + LIMIT 1 + ''', + "tags": ["员工", "考勤", "工作地", "区域", "连续在藏统计", "最值"], + "category": "工作地考勤统计分析" + }, + { + "question": "XX中心2025年连续在藏最长时间的人是谁", + "answer": ''' + SELECT pt."year" AS "年份",p."code" AS "人员编号",pt."continuous_in_tibet_days" AS "连续在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND pt."year" = '2025' + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + ORDER BY pt."continuous_in_tibet_days" DESC + LIMIT 1 + ''', + "tags": ["员工", "考勤", "工作地", "区域", "连续在藏统计", "最值"], + "category": "工作地考勤统计分析" + }, + + { + "question": "XX中心的张三连续在藏多少天了", + "answer": ''' + SELECT pt."year" AS "年份",p."code" AS "人员编号",pt."continuous_in_tibet_days" AS "连续在藏天数", p."name" AS "姓名", o."name" AS "部门" + FROM "YJOA_APPSERVICE_DB"."t_pr3rl2oj_yj_person_database" p + INNER JOIN "YJOA_APPSERVICE_DB"."t_yj_person_in_tibat" pt + ON p."code" = pt."person_id" + INNER JOIN "IUAP_APDOC_BASEDOC"."org_orgs" o + ON p."internal_dept" = o."id" + WHERE p."dr" = 0 + AND pt."dr" = 0 + AND p."name" = '张三' + AND p."internal_dept" IN ( + SELECT id + FROM "IUAP_APDOC_BASEDOC"."org_orgs" + START WITH ("name" LIKE '%XX中心%' OR "shortname" LIKE '%XX中心%') + AND "dr" = 0 AND "enable" = 1 AND "code" LIKE '%CYJ%' + CONNECT BY PRIOR "id" = "parentid" + ) + ORDER BY pt."year",pt."continuous_in_tibet_days" DESC + LIMIT 1 + ''', + "tags": ["员工", "个人", "考勤", "工作地", "区域", "连续在藏天数"], + "category": "工作地考勤统计分析" + }, + ] diff --git a/util/train_ddl.py b/util/train_ddl.py index 76f0c2b..7d01404 100644 --- a/util/train_ddl.py +++ b/util/train_ddl.py @@ -12,6 +12,7 @@ train_document=''' 查询部门信息时尽量使用internal_dept而非internal_unit 数信部不是数信中心,两者不能等价 数信中心就叫数信中心,没有数字信息中心这个部门,请勿胡乱替换 + 部门表里code字段中中带CYJ的才是正式加入使用的部门,废弃或测试部门的部门编号则不带CYJ ''' person_database_ddl = """ @@ -660,13 +661,7 @@ person_status_ddl=''' "role": "dimension", "tags": ["休假信息", "请假类型", "枚举", "考勤管理"] }, - { - "name": "is_in_tibet", - "type": "INT", - "comment": "是否在西藏地区", - "role": "dimension", - "tags": ["地区标识", "地理位置"] - }, + { "name": "business_trip_destination", "type": "VARCHAR(50)", @@ -986,57 +981,57 @@ person_ac_area = '''{ person_in_tibat = ''' { "db_name": "YJOA_APPSERVICE_DB", - "table_name": "person_in_tibat", - "table_comment": "人员在藏情况表", + "table_name": "t_yj_person_in_tibat", + "table_comment": "人员累计在藏天数、连续在藏天数,情况表", "columns": [ { "name": "id", "type": "VARCHAR(50)", "comment": "主键ID", "role": "dimension", - "tags": ["唯一标识"] + "tags": ["唯一标识", "主键"] }, { "name": "person_id", "type": "VARCHAR(50)", - "comment": "人员ID", + "comment": "人员唯一标识", "role": "dimension", - "tags": ["人员标识"] + "tags": ["人员标识", "外键"] }, { "name": "year", "type": "VARCHAR(20)", - "comment": "年份", + "comment": "统计年份", "role": "dimension", - "tags": ["时间维度"] + "tags": ["时间维度", "统计周期"] }, { - "name": "create_time", - "type": "DATETIME", - "comment": "创建时间", - "role": "dimension", - "tags": ["时间信息"] - }, - { - "name": "update_time", - "type": "DATETIME", - "comment": "更新时间", - "role": "dimension", - "tags": ["时间信息"] - }, - { - "name": "dr", + "name": "count_in_tibat", "type": "INT", - "comment": "删除标记", - "role": "dimension", - "tags": ["数据状态"] + "comment": "该年累计在藏天数", + "role": "metric", + "tags": ["在藏统计", "累计天数","当年累计天数"] + }, + { + "name": "last_count_in_tibat", + "type": "INT", + "comment": "上一年度累计在藏天数", + "role": "metric", + "tags": ["历史统计", "同比数据","上次累计在藏"] }, { "name": "continuous_in_tibet_days", "type": "INT", "comment": "连续在藏天数", "role": "metric", - "tags": ["连续在藏天数"] + "tags": ["连续统计", "持续天数"] + }, + { + "name": "dr", + "type": "INT", + "comment": "软删除标记(0:正常, 1:删除)", + "role": "dimension", + "tags": ["数据状态", "系统字段"] } ], "relationships": [