- 将项目名称从 lzwcai-mcp-sqlexecutor 重命名为 lzwcai-mcpskills-analyzeWorkOrder - 更新 README.md 中的安装命令、使用说明和配置示例 - 本地化业务查询名称,将中文业务名称改为英文,如"查询列表"改为"QueryList" - 优化SQL模板,移除中文列别名,使用英文字段名 - 新增销售订单相关查询功能,包括订单列表、订单详情、交付风险预测 - 添加部门人效产值损耗三维仪表盘查询 - 更新包的初始化信息和版本号
76 lines
16 KiB
JSON
76 lines
16 KiB
JSON
[
|
||
{
|
||
"id": "2006300000000000000",
|
||
"businessName": "QueryList",
|
||
"businessDescription": "查询所有工单列表,返回fact_work_order表的全部数据",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "SELECT * FROM fact_work_order",
|
||
"parameters": {}
|
||
},
|
||
{
|
||
"id": "2006300000000000004",
|
||
"businessName": "WorkOrderDetail",
|
||
"businessDescription": "根据工单编号查询工单详情,包括工单基本信息、产品信息、委外供应商、工艺路线等",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "SELECT wo.work_order_id, wo.work_order_number, wo.status, wo.planned_qty, wo.completed_qty, wo.operation_good_qty, wo.operation_bad_qty, wo.qc_good_qty, wo.qc_bad_qty, wo.source_doc_number, wo.event_time_utc, p.product_code, p.product_name, p.product_spec, s.supplier_name, r.routing_name FROM fact_work_order wo LEFT JOIN dim_product p ON wo.product_id = p.product_id AND p.is_current = true LEFT JOIN dim_supplier s ON wo.supplier_id = s.supplier_id AND s.is_current = true LEFT JOIN dim_routing r ON wo.routing_id = r.routing_id AND r.is_current = true WHERE wo.work_order_number = '{workOrderNumber}'",
|
||
"parameters": {
|
||
"workOrderNumber": {
|
||
"type": "string",
|
||
"description": "工单编号",
|
||
"required": true,
|
||
"examples": [
|
||
"WO1311343859"
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "2006300000000000005",
|
||
"businessName": "WorkOrderProgressDashboard",
|
||
"businessDescription": "工单执行进度与异常节点看板,展示工单完工进度、工序良率、质检良率、异常标识等关键监控指标",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "WITH work_order_progress AS (SELECT wo.work_order_number, wo.status AS work_order_status, wo.planned_qty, wo.completed_qty, wo.operation_good_qty, wo.operation_bad_qty, wo.qc_good_qty, wo.qc_bad_qty, wo.source_doc_number AS sales_order_number, wo.event_time_utc, p.product_code, p.product_name, CASE WHEN wo.planned_qty > 0 THEN ROUND(wo.completed_qty * 100.0 / wo.planned_qty, 2) ELSE 0 END AS completion_pct, CASE WHEN (wo.operation_good_qty + wo.operation_bad_qty) > 0 THEN ROUND(wo.operation_good_qty * 100.0 / (wo.operation_good_qty + wo.operation_bad_qty), 2) ELSE NULL END AS operation_yield_pct, CASE WHEN (wo.qc_good_qty + wo.qc_bad_qty) > 0 THEN ROUND(wo.qc_good_qty * 100.0 / (wo.qc_good_qty + wo.qc_bad_qty), 2) ELSE NULL END AS qc_yield_pct FROM fact_work_order wo LEFT JOIN dim_product p ON wo.product_id = p.product_id AND p.is_current = true), task_summary AS (SELECT work_order_number, COUNT(*) AS total_tasks, SUM(CASE WHEN actual_end_time_utc IS NOT NULL THEN 1 ELSE 0 END) AS completed_tasks, SUM(CASE WHEN actual_start_time_utc IS NOT NULL AND actual_end_time_utc IS NULL THEN 1 ELSE 0 END) AS in_progress_tasks, SUM(CASE WHEN actual_start_time_utc IS NULL THEN 1 ELSE 0 END) AS pending_tasks, SUM(bad_qty) AS total_bad_qty FROM fact_operation_task GROUP BY work_order_number), labor_summary AS (SELECT work_order_number, SUM(report_qty) AS total_report_qty, SUM(good_qty) AS total_good_qty, SUM(bad_qty) AS total_bad_qty, SUM(duration_minutes) AS total_work_minutes FROM fact_labor_report GROUP BY work_order_number), qc_summary AS (SELECT work_order_number, COUNT(*) AS qc_record_count, SUM(pass_qty) AS total_pass_qty, SUM(fail_qty) AS total_fail_qty FROM fact_quality_inspection WHERE work_order_number IS NOT NULL GROUP BY work_order_number) SELECT wp.work_order_number, wp.product_code, wp.product_name, wp.sales_order_number, wp.work_order_status, wp.planned_qty, wp.completed_qty, wp.completion_pct, COALESCE(ts.total_tasks, 0) AS total_tasks, COALESCE(ts.completed_tasks, 0) AS completed_tasks, COALESCE(ts.in_progress_tasks, 0) AS in_progress_tasks, COALESCE(ts.pending_tasks, 0) AS pending_tasks, COALESCE(ls.total_report_qty, 0) AS total_report_qty, COALESCE(ls.total_work_minutes, 0) AS total_work_minutes, wp.operation_yield_pct, wp.qc_yield_pct, COALESCE(qc.total_pass_qty, 0) AS qc_pass_qty, COALESCE(qc.total_fail_qty, 0) AS qc_fail_qty, CASE WHEN wp.completion_pct < 50 AND wp.work_order_status = 'STARTED' THEN 'PROGRESS_DELAY' WHEN wp.operation_yield_pct < 90 THEN 'OPERATION_YIELD_ABNORMAL' WHEN wp.qc_yield_pct < 95 THEN 'QC_YIELD_ABNORMAL' WHEN ts.total_bad_qty > 0 THEN 'HAS_DEFECTS' ELSE 'NORMAL' END AS abnormal_flag, wp.event_time_utc AS last_update_time FROM work_order_progress wp LEFT JOIN task_summary ts ON wp.work_order_number = ts.work_order_number LEFT JOIN labor_summary ls ON wp.work_order_number = ls.work_order_number LEFT JOIN qc_summary qc ON wp.work_order_number = qc.work_order_number ORDER BY CASE wp.work_order_status WHEN 'STARTED' THEN 1 WHEN 'RELEASED' THEN 2 WHEN 'PLANNED' THEN 3 ELSE 4 END, wp.event_time_utc DESC",
|
||
"parameters": {}
|
||
},
|
||
{
|
||
"id": "2006300000000000006",
|
||
"businessName": "SalesOrderList",
|
||
"businessDescription": "历史订单列表:查询所有销售订单,包含客户信息、订单金额、收款状态、交货日期等关键信息",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "SELECT so.sales_order_id, so.sales_order_number, c.customer_name, so.contract_number, so.order_date_utc, so.delivery_date_utc, so.deal_amount, so.currency_code, so.payment_status, so.stage, so.result, so.transport_mode, so.production_doc_number, so.event_time_utc FROM fact_sales_order so LEFT JOIN dim_customer c ON so.customer_id = c.customer_id AND c.is_current = true ORDER BY so.order_date_utc DESC",
|
||
"parameters": {}
|
||
},
|
||
{
|
||
"id": "2006300000000000007",
|
||
"businessName": "SalesOrderDetail",
|
||
"businessDescription": "订单详情:根据订单编号查询订单详细信息,包含客户信息、销售员、合同、金额、交货日期、收款状态等完整信息",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "SELECT so.sales_order_id, so.sales_order_number, c.customer_name, c.customer_level, c.phone AS customer_phone, c.email AS customer_email, c.address AS customer_address, p.person_name AS sales_person_name, so.contract_number, ct.contract_name, ct.contract_amount, so.order_date_utc, so.delivery_date_utc, so.deal_amount, so.currency_code, so.fx_rate, so.payment_status, so.transport_mode, so.packaging, so.customs_number, so.production_doc_number, so.stage, so.result, so.event_time_utc FROM fact_sales_order so LEFT JOIN dim_customer c ON so.customer_id = c.customer_id AND c.is_current = true LEFT JOIN dim_person p ON so.sales_person_id = p.person_id AND p.is_current = true LEFT JOIN dim_contract ct ON so.contract_id = ct.contract_id AND ct.is_current = true WHERE so.sales_order_number = '{salesOrderNumber}'",
|
||
"parameters": {
|
||
"salesOrderNumber": {
|
||
"type": "string",
|
||
"description": "销售订单编号",
|
||
"required": true,
|
||
"examples": [
|
||
"SO20251225001"
|
||
]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"id": "2006300000000000008",
|
||
"businessName": "DeliveryRiskPrediction",
|
||
"businessDescription": "交付风险预测:基于历史订单的生产周期、物流延误、设备故障等特征,计算延迟概率与红/黄/绿预警等级",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "WITH global_production AS (SELECT COUNT(*) AS total_wo_count, AVG(CASE WHEN planned_qty > 0 THEN completed_qty / planned_qty ELSE 0 END) AS avg_completion_rate, SUM(CASE WHEN status IN ('OPEN', 'STARTED') THEN 1 ELSE 0 END) AS pending_wo_count, SUM(CASE WHEN status = 'CLOSED' THEN 1 ELSE 0 END) AS closed_wo_count FROM fact_work_order), global_quality AS (SELECT COUNT(*) AS total_inspection_count, SUM(COALESCE(pass_qty, 0)) AS total_pass_qty, SUM(COALESCE(fail_qty, 0)) AS total_fail_qty, CASE WHEN SUM(COALESCE(pass_qty, 0) + COALESCE(fail_qty, 0)) > 0 THEN SUM(COALESCE(pass_qty, 0))::FLOAT / SUM(COALESCE(pass_qty, 0) + COALESCE(fail_qty, 0)) ELSE 1 END AS qc_pass_rate FROM fact_quality_inspection), global_operation AS (SELECT COUNT(*) AS total_task_count, SUM(COALESCE(good_qty, 0)) AS total_good_qty, SUM(COALESCE(bad_qty, 0)) AS total_bad_qty, CASE WHEN SUM(COALESCE(good_qty, 0) + COALESCE(bad_qty, 0)) > 0 THEN SUM(COALESCE(bad_qty, 0))::FLOAT / SUM(COALESCE(good_qty, 0) + COALESCE(bad_qty, 0)) ELSE 0 END AS operation_defect_rate FROM fact_operation_task), customer_shipment AS (SELECT customer_id, COUNT(*) AS shipment_count, SUM(COALESCE(amount, 0)) AS total_shipment_amount FROM fact_sales_shipment GROUP BY customer_id), customer_return AS (SELECT customer_id, COUNT(*) AS return_count, SUM(COALESCE(amount, 0)) AS total_return_amount FROM fact_sales_return GROUP BY customer_id), order_risk AS (SELECT so.sales_order_id, so.sales_order_number, c.customer_name, so.order_date_utc, so.deal_amount, so.payment_status, gp.avg_completion_rate AS production_completion_rate, gp.pending_wo_count, gp.total_wo_count AS work_order_count, gq.qc_pass_rate, gq.total_fail_qty, go.operation_defect_rate, COALESCE(cs.shipment_count, 0) AS shipment_count, COALESCE(cr.return_count, 0) AS return_count, CASE WHEN COALESCE(cs.shipment_count, 0) > 0 THEN COALESCE(cr.return_count, 0)::FLOAT / cs.shipment_count ELSE 0 END AS return_rate FROM fact_sales_order so LEFT JOIN dim_customer c ON so.customer_id = c.customer_id AND c.is_current = true CROSS JOIN global_production gp CROSS JOIN global_quality gq CROSS JOIN global_operation go LEFT JOIN customer_shipment cs ON so.customer_id = cs.customer_id LEFT JOIN customer_return cr ON so.customer_id = cr.customer_id) SELECT sales_order_id, sales_order_number, customer_name, order_date_utc, deal_amount, payment_status, work_order_count, ROUND(production_completion_rate::NUMERIC, 2) AS production_completion_rate, pending_wo_count, ROUND(qc_pass_rate::NUMERIC, 2) AS qc_pass_rate, ROUND(operation_defect_rate::NUMERIC, 4) AS operation_defect_rate, return_count, ROUND(return_rate::NUMERIC, 4) AS return_rate, ROUND((CASE WHEN production_completion_rate < 0.3 THEN 0.30 WHEN production_completion_rate < 0.5 THEN 0.20 WHEN production_completion_rate < 0.8 THEN 0.10 ELSE 0 END + CASE WHEN qc_pass_rate < 0.8 THEN 0.25 WHEN qc_pass_rate < 0.9 THEN 0.15 WHEN qc_pass_rate < 0.95 THEN 0.08 ELSE 0 END + CASE WHEN operation_defect_rate > 0.1 THEN 0.20 WHEN operation_defect_rate > 0.05 THEN 0.12 WHEN operation_defect_rate > 0.02 THEN 0.05 ELSE 0 END + CASE WHEN return_rate > 0.1 THEN 0.15 WHEN return_rate > 0.05 THEN 0.08 WHEN return_rate > 0.02 THEN 0.03 ELSE 0 END + CASE WHEN payment_status = 'UNPAID' THEN 0.10 WHEN payment_status = 'PARTIAL' THEN 0.05 ELSE 0 END)::NUMERIC, 2) AS delay_probability, CASE WHEN (CASE WHEN production_completion_rate < 0.3 THEN 0.30 WHEN production_completion_rate < 0.5 THEN 0.20 WHEN production_completion_rate < 0.8 THEN 0.10 ELSE 0 END + CASE WHEN qc_pass_rate < 0.8 THEN 0.25 WHEN qc_pass_rate < 0.9 THEN 0.15 WHEN qc_pass_rate < 0.95 THEN 0.08 ELSE 0 END + CASE WHEN operation_defect_rate > 0.1 THEN 0.20 WHEN operation_defect_rate > 0.05 THEN 0.12 WHEN operation_defect_rate > 0.02 THEN 0.05 ELSE 0 END + CASE WHEN return_rate > 0.1 THEN 0.15 WHEN return_rate > 0.05 THEN 0.08 WHEN return_rate > 0.02 THEN 0.03 ELSE 0 END + CASE WHEN payment_status = 'UNPAID' THEN 0.10 WHEN payment_status = 'PARTIAL' THEN 0.05 ELSE 0 END) >= 0.50 THEN 'RED' WHEN (CASE WHEN production_completion_rate < 0.3 THEN 0.30 WHEN production_completion_rate < 0.5 THEN 0.20 WHEN production_completion_rate < 0.8 THEN 0.10 ELSE 0 END + CASE WHEN qc_pass_rate < 0.8 THEN 0.25 WHEN qc_pass_rate < 0.9 THEN 0.15 WHEN qc_pass_rate < 0.95 THEN 0.08 ELSE 0 END + CASE WHEN operation_defect_rate > 0.1 THEN 0.20 WHEN operation_defect_rate > 0.05 THEN 0.12 WHEN operation_defect_rate > 0.02 THEN 0.05 ELSE 0 END + CASE WHEN return_rate > 0.1 THEN 0.15 WHEN return_rate > 0.05 THEN 0.08 WHEN return_rate > 0.02 THEN 0.03 ELSE 0 END + CASE WHEN payment_status = 'UNPAID' THEN 0.10 WHEN payment_status = 'PARTIAL' THEN 0.05 ELSE 0 END) >= 0.25 THEN 'YELLOW' ELSE 'GREEN' END AS risk_level, CONCAT_WS(' | ', CASE WHEN production_completion_rate < 0.5 THEN '生产进度滞后' END, CASE WHEN qc_pass_rate < 0.9 THEN '质检通过率低' END, CASE WHEN operation_defect_rate > 0.05 THEN '工序不良率高' END, CASE WHEN return_rate > 0.05 THEN '历史退货率高' END, CASE WHEN payment_status = 'UNPAID' THEN '未付款' END) AS risk_reasons FROM order_risk ORDER BY delay_probability DESC, deal_amount DESC",
|
||
"parameters": {}
|
||
},
|
||
{
|
||
"id": "2006300000000000009",
|
||
"businessName": "DepartmentEfficiencyDashboard",
|
||
"businessDescription": "部门人效产值损耗三维仪表盘:关联订单量×工时×人员数×成本,构建人效—产值—损耗三维模型,按部门汇总展示",
|
||
"datasourceId": "19",
|
||
"sqlTemplate": "WITH order_summary AS (SELECT COUNT(DISTINCT so.sales_order_id) AS total_order_count, SUM(COALESCE(so.deal_amount, 0)) AS total_order_amount FROM fact_sales_order so), labor_by_dept AS (SELECT p.department, COUNT(DISTINCT lr.worker_name) AS worker_count, SUM(COALESCE(lr.duration_minutes, 0)) AS total_work_minutes, SUM(COALESCE(lr.report_qty, 0)) AS total_report_qty, SUM(COALESCE(lr.good_qty, 0)) AS total_good_qty, SUM(COALESCE(lr.bad_qty, 0)) AS total_bad_qty FROM fact_labor_report lr LEFT JOIN dim_person p ON lr.worker_name = p.person_name AND p.is_current = true GROUP BY p.department), work_order_output AS (SELECT p.department, SUM(COALESCE(wo.completed_qty, 0)) AS completed_qty, SUM(COALESCE(wo.operation_bad_qty, 0)) AS operation_bad_qty, SUM(COALESCE(wo.qc_bad_qty, 0)) AS qc_bad_qty, COUNT(DISTINCT wo.work_order_id) AS work_order_count FROM fact_work_order wo LEFT JOIN dim_person p ON wo.production_manager_id = p.person_id AND p.is_current = true GROUP BY p.department), scrap_by_dept AS (SELECT p.department, COUNT(*) AS scrap_count FROM fact_scrap s LEFT JOIN dim_person p ON s.operator_id = p.person_id AND p.is_current = true GROUP BY p.department), qc_by_dept AS (SELECT p.department, SUM(COALESCE(qi.pass_qty, 0)) AS qc_pass_qty, SUM(COALESCE(qi.fail_qty, 0)) AS qc_fail_qty FROM fact_quality_inspection qi LEFT JOIN dim_person p ON qi.inspector_id = p.person_id AND p.is_current = true GROUP BY p.department) SELECT COALESCE(ld.department, '未分配') AS department, os.total_order_count, os.total_order_amount, COALESCE(ld.worker_count, 0) AS worker_count, COALESCE(ld.total_work_minutes, 0) AS total_work_minutes, ROUND(COALESCE(ld.total_work_minutes, 0) / 60.0, 2) AS total_work_hours, COALESCE(ld.total_report_qty, 0) AS total_report_qty, COALESCE(ld.total_good_qty, 0) AS total_good_qty, COALESCE(ld.total_bad_qty, 0) AS labor_bad_qty, COALESCE(wo.completed_qty, 0) AS completed_qty, COALESCE(wo.work_order_count, 0) AS work_order_count, COALESCE(wo.operation_bad_qty, 0) AS operation_bad_qty, COALESCE(wo.qc_bad_qty, 0) AS qc_bad_qty, COALESCE(sc.scrap_count, 0) AS scrap_count, COALESCE(qc.qc_pass_qty, 0) AS qc_pass_qty, COALESCE(qc.qc_fail_qty, 0) AS qc_fail_qty, CASE WHEN COALESCE(ld.worker_count, 0) > 0 THEN ROUND(COALESCE(ld.total_report_qty, 0)::NUMERIC / ld.worker_count, 2) ELSE 0 END AS output_per_worker, CASE WHEN COALESCE(ld.total_work_minutes, 0) > 0 THEN ROUND(COALESCE(ld.total_report_qty, 0)::NUMERIC * 60 / ld.total_work_minutes, 2) ELSE 0 END AS output_per_hour, CASE WHEN COALESCE(ld.worker_count, 0) > 0 THEN ROUND(os.total_order_amount::NUMERIC / ld.worker_count, 2) ELSE 0 END AS order_value_per_worker, CASE WHEN (COALESCE(ld.total_good_qty, 0) + COALESCE(ld.total_bad_qty, 0)) > 0 THEN ROUND(COALESCE(ld.total_good_qty, 0)::NUMERIC * 100 / (ld.total_good_qty + ld.total_bad_qty), 2) ELSE 100 END AS labor_yield_pct, CASE WHEN (COALESCE(qc.qc_pass_qty, 0) + COALESCE(qc.qc_fail_qty, 0)) > 0 THEN ROUND(COALESCE(qc.qc_pass_qty, 0)::NUMERIC * 100 / (qc.qc_pass_qty + qc.qc_fail_qty), 2) ELSE 100 END AS qc_yield_pct, COALESCE(ld.total_bad_qty, 0) + COALESCE(wo.operation_bad_qty, 0) + COALESCE(wo.qc_bad_qty, 0) + COALESCE(qc.qc_fail_qty, 0) AS total_loss_qty, CASE WHEN COALESCE(ld.worker_count, 0) > 0 AND COALESCE(ld.total_work_minutes, 0) > 0 AND (COALESCE(ld.total_good_qty, 0) + COALESCE(ld.total_bad_qty, 0)) > 0 THEN CASE WHEN (COALESCE(ld.total_report_qty, 0)::NUMERIC / ld.worker_count) >= 100 AND (COALESCE(ld.total_report_qty, 0)::NUMERIC * 60 / ld.total_work_minutes) >= 10 AND (COALESCE(ld.total_good_qty, 0)::NUMERIC * 100 / (ld.total_good_qty + ld.total_bad_qty)) >= 95 THEN 'EXCELLENT' WHEN (COALESCE(ld.total_report_qty, 0)::NUMERIC / ld.worker_count) >= 50 AND (COALESCE(ld.total_report_qty, 0)::NUMERIC * 60 / ld.total_work_minutes) >= 5 AND (COALESCE(ld.total_good_qty, 0)::NUMERIC * 100 / (ld.total_good_qty + ld.total_bad_qty)) >= 90 THEN 'GOOD' ELSE 'NEEDS_IMPROVEMENT' END ELSE 'NO_DATA' END AS efficiency_rating FROM labor_by_dept ld CROSS JOIN order_summary os LEFT JOIN work_order_output wo ON ld.department = wo.department LEFT JOIN scrap_by_dept sc ON ld.department = sc.department LEFT JOIN qc_by_dept qc ON ld.department = qc.department ORDER BY total_report_qty DESC",
|
||
"parameters": {}
|
||
}
|
||
] |