feat(analyzeWorkOrder): 重构工单分析MCP技能模块并更新业务查询配置

- 将项目名称从 lzwcai-mcp-sqlexecutor 重命名为 lzwcai-mcpskills-analyzeWorkOrder
- 更新 README.md 中的安装命令、使用说明和配置示例
- 本地化业务查询名称,将中文业务名称改为英文,如"查询列表"改为"QueryList"
- 优化SQL模板,移除中文列别名,使用英文字段名
- 新增销售订单相关查询功能,包括订单列表、订单详情、交付风险预测
- 添加部门人效产值损耗三维仪表盘查询
- 更新包的初始化信息和版本号
This commit is contained in:
2026-01-07 22:05:44 +08:00
parent 79374b0d2f
commit 053d98dffd
10 changed files with 255 additions and 31 deletions

View File

@@ -1,4 +1,4 @@
# lzwcai-mcp-sqlexecutor
# lzwcai-mcpskills-analyzeWorkOrder
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
@@ -14,7 +14,7 @@
### 使用 pip 安装
```bash
pip install lzwcai-mcp-sqlexecutor
pip install lzwcai-mcpskills-analyzeWorkOrder
```
### 从源码安装
@@ -28,7 +28,7 @@ pip install -e .
### 使用 uv 安装(推荐)
```bash
uv pip install lzwcai-mcp-sqlexecutor
uv pip install lzwcai-mcpskills-analyzeWorkOrder
```
## 使用方法
@@ -38,7 +38,7 @@ uv pip install lzwcai-mcp-sqlexecutor
安装后,可以直接通过命令启动:
```bash
lzwcai-mcp-sqlexecutor
lzwcai-mcpskills-analyzeWorkOrder
```
### 作为 Python 模块运行
@@ -55,7 +55,7 @@ python -m lzwcai_mcp_sqlexecutor.main
{
"mcpServers": {
"lzwcai-sqlexecutor": {
"command": "lzwcai-mcp-sqlexecutor"
"command": "lzwcai-mcpskills-analyzeWorkOrder"
}
}
}

View File

@@ -1,4 +1,4 @@
# lzwcai-mcp-sqlexecutor
# lzwcai-mcpskills-analyzeWorkOrder
一个基于 MCP (Model Context Protocol) 的 SQL 查询执行服务器,支持从 JSON 配置文件动态生成查询工具。
@@ -14,7 +14,7 @@
### 使用 pip 安装
```bash
pip install lzwcai-mcp-sqlexecutor
pip install lzwcai-mcpskills-analyzeWorkOrder
```
### 从源码安装
@@ -28,7 +28,7 @@ pip install -e .
### 使用 uv 安装(推荐)
```bash
uv pip install lzwcai-mcp-sqlexecutor
uv pip install lzwcai-mcpskills-analyzeWorkOrder
```
## 使用方法
@@ -38,7 +38,7 @@ uv pip install lzwcai-mcp-sqlexecutor
安装后,可以直接通过命令启动:
```bash
lzwcai-mcp-sqlexecutor
lzwcai-mcpskills-analyzeWorkOrder
```
### 作为 Python 模块运行
@@ -55,7 +55,7 @@ python -m lzwcai_mcp_sqlexecutor.main
{
"mcpServers": {
"lzwcai-sqlexecutor": {
"command": "lzwcai-mcp-sqlexecutor"
"command": "lzwcai-mcpskills-analyzeWorkOrder"
}
}
}

View File

@@ -1,5 +1,5 @@
"""
lzwcai-mcp-sqlexecutor - MCP server for executing business SQL queries
lzwcai-mcpskills-analyzeWorkOrder - MCP server for executing business SQL queries
"""
__version__ = "0.1.2"

File diff suppressed because one or more lines are too long

View File

@@ -94,7 +94,7 @@ def generate_tool_schema_from_query(query: dict) -> types.Tool:
# 创建 MCP 服务器实例
server = Server("lzwcai-mcp-sqlexecutor")
server = Server("lzwcai-mcpskills-analyzeWorkOrder")
# 缓存查询配置,避免重复加载
_queries_cache = None
@@ -226,16 +226,30 @@ async def handle_call_tool(
api_response = test_sql_with_schema(request_data)
mcp_logger.info("测试SQL API调用成功")
# 返回 API 响应结果
result_text = json.dumps(api_response, ensure_ascii=False, indent=2)
# 返回包含 data 字段的结果
result = {
"success": True,
"data": api_response
}
result_text = json.dumps(result, ensure_ascii=False, indent=2)
except Exception as e:
error_msg = f"调用测试SQL API失败: {str(e)}"
mcp_logger.error(error_msg, exc_info=True)
result_text = json.dumps({"error": error_msg}, ensure_ascii=False, indent=2)
result = {
"success": False,
"error": error_msg,
"data": None
}
result_text = json.dumps(result, ensure_ascii=False, indent=2)
else:
error_msg = f"未找到工具 {name} 对应的配置"
result_text = json.dumps({"error": error_msg}, ensure_ascii=False, indent=2)
result = {
"success": False,
"error": error_msg,
"data": None
}
result_text = json.dumps(result, ensure_ascii=False, indent=2)
mcp_logger.debug(f"工具调用结果: {result_text}")
@@ -297,7 +311,7 @@ async def async_main():
"""MCP 服务器异步主函数"""
try:
mcp_logger.info("=" * 60)
mcp_logger.info("正在启动 MCP 服务器: lzwcai-mcp-sqlexecutor")
mcp_logger.info("正在启动 MCP 服务器: lzwcai-mcpskills-analyzeWorkOrder")
mcp_logger.info("版本: 0.1.0")
mcp_logger.info("=" * 60)
@@ -318,7 +332,7 @@ async def async_main():
read_stream,
write_stream,
InitializationOptions(
server_name="lzwcai-mcp-sqlexecutor",
server_name="lzwcai-mcpskills-analyzeWorkOrder",
server_version="0.1.0",
capabilities=server.get_capabilities(
notification_options=NotificationOptions(),

View File

@@ -3,8 +3,8 @@ requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = "lzwcai-mcp-sqlexecutor"
version = "0.1.6"
name = "lzwcai-mcpskills-analyzeWorkOrder"
version = "0.1.10"
description = "MCP server for executing business SQL queries with dynamic tool generation"
readme = "README.md"
requires-python = ">=3.13"
@@ -26,10 +26,10 @@ dependencies = [
]
[project.scripts]
lzwcai-mcp-sqlexecutor = "lzwcai_mcp_sqlexecutor.main:main"
lzwcai-mcpskills-analyzeWorkOrder = "lzwcai_mcpskills_analyzeWorkOrder.main:main"
[tool.hatch.build.targets.wheel]
packages = ["lzwcai_mcp_sqlexecutor"]
packages = ["lzwcai_mcpskills_analyzeWorkOrder"]
[tool.hatch.build.targets.wheel.force-include]
"lzwcai_mcp_sqlexecutor/businessQueries.json" = "lzwcai_mcp_sqlexecutor/businessQueries.json"
"lzwcai_mcpskills_analyzeWorkOrder/businessQueries.json" = "lzwcai_mcpskills_analyzeWorkOrder/businessQueries.json"

View File

@@ -0,0 +1,169 @@
-- =====================================================
-- 交付风险预测:延迟概率与红/黄/绿预警等级
-- 基于历史订单的生产周期、物流延误、设备故障等特征
-- =====================================================
WITH
-- 1. 全局生产特征(汇总所有工单)
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
),
-- 2. 全局质检特征
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
),
-- 3. 全局工序不良特征
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
),
-- 4. 客户级别发货统计
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
),
-- 5. 客户级别退货统计
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
),
-- 6. 订单风险评估
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
)
-- 7. 最终输出
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;

View File

@@ -146,7 +146,7 @@ wheels = [
]
[[package]]
name = "lzwcai-mcp-sqlexecutor"
name = "lzwcai-mcpskills-analyzeWorkOrder"
version = "0.1.0"
source = { virtual = "." }
dependencies = [

View File

@@ -1,5 +1,5 @@
"""
Entry point for lzwcai-mcp-sqlexecutor
Entry point for lzwcai-mcpskills-analyzeWorkOrder
Runs the MCP server for SQL query execution
"""
import os

View File

@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "lzwcai-mcpskills-analyzeWorkOrder"
version = "0.1.8"
version = "0.1.12"
description = "MCP server for executing business SQL queries with dynamic tool generation"
readme = "README.md"
requires-python = ">=3.13"