Add HL MES manager with AI assistant service

This commit is contained in:
2026-05-25 18:28:10 +08:00
commit 35f11c095d
881 changed files with 172675 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
PORT=8787
MES_BASE_URL=http://127.0.0.1:10100
DEEPSEEK_API_KEY=replace-with-your-key
DEEPSEEK_MODEL=deepseek-v4-flash
DEEPSEEK_BASE_URL=https://api.deepseek.com
MES_AI_ALLOW_WRITE=0

2
ai-mcp-service/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
.env
*.log

View File

@@ -0,0 +1,93 @@
[
{
"keywords": ["系统日志", "操作日志", "审计日志", "日志导出"],
"module": "基础数据",
"page": "报警日志/系统日志",
"paths": [
"src/views/BasicData/WorkStationAlarmLog/index.vue",
"src/views/BasicData/SystemAlarmLog/index.vue"
],
"actions": ["查询", "导出"],
"procedures": [
"合力_系统日志_查询",
"报警工位记录表_查询"
],
"answer": "系统日志相关功能在基础数据模块下,项目中存在 WorkStationAlarmLog 和 SystemAlarmLog 两类页面,均带导出按钮。用户询问系统日志时,优先引导其打开基础数据下的日志页面,而不是泛泛询问系统外日志类型。"
},
{
"keywords": ["报警日志", "设备报警", "报警导出", "报警日志图表"],
"module": "设备运行分析/基础数据",
"page": "设备报警统计、报警日志图表、报警日志",
"paths": [
"src/views/EquipmentOperationAnalysis/EquipmentAlarmStatistics/index.vue",
"src/views/EquipmentOperationAnalysis/EquipmentAlarmLogEcharts/index.vue",
"src/views/BasicData/SystemAlarmLog/index.vue"
],
"actions": ["查询", "统计", "导出"],
"procedures": [
"测量数据工位报警全部视图_查询新",
"报警工位记录表_查询"
],
"answer": "报警相关问题优先定位到设备运行分析中的设备报警统计/报警日志图表,或基础数据中的报警日志。"
},
{
"keywords": ["过站", "过站日志", "过站信息", "在线状态"],
"module": "质量保障",
"page": "过站信息查询",
"paths": [
"src/views/QualityAssurance/InquiryTransitInformation/index.vue"
],
"actions": ["查询", "导出"],
"procedures": [
"质量数据查询_测量数据发动机在线状态_报表_NEW新"
],
"answer": "过站记录在质量保障 > 过站信息查询中处理。"
},
{
"keywords": ["扫码", "扫码记录", "条码", "二维码"],
"module": "质量保障",
"page": "扫码记录查询",
"paths": [
"src/views/QualityAssurance/BarCodeDataSearch/index.vue"
],
"actions": ["查询", "导出", "修改码值"],
"procedures": [
"合力_扫码记录_查询分页",
"合力_扫码记录_修改码值"
],
"answer": "扫码记录在质量保障 > 扫码记录查询中处理。"
},
{
"keywords": ["点检", "点检记录", "设备点检", "点检导出"],
"module": "设备运行分析/质量保障",
"page": "点检记录、设备点检质量查询",
"paths": [
"src/views/EquipmentOperationAnalysis/SpotCheckRecord/index.vue",
"src/views/QualityAssurance/EquipmentMaintenance/index.vue"
],
"actions": ["日点检", "周点检", "月点检", "季点检", "年点检", "导出"],
"procedures": [
"点检日期导出_查询数据",
"点检日期周导出_查询数据",
"点检日期月导出_查询数据",
"点检日期季导出_查询数据",
"点检日期年导出_查询数据"
],
"answer": "点检记录优先在设备运行分析 > 点检记录中处理,也可在质量保障 > 设备点检质量查询中查看质量相关点检。"
},
{
"keywords": ["质量数据", "质量追溯", "装配质量", "总成号"],
"module": "质量保障/统计分析",
"page": "装配质量数据查询、质量数据查询、SPC 分析",
"paths": [
"src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue",
"src/views/SearchData/QualityDatasearch/index.vue",
"src/views/SearchData/SPC_Analysis/index.vue"
],
"actions": ["查询", "导出", "SPC"],
"procedures": [
"质量数据查询_综合查询新"
],
"answer": "质量数据优先在质量保障 > 装配质量数据查询中查看,统计分析类问题进入 SearchData 的质量数据或 SPC 页面。"
}
]

View File

@@ -0,0 +1,80 @@
{
"system": "HL_MES_manager",
"description": "合力差速器智能产线 MES 管理端功能目录",
"frontend": "前端源码/HL_MES_manager",
"backend": "MES_Manage_standard",
"mainEndpoint": "/submit/MESCommonBase.ashx",
"modules": [
{
"name": "登录与权限",
"paths": ["src/views/login/index.vue", "src/permission.js", "src/router/getRouter.js"],
"features": ["用户登录", "密码修改", "角色菜单加载", "动态路由", "Cookie 登录态"]
},
{
"name": "基础数据",
"paths": ["src/views/BasicData"],
"features": ["人员管理", "角色维护", "菜单管理", "用户权限", "班次管理", "工厂日历", "设备人员绑定", "设备能力维护", "物料维护", "工位工序维护", "零件数量维护", "报警日志", "项目展示"]
},
{
"name": "基础变量维护",
"paths": ["src/views/BasicDataMaintenance"],
"features": ["基础变量维护", "基础变量查询", "报警变量维护", "站点信息维护", "变量设备类型", "Excel 导入"]
},
{
"name": "工艺管理",
"paths": ["src/views/ProcessManagement"],
"features": ["工步内容维护", "工艺图片维护", "物料校验维护", "BOM 发动机管理", "BOM 清单比对", "接口模块维护", "监控数据", "PDF 卡片维护", "分流缓存", "仓位维护", "标签语言维护", "Andon 配置"]
},
{
"name": "工艺参数维护",
"paths": ["src/views/ProcessParameterMaintenance"],
"features": ["拧紧位置维护", "测量范围维护", "工艺节拍维护", "线体验证维护"]
},
{
"name": "生产计划",
"paths": ["src/views/WorkOrderManagement"],
"features": ["生产计划下发", "Excel 计划导入", "排程状态变更"]
},
{
"name": "质量保障",
"paths": ["src/views/QualityAssurance"],
"features": ["装配质量数据查询", "过站信息查询", "扫码记录查询", "物料数据查询", "巡检数据查询", "物料消耗统计", "线体项目查询", "线体质量查询", "生产计划完成情况", "设备点检质量查询"]
},
{
"name": "统计分析",
"paths": ["src/views/SearchData", "src/api/SPCanalysis"],
"features": ["SPC 分析", "质量数据查询", "排列图", "直方图", "正态分布", "XR 控制图", "XS 控制图", "样本趋势图", "过程能力分析", "OEE 查询", "OEE 趋势", "JPH 趋势", "FTT 趋势", "报警分析", "故障停工管理"]
},
{
"name": "设备运行分析",
"paths": ["src/views/EquipmentOperationAnalysis"],
"features": ["设备实时状态", "每日设备统计", "设备报警统计", "报警日志图表", "设备基础信息维护", "设备维修计划", "当前维修计划", "维修记录管理", "日常点检信息维护", "日/周/月/季/年点检记录"]
},
{
"name": "配方管理",
"paths": ["src/views/RecipeManagement"],
"features": ["配方维护", "新版配方维护", "配方基础数据", "电气元件参数", "物料厂家管理", "物料厂家查询", "Excel 导入"]
},
{
"name": "Andon 系统",
"paths": ["src/views/AndonSystem"],
"features": ["设备 Andon", "设备 Andon 统计", "物料 Andon", "物料 Andon 统计", "质量 Andon", "质量 Andon 统计"]
},
{
"name": "采购管理",
"paths": ["src/views/PurchasingManagement"],
"features": ["采购订单", "采购件查询", "供应商管理"]
}
],
"integration": {
"mqtt": {
"subscriptionTopic": "MES/InstantMessaging/PF25/",
"publishTopic": "MesPrint",
"usage": ["即时消息", "打印消息"]
},
"plc": {
"usage": ["OP010 上线", "自动工位质量保存", "OPA 提前上料", "RFID 托盘/总成信息交互"],
"signals": ["DBX500.1 到位", "DBX500.3 申请上线", "DBX587.0 允许 MES 保存", "DBX11.3 MES 保存完成", "DBB750 质量数据区"]
}
}
}

View File

@@ -0,0 +1,340 @@
# 数据库知识库
数据库主库配置为 MESBasicDB_HL。当前知识库从项目 Excel 资料和前端接口调用名中整理数据库对象线索。
## Excel 资料
### 数据库结构.xlsx
路径MesProject20250822\数据库结构.xlsx
状态ok
工作表:
- 测量数据合格索引25 行32 列字段示例Id_tagCF、工厂、工作中心、TagID_CF、EngineTypeID、EngineID、EngineType、TagValue1、TagValue2、TagValue3、TagValue4、TagValue5
- 测量数据合格48 行23 列字段示例Id、Id_tagCF、EngineTypeID、EngineID、TagID、TagValue、IsOK、IsGoodBad、测量位置、测量项目、工位号、理论值
- 测量数据发动机在线状态6 行35 列字段示例ID、工厂、工作中心、工位号、订单号、机型代码、机型、发动机号、托盘编号、操作者工号、班次代码、到达时间
- 测量数据工位报警全部8 行20 列字段示例ID、AlarmID、TagID、TagTypeID、OpName、TagValue、MsgNr、State、alarmStartTime、alarmEndTime、Comment、Username
- MES_装配数据_零部件追溯26 行66 列字段示例ID、追溯代码、订单号、SAP物料号、发动机型号、发动机型号代码、发动机机型、发动机数量、厂牌编号起始号、客户名称、投料日期、文件编号
### MES基础数据.xlsx
路径MesProject20250822\MES基础数据.xlsx
状态ok
工作表:
- 基本变量_JEE87 行26 列字段示例TagID、TagName、工位号、数据来源、IP、TagTypeID、TagLong、DbName、变量类型、变量地址、地址、演示偏移
- MES_计划BOM_工位与名称84 行64 列字段示例工位代码、工位号、指南工位号、机床类型、工位名称、线体类型、二维码扫描枪、固定条形码扫描枪、手持条形码扫描枪、PC、工控机名称、工控机IP
- MES_基本数据_测量范围225 行7 列字段示例数值代码、TagID、理论值、值上限、值下限、发动机型号代码、是否启用、1、70100501、110.00、112.23、108.25
- 报警变量15 行23 列字段示例X、700、701、702、703、704、705、706、707、708、709、710
- MES_基本变量原始数据337 行32 列字段示例TagID、TagName、工位号、数据来源、IP、TagTypeID、TagLong、DbName、变量类型、变量地址、变量其它、演示偏移
- MES_机床报警33 行32 列字段示例TagID、TagName、工位号、数据来源、IP、TagTypeID、TagLong、DbName、变量类型、变量地址、变量其它、演示偏移
- MES_基本变量_报警报文30 行6 列字段示例NR、MSGVAR、MSGBIT、TypeName、TEXT1、TEXT2、101005010、10100501、0、1、[000] =OP1005 + 升降机 电机过流 故障、OP1005
- Sheet385 行1 列字段示例TagTypeID、2、2、2、2
### 基本变量.xlsx
路径MesProject20250822\基本变量.xlsx
状态ok
工作表:
- Sheet1未知 行,未知 列;字段示例:
## 从接口调用推断的数据库/过程对象关键词
- .点检表类型
- AAA临工看板_主看板_查询数据
- ANDON_ANDON信息_备份_故障Andon统计综合查询
- ANDON_ANDON信息_备份_故障Andon综合查询_分页
- ANDON_ANDON信息_备份_故障Andon综合查询新
- ANDON_ANDON信息_备份_物料Andon统计综合查询
- ANDON_ANDON信息_备份_物料Andon综合查询_分页
- ANDON_ANDON信息_备份_物料Andon综合查询新
- ANDON_ANDON信息_备份_质量Andon统计综合查询
- ANDON_ANDON信息_备份_质量Andon综合查询_分页
- ANDON_ANDON信息_备份_质量Andon综合查询新
- ANDON_类型_查询
- ANDON_类型_编号_导入Excel
- ANDON_类型_编号_导入校验
- ANDON_类型_编号_工艺页删除
- ANDON_类型_编号_工艺页增加
- ANDON_类型_编号_工艺页查询
- ANDON_类型_编号_工艺页编辑
- ANDON监控_查询
- LG_临工看板_工艺管理_工艺文件上传
- LG_临工看板_工艺管理_工艺文件删除
- LG_临工看板_工艺管理_工艺文件查询
- MES_OEE计算_查询
- MES_基本变量_启用与监控编辑
- MES_基本变量_基本机型_查询_zdy
- MES_基本变量_字段信息_编辑
- MES_基本变量_报警类型
- MES_基本变量_机型代码_删除数据
- MES_基本变量_机型代码_删除数据_桥壳
- MES_基本变量_机型代码_删除数据_轮毂
- MES_基本变量_机型代码_吨位标志
- MES_基本变量_机型代码_增加数据
- MES_基本变量_机型代码_增加数据_桥壳
- MES_基本变量_机型代码_增加数据_轮毂
- MES_基本变量_机型代码_查询
- MES_基本变量_机型代码_查询数据
- MES_基本变量_机型代码_查询数据_桥壳
- MES_基本变量_机型代码_查询数据_轮毂
- MES_基本变量_机型代码_箱体标志
- MES_基本变量_机型代码_编辑数据
- MES_基本变量_查询数据
- MES_基本变量_查询数据_TagId
- MES_基本变量数据_增加
- MES_基本变量设备类型_删除
- MES_基本变量设备类型_增加
- MES_基本变量设备类型_查询
- MES_基本变量设备类型_编辑
- MES_基本变量设备类型对应表
- MES_基本数据_工位节拍_修改
- MES_基本数据_工位节拍_增加
- MES_基本数据_工位节拍_查询
- MES_工作站_设备状态表
- MES_机加工MES_工位点检任务每周_查询
- MES_机加工MES_工位点检任务每季_查询
- MES_机加工MES_工位点检任务每年_查询
- MES_机加工MES_工位点检任务每日_查询
- MES_机加工MES_工位点检任务每月_查询
- MES_机加工MES_工位零件图号查询_设备监控
- MES_机加工MES_库存管理_入库模块_增加入库信息_修改入库数量
- MES_机加工MES_库存管理_入库模块_更新零件状态
- MES_机加工MES_库存管理_入库模块_零件基础信息查询_根据零件图号
- MES_机加工MES_库存管理_出库模块_出库零件信息_零件出库
- MES_机加工MES_待加工区列表_排序
- MES_机加工MES_待加工零件_查询_设备监控
- MES_机加工MES_新增工位点检任务每周记录_循环执行_编辑
- MES_机加工MES_新增工位点检任务每季记录_循环执行_编辑
- MES_机加工MES_新增工位点检任务每年记录_循环执行_编辑
- MES_机加工MES_新增工位点检任务每日记录_循环执行_编辑
- MES_机加工MES_新增工位点检任务每月记录_循环执行_编辑
- MES_机加工MES_记录零件待加工显示
- MES_机加工MES_记录零件待加工显示_NEW
- MES_机加工MES_设备数据采集_工位状态_查询
- MES_机加工MES_设备数据采集_工位状态_查询_按工位号
- MES_机加工MES_设备数据采集_工作状态_查询
- MES_机加工MES_设备状态查询_初始化
- MES_看板统计_查询
- MES_装配数据_零部件追溯_修改码值
- MES_装配数据_零部件追溯_物料消耗统计_视图_查询
- MES_计划BOM_发动机订单计划_下发查询
- MES_计划BOM_发动机订单计划_未完成计划_查询
- MES_计划BOM_发动机订单计划_查询分页
- MES_计划BOM_发动机订单计划_状态_查询
- MES_计划BOM_发动机订单计划_订单上移
- MES_计划BOM_发动机订单计划_订单下发
- MES_计划BOM_发动机订单计划_订单下发取消
- MES_计划BOM_发动机订单计划_订单下移
- MES_计划BOM_发动机订单计划_订单启用
- MES_计划BOM_发动机订单计划_订单完工_报表
- MES_计划BOM_发动机订单计划_订单完工_报表新
- MES_计划BOM_发动机订单计划_订单完工_查询
- MES_计划BOM_发动机订单计划_订单导入
- MES_计划BOM_发动机订单计划_订单导入校验
- MES_计划BOM_发动机订单计划_订单导出新
- MES_计划BOM_发动机订单计划_订单手动增加
- MES_计划BOM_发动机订单计划_订单禁用
- MES_计划BOM_工位与名称
- MES_计划BOM_工位与名称_查询
- MES_计划BOM_工位与名称_点检_查询
- MES界面显示_模块列表_查询
- MES界面显示_消息滚动_修改
- MES界面显示_消息滚动_修改全部
- MES界面显示_消息滚动_初始化
- MRP_计划订单_组件零件清单_基本件_打回数据
- MRP_计划订单_组件零件清单_基本件_编辑数据
- MRP_计划订单_组件零件清单_基本件_采购_编辑数据
- MRP_计划订单_组件零件清单_编辑数据
- MRP_计划订单_车间打回零件_增加数据
- PDM_三表下达时间_查询数据
- PDM_整改件合并查询_查询数据
- PDM_整改件合并查询_查询机床
- PDM_机床名称
- PDM_机床名称_删除数据
- PDM_机床名称_发货审批_编辑数据
- PDM_机床名称_发货状态_查询数据
- PDM_机床名称_发货状态_编辑数据
- PDM_机床名称_机床状态_修改数据
- PDM_机床名称_机床状态_修改数据_编辑
- PDM_机床名称_查询数据
- PDM_机床名称_查询数据2
- PDM_机床名称_查询数据_查询全部
- PDM_机床名称_查询数据_获取数量和名称
- PDM_机床名称_查询数据_获取数量和名称_根据机床流水号
- PDM_机床名称_查询数据_通过项目流水号
- PDM_机床名称_电气状态_修改数据
- PDM_机床名称_电气调试状态_修改数据
- PDM_机床名称_调试状态_修改数据
- PDM_机床总图_删除数据
- PDM_机床总图_查询数据
- PDM_组件名称_查询数据
- PDM_组件名称_查询数据_新
- PDM_组件名称_查询数据_查询名称
- PDM_组件名称_查询数据_装配
- PDM_装箱单_主机_修改数据
- PDM_装箱单_主机_删除数据
- PDM_装箱单_主机_增加数据
- PDM_装箱单_主机_查询数据
- PDM_装箱单_备件_修改数据
- PDM_装箱单_备件_删除数据
- PDM_装箱单_备件_增加数据
- PDM_装箱单_备件_查询数据
- PDM_装箱单_总单据_修改数据
- PDM_装箱单_总单据_删除数据
- PDM_装箱单_总单据_增加数据
- PDM_装箱单_总单据_查询数据
- PDM_装箱单_机床所属部件_删除数据
- PDM_装箱单_机床所属部件_查询数据
- PDM_装箱单_部件_编辑数据
- PDM_装箱单_随机技术文件_修改数据
- PDM_装箱单_随机技术文件_删除数据
- PDM_装箱单_随机技术文件_增加数据
- PDM_装箱单_随机技术文件_查询数据
- PDM_零件明细表_一键删除
- PDM_零件明细表_加急件_增加
- PDM_零件明细表_基本件_不规范数据查询_gj
- PDM_零件明细表_基本件_临时表_全部删除
- PDM_零件明细表_基本件_临时表_删除
- PDM_零件明细表_基本件_临时表数据查询
- PDM_零件明细表_基本件_删除数据
- PDM_零件明细表_基本件_删除数据_根据组件流水号
- PDM_零件明细表_基本件_大量导入
- PDM_零件明细表_基本件_数据导入保存_删除数据gj
- PDM_零件明细表_基本件_数据导入保存_机床_查询数据gj
- PDM_零件明细表_基本件_数据导入保存_组号_查询数据gj
- PDM_零件明细表_基本件_数据导入保存_编辑整改类型
- PDM_零件明细表_基本件_查询数据
- PDM_零件明细表_基本件_查询数据_综合gj
- PDM_零件明细表_基本件_查询数据_综合gj_数量维护
- PDM_零件明细表_基本件_编辑数据
- PDM_零件明细表_基本件_编辑数据_验证图号
- PDM_零件明细表_基本件_规范数据查询_gj
- PDM_零件明细表_外购件和标准件_不规范数据查询gj
- PDM_零件明细表_外购件和标准件_临时表_全部删除
- PDM_零件明细表_外购件和标准件_临时表_删除
- PDM_零件明细表_外购件和标准件_临时表数据查询
- PDM_零件明细表_外购件和标准件_数据导入保存_删除数据gj
- PDM_零件明细表_外购件和标准件_数据导入保存_更改物料流水号
- PDM_零件明细表_外购件和标准件_数据导入保存_更改物料流水号_验证
- PDM_零件明细表_外购件和标准件_数据导入保存_编辑整改类型
- PDM_零件明细表_外购件和标准件_整改件_不规范数据查询gj
- PDM_零件明细表_外购件和标准件_整改件_规范数据查询_gj
- PDM_零件明细表_外购件和标准件_规范数据查询_gj
- PDM_零件明细表_整改件_不规范数据查询_gj
- PDM_零件明细表_整改件_大量导入
- PDM_零件明细表_整改件_数据关联查询_gj
- PDM_零件明细表_整改件_数据导入保存_组号_查询数据gj
- PDM_零件明细表_整改件_规范数据查询_gj
- PDM_零件明细表_材料_名称_查询数据_gj
- PDM_零件明细表_标准件和外购件_修改数据
- PDM_零件明细表_标准件和外购件_删除数据
- PDM_零件明细表_标准件和外购件_删除数据_根据组件流水号
- PDM_零件明细表_标准件和外购件_大量导入
- PDM_零件明细表_标准件和外购件_查询数据
- PDM_零件明细表_标准件和外购件_查询数据_数量维护
- PDM_零件明细表_标准件和外购件_物料对比
- PDM_零件明细表_物料查询gj
- PDM_零件明细表_物料查询总gj
- PDM_零件明细表_组件流水号_查询数据_根据机床
- PDM_零件明细表_组件流水号_组件数量_修改数据
- PDM_项目名称_查询数据
- PDM_项目名称_查询数据_总计划
- PDM_项目名称_查询数据_成本分析
- PDM_项目名称_查询数据_按时间排序
- PDM_项目名称_查询数据_是否显示
- PDM_项目名称_查询数据_是否显示_初始化
- PDM_项目名称_查询数据_是否显示_更改状态
- PDM_项目名称_综合查询
- PDM_项目名称_采购部采购_查询数据
- PDM_项目管理_零件明细表_标准件和外购件_车间采购_查询数据
- U8_错误信息查询
- _日志_描述表_查询模块描述
- _日志_描述表_查询模块类型
- dbo.人事档案管理_人员名单
- dbo.人事档案管理_基础表_部门
- dbo.基础数据_点检类型名称
- dbo.客户关系管理系统_价值评估_查询数据_MESWORK
- dbo.客户关系管理系统_客户_删除数据_MESWORK
- dbo.库存管理_供货商
- dbo.菜单系统模块_人员与角色
- dbo.车间生产管理工艺_基础表_工艺名称_增加数据
- row.人员编号
- xqs_采购管理_采购部采购_查询物料_分配后_带库存_New20191109
- xqs_采购管理_采购部采购_查询物料_分配后_带库存_创建询价单
- xqs_采购管理_采购部采购_查询物料_分配后_带库存_创建询价单_分页
- xqs_采购管理_采购部采购_查询物料_分配后_采购任务分配
- 三表导入_人员查询
- 三表查询_根据机床组号查询规格型号
- 上料无件
- 下料堵塞
- 不合格区域
- 不通过处理
- 中等故障率
- 交货日期
- 人事档案管理_人员_离职人员查询
- 人事档案管理_人员_离职操作
- 人事档案管理_人员_部门与人员_查询数据_根据部门编号
- 人事档案管理_人员_部门与人员_查询数据_根据部门编号_装配
- 人事档案管理_人员与角色_查询数据_技术员
- 人事档案管理_人员与角色_查询数据_采购员
- 人事档案管理_人员名单
- 人事档案管理_人员名单.考核部门编号=12
- 人事档案管理_人员名单.考核部门编号=人事档案管理_基础表_部门.考核部门编号
- 人事档案管理_人员名单_云上改密码
- 人事档案管理_人员名单_修改数据_MESWORK
- 人事档案管理_人员名单_删除数据_MESWORK
- 人事档案管理_人员名单_增加数据_MESWORK
- 人事档案管理_人员名单_查询数据_根据姓名_MESWORK
- 人事档案管理_人员名单_移动数据_MESWORK
- 人事档案管理_基础表_人员岗位_修改数据
- 人事档案管理_基础表_人员岗位_删除数据
- 人事档案管理_基础表_人员岗位_增加数据
- 人事档案管理_基础表_人员岗位_查询数据
- 人事档案管理_基础表_人员岗位_查询数据_根据岗位名_MESWORK
- 人事档案管理_基础表_外语及熟练程度_查询数据
- 人事档案管理_基础表_学历_查询数据
- 人事档案管理_基础表_岗位状态_查询数据
- 人事档案管理_基础表_所学专业_修改数据
- 人事档案管理_基础表_所学专业_删除数据
- 人事档案管理_基础表_所学专业_增加数据
- 人事档案管理_基础表_所学专业_查询数据
- 人事档案管理_基础表_所学专业_查询数据_根据专业名_MESWORK
- 人事档案管理_基础表_毕业院校_修改数据
- 人事档案管理_基础表_毕业院校_删除数据
- 人事档案管理_基础表_毕业院校_增加数据
- 人事档案管理_基础表_毕业院校_查询数据
- 人事档案管理_基础表_毕业院校_查询数据_根据学校名_MESWORK
- 人事档案管理_基础表_职称_查询数据
- 人事档案管理_离职人员_删除数据
- 人事档案管理_部门关系_修改节点
- 人事档案管理_部门关系_删除节点
- 人事档案管理_部门关系_增加节点
- 人事档案管理_部门关系_查询节点
- 人员名单_查询数据
- 人员管理_图片
- 人员编号
- 仓储管理_入库记录退货_未查看数量
- 仓储管理_入库记录退货_查看
- 仓储管理_入库记录退货_查询
- 低故障率
- 供应商_查询
- 供货商
- 保养周期
- 保养项目
- 停台时间
- 内容占比
- 准结定额工时
- 出库管理_人员查询
- 出库管理_人员查询1
- 出库管理_部门查询
- 创建合同_客户信息查询
- 创建合同_改变执行进度
- 创建合同_机床名称_修改数据
- 创建合同_机床名称_增加数据
- 创建合同_查询执行进度时间
- 创建合同_查询执行进度时间_总
- 初始化二维码_查询
- 制造中心_制造_零件分配_机床编号_查询
- 制造中心_制造_零件分配_组号_查询
- 加工完成时间
- 北汽福田BOM_复制
- 北汽福田_BOM_修改

View File

@@ -0,0 +1,904 @@
# 导出能力知识库
该文档整理前端页面中可导出 Excel/文件/报表的页面、按钮和后端过程。用户提出导出请求时优先参考此文档。
## NO
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\equipmentAndonStatistics\index.vue
路由推断:/AndonSystem/equipmentAndonStatistics
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=166
- 测量数据发动机在线状态_订单号_查询type=11line=182
- MES_计划BOM_工位与名称_查询type=11line=197
- NOtype=line=251
- ANDON_ANDON信息_备份_故障Andon综合查询_分页type=11line=294
- ANDON_ANDON信息_备份_故障Andon统计综合查询type=11line=322
- 测量数据工位报警全部视图_查询type=2001line=350
## AndonSystem/equipmentAndon
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\equipmentAndon\index.vue
路由推断:/AndonSystem/equipmentAndon
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=171
- 测量数据发动机在线状态_订单号_查询type=11line=187
- MES_计划BOM_工位与名称_查询type=11line=202
- ANDON_ANDON信息_备份_故障Andon综合查询_分页type=11line=234
- ANDON_ANDON信息_备份_故障Andon综合查询新type=2001line=259
## NO
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\materialAndonStatistics\index.vue
路由推断:/AndonSystem/materialAndonStatistics
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=166
- 测量数据发动机在线状态_订单号_查询type=11line=182
- MES_计划BOM_工位与名称_查询type=11line=197
- NOtype=line=251
- ANDON_ANDON信息_备份_物料Andon综合查询_分页type=11line=294
- ANDON_ANDON信息_备份_物料Andon统计综合查询type=11line=322
- 测量数据工位报警全部视图_查询type=2001line=350
## AndonSystem/materialAndon
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\materialAndon\index.vue
路由推断:/AndonSystem/materialAndon
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=171
- 测量数据发动机在线状态_订单号_查询type=11line=187
- MES_计划BOM_工位与名称_查询type=11line=202
- ANDON_ANDON信息_备份_物料Andon综合查询_分页type=11line=234
- ANDON_ANDON信息_备份_物料Andon综合查询新type=2001line=259
## NO
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\qualityAndonStatistics\index.vue
路由推断:/AndonSystem/qualityAndonStatistics
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=166
- 测量数据发动机在线状态_订单号_查询type=11line=182
- MES_计划BOM_工位与名称_查询type=11line=197
- NOtype=line=251
- ANDON_ANDON信息_备份_质量Andon综合查询_分页type=11line=294
- ANDON_ANDON信息_备份_质量Andon统计综合查询type=11line=322
- 测量数据工位报警全部视图_查询type=2001line=350
## AndonSystem/qualityAndon
模块AndonSystem
源码:前端源码\HL_MES_manager\src\views\AndonSystem\qualityAndon\index.vue
路由推断:/AndonSystem/qualityAndon
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=171
- 测量数据发动机在线状态_订单号_查询type=11line=187
- MES_计划BOM_工位与名称_查询type=11line=202
- ANDON_ANDON信息_备份_质量Andon综合查询_分页type=11line=234
- ANDON_ANDON信息_备份_质量Andon综合查询新type=2001line=259
## UploadExcel
模块BasicDataMaintenance
源码:前端源码\HL_MES_manager\src\views\BasicDataMaintenance\AlarmVariableMaintenance\index.vue
路由推断:/BasicDataMaintenance/AlarmVariableMaintenance
相关按钮:查询、复制、报警导入、编辑、取消、确定、导入到数据库
导出接口/过程:
- UploadExceltype=line=170
## UploadExcel
模块BasicDataMaintenance
源码:前端源码\HL_MES_manager\src\views\BasicDataMaintenance\BasicVariableMaintenance\index.vue
路由推断:/BasicDataMaintenance/BasicVariableMaintenance
相关按钮:查询、写入基本变量、写入报警变量、写入质量变量、新增、导入、编辑、取消、确定、导入到数据库
导出接口/过程:
- UploadExceltype=line=116
- Recipe_Machine_Exceltype=12line=465
## UploadExcel
模块BasicDataMaintenance
源码:前端源码\HL_MES_manager\src\views\BasicDataMaintenance\StationInformationMaintenance\index.vue
路由推断:/BasicDataMaintenance/StationInformationMaintenance
相关按钮Excel
导出接口/过程:
- UploadExceltype=line=770
- SELECT [工位号] FROM [dbo].[MES_计划BOM_工位与名称]type=line=908
- SELECT [设备IP],[ID] FROM [dbo].[MES_基本变量设备类型对应表] ORDER BY IDtype=line=928
- 基础数据_工位信息维护_查询type=11line=956
- 基础数据_工位信息维护_导出type=2001line=1043
- 基础数据_工位信息维护_增加type=12line=1190
- 基础数据_工位信息维护_增加type=12line=1415
- 基础数据_工位信息维护_修改type=12line=1505
- 基础数据_工位信息维护_删除type=12line=1531
- 基础数据_工位信息维护_导入校验type=11line=1646
- 基础数据_工位信息维护_导入type=12line=2016
## BasicData/SystemAlarmLog
模块BasicData
源码:前端源码\HL_MES_manager\src\views\BasicData\SystemAlarmLog\index.vue
路由推断:/BasicData/SystemAlarmLog
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=111
- _日志_描述表_查询模块描述type=11line=125
- 报警工位记录表_查询type=11line=151
- 报警工位记录表_查询type=2001line=174
## BasicData/WorkStationAlarmLog
模块BasicData
源码:前端源码\HL_MES_manager\src\views\BasicData\WorkStationAlarmLog\index.vue
路由推断:/BasicData/WorkStationAlarmLog
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=132
- 合力_系统日志_查询type=2001line=156
- _日志_描述表_查询模块描述type=11line=165
- 合力_系统日志_查询type=11line=191
## PASS
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\EquipmentAlarmStatistics\index.vue
路由推断:/EquipmentOperationAnalysis/EquipmentAlarmStatistics
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=165
- 测量数据发动机在线状态_订单号_查询type=11line=181
- MES_计划BOM_工位与名称_查询type=11line=196
- PASStype=line=243
- NOtype=line=264
- 测量数据工位报警全部视图_查询_分页type=11line=311
- 测量数据工位报警全部视图_查询报表type=11line=345
- 测量数据工位报警全部视图_查询新type=2001line=385
## EquipmentOperationAnalysis/EverydayDeviceStatistics
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\EverydayDeviceStatistics\index.vue
路由推断:/EquipmentOperationAnalysis/EverydayDeviceStatistics
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=150
- MES_看板统计_查询type=11line=174
- MES_看板统计_查询type=2001line=202
## EquipmentOperationAnalysis/Maintenancebasicequipmentinformation
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\Maintenancebasicequipmentinformation\index.vue
路由推断:/EquipmentOperationAnalysis/Maintenancebasicequipmentinformation
相关按钮:导出
导出接口/过程:
- 设备管理_设备类型_查询type=11line=210
- MES_计划BOM_工位与名称_查询type=11line=224
- 设备管理_基础表_设备台账_综合查询type=11line=257
- 设备管理_基础表_设备台账_综合查询type=2001line=284
- 设备管理_基础表_设备台账_增加type=12line=313
- 设备管理_基础表_设备台账_删除type=12line=346
- 设备管理_基础表_设备台账_修改type=12line=390
## EquipmentOperationAnalysis/RoutineCheckInformationMaintenance
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\RoutineCheckInformationMaintenance\index.vue
路由推断:/EquipmentOperationAnalysis/RoutineCheckInformationMaintenance
相关按钮:导出日点检表
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=308
- 基础数据_设备工位点检表图片_保存图片type=15line=629
## EquipmentOperationAnalysis/SpotCheckRecord
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\SpotCheckRecord\DayCheck.vue
路由推断:/EquipmentOperationAnalysis/SpotCheckRecord
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_点检_查询type=11line=69
- 点检日期_查询数据type=11line=89
- 点检日期导出_查询数据type=2001line=105
- 点检日期_查询数据_表头type=11line=114
## EquipmentOperationAnalysis/SpotCheckRecord
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\SpotCheckRecord\MoonCheck.vue
路由推断:/EquipmentOperationAnalysis/SpotCheckRecord
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_点检_查询type=11line=73
- 点检日期月_查询数据type=11line=93
- 点检日期月导出_查询数据type=2001line=109
- 点检日期_查询数据_表头type=11line=118
## EquipmentOperationAnalysis/SpotCheckRecord
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\SpotCheckRecord\QuarterCheck.vue
路由推断:/EquipmentOperationAnalysis/SpotCheckRecord
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_点检_查询type=11line=73
- 点检日期季_查询数据type=11line=93
- 点检日期季导出_查询数据type=2001line=109
- 点检日期_查询数据_表头type=11line=118
## EquipmentOperationAnalysis/SpotCheckRecord
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\SpotCheckRecord\WeekCheck.vue
路由推断:/EquipmentOperationAnalysis/SpotCheckRecord
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_点检_查询type=11line=75
- 点检日期周_查询数据type=11line=95
- 点检日期周导出_查询数据type=2001line=111
- 点检日期_查询数据_表头type=11line=120
## EquipmentOperationAnalysis/SpotCheckRecord
模块EquipmentOperationAnalysis
源码:前端源码\HL_MES_manager\src\views\EquipmentOperationAnalysis\SpotCheckRecord\YearCheck.vue
路由推断:/EquipmentOperationAnalysis/SpotCheckRecord
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_点检_查询type=11line=74
- 点检日期年_查询数据type=11line=94
- 点检日期年导出_查询数据type=2001line=110
- 点检日期_查询数据_表头type=11line=119
## UploadExcel
模块ProcessManagement
源码:前端源码\HL_MES_manager\src\views\ProcessManagement\AndonMaintenance\index.vue
路由推断:/ProcessManagement/AndonMaintenance
相关按钮:查询、添加、导入、修改、删除、取消、确定、导入到数据库
导出接口/过程:
- UploadExceltype=line=187
- ANDON_类型_编号_导入Exceltype=12line=552
## ProcessManagement/BomEngineManagement
模块ProcessManagement
源码:前端源码\HL_MES_manager\src\views\ProcessManagement\BomEngineManagement\BomList.vue
路由推断:/ProcessManagement/BomEngineManagement
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=351
- 北汽福田_BOM_福田零件号_查询type=11line=372
- 北汽福田_BOM_删除type=12line=414
- 北汽福田BOM_复制type=11line=447
- 北汽福田_BOM_修改type=11line=474
- 北汽福田_BOM_增加type=11line=497
- 北汽福田_BOM_零件号查询type=11line=517
- MES_基本变量_机型代码_查询type=11line=532
- 北汽福田_BOM_查询type=11line=580
- 北汽福田_BOM_查询type=2001line=620
## UploadExcel
模块ProcessManagement
源码:前端源码\HL_MES_manager\src\views\ProcessManagement\MaterialVerificationMaintenance\index.vue
路由推断:/ProcessManagement/MaterialVerificationMaintenance
相关按钮:导出、物料导出
导出接口/过程:
- UploadExceltype=line=308
- MES_基本变量_机型代码_查询type=11line=476
- MES_计划BOM_工位与名称_查询type=11line=493
- 电子看板_装配零件_查询type=11line=514
- 电子看板_装配零件_查询type=2001line=532
- 电子看板_装配零件_SPC_增加type=11line=568
- 电子看板_装配零件_SPC_增加type=12line=638
- 电子看板_装配零件_SPC_删除type=12line=664
- 电子看板_装配零件_SPC_修改type=12line=712
- 确认导入物料字典_新增type=11line=747
- 生产计划导入_确认导入前临时表_查询type=11line=773
- 电子看板_装配零件_总物料表_导入校验type=11line=810
- 物料数据_导入Exceltype=12line=905
- 电子看板_装配零件_总物料表_导出新type=2001line=924
## ProcessManagement/ShuntingCacheManagement
模块ProcessManagement
源码:前端源码\HL_MES_manager\src\views\ProcessManagement\ShuntingCacheManagement\index.vue
路由推断:/ProcessManagement/ShuntingCacheManagement
相关按钮:查询计划生产数据、异常删除--> <!--、取消、确定、导入到数据库
导出接口/过程:
- 物料数据_导入Exceltype=12line=898
- 电子看板_装配零件_总物料表_导出新type=2001line=917
## ProcessManagement/StepContentMaintenance
模块ProcessManagement
源码:前端源码\HL_MES_manager\src\views\ProcessManagement\StepContentMaintenance\index.vue
路由推断:/ProcessManagement/StepContentMaintenance
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=321
- MES_基本变量_机型代码_查询type=11line=340
- 电子看板_工序内容_查询_要点理由SQtype=11line=371
- 电子看板_工序内容_查询_要点理由SQtype=2001line=384
- 电子看板_工序内容_增加type=12line=427
- 电子看板_工序内容_增加type=12line=459
- 电子看板_工序内容_修改_要点理由YCtype=12line=517
- 电子看板_工序内容_删除type=12line=543
## select * from 机加工MES_零件图PDF表 where 是否启用 = 1 and name =
模块PurchasingManagement
源码:前端源码\HL_MES_manager\src\views\PurchasingManagement\PurchaseOrder\index.vue
路由推断:/PurchasingManagement/PurchaseOrder
相关按钮:导出
导出接口/过程:
- 仓储管理_入库记录退货_查询type=11line=655
- 仓储管理_入库记录退货_查看type=12line=662
- 仓储管理_入库记录退货_未查看数量type=11line=669
- select * from 机加工MES_零件图PDF表 where 是否启用 = 1 and name =type=line=687
- ${item.name}.${item.suffix}type=line=696
- 采购管理_采购合同选入项_使用库存type=12line=713
- 采购管理_订单信息_列表_查询数据type=11line=739
- 供应商_查询type=11line=751
- 订单信息_产品信息_查询数据type=11line=767
- 采购管理_采购合同选入项_隐藏type=12line=781
- 采购管理_采购合同选入项_恢复type=12line=795
- 采购管理_采购合同_增加type=12line=812
- 采购管理_采购合同明细_增加type=12line=847
- 采购管理_采购合同明细_查询数据type=11line=853
- 采购管理_采购合同明细_删除type=12line=870
- 采购管理_采购合同明细_查询数据type=11line=876
- 采购管理_采购合同明细_编辑单价type=12line=894
- 采购管理_采购合同_提交type=12line=911
- 采购管理_耗材采购合同_提交type=12line=952
- 采购合同查询_上传图片type=15line=993
- 采购管理_物料采购_查询数据type=11line=1029
- 采购管理_采购合同_查询数据type=11line=1040
- 采购管理_采购合同明细_查询数据type=11line=1050
- 采购管理_采购合同_查询数据type=11line=1078
- 采购管理_耗材采购合同_增加type=12line=1095
- 采购管理_耗材采购合同明细_查询数据type=11line=1114
- 采购管理_耗材采购合同明细_编辑数据type=12line=1162
- 采购管理_耗材采购合同明细_编辑数据type=12line=1173
- 采购管理_耗材采购合同明细_查询数据type=11line=1183
- 采购管理_耗材采购合同明细_增加数据type=12line=1220
- 采购管理_耗材采购合同明细_查询数据type=11line=1226
- 采购管理_耗材采购合同明细_删除数据type=12line=1267
- 采购管理_耗材采购合同明细_查询数据type=11line=1274
- 物料信息_查询type=11line=1333
- 采购管理_采购物料修改_修改数据type=12line=1350
- 物料信息_查询type=11line=1370
- 采购管理_耗材采购合同明细_增加数据type=12line=1397
- 采购管理_耗材采购合同明细_查询数据type=11line=1405
- 采购合同_图片_查询数据type=11line=1522
## QualityAssurance/AssemblyQualitydataQuery
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\AssemblyQualitydataQuery\index.vue
路由推断:/QualityAssurance/AssemblyQualitydataQuery
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=329
- MES_基本变量_机型代码_查询type=11line=346
- 测量数据合格索引_订单号_查询type=11line=371
- 初始化二维码_查询type=11line=397
- 测量数据合格索引_发动机号_发动机型号_查询type=11line=423
- 物料数据_视图_物料条码批次号_查询type=11line=441
- 质量数据查询_测量位置type=11line=455
- 质量数据查询_测量项目type=11line=472
- 质量数据_发动机质量数据_各个工位_视图_发动机型号_综合查询type=11line=515
- 质量数据查询_综合查询新type=2001line=555
## QualityAssurance/BarCodeDataSearch
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\BarCodeDataSearch\index.vue
路由推断:/QualityAssurance/BarCodeDataSearch
相关按钮Excel
导出接口/过程:
- 合力_扫码记录_修改码值type=11line=257
- MES_计划BOM_工位与名称_查询type=11line=275
- MES_计划BOM_工位与名称_查询type=11line=289
- 测量数据发动机在线状态_订单号_查询type=11line=307
- 测量数据发动机在线状态_发动机号_查询type=11line=328
- 合力_扫码记录_查询分页type=11line=355
- 合力_扫码记录_查询分页type=2001line=381
## QualityAssurance/InquiryTransitInformation
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\InquiryTransitInformation\index.vue
路由推断:/QualityAssurance/InquiryTransitInformation
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=267
- MES_计划BOM_工位与名称_查询type=11line=281
- 测量数据发动机在线状态_订单号_查询type=11line=299
- 测量数据发动机在线状态_发动机号_查询type=11line=320
- 质量数据查询_测量数据发动机在线状态_查询_NEWtype=11line=356
- 质量数据查询_测量数据发动机在线状态_报表_NEW新type=2001line=386
## QualityAssurance/LineItemQuery
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\LineItemQuery\index.vue
路由推断:/QualityAssurance/LineItemQuery
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=265
- MES_基本变量_机型代码_查询type=11line=281
- 电子看板装配零件_零件名称_初始化查询type=11line=297
- 初始化二维码_查询type=11line=324
- 测量数据合格索引_发动机号_发动机型号_查询type=11line=348
- 物料数据分线_视图_物料条码批次号_查询type=11line=365
- 质量数据查询_测量项目type=11line=380
- 物料数据分线_视图_查询type=11line=418
- 物料数据分线查询_报表新type=2001line=452
## QualityAssurance/LineQualityQuery
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\LineQualityQuery\index.vue
路由推断:/QualityAssurance/LineQualityQuery
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=295
- MES_基本变量_机型代码_查询type=11line=312
- 测量数据发动机在线状态_订单号_查询type=11line=328
- 初始化二维码_查询type=11line=352
- 测量数据合格索引_发动机号_发动机型号_查询type=11line=376
- 物料数据分线_视图_物料条码批次号_查询type=11line=392
- 质量数据查询_测量位置type=11line=406
- 质量数据查询_测量项目type=11line=423
- 质量数据_发动机分线质量数据_综合查询type=11line=465
- 质量数据分线_导出新type=2001line=503
## QualityAssurance/MaterialDataQuery
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\MaterialDataQuery\index.vue
路由推断:/QualityAssurance/MaterialDataQuery
相关按钮Excel
导出接口/过程:
- MES_装配数据_零部件追溯_修改码值type=11line=269
- MES_计划BOM_工位与名称_查询type=11line=287
- MES_基本变量_机型代码_查询type=11line=304
- 电子看板装配零件_零件名称_初始化查询type=11line=320
- 初始化二维码_查询type=11line=347
- 测量数据合格索引_发动机号_发动机型号_查询type=11line=373
- 物料数据_视图_物料条码批次号_查询type=11line=391
- 质量数据查询_测量位置type=11line=405
- 质量数据查询_测量项目type=11line=422
- 物料数据_视图_查询type=11line=462
- 物料数据查询_报表新type=2001line=498
## QualityAssurance/MaterialsConsumeCount
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\MaterialsConsumeCount\index.vue
路由推断:/QualityAssurance/MaterialsConsumeCount
相关按钮Excel
导出接口/过程:
- MES_装配数据_零部件追溯_修改码值type=11line=243
- MES_计划BOM_工位与名称_查询type=11line=261
- MES_基本变量_机型代码_查询type=11line=276
- 电子看板装配零件_零件名称_初始化查询type=11line=292
- 初始化二维码_查询type=11line=319
- 测量数据合格索引_发动机号_发动机型号_查询type=11line=345
- 物料数据_视图_物料条码批次号_查询type=11line=363
- 质量数据查询_测量位置type=11line=377
- 质量数据查询_测量项目type=11line=394
- MES_装配数据_零部件追溯_物料消耗统计_视图_查询type=11line=417
- MES_装配数据_零部件追溯_物料消耗统计_视图_查询type=2001line=439
## QualityAssurance/PatrolInspectionDataSearch
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\PatrolInspectionDataSearch\index.vue
路由推断:/QualityAssurance/PatrolInspectionDataSearch
相关按钮:导出
导出接口/过程:
- 合力_巡检记录_增加type=11line=240
- MES_计划BOM_工位与名称_查询type=11line=255
- _日志_描述表_查询模块类型type=11line=270
- _日志_描述表_查询模块描述type=11line=283
- 合力_巡检记录_视图_查询type=11line=303
- 合力_巡检记录_视图_查询type=2001line=320
## PASS
模块QualityAssurance
源码:前端源码\HL_MES_manager\src\views\QualityAssurance\ProductionPlanOrderCompletion\index.vue
路由推断:/QualityAssurance/ProductionPlanOrderCompletion
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=177
- 测量数据发动机在线状态_订单号_查询type=11line=193
- MES_计划BOM_工位与名称_查询type=11line=208
- PASStype=line=258
- NOtype=line=279
- MES_计划BOM_发动机订单计划_订单完工_查询type=11line=328
- MES_计划BOM_发动机订单计划_订单完工_报表type=11line=364
- MES_计划BOM_发动机订单计划_订单完工_报表新type=2001line=406
## UploadExcel
模块RecipeManagement
源码:前端源码\HL_MES_manager\src\views\RecipeManagement\BasicDataManagement\index.vue
路由推断:/RecipeManagement/BasicDataManagement
相关按钮:查询、新增、导入、编辑、删除、取消、确定、导入到数据库
导出接口/过程:
- UploadExceltype=line=135
- Recipe_WorkBook_Exceltype=12line=386
## UploadExcel
模块RecipeManagement
源码:前端源码\HL_MES_manager\src\views\RecipeManagement\ElectricalComponentParameters\index.vue
路由推断:/RecipeManagement/ElectricalComponentParameters
相关按钮:查询、新增、导入、编辑、删除、取消、确定、导入到数据库
导出接口/过程:
- UploadExceltype=line=147
- Recipe_Machine_Exceltype=12line=466
## RecipeManagement/MaterialFactoryManagement
模块RecipeManagement
源码:前端源码\HL_MES_manager\src\views\RecipeManagement\MaterialFactoryManagement\index.vue
路由推断:/RecipeManagement/MaterialFactoryManagement
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=281
- 合力_HMI物料厂家_查询type=11line=300
- 合力_HMI物料厂家_查询type=2001line=312
- 合力_停机记录_结束type=12line=329
- 合力_停机记录_查询type=11line=353
- 合力_HMI物料厂家_增加type=12line=400
- 合力_HMI物料厂家_修改type=12line=435
## RecipeManagement/MaterialFactorySearch
模块RecipeManagement
源码:前端源码\HL_MES_manager\src\views\RecipeManagement\MaterialFactorySearch\index.vue
路由推断:/RecipeManagement/MaterialFactorySearch
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=316
- 合力_HMI物料厂家_生产记录_查询type=11line=341
- 合力_HMI物料厂家_生产记录_查询type=2001line=360
- 合力_停机记录_结束type=12line=377
- 合力_停机记录_查询type=11line=401
- 合力_HMI物料厂家_生产记录_修改厂家type=11line=425
- 合力_HMI物料厂家_增加type=11line=462
- 合力_HMI物料厂家_修改type=11line=497
## select * from [报警数据_大柴]
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\AlarmAnalysis\index.vue
路由推断:/SearchData/AlarmAnalysis
相关按钮导出EXCEL
导出接口/过程:
- 设备报警_报警历史查询_管理软件分页type=11line=150
- select * from [报警数据_大柴]type=line=186
- 报警统计表type=line=201
- 报警类型type=line=274
- 报警次数type=line=288
- 报警次数type=line=294
- 报警类型type=line=338
- select 测量项目 ,COUNT(测量项目) as 次数 from 报警数据_大柴type=line=377
- 呼叫类型type=line=459
- 停台时间type=line=469
- 停台时间type=line=475
- 呼叫类型type=line=519
## NO
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\FTTTrendChart\index.vue
路由推断:/SearchData/FTTTrendChart
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=190
- NOtype=line=244
- Data_WorkStationFTT_Statistic_Formtype=11line=287
- Data_WorkStationFTT_Statistic_Graphtype=11line=311
## SearchData/FaultStopWorkManagement
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\FaultStopWorkManagement\index.vue
路由推断:/SearchData/FaultStopWorkManagement
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=375
- 测量数据发动机在线状态_工位数据_日期_查询type=11line=395
- 合力_停机记录_视图_查询type=11line=459
- 合力_停机记录_视图_查询type=2001line=478
- 合力_停机记录_结束type=12line=496
- 合力_停机记录_查询type=11line=520
- 合力_计划停机时间表_修改type=12line=543
## NO
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\JPHTrendChart\index.vue
路由推断:/SearchData/JPHTrendChart
相关按钮Excel
导出接口/过程:
- NOtype=line=187
- Data_WorkStationJPH_Statistic_Formtype=11line=220
- Data_WorkStationJPH_Statistic_Addtype=11line=237
## SearchData/OEEQuerySearch
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\OEEQuerySearch\index.vue
路由推断:/SearchData/OEEQuerySearch
相关按钮:导出
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=494
- 测量数据发动机在线状态_工位数据_日期_查询type=11line=513
- MES_OEE计算_查询type=11line=572
- MES_OEE计算_查询type=2001line=584
- 合力_停机记录_结束type=12line=601
- 合力_停机记录_查询type=11line=625
- 合力_计划停机时间表_修改type=12line=648
## NO
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\OEETrendChart\index.vue
路由推断:/SearchData/OEETrendChart
相关按钮Excel
导出接口/过程:
- MES_计划BOM_工位与名称_查询type=11line=203
- NOtype=line=257
- Data_WorkStationOEE_Statistic_Formtype=11line=291
- Data_WorkStationOEE_Statistic_Addtype=11line=310
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\QualityData_XR\index.vue
路由推断:/SearchData/QualityData_XR
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=187
- 质量数据查询_测量位置type=11line=203
- 质量数据查询_测量项目type=11line=249
- 测量值type=line=433
- UCLtype=line=438
- CLtype=line=439
- LCLtype=line=440
- 测量值type=line=500
- UCLtype=line=505
- CLtype=line=506
- LCLtype=line=507
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\QualityDatasearch\index.vue
路由推断:/SearchData/QualityDatasearch
相关按钮:搜索
导出接口/过程:
- 质量数据报表type=line=662
## 质量数据报表
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\SPC_Analysis\QualityDatasearch.vue
路由推断:/SearchData/SPC_Analysis
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_基本机型_查询_zdytype=11line=171
- 质量数据查询_工位号_zdytype=11line=189
- 质量数据查询_测量位置_大柴type=11line=210
- 质量数据查询_测量项目_LLJtype=11line=232
- 质量数据_发动机质量数据_各个工位_视图_综合查询_趋势图_LLJtype=11line=263
- 质量数据报表type=line=325
- 测量值type=line=387
- USLtype=line=392
- LSLtype=line=393
- QUtype=line=394
- QLtype=line=395
- SLtype=line=396
## 工序能力分析表
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\SPC_Analysis\index.vue
路由推断:/SearchData/SPC_Analysis
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_基本机型_查询_zdytype=11line=248
- 质量数据查询_工位号_zdytype=11line=265
- 质量数据查询_测量位置_大柴type=11line=286
- 质量数据查询_测量项目_LLJtype=11line=308
- 工序能力分析表type=line=387
- M值type=line=426
- 分类type=line=453
- 目标值type=line=474
- 题号type=line=500
- 频数type=line=591
- 增长type=line=602
- 概率type=line=626
- USLtype=line=632
- LSLtype=line=633
- QUtype=line=634
- QLtype=line=635
- SLtype=line=636
- 频数type=line=661
- 频数type=line=688
- 增长type=line=716
## 工序能力分析表
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\SPC_Analysis\index111.vue
路由推断:/SearchData/SPC_Analysis
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_基本机型_查询_zdytype=11line=333
- 质量数据查询_工位号_zdytype=11line=350
- 质量数据查询_测量位置_大柴type=11line=371
- 质量数据查询_测量项目_LLJtype=11line=393
- 工序能力分析表type=line=428
- 测量值type=line=508
- USLtype=line=513
- LSLtype=line=514
- QUtype=line=515
- QLtype=line=516
- SLtype=line=517
## 质量数据查询表
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\SPC_Analysis\index_beifen.vue
路由推断:/SearchData/SPC_Analysis
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_基本机型_查询_zdytype=11line=225
- 质量数据查询_工位号_zdytype=11line=242
- 质量数据查询_测量位置_大柴type=11line=263
- 质量数据查询_测量项目_LLJtype=11line=285
- 质量数据查询表type=line=347
- 频数type=line=395
- 测量值type=line=428
- 平均温度type=line=433
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\arrangeChart\index.vue
路由推断:/SearchData/arrangeChart
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=240
- 质量数据查询_测量位置type=11line=256
- 质量数据查询_测量项目type=11line=302
- 质量数据查询表type=line=373
- 频数1type=line=421
- 频数2type=line=425
- 频数1type=line=430
- 频数2type=line=441
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\histogram\index.vue
路由推断:/SearchData/histogram
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=263
- 质量数据查询_测量位置type=11line=279
- 质量数据查询_测量项目type=11line=325
- 质量数据查询表type=line=404
- 测量值type=line=443
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\processCapabilityAnalysis\index.vue
路由推断:/SearchData/processCapabilityAnalysis
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=248
- 质量数据查询_测量位置type=11line=264
- 质量数据查询_测量项目type=11line=310
- 工序能力分析表type=line=388
- 测量值type=line=454
- USLtype=line=459
- LSLtype=line=460
- QUtype=line=461
- QLtype=line=462
- SLtype=line=463
## select distinct 工位号 from dbo.MES_基本变量_原始数据 where 变量类型代码 = 101 or 变量类型代码 = 105 or 变量类型代码 = 104 order by 工位号
模块SearchData
源码:前端源码\HL_MES_manager\src\views\SearchData\sampleTrendChart\index.vue
路由推断:/SearchData/sampleTrendChart
相关按钮导出EXCEL
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=263
- 质量数据查询_测量位置type=11line=279
- 质量数据查询_测量项目_zdytype=11line=322
- 质量数据查询_测量项目type=11line=344
- 质量数据查询表type=line=407
- 测量值type=line=470
## UploadExcel
模块WorkOrderManagement
源码:前端源码\HL_MES_manager\src\views\WorkOrderManagement\ReleaseOfProductionPlan\index.vue
路由推断:/WorkOrderManagement/ReleaseOfProductionPlan
相关按钮:订单导出
导出接口/过程:
- UploadExceltype=line=482
- MES_Managertype=line=497
- MES_基本变量_机型代码_查询type=11line=723
- 北汽福田订单创建零件号_查询type=11line=753
- 订单计划_订单号_查询type=11line=778
- 合力_分装线PLC_更新待上线数量type=12line=801
- 合力_总装线PLC_更新待上线数量type=12line=838
- 生产计划_派工订单_打印_查询type=11line=865
- 生产计划_派工订单_打印详细_查询type=11line=875
- MES_计划BOM_发动机订单计划_查询分页type=11line=920
- MES_计划BOM_发动机订单计划_订单手动增加type=12line=953
- 生产计划_派工订单_打印_增加type=12line=985
- 生产计划_派工订单_打印记录_是否重复_查询type=11line=1026
- 生产计划_派工订单_打印记录_增加type=12line=1044
- 生产计划_派工订单_打印_查询type=11line=1074
- 订单计划_删除type=11line=1099
- MES_计划BOM_发动机订单计划_订单下发type=12line=1150
- 订单计划_修改type=11line=1184
- MES_计划BOM_发动机订单计划_订单下发type=12line=1226
- MES_计划BOM_发动机订单计划_订单下发取消type=11line=1252
- 确认导入物料字典_新增type=11line=1273
- 生产计划导入_确认导入前临时表_查询type=11line=1299
- MES_计划BOM_发动机订单计划_订单导入校验type=11line=1330
- MES_计划BOM_发动机订单计划_订单导入type=12line=1393
- MES_计划BOM_发动机订单计划_查询分页type=2001line=1439
## WorkOrderManagement/ScheduleStatusChange
模块WorkOrderManagement
源码:前端源码\HL_MES_manager\src\views\WorkOrderManagement\ScheduleStatusChange\index.vue
路由推断:/WorkOrderManagement/ScheduleStatusChange
相关按钮Excel
导出接口/过程:
- MES_基本变量_机型代码_查询type=11line=205
- MES_计划BOM_发动机订单计划_状态_查询type=11line=219
- 北汽福田订单创建零件号_查询type=11line=234
- MES_计划BOM_发动机订单计划_下发查询type=11line=264
- MES_计划BOM_发动机订单计划_订单上移type=12line=279
- MES_计划BOM_发动机订单计划_订单下移type=12line=303
- MES_计划BOM_发动机订单计划_订单禁用type=12line=327
- MES_计划BOM_发动机订单计划_订单启用type=12line=351
- MES_计划BOM_发动机订单计划_订单导出新type=2001line=387
## {{ sudoku.name }}
模块dashboard
源码:前端源码\HL_MES_manager\src\views\dashboard\index.vue
路由推断:/dashboard
相关按钮下载Excel
导出接口/过程:
- 菜单系统模块_首页信息_查询数据1type=line=151
- 菜单系统模块_首页信息_查询数据2type=line=175
- 菜单系统模块_通知信息_查询数据type=line=197
- select count(*) from ${tableName} where ${condition}type=line=213

View File

@@ -0,0 +1,81 @@
# 前端操作任务知识库
该文档把用户常见说法映射到 HL_MES_manager 的真实前端模块、页面和导出接口AI 助手回答时应优先按这些页面操作路径给建议。
## 报警日志/系统日志
关键词:系统日志、操作日志、审计日志、日志导出
模块:基础数据
页面:报警日志/系统日志
操作:查询、导出
过程/查询合力_系统日志_查询、报警工位记录表_查询
源码路径:
- src/views/BasicData/WorkStationAlarmLog/index.vue
- src/views/BasicData/SystemAlarmLog/index.vue
系统日志相关功能在基础数据模块下,项目中存在 WorkStationAlarmLog 和 SystemAlarmLog 两类页面,均带导出按钮。用户询问系统日志时,优先引导其打开基础数据下的日志页面,而不是泛泛询问系统外日志类型。
## 设备报警统计、报警日志图表、报警日志
关键词:报警日志、设备报警、报警导出、报警日志图表
模块:设备运行分析/基础数据
页面:设备报警统计、报警日志图表、报警日志
操作:查询、统计、导出
过程/查询测量数据工位报警全部视图_查询新、报警工位记录表_查询
源码路径:
- src/views/EquipmentOperationAnalysis/EquipmentAlarmStatistics/index.vue
- src/views/EquipmentOperationAnalysis/EquipmentAlarmLogEcharts/index.vue
- src/views/BasicData/SystemAlarmLog/index.vue
报警相关问题优先定位到设备运行分析中的设备报警统计/报警日志图表,或基础数据中的报警日志。
## 过站信息查询
关键词:过站、过站日志、过站信息、在线状态
模块:质量保障
页面:过站信息查询
操作:查询、导出
过程/查询质量数据查询_测量数据发动机在线状态_报表_NEW新
源码路径:
- src/views/QualityAssurance/InquiryTransitInformation/index.vue
过站记录在质量保障 > 过站信息查询中处理。
## 扫码记录查询
关键词:扫码、扫码记录、条码、二维码
模块:质量保障
页面:扫码记录查询
操作:查询、导出、修改码值
过程/查询合力_扫码记录_查询分页、合力_扫码记录_修改码值
源码路径:
- src/views/QualityAssurance/BarCodeDataSearch/index.vue
扫码记录在质量保障 > 扫码记录查询中处理。
## 点检记录、设备点检质量查询
关键词:点检、点检记录、设备点检、点检导出
模块:设备运行分析/质量保障
页面:点检记录、设备点检质量查询
操作:日点检、周点检、月点检、季点检、年点检、导出
过程/查询点检日期导出_查询数据、点检日期周导出_查询数据、点检日期月导出_查询数据、点检日期季导出_查询数据、点检日期年导出_查询数据
源码路径:
- src/views/EquipmentOperationAnalysis/SpotCheckRecord/index.vue
- src/views/QualityAssurance/EquipmentMaintenance/index.vue
点检记录优先在设备运行分析 > 点检记录中处理,也可在质量保障 > 设备点检质量查询中查看质量相关点检。
## 装配质量数据查询、质量数据查询、SPC 分析
关键词:质量数据、质量追溯、装配质量、总成号
模块:质量保障/统计分析
页面装配质量数据查询、质量数据查询、SPC 分析
操作查询、导出、SPC
过程/查询质量数据查询_综合查询新
源码路径:
- src/views/QualityAssurance/AssemblyQualitydataQuery/index.vue
- src/views/SearchData/QualityDatasearch/index.vue
- src/views/SearchData/SPC_Analysis/index.vue
质量数据优先在质量保障 > 装配质量数据查询中查看,统计分析类问题进入 SearchData 的质量数据或 SPC 页面。

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,269 @@
[
{
"name": "数据库结构.xlsx",
"path": "MesProject20250822\\数据库结构.xlsx",
"status": "ok",
"sheets": [
{
"name": "测量数据合格索引",
"rows": 25,
"columns": 32,
"headers": [
"Id_tagCF",
"工厂",
"工作中心",
"TagID_CF",
"EngineTypeID",
"EngineID",
"EngineType",
"TagValue1",
"TagValue2",
"TagValue3",
"TagValue4",
"TagValue5"
]
},
{
"name": "测量数据合格",
"rows": 48,
"columns": 23,
"headers": [
"Id",
"Id_tagCF",
"EngineTypeID",
"EngineID",
"TagID",
"TagValue",
"IsOK",
"IsGoodBad",
"测量位置",
"测量项目",
"工位号",
"理论值"
]
},
{
"name": "测量数据发动机在线状态",
"rows": 6,
"columns": 35,
"headers": [
"ID",
"工厂",
"工作中心",
"工位号",
"订单号",
"机型代码",
"机型",
"发动机号",
"托盘编号",
"操作者工号",
"班次代码",
"到达时间"
]
},
{
"name": "测量数据工位报警全部",
"rows": 8,
"columns": 20,
"headers": [
"ID",
"AlarmID",
"TagID",
"TagTypeID",
"OpName",
"TagValue",
"MsgNr",
"State",
"alarmStartTime",
"alarmEndTime",
"Comment",
"Username"
]
},
{
"name": "MES_装配数据_零部件追溯",
"rows": 26,
"columns": 66,
"headers": [
"ID",
"追溯代码",
"订单号",
"SAP物料号",
"发动机型号",
"发动机型号代码",
"发动机机型",
"发动机数量",
"厂牌编号起始号",
"客户名称",
"投料日期",
"文件编号"
]
}
]
},
{
"name": "MES基础数据.xlsx",
"path": "MesProject20250822\\MES基础数据.xlsx",
"status": "ok",
"sheets": [
{
"name": "基本变量_JEE",
"rows": 87,
"columns": 26,
"headers": [
"TagID",
"TagName",
"工位号",
"数据来源",
"IP",
"TagTypeID",
"TagLong",
"DbName",
"变量类型",
"变量地址",
"地址",
"演示偏移"
]
},
{
"name": "MES_计划BOM_工位与名称",
"rows": 84,
"columns": 64,
"headers": [
"工位代码",
"工位号",
"指南工位号",
"机床类型",
"工位名称",
"线体类型",
"二维码扫描枪",
"固定条形码扫描枪",
"手持条形码扫描枪",
"PC",
"工控机名称",
"工控机IP"
]
},
{
"name": "MES_基本数据_测量范围",
"rows": 225,
"columns": 7,
"headers": [
"数值代码",
"TagID",
"理论值",
"值上限",
"值下限",
"发动机型号代码",
"是否启用",
"1",
"70100501",
"110.00",
"112.23",
"108.25"
]
},
{
"name": "报警变量",
"rows": 15,
"columns": 23,
"headers": [
"X",
"700",
"701",
"702",
"703",
"704",
"705",
"706",
"707",
"708",
"709",
"710"
]
},
{
"name": "MES_基本变量原始数据",
"rows": 337,
"columns": 32,
"headers": [
"TagID",
"TagName",
"工位号",
"数据来源",
"IP",
"TagTypeID",
"TagLong",
"DbName",
"变量类型",
"变量地址",
"变量其它",
"演示偏移"
]
},
{
"name": "MES_机床报警",
"rows": 33,
"columns": 32,
"headers": [
"TagID",
"TagName",
"工位号",
"数据来源",
"IP",
"TagTypeID",
"TagLong",
"DbName",
"变量类型",
"变量地址",
"变量其它",
"演示偏移"
]
},
{
"name": "MES_基本变量_报警报文",
"rows": 30,
"columns": 6,
"headers": [
"NR",
"MSGVAR",
"MSGBIT",
"TypeName",
"TEXT1",
"TEXT2",
"101005010",
"10100501",
"0",
"1",
"[000] =OP1005 + 升降机 电机过流 故障",
"OP1005"
]
},
{
"name": "Sheet3",
"rows": 85,
"columns": 1,
"headers": [
"TagTypeID",
"2",
"2",
"2",
"2"
]
}
]
},
{
"name": "基本变量.xlsx",
"path": "MesProject20250822\\基本变量.xlsx",
"status": "ok",
"sheets": [
{
"name": "Sheet1",
"rows": 0,
"columns": 0,
"headers": []
}
]
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,125 @@
[
{
"id": "overview",
"title": "系统总体知识",
"category": "architecture",
"tags": [
"系统架构",
"前端",
"后端",
"模块"
],
"file": "overview.md",
"summary": "HL_MES_manager 的技术架构、目录、模块数量和核心入口。"
},
{
"id": "software-features",
"title": "软件功能知识库",
"category": "feature",
"tags": [
"功能",
"页面",
"菜单",
"业务模块"
],
"file": "software-features.md",
"summary": "按业务模块整理前端页面和 MES 功能。"
},
{
"id": "page-operation-catalog",
"title": "页面级操作知识库",
"category": "frontend",
"tags": [
"页面",
"按钮",
"导出",
"查询",
"操作"
],
"file": "page-operation-catalog.md",
"summary": "从 137 个 Vue 页面抽取页面操作、按钮和接口线索。"
},
{
"id": "export-capabilities",
"title": "导出能力知识库",
"category": "frontend",
"tags": [
"导出",
"Excel",
"报表",
"下载"
],
"file": "export-capabilities.md",
"summary": "整理 58 个具备导出/下载能力的页面。"
},
{
"id": "interfaces-and-procedures",
"title": "接口与存储过程知识库",
"category": "interface",
"tags": [
"接口",
"存储过程",
"ASHX",
"MESCommonBase",
"CreateData"
],
"file": "interfaces-and-procedures.md",
"summary": "从源码抽取 3310 条接口/存储过程调用。"
},
{
"id": "frontend-task-map",
"title": "前端操作任务知识库",
"category": "frontend",
"tags": [
"前端操作",
"页面跳转",
"导出",
"系统日志",
"报警日志"
],
"file": "frontend-task-map.md",
"summary": "把用户常见请求映射到当前 MES 前端页面、源码路径和导出接口。"
},
{
"id": "database-knowledge",
"title": "数据库知识库",
"category": "database",
"tags": [
"数据库",
"SQL Server",
"表",
"存储过程",
"Excel"
],
"file": "database-knowledge.md",
"summary": "数据库资料、Excel 工作簿结构和从接口名推断的对象线索。"
},
{
"id": "plc-mqtt-integration",
"title": "PLC 与 MQTT 集成知识库",
"category": "integration",
"tags": [
"PLC",
"MQTT",
"RFID",
"OP010",
"质量保存"
],
"file": "plc-mqtt-integration.md",
"summary": "现场 PLC、RFID、MQTT、OP010、自动工位和 OPA 上料的集成要点。"
},
{
"id": "operations-and-risk",
"title": "运维与风险知识库",
"category": "operations",
"tags": [
"运维",
"部署",
"安全",
"故障排查",
"风险"
],
"file": "operations-and-risk.md",
"summary": "前端、后端、AI 服务的部署检查和已知安全风险。"
}
]

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,31 @@
# 运维与风险知识库
## AI/MCP 服务
- 目录ai-mcp-service
- 后台启动:.\start.ps1
- 状态检查:.\status.ps1
- 停止服务:.\stop.ps1
- 健康检查http://127.0.0.1:8787/health
- DeepSeek Key 配置ai-mcp-service/.env 中的 DEEPSEEK_API_KEY
## 前端配置
- 开发配置:前端源码/HL_MES_manager/static/config.js
- 发布配置:前端源码/HL_MES_manager/dist/static/config.js
- 后端地址baseURL
- AI 服务地址aiMcpURL
## 后端配置
- 主配置MES_Manage_standard/Web.config
- 主库MESBasicDB_HL
- 主入口submit/MESCommonBase.ashx
## 安全风险
- Web.config 存在明文数据库账号密码。
- CORS 当前允许任意来源。
- 通用接口支持 name/param 动态调用,应限制 AI 写入权限。
- AI 服务默认禁止写入类操作,只有 MES_AI_ALLOW_WRITE=1 才放开。
- 前端登录态主要依赖 Cookiesession 校验逻辑未启用。

View File

@@ -0,0 +1,32 @@
# 系统总体知识
HL_MES_manager 是合力差速器智能产线 MES 管理端,前端为 Vue 2 + Element UI后端为 ASP.NET ASHX数据库为 SQL Server。
## 关键目录
- 前端源码:前端源码/HL_MES_manager
- 后端发布目录MES_Manage_standard
- 主接口:/submit/MESCommonBase.ashx
- AI/MCP 服务ai-mcp-service
## 规模
- Vue 页面数量137
- 前端 API 文件数量25
- 后端 ASHX 处理器数量44
- 功能模块数量12
## 模块清单
- 登录与权限用户登录、密码修改、角色菜单加载、动态路由、Cookie 登录态
- 基础数据:人员管理、角色维护、菜单管理、用户权限、班次管理、工厂日历、设备人员绑定、设备能力维护、物料维护、工位工序维护、零件数量维护、报警日志、项目展示
- 基础变量维护基础变量维护、基础变量查询、报警变量维护、站点信息维护、变量设备类型、Excel 导入
- 工艺管理工步内容维护、工艺图片维护、物料校验维护、BOM 发动机管理、BOM 清单比对、接口模块维护、监控数据、PDF 卡片维护、分流缓存、仓位维护、标签语言维护、Andon 配置
- 工艺参数维护:拧紧位置维护、测量范围维护、工艺节拍维护、线体验证维护
- 生产计划生产计划下发、Excel 计划导入、排程状态变更
- 质量保障:装配质量数据查询、过站信息查询、扫码记录查询、物料数据查询、巡检数据查询、物料消耗统计、线体项目查询、线体质量查询、生产计划完成情况、设备点检质量查询
- 统计分析SPC 分析、质量数据查询、排列图、直方图、正态分布、XR 控制图、XS 控制图、样本趋势图、过程能力分析、OEE 查询、OEE 趋势、JPH 趋势、FTT 趋势、报警分析、故障停工管理
- 设备运行分析:设备实时状态、每日设备统计、设备报警统计、报警日志图表、设备基础信息维护、设备维修计划、当前维修计划、维修记录管理、日常点检信息维护、日/周/月/季/年点检记录
- 配方管理配方维护、新版配方维护、配方基础数据、电气元件参数、物料厂家管理、物料厂家查询、Excel 导入
- Andon 系统:设备 Andon、设备 Andon 统计、物料 Andon、物料 Andon 统计、质量 Andon、质量 Andon 统计
- 采购管理:采购订单、采购件查询、供应商管理

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
# PLC 与 MQTT 集成知识库
## MQTT
- 订阅主题MES/InstantMessaging/PF25/
- 发布主题MesPrint
- 用途:即时消息、打印消息
## PLC/RFID
用途OP010 上线、自动工位质量保存、OPA 提前上料、RFID 托盘/总成信息交互
关键点位:
- DBX500.1 到位
- DBX500.3 申请上线
- DBX587.0 允许 MES 保存
- DBX11.3 MES 保存完成
- DBB750 质量数据区
## 常见排查
- MES 不保存质量数据:检查 DBX587.0 是否置位、DBB750 是否有质量数据、MES 后端是否可用。
- PLC 等待保存完成:检查 MES 是否写 DBX11.3。
- OP010 不允许上线检查二维码、订单机型匹配、DBX500.3、DBX1.1。
- 物料数量异常:检查 OPA 上料完成信号和 MES 扣减逻辑。

View File

@@ -0,0 +1,167 @@
# 软件功能知识库
## 登录与权限
路径src/views/login/index.vue、src/permission.js、src/router/getRouter.js
功能:
- 用户登录
- 密码修改
- 角色菜单加载
- 动态路由
- Cookie 登录态
## 基础数据
路径src/views/BasicData
功能:
- 人员管理
- 角色维护
- 菜单管理
- 用户权限
- 班次管理
- 工厂日历
- 设备人员绑定
- 设备能力维护
- 物料维护
- 工位工序维护
- 零件数量维护
- 报警日志
- 项目展示
## 基础变量维护
路径src/views/BasicDataMaintenance
功能:
- 基础变量维护
- 基础变量查询
- 报警变量维护
- 站点信息维护
- 变量设备类型
- Excel 导入
## 工艺管理
路径src/views/ProcessManagement
功能:
- 工步内容维护
- 工艺图片维护
- 物料校验维护
- BOM 发动机管理
- BOM 清单比对
- 接口模块维护
- 监控数据
- PDF 卡片维护
- 分流缓存
- 仓位维护
- 标签语言维护
- Andon 配置
## 工艺参数维护
路径src/views/ProcessParameterMaintenance
功能:
- 拧紧位置维护
- 测量范围维护
- 工艺节拍维护
- 线体验证维护
## 生产计划
路径src/views/WorkOrderManagement
功能:
- 生产计划下发
- Excel 计划导入
- 排程状态变更
## 质量保障
路径src/views/QualityAssurance
功能:
- 装配质量数据查询
- 过站信息查询
- 扫码记录查询
- 物料数据查询
- 巡检数据查询
- 物料消耗统计
- 线体项目查询
- 线体质量查询
- 生产计划完成情况
- 设备点检质量查询
## 统计分析
路径src/views/SearchData、src/api/SPCanalysis
功能:
- SPC 分析
- 质量数据查询
- 排列图
- 直方图
- 正态分布
- XR 控制图
- XS 控制图
- 样本趋势图
- 过程能力分析
- OEE 查询
- OEE 趋势
- JPH 趋势
- FTT 趋势
- 报警分析
- 故障停工管理
## 设备运行分析
路径src/views/EquipmentOperationAnalysis
功能:
- 设备实时状态
- 每日设备统计
- 设备报警统计
- 报警日志图表
- 设备基础信息维护
- 设备维修计划
- 当前维修计划
- 维修记录管理
- 日常点检信息维护
- 日/周/月/季/年点检记录
## 配方管理
路径src/views/RecipeManagement
功能:
- 配方维护
- 新版配方维护
- 配方基础数据
- 电气元件参数
- 物料厂家管理
- 物料厂家查询
- Excel 导入
## Andon 系统
路径src/views/AndonSystem
功能:
- 设备 Andon
- 设备 Andon 统计
- 物料 Andon
- 物料 Andon 统计
- 质量 Andon
- 质量 Andon 统计
## 采购管理
路径src/views/PurchasingManagement
功能:
- 采购订单
- 采购件查询
- 供应商管理

View File

@@ -0,0 +1,17 @@
{
"name": "hl-mes-ai-mcp-service",
"version": "1.0.0",
"private": true,
"description": "HTTP bridge and MCP-style tool service for HL_MES_manager AI assistant.",
"main": "server.js",
"scripts": {
"start": "node server.js",
"status": "powershell -ExecutionPolicy Bypass -File .\\status.ps1",
"start:bg": "powershell -ExecutionPolicy Bypass -File .\\start.ps1",
"stop": "powershell -ExecutionPolicy Bypass -File .\\stop.ps1",
"kb:build": "node scripts/build-knowledge-base.js"
},
"engines": {
"node": ">=16"
}
}

View File

@@ -0,0 +1,661 @@
const fs = require('fs')
const path = require('path')
const childProcess = require('child_process')
const serviceDir = path.resolve(__dirname, '..')
const repoRoot = path.resolve(serviceDir, '..')
const frontendDir = path.join(repoRoot, '前端源码', 'HL_MES_manager')
const backendDir = path.join(repoRoot, 'MES_Manage_standard')
const projectDir = path.join(repoRoot, 'MesProject20250822')
const kbDir = path.join(serviceDir, 'knowledge')
const generatedDir = path.join(kbDir, 'generated')
ensureDir(kbDir)
ensureDir(generatedDir)
const capabilities = readJson(path.join(serviceDir, 'catalog', 'mes-capabilities.json'))
const frontendTaskMap = readJson(path.join(serviceDir, 'catalog', 'frontend-task-map.json'))
const apiCalls = extractApiCalls(frontendDir)
const vuePages = listFiles(path.join(frontendDir, 'src', 'views'), file => file.endsWith('.vue'))
const pageCatalog = extractPageCatalog(frontendDir, vuePages, apiCalls)
const apiFiles = listFiles(path.join(frontendDir, 'src', 'api'), file => file.endsWith('.js'))
const backendHandlers = listFiles(path.join(backendDir, 'submit'), file => file.endsWith('.ashx'))
const excelInventory = inspectExcelFiles([
path.join(projectDir, '数据库结构.xlsx'),
path.join(projectDir, 'MES基础数据.xlsx'),
path.join(projectDir, '基本变量.xlsx')
])
const docs = [
buildOverviewDoc(capabilities, vuePages, apiFiles, backendHandlers),
buildFeatureDoc(capabilities),
buildPageCatalogDoc(pageCatalog),
buildExportCatalogDoc(pageCatalog),
buildInterfaceDoc(apiCalls, backendHandlers),
buildFrontendTaskDoc(frontendTaskMap),
buildDatabaseDoc(excelInventory, apiCalls),
buildIntegrationDoc(capabilities),
buildOperationsDoc()
]
for (const doc of docs) {
fs.writeFileSync(path.join(kbDir, `${doc.id}.md`), doc.content, 'utf8')
}
const index = docs.map(doc => ({
id: doc.id,
title: doc.title,
category: doc.category,
tags: doc.tags,
file: `${doc.id}.md`,
summary: doc.summary
}))
fs.writeFileSync(path.join(kbDir, 'index.json'), JSON.stringify(index, null, 2), 'utf8')
fs.writeFileSync(path.join(generatedDir, 'api-calls.json'), JSON.stringify(apiCalls.map(item => ({
module: item.module,
operation: item.operation,
type: item.type,
name: item.name,
file: relative(repoRoot, item.file),
line: item.line
})), null, 2), 'utf8')
fs.writeFileSync(path.join(generatedDir, 'page-catalog.json'), JSON.stringify(pageCatalog.map(item => Object.assign({}, item, {
file: relative(repoRoot, item.file)
})), null, 2), 'utf8')
fs.writeFileSync(path.join(generatedDir, 'database-inventory.json'), JSON.stringify(excelInventory.map(item => Object.assign({}, item, {
path: relative(repoRoot, item.path)
})), null, 2), 'utf8')
console.log(`Knowledge base generated: ${kbDir}`)
console.log(`Documents: ${docs.length}`)
console.log(`API calls extracted: ${apiCalls.length}`)
function buildOverviewDoc(catalog, vuePages, apiFiles, handlers) {
return {
id: 'overview',
title: '系统总体知识',
category: 'architecture',
tags: ['系统架构', '前端', '后端', '模块'],
summary: 'HL_MES_manager 的技术架构、目录、模块数量和核心入口。',
content: [
'# 系统总体知识',
'',
'HL_MES_manager 是合力差速器智能产线 MES 管理端,前端为 Vue 2 + Element UI后端为 ASP.NET ASHX数据库为 SQL Server。',
'',
'## 关键目录',
'',
`- 前端源码:${catalog.frontend}`,
`- 后端发布目录:${catalog.backend}`,
`- 主接口:${catalog.mainEndpoint}`,
'- AI/MCP 服务ai-mcp-service',
'',
'## 规模',
'',
`- Vue 页面数量:${vuePages.length}`,
`- 前端 API 文件数量:${apiFiles.length}`,
`- 后端 ASHX 处理器数量:${handlers.length}`,
`- 功能模块数量:${catalog.modules.length}`,
'',
'## 模块清单',
'',
...catalog.modules.map(item => `- ${item.name}${item.features.join('、')}`),
''
].join('\n')
}
}
function buildFeatureDoc(catalog) {
const lines = ['# 软件功能知识库', '']
for (const module of catalog.modules) {
lines.push(`## ${module.name}`)
lines.push('')
lines.push(`路径:${module.paths.join('、')}`)
lines.push('')
lines.push('功能:')
for (const feature of module.features) {
lines.push(`- ${feature}`)
}
lines.push('')
}
return {
id: 'software-features',
title: '软件功能知识库',
category: 'feature',
tags: ['功能', '页面', '菜单', '业务模块'],
summary: '按业务模块整理前端页面和 MES 功能。',
content: lines.join('\n')
}
}
function buildPageCatalogDoc(pages) {
const grouped = groupBy(pages, item => item.module)
const lines = [
'# 页面级操作知识库',
'',
'该文档从 Vue 页面源码中抽取页面路径、按钮文本、接口调用、导出能力和表格字段线索,用于回答“在哪里操作、怎么查询、怎么导出”。',
''
]
Object.keys(grouped).sort().forEach(module => {
lines.push(`## ${module}`)
lines.push('')
grouped[module].forEach(page => {
lines.push(`### ${page.title || page.name}`)
lines.push('')
lines.push(`源码:${relative(repoRoot, page.file)}`)
lines.push(`路由推断:${page.route}`)
if (page.buttons.length) lines.push(`按钮:${page.buttons.join('、')}`)
if (page.exports.length) {
lines.push('导出能力:')
page.exports.forEach(item => lines.push(`- ${item.name}type=${item.type}line=${item.line}`))
}
if (page.calls.length) {
lines.push('主要接口/过程:')
page.calls.slice(0, 20).forEach(item => lines.push(`- ${item.name}type=${item.type || ''}line=${item.line}`))
}
if (page.tableColumns.length) lines.push(`表格字段线索:${page.tableColumns.slice(0, 30).join('、')}`)
lines.push('')
})
})
return {
id: 'page-operation-catalog',
title: '页面级操作知识库',
category: 'frontend',
tags: ['页面', '按钮', '导出', '查询', '操作'],
summary: `${pages.length} 个 Vue 页面抽取页面操作、按钮和接口线索。`,
content: lines.join('\n')
}
}
function buildExportCatalogDoc(pages) {
const exportPages = pages.filter(page => page.exports.length || page.buttons.some(button => /导出|下载|Excel|EXCEL/i.test(button)))
const lines = [
'# 导出能力知识库',
'',
'该文档整理前端页面中可导出 Excel/文件/报表的页面、按钮和后端过程。用户提出导出请求时优先参考此文档。',
''
]
exportPages.forEach(page => {
lines.push(`## ${page.title || page.name}`)
lines.push('')
lines.push(`模块:${page.module}`)
lines.push(`源码:${relative(repoRoot, page.file)}`)
lines.push(`路由推断:${page.route}`)
if (page.buttons.length) lines.push(`相关按钮:${page.buttons.filter(button => /导出|下载|Excel|EXCEL|报表/i.test(button)).join('、') || page.buttons.join('、')}`)
if (page.exports.length) {
lines.push('导出接口/过程:')
page.exports.forEach(item => lines.push(`- ${item.name}type=${item.type}line=${item.line}`))
}
lines.push('')
})
return {
id: 'export-capabilities',
title: '导出能力知识库',
category: 'frontend',
tags: ['导出', 'Excel', '报表', '下载'],
summary: `整理 ${exportPages.length} 个具备导出/下载能力的页面。`,
content: lines.join('\n')
}
}
function buildInterfaceDoc(apiCalls, handlers) {
const grouped = groupBy(apiCalls, item => item.module)
const lines = [
'# 接口与存储过程知识库',
'',
'前端主要通过 request.js 请求 MESCommonBase.ashx业务参数为 type、name、param。旧页面也大量使用 CreateData(type, name, param, pageSize, pageList)。',
'',
'## 后端 ASHX 入口',
'',
...handlers.map(file => `- ${relative(repoRoot, file)}`),
'',
'## 前端调用索引',
''
]
Object.keys(grouped).sort().forEach(module => {
lines.push(`### ${module}`)
lines.push('')
grouped[module].slice(0, 180).forEach(item => {
lines.push(`- ${item.operation || 'unknown'} | type=${item.type || ''} | ${item.name} | ${relative(repoRoot, item.file)}:${item.line}`)
})
if (grouped[module].length > 180) {
lines.push(`- ... 还有 ${grouped[module].length - 180} 条调用未在文档中展开,可检索 knowledge/index.json 或重新生成索引。`)
}
lines.push('')
})
return {
id: 'interfaces-and-procedures',
title: '接口与存储过程知识库',
category: 'interface',
tags: ['接口', '存储过程', 'ASHX', 'MESCommonBase', 'CreateData'],
summary: `从源码抽取 ${apiCalls.length} 条接口/存储过程调用。`,
content: lines.join('\n')
}
}
function buildFrontendTaskDoc(taskMap) {
const lines = [
'# 前端操作任务知识库',
'',
'该文档把用户常见说法映射到 HL_MES_manager 的真实前端模块、页面和导出接口AI 助手回答时应优先按这些页面操作路径给建议。',
''
]
taskMap.forEach(item => {
lines.push(`## ${item.page}`)
lines.push('')
lines.push(`关键词:${item.keywords.join('、')}`)
lines.push(`模块:${item.module}`)
lines.push(`页面:${item.page}`)
lines.push(`操作:${item.actions.join('、')}`)
lines.push(`过程/查询:${item.procedures.join('、')}`)
lines.push('源码路径:')
item.paths.forEach(file => lines.push(`- ${file}`))
lines.push('')
lines.push(item.answer)
lines.push('')
})
return {
id: 'frontend-task-map',
title: '前端操作任务知识库',
category: 'frontend',
tags: ['前端操作', '页面跳转', '导出', '系统日志', '报警日志'],
summary: '把用户常见请求映射到当前 MES 前端页面、源码路径和导出接口。',
content: lines.join('\n')
}
}
function buildDatabaseDoc(excelInventory, apiCalls) {
const objectNames = new Set()
apiCalls.forEach(call => {
extractDbTokens(call.name).forEach(name => objectNames.add(name))
})
const lines = [
'# 数据库知识库',
'',
'数据库主库配置为 MESBasicDB_HL。当前知识库从项目 Excel 资料和前端接口调用名中整理数据库对象线索。',
'',
'## Excel 资料',
''
]
excelInventory.forEach(item => {
lines.push(`### ${item.name}`)
lines.push('')
lines.push(`路径:${relative(repoRoot, item.path)}`)
lines.push(`状态:${item.status}`)
if (item.sheets && item.sheets.length) {
lines.push('工作表:')
item.sheets.forEach(sheet => {
lines.push(`- ${sheet.name}${sheet.rows || '未知'} 行,${sheet.columns || '未知'} 列;字段示例:${(sheet.headers || []).join('、')}`)
})
}
lines.push('')
})
lines.push('## 从接口调用推断的数据库/过程对象关键词')
lines.push('')
Array.from(objectNames).sort().slice(0, 300).forEach(name => {
lines.push(`- ${name}`)
})
return {
id: 'database-knowledge',
title: '数据库知识库',
category: 'database',
tags: ['数据库', 'SQL Server', '表', '存储过程', 'Excel'],
summary: '数据库资料、Excel 工作簿结构和从接口名推断的对象线索。',
content: lines.join('\n')
}
}
function buildIntegrationDoc(catalog) {
const integration = catalog.integration
return {
id: 'plc-mqtt-integration',
title: 'PLC 与 MQTT 集成知识库',
category: 'integration',
tags: ['PLC', 'MQTT', 'RFID', 'OP010', '质量保存'],
summary: '现场 PLC、RFID、MQTT、OP010、自动工位和 OPA 上料的集成要点。',
content: [
'# PLC 与 MQTT 集成知识库',
'',
'## MQTT',
'',
`- 订阅主题:${integration.mqtt.subscriptionTopic}`,
`- 发布主题:${integration.mqtt.publishTopic}`,
`- 用途:${integration.mqtt.usage.join('、')}`,
'',
'## PLC/RFID',
'',
`用途:${integration.plc.usage.join('、')}`,
'',
'关键点位:',
...integration.plc.signals.map(signal => `- ${signal}`),
'',
'## 常见排查',
'',
'- MES 不保存质量数据:检查 DBX587.0 是否置位、DBB750 是否有质量数据、MES 后端是否可用。',
'- PLC 等待保存完成:检查 MES 是否写 DBX11.3。',
'- OP010 不允许上线检查二维码、订单机型匹配、DBX500.3、DBX1.1。',
'- 物料数量异常:检查 OPA 上料完成信号和 MES 扣减逻辑。',
''
].join('\n')
}
}
function buildOperationsDoc() {
return {
id: 'operations-and-risk',
title: '运维与风险知识库',
category: 'operations',
tags: ['运维', '部署', '安全', '故障排查', '风险'],
summary: '前端、后端、AI 服务的部署检查和已知安全风险。',
content: [
'# 运维与风险知识库',
'',
'## AI/MCP 服务',
'',
'- 目录ai-mcp-service',
'- 后台启动:.\\start.ps1',
'- 状态检查:.\\status.ps1',
'- 停止服务:.\\stop.ps1',
'- 健康检查http://127.0.0.1:8787/health',
'- DeepSeek Key 配置ai-mcp-service/.env 中的 DEEPSEEK_API_KEY',
'',
'## 前端配置',
'',
'- 开发配置:前端源码/HL_MES_manager/static/config.js',
'- 发布配置:前端源码/HL_MES_manager/dist/static/config.js',
'- 后端地址baseURL',
'- AI 服务地址aiMcpURL',
'',
'## 后端配置',
'',
'- 主配置MES_Manage_standard/Web.config',
'- 主库MESBasicDB_HL',
'- 主入口submit/MESCommonBase.ashx',
'',
'## 安全风险',
'',
'- Web.config 存在明文数据库账号密码。',
'- CORS 当前允许任意来源。',
'- 通用接口支持 name/param 动态调用,应限制 AI 写入权限。',
'- AI 服务默认禁止写入类操作,只有 MES_AI_ALLOW_WRITE=1 才放开。',
'- 前端登录态主要依赖 Cookiesession 校验逻辑未启用。',
''
].join('\n')
}
}
function extractApiCalls(root) {
const files = listFiles(path.join(root, 'src'), file => file.endsWith('.js') || file.endsWith('.vue'))
const calls = []
files.forEach(file => {
const text = safeRead(file)
const lines = text.split(/\r?\n/)
lines.forEach((line, index) => {
const nameMatches = [
...line.matchAll(/name\s*:\s*['"`]([^'"`]+)['"`]/g),
...line.matchAll(/CreateData\(\s*['"`]([^'"`]+)['"`]\s*,\s*['"`]([^'"`]+)['"`]/g)
]
nameMatches.forEach(match => {
if (match[2]) {
calls.push({
file,
line: index + 1,
module: inferModule(root, file),
operation: 'CreateData',
type: match[1],
name: cleanup(match[2])
})
} else {
calls.push({
file,
line: index + 1,
module: inferModule(root, file),
operation: 'request',
type: '',
name: cleanup(match[1])
})
}
})
})
})
return calls.filter(item => item.name && item.name.length > 1 && item.name !== 'Dashboard')
}
function extractPageCatalog(root, vuePages, apiCalls) {
return vuePages.map(file => {
const text = safeRead(file)
const rel = relative(path.join(root, 'src', 'views'), file).replace(/\\/g, '/')
const parts = rel.split('/')
const module = parts[0] || 'root'
const name = parts.slice(0, -1).join('/') || path.basename(file, '.vue')
const title = inferPageTitle(text, name)
const calls = apiCalls
.filter(call => call.file === file)
.map(call => ({
operation: call.operation,
type: call.type,
name: call.name,
line: call.line
}))
const buttons = extractButtonTexts(text)
const tableColumns = extractTableColumns(text)
const exports = calls.filter(call => call.type === '2001' || /导出|报表|download|excel/i.test(call.name) || /导出|下载|Excel|EXCEL/.test(buttons.join(' ')))
return {
module,
name,
title,
file,
route: '/' + name.replace(/\/index$/, ''),
buttons,
tableColumns,
calls,
exports
}
})
}
function inferPageTitle(text, fallback) {
const titleMatch = text.match(/<h[1-6][^>]*>([^<]{2,40})<\/h[1-6]>/i)
if (titleMatch) return cleanup(titleMatch[1])
const nameMatch = text.match(/name\s*:\s*['"`]([^'"`]+)['"`]/)
if (nameMatch) return cleanup(nameMatch[1])
return fallback
}
function extractButtonTexts(text) {
const result = []
const buttonRegex = /<el-button[\s\S]*?>([\s\S]*?)<\/el-button>/g
let match
while ((match = buttonRegex.exec(text))) {
const raw = match[1]
.replace(/<[^>]+>/g, '')
.replace(/\{\{[\s\S]*?\}\}/g, '')
const value = cleanup(raw)
if (value && value.length <= 30) result.push(value)
}
return Array.from(new Set(result)).slice(0, 30)
}
function extractTableColumns(text) {
const result = []
const labelRegex = /<el-table-column[\s\S]*?label\s*=\s*['"]([^'"]+)['"][\s\S]*?>/g
let match
while ((match = labelRegex.exec(text))) {
const value = cleanup(match[1])
if (value) result.push(value)
}
return Array.from(new Set(result)).slice(0, 80)
}
function inspectExcelFiles(files) {
const xlsx = loadXlsx()
return files.map(file => {
if (!fs.existsSync(file)) {
return { name: path.basename(file), path: file, status: '文件不存在' }
}
if (xlsx) {
try {
const workbook = xlsx.readFile(file, { cellDates: false })
const sheets = workbook.SheetNames.map(name => {
const sheet = workbook.Sheets[name]
const ref = sheet['!ref'] ? xlsx.utils.decode_range(sheet['!ref']) : null
const rows = ref ? ref.e.r + 1 : 0
const columns = ref ? ref.e.c + 1 : 0
const matrix = xlsx.utils.sheet_to_json(sheet, { header: 1, blankrows: false })
const headers = []
matrix.slice(0, 5).forEach(row => {
row.forEach(value => {
if (value !== undefined && value !== null && String(value).trim() && headers.length < 12) {
headers.push(String(value).trim())
}
})
})
return { name, rows, columns, headers }
})
return { name: path.basename(file), path: file, status: 'ok', sheets }
} catch (error) {
return {
name: path.basename(file),
path: file,
status: 'xlsx 读取失败',
error: error.message
}
}
}
const script = [
'import json, sys',
'try:',
' import openpyxl',
'except Exception as e:',
' print(json.dumps({"status":"openpyxl unavailable","error":str(e)}, ensure_ascii=False)); sys.exit(0)',
'path=sys.argv[1]',
'wb=openpyxl.load_workbook(path, read_only=True, data_only=True)',
'sheets=[]',
'for ws in wb.worksheets:',
' rows=ws.max_row',
' cols=ws.max_column',
' headers=[]',
' for row in ws.iter_rows(min_row=1, max_row=min(rows, 5), values_only=True):',
' for val in row:',
' if val is not None and str(val).strip() and len(headers)<12:',
' headers.append(str(val).strip())',
' sheets.append({"name":ws.title,"rows":rows,"columns":cols,"headers":headers})',
'print(json.dumps({"status":"ok","sheets":sheets}, ensure_ascii=False))'
].join('\n')
try {
const output = childProcess.execFileSync('python', ['-c', script, file], {
encoding: 'utf8',
windowsHide: true,
timeout: 20000
})
const result = JSON.parse(output)
return Object.assign({ name: path.basename(file), path: file }, result)
} catch (error) {
return {
name: path.basename(file),
path: file,
status: '读取失败',
error: error.message
}
}
})
}
function loadXlsx() {
const candidates = [
path.join(frontendDir, 'node_modules', 'xlsx'),
'xlsx'
]
for (const candidate of candidates) {
try {
return require(candidate)
} catch (error) {
// try next candidate
}
}
return null
}
function extractDbTokens(text) {
const tokens = []
String(text || '').split(/[\s,()\[\]{};]+/).forEach(part => {
const value = part.trim()
if (!value) return
if (/[\u4e00-\u9fa5]/.test(value) && value.length >= 3) {
tokens.push(value)
}
})
return tokens
}
function inferModule(root, file) {
const rel = relative(root, file).replace(/\\/g, '/')
const parts = rel.split('/')
const viewsIndex = parts.indexOf('views')
if (viewsIndex >= 0 && parts[viewsIndex + 1]) return parts[viewsIndex + 1]
const apiIndex = parts.indexOf('api')
if (apiIndex >= 0 && parts[apiIndex + 1]) return parts[apiIndex + 1]
return parts[0] || 'root'
}
function listFiles(dir, predicate) {
if (!fs.existsSync(dir)) return []
const result = []
const stack = [dir]
while (stack.length) {
const current = stack.pop()
const entries = fs.readdirSync(current, { withFileTypes: true })
entries.forEach(entry => {
const fullPath = path.join(current, entry.name)
if (entry.isDirectory()) {
if (entry.name !== 'node_modules' && entry.name !== 'dist') stack.push(fullPath)
} else if (!predicate || predicate(fullPath)) {
result.push(fullPath)
}
})
}
return result.sort()
}
function groupBy(items, getKey) {
return items.reduce((result, item) => {
const key = getKey(item)
if (!result[key]) result[key] = []
result[key].push(item)
return result
}, {})
}
function readJson(file) {
return JSON.parse(fs.readFileSync(file, 'utf8'))
}
function safeRead(file) {
try {
return fs.readFileSync(file, 'utf8')
} catch (error) {
return ''
}
}
function cleanup(value) {
return String(value || '').replace(/\s+/g, ' ').trim()
}
function ensureDir(dir) {
fs.mkdirSync(dir, { recursive: true })
}
function relative(from, file) {
return path.relative(from, file)
}

729
ai-mcp-service/server.js Normal file
View File

@@ -0,0 +1,729 @@
const http = require('http')
const https = require('https')
const fs = require('fs')
const path = require('path')
loadEnv(path.join(__dirname, '.env'))
const PORT = Number(process.env.PORT || 8787)
const MES_BASE_URL = process.env.MES_BASE_URL || 'http://127.0.0.1:10100'
const DEEPSEEK_BASE_URL = process.env.DEEPSEEK_BASE_URL || 'https://api.deepseek.com'
const DEEPSEEK_MODEL = process.env.DEEPSEEK_MODEL || 'deepseek-v4-flash'
const DEEPSEEK_API_KEY = process.env.DEEPSEEK_API_KEY || ''
const MES_AI_ALLOW_WRITE = process.env.MES_AI_ALLOW_WRITE === '1'
const CATALOG_PATH = path.join(__dirname, 'catalog', 'mes-capabilities.json')
const catalog = JSON.parse(fs.readFileSync(CATALOG_PATH, 'utf8'))
const frontendTaskMap = readJsonIfExists(path.join(__dirname, 'catalog', 'frontend-task-map.json'), [])
const knowledgeBase = loadKnowledgeBase()
const generatedKnowledge = loadGeneratedKnowledge()
const tools = [
{
name: 'mes.list_capabilities',
description: '列出 HL_MES_manager 的模块、页面和功能能力。',
input_schema: {
type: 'object',
properties: {
module: { type: 'string', description: '可选,按模块名模糊过滤。' }
}
}
},
{
name: 'mes.search_capabilities',
description: '按关键词搜索 MES 功能目录。',
input_schema: {
type: 'object',
properties: {
keyword: { type: 'string', description: '关键词,如 质量、BOM、OEE、Andon。' }
},
required: ['keyword']
}
},
{
name: 'kb.list_documents',
description: '列出 AI 知识库中的文档。',
input_schema: {
type: 'object',
properties: {}
}
},
{
name: 'kb.search',
description: '检索 AI 知识库适合查询功能、数据库、接口、PLC、部署和风险。',
input_schema: {
type: 'object',
properties: {
keyword: { type: 'string', description: '检索关键词,如 质量数据、MES_计划BOM、OP010、DeepSeek。' },
limit: { type: 'number', description: '返回条数,默认 5。' }
},
required: ['keyword']
}
},
{
name: 'kb.read_document',
description: '读取知识库文档全文或前 N 个字符。',
input_schema: {
type: 'object',
properties: {
id: { type: 'string', description: '文档 ID。' },
maxLength: { type: 'number', description: '最大字符数,默认 12000。' }
},
required: ['id']
}
},
{
name: 'frontend.search_pages',
description: '搜索前端页面、按钮、导出能力和接口调用,适合回答页面操作问题。',
input_schema: {
type: 'object',
properties: {
keyword: { type: 'string', description: '页面、按钮、字段、接口关键词。' },
limit: { type: 'number', description: '返回条数,默认 8。' }
},
required: ['keyword']
}
},
{
name: 'mes.query',
description: '通过 MESCommonBase.ashx 调用只读查询。仅允许 type=1 或 3。',
input_schema: {
type: 'object',
properties: {
type: { type: 'string', enum: ['1', '3'] },
name: { type: 'string' },
param: { type: 'string' }
},
required: ['type', 'name']
}
},
{
name: 'mes.execute',
description: '执行 MES 通用接口。默认禁止写入类操作,需 MES_AI_ALLOW_WRITE=1。',
input_schema: {
type: 'object',
properties: {
type: { type: 'string' },
name: { type: 'string' },
param: { type: 'string' },
pageSize: {},
pageList: {}
},
required: ['type', 'name']
}
}
]
const server = http.createServer(async(req, res) => {
setCors(res)
if (req.method === 'OPTIONS') {
return sendJson(res, 204, {})
}
try {
const url = new URL(req.url, `http://${req.headers.host}`)
if (req.method === 'GET' && url.pathname === '/health') {
return sendJson(res, 200, {
ok: true,
service: 'hl-mes-ai-mcp-service',
mesBaseUrl: MES_BASE_URL,
model: DEEPSEEK_MODEL,
deepseekConfigured: Boolean(DEEPSEEK_API_KEY),
knowledgeDocuments: knowledgeBase.index.length
})
}
if (req.method === 'GET' && url.pathname === '/api/mcp/tools') {
return sendJson(res, 200, { tools })
}
if (req.method === 'GET' && url.pathname === '/api/kb/list') {
return sendJson(res, 200, { documents: knowledgeBase.index })
}
if (req.method === 'GET' && url.pathname === '/api/kb/search') {
return sendJson(res, 200, {
results: searchKnowledgeBase(url.searchParams.get('q') || '', Number(url.searchParams.get('limit') || 5))
})
}
if (req.method === 'GET' && url.pathname === '/api/kb/read') {
return sendJson(res, 200, readKnowledgeDocument(url.searchParams.get('id') || '', Number(url.searchParams.get('maxLength') || 12000)))
}
if (req.method === 'POST' && url.pathname === '/api/mcp/call') {
const body = await readJson(req)
const result = await callTool(body.name, body.arguments || {})
return sendJson(res, 200, { result })
}
if (req.method === 'POST' && url.pathname === '/api/ai/chat') {
const body = await readJson(req)
const answer = await chatWithDeepSeek(body.messages || [], body.context || {})
return sendJson(res, 200, answer)
}
sendJson(res, 404, { error: 'Not found' })
} catch (error) {
sendJson(res, 500, { error: error.message || String(error) })
}
})
server.listen(PORT, '127.0.0.1', () => {
console.log(`HL MES AI MCP service listening on http://127.0.0.1:${PORT}`)
})
async function chatWithDeepSeek(messages, context) {
if (!DEEPSEEK_API_KEY) {
return {
message: '<table><thead><tr><th>状态</th><th>处理方式</th></tr></thead><tbody><tr><td>AI 服务未配置 <code>DEEPSEEK_API_KEY</code></td><td>请在 <code>ai-mcp-service/.env</code> 中填写后重启服务。</td></tr></tbody></table>',
format: 'html',
toolResults: []
}
}
const toolResults = prefetchLocalContext(messages, context)
const systemPrompt = [
'你是 HL_MES_manager 前端系统内置 AI 助手,不是通用聊天机器人。',
'你的职责只限于帮助用户使用当前前端网页:打开模块、解释页面功能、说明查询/导出步骤、生成本系统相关表格、解释 MES 接口和排查本系统问题。',
'禁止回答与 HL_MES_manager 前端程序无关的问题。遇到无关问题,必须简短说明“我只能协助当前 MES 前端系统相关操作”,并引导用户提出页面、模块、查询、导出或排查问题。',
'回答必须优先基于当前用户可见菜单、当前路由、MES 功能目录、前端任务映射、接口约束和知识库检索结果。',
'遇到“系统日志、报警日志、扫码记录、过站日志、点检记录、导出”等词时,必须优先按前端任务映射定位项目内页面,不要扩展成操作系统日志、服务器日志或通用审计场景。',
'不要假装已经点击页面、读取实时页面数据或完成导出;实际页面跳转、导出由前端执行。',
'你可以解释模块位置、业务流程、页面查询条件、导出按钮、接口调用方式、排查方向。',
'涉及写入、删除、下发、修改数据时,必须提醒用户需要人工确认,不要直接执行。',
'输出协议:所有回答必须直接以标准 HTML 片段作为主格式输出。',
'不要使用 Markdown 语法,不要使用 ``` 代码围栏,不要输出纯文本段落,不要输出完整 html/head/body 标签。',
'输出组织规则:每次回答必须至少包含一个规范 HTML table方便用户查看。',
'即使是简短提示,也要用两列表格展示,表头可为“项目/内容”或“操作/说明”。',
'模块清单、字段说明、接口参数、页面位置、操作步骤、导出字段、排查项、对比项、结果数据,都优先使用 <table><thead><tbody><tr><th><td>。',
'可以在表格前用一个 <p> 给出一句结论,但主体必须是 table。',
'简单步骤也优先改成表格,不要使用普通项目符号列表作为主体。',
'重点使用 <strong>,路径/接口/字段使用 <code>,多行示例使用 <pre><code>。',
'不要输出 JavaScript 代码、script 标签或事件属性;需要表格时只输出静态 HTML table由前端负责显示和导出。',
'允许标签p、ul、ol、li、table、thead、tbody、tr、th、td、strong、em、code、pre、h3、h4、svg、g、rect、line、polyline、circle、text、path。',
'图文并茂规则当回答流程、模块关系、数据流、PLC/MQTT 交互、查询导出步骤时,优先在表格后补充一个简洁内联 SVG 图示SVG 必须是静态图,不得包含脚本、动画或外链。',
'禁止标签script、style、iframe、form、input、button、link、meta、image、foreignObject。',
'禁止任何 on* 事件属性、javascript: URL、内联脚本。',
'当用户要求制作 Excel、表格、清单、台账、模板时必须输出可被前端导出的 HTML table表头用 th数据行用 td。',
'如果用户要求打开某个模块或页面,只说明目标模块名称和建议页面;实际跳转由前端根据当前用户菜单执行。',
'不要输出 script、style、iframe、form、input、button不要输出任何 on* 事件属性。',
'当前前端上下文如下:',
JSON.stringify(normalizeClientContext(context)),
'当前可用 MCP 风格工具如下:',
JSON.stringify(tools.map(tool => ({ name: tool.name, description: tool.description }))),
'当前知识库文档如下:',
JSON.stringify(knowledgeBase.index.map(item => ({ id: item.id, title: item.title, category: item.category, summary: item.summary }))),
'页面级索引规模如下:',
JSON.stringify({ pages: generatedKnowledge.pages.length, apiCalls: generatedKnowledge.apiCalls.length }),
'前端任务映射如下:',
JSON.stringify(frontendTaskMap),
'MES 功能目录如下:',
JSON.stringify(catalog)
].join('\n')
const data = await requestJson(`${DEEPSEEK_BASE_URL.replace(/\/$/, '')}/chat/completions`, {
method: 'POST',
headers: {
Authorization: `Bearer ${DEEPSEEK_API_KEY}`
},
body: {
model: DEEPSEEK_MODEL,
messages: [
{ role: 'system', content: systemPrompt },
...toolResults.map(item => ({
role: 'system',
content: `本地工具 ${item.name} 结果:${JSON.stringify(item.result)}`
})),
...messages.slice(-12)
],
temperature: 0.2,
stream: false,
response_format: {
type: 'text'
}
}
})
if (data.statusCode < 200 || data.statusCode >= 300) {
const payload = data.body
throw new Error(payload.error && payload.error.message ? payload.error.message : `DeepSeek request failed: ${data.statusCode}`)
}
return {
message: ensureHtmlMessage(data.body.choices && data.body.choices[0] && data.body.choices[0].message ? data.body.choices[0].message.content : ''),
format: 'html',
model: data.body.model || DEEPSEEK_MODEL,
toolResults
}
}
function ensureHtmlMessage(message) {
const content = String(message || '').trim()
if (!content) return '<table><thead><tr><th>项目</th><th>内容</th></tr></thead><tbody><tr><td>结果</td><td>AI 服务未返回内容。</td></tr></tbody></table>'
if (/<(p|ul|ol|li|table|thead|tbody|tr|th|td|strong|em|code|pre|h3|h4|svg)[\s>]/i.test(content)) {
if (/<table[\s>]/i.test(content)) return content
return convertHtmlFragmentToTable(content)
}
return convertPlainTextToHtml(content)
}
function convertPlainTextToHtml(content) {
const lines = String(content || '').split(/\r?\n/).map(line => line.trim()).filter(Boolean)
if (!lines.length) return '<table><thead><tr><th>项目</th><th>内容</th></tr></thead><tbody><tr><td>结果</td><td>AI 服务未返回内容。</td></tr></tbody></table>'
const rows = lines.map((line, index) => {
const normalized = line
.replace(/^#{1,4}\s+/, '')
.replace(/^[-*]\s+/, '')
.replace(/^\d+[.)]\s+/, '')
return '<tr><td>' + (index + 1) + '</td><td>' + escapeHtml(normalized) + '</td></tr>'
})
return '<table><thead><tr><th>序号</th><th>内容</th></tr></thead><tbody>' + rows.join('') + '</tbody></table>'
}
function convertHtmlFragmentToTable(content) {
const blocks = []
const blockRegex = /<(h3|h4|p|li|pre)[^>]*>([\s\S]*?)<\/\1>/gi
let match
while ((match = blockRegex.exec(content))) {
const typeMap = {
h3: '标题',
h4: '标题',
p: '说明',
li: '条目',
pre: '示例'
}
const value = match[2].trim()
if (value) {
blocks.push({
type: typeMap[match[1].toLowerCase()] || '内容',
value
})
}
}
if (!blocks.length) {
const text = stripHtml(content)
return '<table><thead><tr><th>项目</th><th>内容</th></tr></thead><tbody><tr><td>说明</td><td>' + escapeHtml(text) + '</td></tr></tbody></table>'
}
const rows = blocks.map(item => '<tr><td>' + escapeHtml(item.type) + '</td><td>' + item.value + '</td></tr>')
return '<table><thead><tr><th>类型</th><th>内容</th></tr></thead><tbody>' + rows.join('') + '</tbody></table>'
}
function stripHtml(value) {
return String(value || '').replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim()
}
function escapeHtml(value) {
return String(value || '')
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#39;')
}
function prefetchLocalContext(messages, context) {
const last = messages.length ? String(messages[messages.length - 1].content || '') : ''
const results = []
if (last) {
results.push({
name: 'mes.search_capabilities',
result: searchCapabilities(last)
})
results.push({
name: 'kb.search',
result: searchKnowledgeBase(last, 5)
})
results.push({
name: 'frontend.task_map',
result: searchFrontendTaskMap(last)
})
results.push({
name: 'frontend.search_pages',
result: searchFrontendPages(last, 8)
})
const contextMatches = searchClientMenus(last, context)
if (contextMatches.length) {
results.push({
name: 'frontend.current_menu_match',
result: contextMatches
})
}
}
return results
}
async function callTool(name, args) {
if (name === 'mes.list_capabilities') {
if (!args.module) return catalog.modules
const keyword = String(args.module).toLowerCase()
return catalog.modules.filter(item => item.name.toLowerCase().includes(keyword))
}
if (name === 'mes.search_capabilities') {
return searchCapabilities(args.keyword || '')
}
if (name === 'kb.list_documents') {
return knowledgeBase.index
}
if (name === 'kb.search') {
return searchKnowledgeBase(args.keyword || '', Number(args.limit || 5))
}
if (name === 'kb.read_document') {
return readKnowledgeDocument(args.id || '', Number(args.maxLength || 12000))
}
if (name === 'frontend.search_pages') {
return searchFrontendPages(args.keyword || '', Number(args.limit || 8))
}
if (name === 'mes.query') {
const type = String(args.type || '1')
if (type !== '1' && type !== '3') {
throw new Error('mes.query only allows type=1 or type=3')
}
return callMesCommonBase({ type, name: args.name, param: args.param || '' })
}
if (name === 'mes.execute') {
const type = String(args.type || '')
if (!MES_AI_ALLOW_WRITE && type !== '1' && type !== '3') {
throw new Error('Write operations are disabled. Set MES_AI_ALLOW_WRITE=1 to enable them.')
}
return callMesCommonBase(args)
}
throw new Error(`Unknown tool: ${name}`)
}
function searchCapabilities(keyword) {
const key = String(keyword || '').trim().toLowerCase()
if (!key) return []
return catalog.modules
.map(module => {
const haystack = JSON.stringify(module).toLowerCase()
if (!haystack.includes(key)) return null
return module
})
.filter(Boolean)
}
function searchFrontendTaskMap(keyword) {
const key = String(keyword || '').toLowerCase()
if (!key) return []
return frontendTaskMap
.map(item => {
const haystack = JSON.stringify(item).toLowerCase()
let score = haystack.includes(key) ? 20 : 0
item.keywords.forEach(word => {
if (key.includes(String(word).toLowerCase()) || haystack.includes(key)) score += 5
})
return score ? Object.assign({ score }, item) : null
})
.filter(Boolean)
.sort((a, b) => b.score - a.score)
.slice(0, 5)
}
function searchClientMenus(keyword, context) {
const key = String(keyword || '').toLowerCase()
const menus = (context && Array.isArray(context.menus)) ? context.menus : []
if (!key || !menus.length) return []
return menus
.map(menu => {
const title = String(menu.title || '').toLowerCase()
let score = 0
if (title && key.includes(title)) score += 40
if (title && title.includes(key)) score += 30
for (let i = 0; i < key.length; i++) {
if (title.includes(key[i])) score += 1
}
return score ? Object.assign({ score }, menu) : null
})
.filter(Boolean)
.sort((a, b) => b.score - a.score)
.slice(0, 8)
}
function searchFrontendPages(keyword, limit) {
const key = String(keyword || '').toLowerCase()
if (!key) return []
const tokens = createSearchTokens(key)
const meaningfulTokens = tokens.filter(token => token && token.length > 1)
const max = Math.max(1, Math.min(Number(limit) || 8, 20))
return generatedKnowledge.pages
.map(page => {
const haystack = JSON.stringify(page).toLowerCase()
let score = haystack.includes(key) ? 30 : 0
key.split(/[\s,,。;;、]+/).forEach(part => {
if (part && haystack.includes(part)) score += 15
})
meaningfulTokens.forEach(token => {
if (token && haystack.includes(token)) score += token.length > 1 ? 4 : 1
})
if (/导出|excel|下载|报表/i.test(key) && page.exports && page.exports.length) score += 12
if (/日志|记录/i.test(key) && /日志|记录/i.test(haystack)) score += 12
if (!score) return null
return {
module: page.module,
title: page.title,
route: page.route,
file: page.file,
buttons: page.buttons,
exports: page.exports,
tableColumns: (page.tableColumns || []).slice(0, 20),
score
}
})
.filter(Boolean)
.sort((a, b) => b.score - a.score)
.slice(0, max)
}
function normalizeClientContext(context) {
const safeContext = context && typeof context === 'object' ? context : {}
const menus = Array.isArray(safeContext.menus) ? safeContext.menus.slice(0, 200).map(menu => ({
title: menu.title,
path: menu.path,
parentTitle: menu.parentTitle
})) : []
return {
route: safeContext.route || '',
routeName: safeContext.routeName || '',
userName: safeContext.userName || '',
menus
}
}
function readJsonIfExists(file, fallback) {
if (!fs.existsSync(file)) return fallback
return JSON.parse(fs.readFileSync(file, 'utf8'))
}
function loadGeneratedKnowledge() {
const generatedDir = path.join(__dirname, 'knowledge', 'generated')
return {
pages: readJsonIfExists(path.join(generatedDir, 'page-catalog.json'), []),
apiCalls: readJsonIfExists(path.join(generatedDir, 'api-calls.json'), []),
databaseInventory: readJsonIfExists(path.join(generatedDir, 'database-inventory.json'), [])
}
}
function loadKnowledgeBase() {
const kbDir = path.join(__dirname, 'knowledge')
const indexPath = path.join(kbDir, 'index.json')
if (!fs.existsSync(indexPath)) {
return { index: [], documents: [] }
}
const index = JSON.parse(fs.readFileSync(indexPath, 'utf8'))
const documents = index.map(item => {
const filePath = path.join(kbDir, item.file)
const content = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf8') : ''
return Object.assign({}, item, { content })
})
return { index, documents }
}
function searchKnowledgeBase(keyword, limit) {
const query = String(keyword || '').trim().toLowerCase()
if (!query) return []
const tokens = createSearchTokens(query)
const max = Math.max(1, Math.min(Number(limit) || 5, 10))
return knowledgeBase.documents
.map(doc => {
const haystack = [
doc.id,
doc.title,
doc.category,
(doc.tags || []).join(' '),
doc.summary,
doc.content
].join('\n').toLowerCase()
let score = haystack.includes(query) ? 20 : 0
tokens.forEach(token => {
if (token && haystack.includes(token)) score += token.length > 1 ? 3 : 1
})
if (!score) return null
return {
id: doc.id,
title: doc.title,
category: doc.category,
tags: doc.tags,
summary: doc.summary,
score,
excerpt: makeExcerpt(doc.content, query, tokens)
}
})
.filter(Boolean)
.sort((a, b) => b.score - a.score)
.slice(0, max)
}
function readKnowledgeDocument(id, maxLength) {
const doc = knowledgeBase.documents.find(item => item.id === id)
if (!doc) {
return { error: `Knowledge document not found: ${id}` }
}
const size = Math.max(1000, Math.min(Number(maxLength) || 12000, 50000))
return {
id: doc.id,
title: doc.title,
category: doc.category,
tags: doc.tags,
summary: doc.summary,
content: doc.content.slice(0, size),
truncated: doc.content.length > size
}
}
function createSearchTokens(query) {
const tokens = new Set()
query.split(/[\s,,。;;、]+/).forEach(token => {
if (token) tokens.add(token)
})
if (/[\u4e00-\u9fa5]/.test(query)) {
for (let i = 0; i < query.length - 1; i++) {
const token = query.slice(i, i + 2)
if (/[\u4e00-\u9fa5]{2}/.test(token)) tokens.add(token)
}
}
return Array.from(tokens)
}
function makeExcerpt(content, query, tokens) {
const lower = content.toLowerCase()
let index = lower.indexOf(query)
if (index === -1) {
for (const token of tokens) {
index = lower.indexOf(token)
if (index !== -1) break
}
}
if (index === -1) return content.slice(0, 300)
const start = Math.max(0, index - 120)
const end = Math.min(content.length, index + 280)
return content.slice(start, end)
}
async function callMesCommonBase(payload) {
const response = await requestText(`${MES_BASE_URL.replace(/\/$/, '')}/submit/MESCommonBase.ashx`, {
method: 'POST',
body: payload
})
try {
return JSON.parse(response.body)
} catch (error) {
return response.body
}
}
function requestJson(url, options) {
return requestText(url, options).then(response => {
try {
return {
statusCode: response.statusCode,
headers: response.headers,
body: JSON.parse(response.body || '{}')
}
} catch (error) {
return {
statusCode: response.statusCode,
headers: response.headers,
body: { error: { message: response.body } }
}
}
})
}
function requestText(url, options) {
return new Promise((resolve, reject) => {
const target = new URL(url)
const transport = target.protocol === 'https:' ? https : http
const body = typeof options.body === 'string' ? options.body : JSON.stringify(options.body || {})
const headers = Object.assign({
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(body)
}, options.headers || {})
const req = transport.request({
protocol: target.protocol,
hostname: target.hostname,
port: target.port,
path: `${target.pathname}${target.search}`,
method: options.method || 'GET',
headers
}, res => {
let raw = ''
res.setEncoding('utf8')
res.on('data', chunk => {
raw += chunk
})
res.on('end', () => {
resolve({
statusCode: res.statusCode,
headers: res.headers,
body: raw
})
})
})
req.on('error', reject)
req.setTimeout(120000, () => {
req.destroy(new Error('Upstream request timeout'))
})
if (body) req.write(body)
req.end()
})
}
function setCors(res) {
res.setHeader('Access-Control-Allow-Origin', '*')
res.setHeader('Access-Control-Allow-Headers', 'Content-Type')
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS')
}
function sendJson(res, statusCode, data) {
res.statusCode = statusCode
res.setHeader('Content-Type', 'application/json; charset=utf-8')
if (statusCode === 204) return res.end()
res.end(JSON.stringify(data))
}
function readJson(req) {
return new Promise((resolve, reject) => {
let raw = ''
req.on('data', chunk => {
raw += chunk
if (raw.length > 1024 * 1024) {
reject(new Error('Request body too large'))
req.destroy()
}
})
req.on('end', () => {
if (!raw) return resolve({})
try {
resolve(JSON.parse(raw))
} catch (error) {
reject(new Error('Invalid JSON body'))
}
})
req.on('error', reject)
})
}
function loadEnv(filePath) {
if (!fs.existsSync(filePath)) return
const content = fs.readFileSync(filePath, 'utf8')
content.split(/\r?\n/).forEach(line => {
const trimmed = line.trim()
if (!trimmed || trimmed.startsWith('#')) return
const index = trimmed.indexOf('=')
if (index === -1) return
const key = trimmed.slice(0, index).trim()
const value = trimmed.slice(index + 1).trim()
if (!process.env[key]) process.env[key] = value
})
}

25
ai-mcp-service/start.ps1 Normal file
View File

@@ -0,0 +1,25 @@
$ErrorActionPreference = 'Stop'
$serviceDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$port = if ($env:PORT) { [int]$env:PORT } else { 8787 }
$url = "http://127.0.0.1:$port/health"
try {
$health = Invoke-RestMethod -Uri $url -Method Get -TimeoutSec 2
Write-Host "AI MCP service is already running: $url"
$health | ConvertTo-Json -Depth 5
exit 0
} catch {
Write-Host "Starting AI MCP service on $url ..."
}
Start-Process -FilePath "node" -ArgumentList "server.js" -WorkingDirectory $serviceDir -WindowStyle Hidden
Start-Sleep -Seconds 2
try {
$health = Invoke-RestMethod -Uri $url -Method Get -TimeoutSec 5
Write-Host "AI MCP service started: $url"
$health | ConvertTo-Json -Depth 5
} catch {
Write-Error "AI MCP service failed to start. Run 'npm start' in this directory to see details."
}

13
ai-mcp-service/status.ps1 Normal file
View File

@@ -0,0 +1,13 @@
$ErrorActionPreference = 'Stop'
$port = if ($env:PORT) { [int]$env:PORT } else { 8787 }
$url = "http://127.0.0.1:$port/health"
try {
$health = Invoke-RestMethod -Uri $url -Method Get -TimeoutSec 3
Write-Host "AI MCP service is running: $url"
$health | ConvertTo-Json -Depth 5
} catch {
Write-Host "AI MCP service is not running on $url"
exit 1
}

23
ai-mcp-service/stop.ps1 Normal file
View File

@@ -0,0 +1,23 @@
$ErrorActionPreference = 'Stop'
$port = if ($env:PORT) { [int]$env:PORT } else { 8787 }
$connections = Get-NetTCPConnection -LocalAddress 127.0.0.1 -LocalPort $port -ErrorAction SilentlyContinue
if (!$connections) {
Write-Host "AI MCP service is not running on 127.0.0.1:$port"
exit 0
}
$processIds = $connections | Select-Object -ExpandProperty OwningProcess -Unique
foreach ($processId in $processIds) {
if ($processId -eq 0) {
continue
}
$process = Get-Process -Id $processId -ErrorAction SilentlyContinue
if ($process -and $process.ProcessName -eq 'node') {
Stop-Process -Id $processId -Force
Write-Host "Stopped AI MCP service process $processId"
} else {
Write-Host "Port $port is owned by process $processId, but it is not node. Skipped."
}
}