简介:基于C#与Vue构建的iMES工厂管家,是一套面向制造企业生产管理场景的MES系统,涵盖前后端完整源代码与数据库脚本,适合需要快速搭建生产制造管理平台的开发人员、企业信息化工程师,也适合想系统学习业务流程与前后端分离架构的进阶学习者。资源共1456个文件,以982个C#源文件实现后端业务逻辑、156个Vue组件构建前端界面、130个JavaScript脚本处理交互,另有数据库脚本、页面及项目配置文件,压缩包整体仅7.06MB,轻量且结构清晰。已有588人学习下载。资源不只是一份源码快照,还附带一键启动、构建与安装脚本,可帮助快速搭建运行环境;核心业务基类与表服务代码则展示了通用封装方式,便于理解系统架构并开展二次开发,也可作为毕业设计或企业选型的参考。
1. 基于C#和Vue的MES系统:中小工厂也能落地的生产制造管理方案
车间主任手里拿着一沓纸质工单,走到哪问到哪:昨天那批货到哪道工序了?这种场景在中小型制造企业里太常见了。基于C#和Vue开发的MES系统(制造执行系统)就是用来解决这类问题的——把工单下发、工序流转、报工统计、质量检验这些日常动作从纸面搬到系统里,让每一件在制品的位置和数量都能随时查到。这套iMES工厂管家采用前后端分离架构,后端C#提供业务接口,前端Vue搭建操作界面,自带数据库脚本。
它适合两类人:计划上MES但预算有限的工厂,以及想快速交付可运行项目的开发者。熟悉这套技术组合,后续接ERP接口、做车间看板都有现成路径。但务必记住一点:系统再完整,现场执行不到位,看板上的数据就只是数字。
2. 从工厂痛点看架构选型:C#后端、Vue前端与数据库表设计
MES这类系统最关键的技术决策不在某个算法或框架上,而在技术栈与工厂现场环境的匹配程度。选择C#和Vue的组合,不是因为它最新潮,而是它在制造企业里最不容易出问题。下面从三个层面拆开看。
2.1 C#在MES后端的位置:为什么这套技术栈在工厂里吃香
先看制造企业的IT环境。绝大多数工厂的服务器和办公电脑都是Windows系统,IT维护人员最熟悉的技术栈也是Windows生态下的老面孔。C#后端在这类环境里部署几乎不需要额外学习成本:IIS挂一个站点,或者直接用dotnet命令跑一个控制台服务,Windows防火墙放行端口,Web API就能对外提供接口。这一点在项目交付时特别重要,因为工厂的IT负责人通常不希望引入一套需要Linux服务器、Docker容器、K8s编排才能跑起来的系统,操作门槛越高,验收和后续维护的阻力就越大。
从开发效率上看,C#搭配EF Core或Dapper操作SQL Server非常顺手。MES系统的业务模型核心是工单、工序、报工、质检这几张表的联动,事务边界清晰,用ORM映射实体再做仓储封装,代码量比纯ADO.NET少很多。而且EF Core的迁移功能在工厂现场调整表结构时很实用:加一个字段、加一张中间表,几行迁移命令就能同步到生产库,比手工执行一堆SQL脚本安全得多。
还有一个容易被忽视但实际很重要的点:MES系统往深了做,一定要接设备数据。车间里的称重仪、扫码枪、防错料架、甚至部分PLC设备,很多带有Windows下的SDK或串口通信协议。C#在串口通信、USB HID设备读取、Windows服务托管这些方面有天然的生态优势。我见过不少项目当初用其他技术栈做,最后设备对接环节还是绕回来写一个C#的小服务中转数据。既然迟早要用,不如一开始就用。
性能方面不必担心。MES和互联网高并发场景完全不同,一个工厂车间哪怕有几百个同时在线用户,核心写操作的并发度也就是每秒几次到几十次。C#的异步接口和连接池完全够用。真正需要花精力的是业务逻辑的正确性——报工数量能不能和工单匹配、并发报工会不会导致数据覆盖——这些和编程语言无关,和数据表设计有关。
如果拿来对比替代方案,用Java技术栈做MES的团队也不少,Spring Boot生态同样成熟。但从项目交付和维护的角度看,C#的取舍清晰:工厂IT环境几乎不用额外配置,部署包可以发布为单文件免安装,数据库层面和SQL Server的配合度也优于其他组合。Vue和React比也是同样的逻辑,React在组件生态和灵活性上不输Vue,但Vue的组件库成熟度、对后台管理系统场景的贴合度,对做交付的团队更友好。选型这门课上,最贵的不是框架授权,而是团队学习和客户维护的隐性成本。C#加Vue恰好把这两块成本压到了最低。
2.2 Vue前端与传统车间操作习惯的匹配
前端的选型逻辑同样要贴合使用场景。车间里的操作终端有几种典型形态:办公室电脑上的管理端、生产线旁的工位屏、挂在墙上的生产看板。Vue在这三种形态下都有成熟的解决方案:管理端用Vue加组件库做表格、表单、权限菜单,工位屏用Vue做几个大字按钮的极简界面,看板可以直接用Vue写一个自刷新页面接到大屏显示器上。一套前端工程覆盖三种场景,维护成本可控。
很多MES项目在拿需求时,车间工人会对系统有天然的抵触——本来干得好好的,为什么要花时间去点电脑。这个问题的解法一半靠制度,另一半靠界面。Vue的组件化开发模式让二次开发时的交互调整成本很低:字体调大、按钮调大、颜色区分异常状态、把鼠标点击改成扫码枪回车触发,这些改动都落在组件内部,不牵动全局逻辑。实际项目里我一般会建议在报工界面把默认字体做到16到18号以上,按钮最小高度做到40像素以上,因为车间环境光线强、操作者可能带着手套,界面必须比普通后台管理系统更“粗放”。
与后端的交互链路也比较标准:Vue组件里通过axios调用C# Web API,接口返回统一格式的JSON,前端根据code字段判断业务成功还是失败。路由层面用Vue Router控制页面权限,菜单根据登录用户的角色动态渲染。这套模式的好处是,前端只关心展示和交互,后端只关心业务规则和数据校验,两边并行开发时只要把接口约定好就不会互相等待。
有一点要提醒:如果项目用的是Vue 2加组件库,二次开发时注意不要直接把Vue 3生态的组件或写法搬进来,两个版本在响应式原理和组件API上有不少差异,混用会出很多难以排查的运行时问题。拿到源码后先看一下package.json里锁定的vue版本,再决定能不能使用某些新语法。
2.3 数据库表结构:工单、工序、物料、报工记录怎么串起来
数据库是整个MES系统的核心资产。功能可以之后再加,但表结构设计不合理的系统,越往后越难改。一套典型的MES数据库,核心表通常包括:产品表、物料表、工单主表、工单工序表、生产报工记录表、质量检验表、用户与角色表。
我一般会建议按业务对象来划分表,而不是按页面来划分。下面这个建表片段展示了工单主表和报工记录表最核心的结构:
-- 工单主表:每一行代表一张生产工单 CREATE TABLE production_order ( id INT IDENTITY(1,1) PRIMARY KEY, order_no VARCHAR(30) NOT NULL UNIQUE, -- 工单号,扫码枪扫的就是这个 product_id INT NOT NULL, -- 关联产品表 plan_qty INT NOT NULL, -- 计划数量 completed_qty INT DEFAULT 0, -- 已完成数量(冗余字段,用于列表展示) status TINYINT DEFAULT 0, -- 0:待排产 1:生产中 2:已完工 3:已关闭 plan_start_date DATETIME, -- 计划开始时间 plan_end_date DATETIME, -- 计划结束时间 create_by INT NOT NULL, -- 创建人(关联用户表) create_time DATETIME DEFAULT GETDATE() ); -- 报工记录表:每次报工写一行,是所有统计的原始数据 CREATE TABLE production_report ( id INT IDENTITY(1,1) PRIMARY KEY, order_id INT NOT NULL, -- 关联工单主表 process_id INT NOT NULL, -- 关联工序表 report_qty INT NOT NULL, -- 本次报工数量 bad_qty INT DEFAULT 0, -- 本次不良数量 operator_id INT NOT NULL, -- 报工人(操作工) work_date DATETIME NOT NULL, -- 报工日期 remark NVARCHAR(200), -- 备注 FOREIGN KEY (order_id) REFERENCES production_order(id) );这段建表逻辑里有几个值得注意的设计。completed_qty在工单主表里属于冗余字段,它的值可以由production_report里的report_qty汇总得到,但保留这个冗余字段能让列表查询少做一次聚合计算,在数据量大时有实际性能收益。代价是每次报工写入时都要同步更新这个字段,这两步操作必须放在同一个数据库事务里,否则会出现工单显示数量和明细对不上的问题。
工序与工单的关系是另一张表order_process,每一行是“某张工单的某道工序”,包含工序编号、工序名称、计划开始时间、完成数量、是否首检等信息。产品表和物料表按基础数据来设计,产品表存产品编码、名称、规格、默认工艺路线,物料表存原料编码、批次、库存数量,物料与工单在发料环节产生关联。整体来看,这套表结构的主线是“工单带工序,工序带报工,报工带质检”,沿着这条主线就能追踪一件产品的完整生产过程。
status字段用TINYINT而不是字符串,一是查询效率高,二是在代码里可以用枚举对应,避免出现“生产中”“生产完成”“已完工”这种不统一的叫法。实际开发中,状态流转一定要有约束——比如一张已关闭的工单不能被再做报工,这个校验放在前端只是体验问题,放在后端接口和数据库层才是底线。数据库约束能防住绕过页面的所有非法操作。
3. 把源码跑起来:开发环境、数据库还原与最小启动命令
拿到源码包之后,最常见的问题是不知道从哪里开始。我的建议是严格按照“数据库先行、后端其次、前端最后”的顺序来。因为前端页面依赖后端接口返回数据,后端接口依赖数据库里有表结构和基础数据,顺序反了会让人误以为系统有问题。
3.1 开发环境清单:版本搭配与安装顺序
在动手前先把环境对齐,能省掉很多莫名其妙的报错。以下是我实际部署这类项目常用的版本组合,兼容性比较稳妥:
| 组件 | 推荐版本 | 用途与说明 |
|---|---|---|
| Visual Studio | 2022 社区版 | 打开并编译C#后端解决方案,免费 |
| .NET SDK | 6.0 或 8.0 | 后端编译运行依赖,两个版本都常见 |
| Node.js | 16.20 或 18.19 | 前端npm安装依赖与构建 |
| SQL Server | 2019 或 2022 Express | 数据库,Express版足够本机开发和并发不大的车间 |
安装顺序上,先装SQL Server再装Visual Studio是更稳的做法——VS在安装时会自动识别本机已有的SQL Server实例并集成部署工具。Node.js单独装就行,没有冲突。需要注意Node版本不要装最新的20以上,部分老版本Vue项目的依赖在最新Node下会报OpenSSL相关的错误,这是前端构建里很经典的一个坑。
3.2 还原数据库:两种方式与连接字符串配置
源码包里通常带有两种形态的数据库资源:一种是独立的SQL脚本文件,另一种是MDF数据库文件。两种方式都可以,我优先推荐执行SQL脚本,因为脚本能在新建数据库时把表结构、基础数据、索引和约束一次性建好,避免MDF文件因版本或路径问题附加失败。
用SQL Server Management Studio新建数据库后,选中目标库执行脚本即可。命令行方式也可以:
# 在Windows命令行中执行SQL脚本还原 sqlcmd -S localhost -U sa -P your_password -d iMES_DB -i db_init.sql执行完成后,验证一下核心表是否创建成功:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE';能看到production_order、production_report这些表就算成功了。接下来配置后端连接字符串。C#后端一般会把连接字符串放在appsettings.json里,打开后找到ConnectionStrings节点改成对应环境:
{ "ConnectionStrings": { "Default": "Server=localhost;Database=iMES_DB;User Id=sa;Password=your_password;TrustServerCertificate=True;" } }连接字符串这里有两个细节要改:Server字段如果是远程部署,要把localhost换成数据库服务器的IP或计算机名;Password字段换成实际密码。TrustServerCertificate=True是.NET 6之后的版本必须有的,否则本地开发默认证书不受信时会直接拒绝连接。
3.3 启动后端与前端:最小命令与验证方法
后端和前端是两个独立进程,启动顺序没有严格要求,但为了排查方便,我习惯先启动后端。后端启动,在解决方案目录下执行:
dotnet restore dotnet run --project src/iMES.Api -p:ASPNETCORE_ENVIRONMENT=Development看到控制台输出“Now listening on: http://localhost:5000”说明API已经起来了。此时可以打开浏览器访问后端地址,部分项目配置了Swagger的话还能看到接口文档页面,逐个接口手动调用来验证数据库连接是否正常。
前端启动在另一个终端里执行:
npm install npm run servenpm install第一次执行会比较慢,如果出现网络超时,换成镜像源再装一次。启动成功后控制台会输出前端访问地址,一般是http://localhost:8080。浏览器打开登录页,用系统预置的账号登录。
首次进系统后先去两个地方:一是看工单管理页面能否加载出工单数据,二是看生产报工页面能否提交一条测试数据并回显。这两条验证通过,说明数据库、后端、前端三层链路已经通了,可以进入正常的二次开发和业务配置阶段。
如果启动过程中端口被占用,后端或前端会报错提示listen EADDRINUSE或bind失败。解决办法是在启动命令里指定端口:后端开发时可以在launchSettings.json里改applicationUrl字段,前端可以在vue.config.js里改devServer的port。这个细节在工厂现场特别容易遇到——车间局域网里可能有其他系统占用了8080端口,提前改好能避免部署当天手忙脚乱。
4. 核心业务模块拆解:工单流转、报工与质检怎么联动
MES的功能模块看起来很多,但主线非常清晰:工单从创建到关闭是一个生命周期,报工是这个生命周期里最频繁的操作,质检则是在关键节点把关的控制器。三个模块串在一起,才构成完整的生产执行闭环。
4.1 工单状态机:从排产到完工的流转设计
工单状态是整个系统的“交通信号灯”。生产计划员创建工单后,工单进入待排产状态;排产完成并下发给车间后变为生产中;车间完成所有工序并质检合格后变为已完工;最后经过入库或关闭处理变为已关闭。每次状态变更都意味着业务流程进入了一个新阶段。
状态字段本身只是一个数字,但状态之间的流转规则要靠代码保证。比如说订单还在待排产状态时,车间就不能报工;已关闭的工单不允许再追加数量;状态回退必须有权限验证。前端可以控制按钮的显示和禁用,但真正的防呆逻辑一定要在后端接口做二次校验:
// 报工前的状态校验 var order = await _db.ProductionOrders.FindAsync(orderId); if (order.Status == OrderStatus.Closed) { return BadRequest(new { code = 400, message = "工单已关闭,无法报工" }); } if (order.Status != OrderStatus.Running) { return BadRequest(new { code = 400, message = "工单未开工或已完工,无法报工" }); }这段代码的逻辑很清楚:状态不是生产中一律拒绝报工。很多翻车现场都出在这种地方——前端按钮虽然禁用了,但有经验的用户换个接口工具照样能调通,如果后端没有校验,脏数据就进去了。
4.2 报工接口:从扫码输入到生产记录落库
报工是车间里频次最高的操作,也是最能体现MES价值的模块。操作工在工位屏上扫一下工单条码,输入本次完成数量,点击提交,系统就需要在工单进度、报工明细、计件统计三个层面同步更新数据。
报工方式在不同工厂差别很大。小批量多品种的工厂,一台设备一天可能要切换十几张工单,每个操作工的报工次数很频繁,用电脑页面一张张点太慢。这种场景下,扫码枪报工是绝对的主流——扫工单条码、输数量、回车,三秒内完成一次报工。大批量少品种的工厂则更依赖设备联动报工,通过计数器或PLC直接上报产量,人只处理异常。MES系统的设计必须兼容这两种模式,前一种把页面交互做到最简单,后一种把接口设计成可被外部程序调用的形式。报工接口按DTO接收数据,而不是依赖前端表单实体,就是在为设备对接预留扩展空间。
以下代码基于EF Core的DbContext写法,展示后端报工接口的核心逻辑:
[HttpPost("api/report")] public async Task<IActionResult> CreateReport([FromBody] ReportDto dto) { // 1. 校验参数合法性 if (dto.ReportQty <= 0 || dto.ReportQty > 9999) return BadRequest(new { code = 400, message = "报工数量必须在1到9999之间" }); // 2. 开启事务,保证工单更新与报工记录原子生效 using var tx = await _db.Database.BeginTransactionAsync(); // 3. 查询工单并锁定行,防止并发报工互相覆盖 var order = await _db.ProductionOrders .FromSqlRaw("SELECT * FROM production_order WITH (UPDLOCK) WHERE id = {0}", dto.OrderId) .FirstOrDefaultAsync(); if (order == null || order.Status != OrderStatus.Running) return BadRequest(new { code = 400, message = "工单不可报工" }); // 4. 插入报工明细 var record = new ProductionReport { OrderId = dto.OrderId, ProcessId = dto.ProcessId, ReportQty = dto.ReportQty, BadQty = dto.BadQty, OperatorId = dto.OperatorId, WorkDate = DateTime.Now }; _db.ProductionReports.Add(record); // 5. 更新工单完成数量 order.CompletedQty += dto.ReportQty; await _db.SaveChangesAsync(); await tx.CommitAsync(); return Ok(new { code = 200, message = "报工成功" }); }这里有几个参数和细节值得说明。dto.ReportQty是本次报工数量,上限9999是一个简单的防错约束,实际可以根据产品体型调整。第3步用UPDLOCK对工单行加锁,是为了防止两个工人同时提交报工时后写覆盖先写的数值,这在机加工车间里常有发生,不加锁就会出现数量凭空变少的情况。整个报工和更新工单的操作放在同一个事务里,任何一个步骤失败都会回滚,不会出现报了工但工单进度不更新的半截数据。
4.3 质量检验:不合格品处置流程
质检模块通常按检验节点分为来料检验、首件检验、过程巡检和完工检验。来料检验把关采购的原料和毛坯,不经过检验确认就不能投入生产;首件检验要求每班或每次换型后先做首件,合格才允许批量生产;过程巡检由质检员按频次到工位抽检;完工检验是产品下线前的最后一道关。
质检结果一般有三种处置动作:合格放行、不合格返工、不合格报废。返工会让工单进入一个“返工”子状态,返工完成后再重新检验;报废数量会计入工单的损耗字段,直接影响计划达成率的计算。整个处置流程都要保留记录,方便后续追溯是哪一批原料、哪一道工序、谁的班次导致了不良。
不合格品处置的逻辑上,最容易出问题的是“返工回退”操作。一张已经流转到下一道工序的工单,如果上一道工序被质检判了不合格,是需要它把工序位置退回去的。不少项目在这一步只更新了工单状态,没有同步更新工序指针,结果就是看板显示上一道工序已完成、检验又不合格,而工人不知道该回哪个工位处理。正确做法是,在质检不合格且处置方式为返工时,把该工序及其之后所有工序的完成状态重置为未完成,并记录系统操作日志。
质量数据积累下来就是很有价值的分析资产。按月统计各类不良的占比和趋势,能定位是来料问题、工艺问题还是操作习惯问题。很多工厂最早对MES没抱太大期望,但用了一个季度之后,最离不开的反而是质量报表模块,因为它是唯一能把“我觉得最近质量变差了”变成具体数据和趋势图的地方。
5. 部署与二次开发中的避坑指南:5个反复出现的翻车点
这套系统在你自己的开发电脑上跑通,和部署到工厂现场真正用起来,中间隔着很多细节。下面这5个问题是这类项目里出现频率最高的,有些甚至被老工程师称为玄学,但按步骤排查基本都能定位。每条都按现象、原因、解决来记录,建议部署前对照检查。
5.1 数据库连接字符串:本机能连、换台电脑就连不上
现象:开发者在自己电脑上跑得好好的,把系统部署到工厂服务器后,后端启动报错,日志提示数据库连接失败。明明服务器上数据库服务已经启动了,用管理工具也能连上。
原因:appsettings.json里的连接字符串用了localhost或127.0.0.1。localhost指当前进程所在的机器,后端服务跑在服务器上,数据库也跑在同一台服务器上,表面上看起来没问题,但如果连接字符串里写的是开发机IP,或者服务器上SQL Server配置了不允许远程连接,那部署后必然失败。
解决:先将连接字符串改为服务器本机名或数据库实际IP,然后到SQL Server配置管理器中检查TCP/IP协议是否启用、监听端口是否为1433,最后用sqlcmd在服务器上测试连接成功。这三步做完,大部分连接问题都能排除。
5.2 JWT密钥与过期时间:车间电脑时间不准引发的401
现象:系统上线后的一段时间,某个工位屏总是间歇性提示登录过期,重新登录后正常几分钟又失效,其他工位没有同样问题。
原因:排查后发现是这台工位屏的Windows系统时间比标准时间慢了几分钟。JWT令牌会校验签发时间和过期时间,车间电脑时间偏差超过阈值时,后端解析令牌就会判断为过期或未生效,于是反复要求重新登录。
解决:把车间所有用作终端的电脑时间同步改为自动同步,并在部署文档里注明这一点。同时,在做二次开发时把令牌过期时间设置成合理的值——不要为了省事设成一天,也不要设成几分钟,一般半天到一天比较合适。
5.3 上传文件路径写死:图片和工艺文档部署后404
现象:开发环境上传产品图片、工艺图纸一切正常,部署后上传功能还能用,但图片无法在页面加载,打开图片地址返回404。
原因:上传目录的绝对路径被写死成了开发机的某个盘符,比如C:\Work\iMES\uploads。部署到服务器后路径不存在,文件虽然写进了上传接口返回的地址,但服务器上没有对应的物理位置。
解决:将上传路径改为相对路径,基于当前运行目录动态拼接,通常是Path.Combine(Environment.ContentRootPath, "uploads")。同时要给这个目录设置写入权限,否则图片传上来但保存失败,界面却不一定会报错。
5.4 前端打包后接口地址还指向localhost
现象:前端开发时接口请求正常,npm run build打包部署到服务器之后,所有页面请求全部失败,打开浏览器控制台看到的接口地址仍然是http://localhost:5000。
原因:前端代码里的API基础地址写死在了环境配置文件里,通常放在.env.development中,而生产环境没有对应的环境变量,构建时就直接把开发地址带进了产物。
解决:检查前端工程下有没有.env.production文件,有就修改其中的VUE_APP_BASE_URL为服务器实际地址,没有就新建一个。打包后用编辑器打开dist目录里的js文件搜索一下localhost,确认没有残留再发布。这一步虽然简单,但在现场翻车的概率极高。
5.5 数据库排序规则导致的中文乱码与查不到数据
现象:系统录入的中文数据在列表页正常显示,但按中文关键字搜索时查不到任何结果,个别老数据甚至显示成问号。
原因:SQL Server数据库的排序规则不一致。常见情况是数据库用了区分大小写的排序规则,或历史库的字符编码与当前系统的编码不一致。中文数据在录入时如果不强制使用NVARCHAR类型,写入时就可能因为字符编码转换出现乱码。
解决:建表和脚本里字符串统一使用NVARCHAR而不是VARCHAR,数据库排序规则设为Chinese_PRC_CI_AS。已经存在的库可以按下面脚本修改排序规则,但注意要停掉应用服务避免写入冲突:
ALTER DATABASE iMES_DB COLLATE Chinese_PRC_CI_AS;改完之后,对NVARCHAR字段的查询走的是新的规则,中文模糊搜索基本就正常了。这两个细节在建库脚本阶段就做好,后面能省掉不少麻烦。
6. 二次开发的第一课:把报工页面改成扫码枪无脑输入
整个系统跑通之后,第一次真正意义上的二次开发,我建议从改报工页面入手,因为它改动小、见效快,而且直接关联车间日常操作。最常见的需求就是把报工页面改成扫码枪输入:操作工扫一下工单条码,系统自动带出工单和当前工序,输入数量回车就提交。
扫码枪的本质是一个模拟键盘的输入设备,扫一段条码后自动输入字符,并默认在末尾敲一个回车。所以前端改造的核心就是监听一个输入框的回车事件,不用装任何驱动。以最常见的Vue 2工程为例,先在模板里加一个扫码输入框:
<template> <el-input ref="scanBox" v-model="scanValue" placeholder="请扫描工单条码" size="large" clearable @keyup.enter.native="handleScan" /> </template> <script> export default { data() { return { scanValue: '' } }, methods: { // 扫码枪扫完码自动回车,触发查询 handleScan() { const code = this.scanValue.trim() if (!code) return this.loadOrderByCode(code) this.scanValue = '' }, async loadOrderByCode(code) { const { data } = await this.$http.get('/api/order/detail', { params: { code } }) if (data.code === 200) { this.currentOrder = data.data this.$message.success('工单已带出,请核对数量') } else { this.$message.error(data.message || '未找到该工单') } } } } </script>这段改动的核心逻辑很简单:扫码后回车,把条码作为工单号传给后端,后端查出工单信息后回填到页面。注意handleScan里做了trim去空格,因为有些扫码枪会在条码前后带上回车或换行符,不去掉的话查询会失败。查询成功后再把输入框清空,方便扫下一张。
改完后验证时,不用真的拿扫码枪,在输入框里输入工单号再按回车,效果完全一样。我在这类项目上的习惯是:改完功能先自己按一遍,再叫车间班组长在测试环境按几遍,他们不按流程走的操作习惯往往会暴露你没有考虑到的边界情况。
这个方向再往下走,还可以在扫码后自动聚焦工位、校验设备和工单的匹配关系、扫码报工完成后自动打印标签,每一条都是从“能用”到“好用”的进阶。MES项目做得越久越明白,业务逻辑的复杂度永远不在代码本身,而在现场每天发生的那些例外情况。希望这些经验能让你在第一次部署这套系统时少走一点弯路。
本文还有配套的精品资源,点击获取