ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vue 3 + Node.js 实战:新能源汽车4S店维修管理系统从零开发

Vue 3 + Node.js 实战:新能源汽车4S店维修管理系统从零开发 做新能源汽车养护4S店的维修管理系统是我去年接的一个真实项目。客户是一家新能源品牌授权4S店业务从传统燃油车转型过来但维修管理还停留在Excel加微信群的原始状态。工单靠手写、配件库存靠记忆、结算靠月底对账新能源车特有的电池健康记录更是完全没有系统化。客户的需求很明确要一套能管预约、管工单、管配件、管结算的Web系统前端要求用Vue后端要求用Node.js。这个项目从需求梳理到上线部署花了一个多月中间踩了不少坑今天把整个实现过程拆开讲一遍从需求分析到架构选型再到核心功能实现和排坑实录希望能给正在做同类系统的朋友一些参考。这套系统的价值在于它不只是一般的进销存而是把新能源车辆养护的特殊业务流程电池检测、高压安全、OTA升级记录和传统4S店维修管理工单、配件、结算做了深度融合。无论你是刚接触Vue和Node.js全栈开发的新手还是已经在做管理系统的工程师这篇文章里关于业务流程建模、接口设计、权限控制、环境配置坑点这些内容都可以直接拿来用。1. 项目背景与核心需求拆解1.1 新能源养护系统和传统维修系统差在哪先聊需求。很多人觉得4S店维修系统不就是开单、派工、结账三件事吗真做起来才知道新能源车和燃油车的养护流程差异很大这个差异直接决定了数据模型怎么设计。传统燃油车维修的核心是发动机、变速箱、油液系统维修动作集中在机械件更换和油液更换。新能源汽车的核心变成了三电系统——电池、电机、电控。特别是电池组它占了整车成本的40%以上而且的状态直接关系到车辆安全和续航表现。所以新能源4S店的维修流程里必须要有电池健康度检测、高压系统绝缘检测、充电口检查这些专项环节这些检测结果需要作为长期档案留存方便车主和售后团队追踪电池衰减趋势。另一个差异是OTA。新能源车普遍支持远程软件升级车辆进店后技师首先要检查是否有未完成的OTA升级任务这要写进工单流程里。而传统维修系统根本不需要考虑这个环节。所以在设计这个系统时我把车辆档案表和工单表都预留了OTA相关字段并把电池健康记录单独拆了一张表而不是塞在维修记录里。这是整个数据模型设计里最开始就应该想清楚的事如果照搬传统维修系统的表结构后面加字段改表会非常痛苦。1.2 业务模块梳理从预约到结算的完整闭环业务模块的梳理我花了三天时间跟店长、前台接待、车间主任分别聊了一遍最后整理出六大核心模块预约管理、客户与车辆档案、维修工单、配件库存、结算管理、统计报表。其中预约和工单是核心链路配件和结算围绕工单联动客户车辆档案是基础数据。预约模块解决的是车什么时候来、谁来修、哪个工位接的问题。客户可以通过电话或微信预约前台在系统里录单选择到店时间、服务类型保养、维修、钣喷、电池检测系统自动匹配空闲工位和技师档期。这里有一个关键设计预约和工单是两张表预约单在车辆到店后转化为工单而不是直接在预约记录上改状态。原因很简单一个预约可能因为客户爽约而取消也可能到店后检测出额外问题追加维修项目工单的内容比预约灵活得多分开建模才不互相干扰。工单模块从创建到完结要经过接车初检、开单、派工、领料、施工、质检、结算、交车这八个环节。每个环节的状态流转要清晰可追溯谁在什么时间做了什么事都要留痕。配件模块管出入库工单领料自动扣减库存低库存配件自动触发采购预警。结算模块根据工时和配件自动汇总费用支持多种支付方式登记。统计报表是给店长和管理层看的月度产值、工单量、配件周转率、技师工作量这些指标必须能从系统里一键拉出来。1.3 角色权限与流程设计的细节考量这个系统的用户角色有四种管理员店长、前台接待、车间技师、配件管理员。不同角色看到的界面和能执行的操作完全不同。我采用的是基于角色的访问控制模型也就是RBACRole-Based Access Control后端在每个接口上做权限校验前端用路由守卫和按钮级指令控制显隐。权限设计的细节在于同一角色内部也会有细分。比如技师分成机电技师和新能源专项技师新能源专项技师才有权限录入电池检测数据和高压系统维修记录。这类细分权限如果只做角色区分会很啰嗦我的做法是在用户表里加了一个specialty字段来标记专项技能接口权限用角色控制数据录入权限用specialty控制两层配合既简单又够用。还有一点特别值得提所有涉及工单状态变更的操作我都要求必须有备注字段。比如派工操作需要填写派给哪个技师以及注意事项质检不合格退回必须填写退回原因。这个规则一开始客户觉得麻烦但上线跑了两周后店长专门反馈说这个设计帮了大忙——因为售后纠纷回溯时每一笔操作都有据可查不用再翻微信群聊天记录。2. 技术栈选型与整体架构设计2.1 前端为什么选 Vue 3 而不是 Vue 2技术选型这块客户指定了Vue和Node.js但具体用哪个版本、哪套UI库、哪个状态管理方案是我来定的。前端我选了Vue 3 Vite Element Plus Pinia Axios这套组合。选择Vue 3而不是Vue 2主要是考虑到项目从零开始没有历史包袱没必要用即将停止维护的旧版本。Vue 3的组合式APIComposition API在业务逻辑复杂的管理系统里优势很明显可以把同一个功能的响应式数据和操作方法放在一起组织而不是像选项式API那样必须分散在data、methods、computed里。举个例子工单列表页需要同时处理筛选条件、分页、批量操作、状态标签映射用组合式API我可以在一个useWorkOrderList函数里把所有逻辑封装好可读性和可维护性都高很多。构建工具选择Vite是因为它在开发调试时的热更新速度比Webpack快一个量级。Vue 3项目如果还用Webpack冷启动动辄十几秒Vite基本在1秒内这个体感差异对开发效率影响非常大。UI库这块没有犹豫Element Plus是最成熟的Vue 3中后台组件库表格、表单、弹窗、日期选择器这些后台系统常用组件都现成我只需要封装一层业务组件没必要从零手写。2.2 Node.js 后端框架的选择Express 还是 Koa后端框架我在Express和Koa之间纠结了一段时间最终选了Express 4。原因很实际Express的中间件生态最成熟文档和社区案例最多遇到问题搜一下基本都能找到答案。Koa 2的洋葱模型理论上更优雅但在这种传统的CRUD系统里它的优势体现不出来反而因为中间件生态相对少一些一些需要现成方案的功能比如文件上传、Session处理要多花时间。不过我在Express基础上做了一层轻量封装。所有路由的响应统一走res.success()和res.fail()两个方法返回结构固定为{ code, data, message }。这样做的好处是所有接口的返回格式高度统一前端Axios拦截器只用处理这一种结构错误提示逻辑也可以集中管理。这个习惯我建议所有做Node.js后端的朋友都养成接口返回格式不统一是前后端联调最大的内耗来源之一。后端目录我按经典的MVC分层组织routes定义URL路由controllers处理请求参数和业务编排models封装数据库操作middlewares放JWT认证、错误处理、请求日志这些横切逻辑。虽然这套系统规模不算大但分层的价值在于后续加功能时不会把代码越搞越乱。我见过太多Node.js项目把所有逻辑堆在一个文件里两三千行的路由文件改起来真是欲哭无泪。2.3 数据库设计与核心表结构说明数据库用的是MySQL 8.0设计了八张核心业务表加两张辅助表。这里把最主要几张表的结构逻辑讲一下不贴完整SQL因为每个店的具体字段要求会有差异但设计思路是通用的。用户表users存账号、密码哈希、角色、姓名、技师技能标签。密码用bcrypt加盐哈希存储绝对不存明文。车辆表vehicles除了车牌号、品牌型号、VIN码这些基础信息外特别加了电池类型、电池容量、当前续航里程、上次电池检测时间这几个新能源专属字段。客户表customers和车辆表是一对多关系一个客户可能名下有多辆车车主和车辆分开建模方便后续做家庭多车的统一管理。预约表appointments包含预约时间、服务类型、车牌号、客户联系方式、预约工位、备注、状态。工单表work_orders状态机字段先定义为字符串可选值为pending待接车、inspecting初检中、repairing维修中、quality_checking质检中、pending_settlement待结算、completed已完成、cancelled已取消。配件的库存流水单独建表每次出入库都写一条流水记录这样月末对账时可以直接按流水汇总不用去猜测当前库存是怎么算出来的。还有一个容易被忽略的点所有主表都加了created_at和updated_at字段并且统一用时间戳存储。这个习惯很多新手会忽略但等你要做数据统计和问题排查时就知道多重要了。3. 核心功能模块的实现过程3.1 工单流转状态机设计与接口实现工单是这个系统的核心我把它的状态流转当成一个状态机来设计。每个状态允许哪些操作、操作后跳到哪个状态这些规则在前端和后端都要有约束但以后端为准。先说后端约束。每个工单状态变更接口在更新状态之前会先校验当前状态是否允许执行这个操作。比如只有状态是repairing的工单才能执行质检操作而质检操作对应的目标状态是quality_checking如果一个接口请求把pending状态的工单直接改成completed后端直接拒绝并返回错误码WORK_ORDER_STATUS_ILLEGAL。这个校验逻辑我用一张配置表在前端代码里维护映射关系后端则用switch判断实现不复杂但很关键它保证了工单不会出现跳状态的脏数据。工单创建接口的代码结构大概是这样的我简化了业务细节保留核心逻辑// routes/workOrders.js router.post(/, authMiddleware([admin, receptionist]), async (req, res) { const { appointmentId, vehicleId, customerId, serviceType, items } req.body; // 1. 校验预约单是否存在且状态为已到店 const appointment await Appointment.findByPk(appointmentId); if (!appointment || appointment.status ! arrived) { return res.fail(APPOINTMENT_NOT_ARRIVED, 预约单未到店不能创建工单); } // 2. 创建工单主记录 const workOrder await WorkOrder.create({ orderNo: generateOrderNo(), // 规则WO 年月日 4位序号 vehicleId, customerId, serviceType, status: inspecting, createdBy: req.user.id }); // 3. 批量创建工单项 await WorkOrderItem.bulkCreate(items.map(item ({ workOrderId: workOrder.id, itemName: item.itemName, itemType: item.itemType, // labor: 工时, part: 配件 quantity: item.quantity, unitPrice: item.unitPrice, status: pending }))); // 4. 更新预约单状态 await appointment.update({ status: converted, workOrderId: workOrder.id }); res.success({ workOrderId: workOrder.id, orderNo: workOrder.orderNo }); });前端工单操作区根据当前状态动态渲染可用按钮对应调用的接口也是写死的映射关系。这里有个小技巧把状态和允许操作的表单独放在一个JS文件里两边共用避免前端按钮显示和后端校验规则不一致。3.2 预约排期与工位冲突检测预约排期的实现里最核心的难点是工位冲突检测。一个4S店一般有6到8个工位分为快保工位、机电工位、钣喷工位、新能源专项工位不同服务类型会占用不同类型的工位。预约时系统要能判断目标时间段内对应类型的工位有没有空余。实现方案第一步是维护一张工位表workstations每个工位有编号、类型、状态字段。第二步是在预约表里记录占用的工位ID和时间段预约创建时做一次区间重叠查询// controllers/appointments.js async function checkWorkstationConflict(workstationId, startTime, endTime, excludeAppointmentId null) { const where { workstationId, status: { [Op.in]: [confirmed, arrived] }, // 时间段重叠判断新预约开始时间 已有预约结束时间且 新预约结束时间 已有预约开始时间 [Op.and]: [ { startTime: { [Op.lt]: endTime } }, { endTime: { [Op.gt]: startTime } } ] }; if (excludeAppointmentId) { where.id { [Op.ne]: excludeAppointmentId }; } const conflict await Appointment.findOne({ where }); return !!conflict; }这个区间重叠写法是排期系统的核心很多新手会写成startTime 已有startTime endTime 已有endTime这种错误逻辑那样只能判断出完全被包含的情况查不出交叉重叠。正确判断是取两个条件新时间段开始时间早于旧结束时间并且新时间段结束时间晚于旧开始时间两者同时成立就是有重叠。前端预约界面用日历视图展示我基于Element Plus的el-calendar组件做了改造把每天拆成半小时粒度的时间格已经被占用的时段置灰不可选。这个交互看起来简单但底层需要把工位时间段的占用情况一次性返回给前端我在后端写了一个聚合接口按日期返回该工位当天的占用区间数组前端渲染时做一次区间合并算法把连续的时间段合并成整块灰色区域视觉效果干净很多。3.3 配件库存与低库存预警配件库存管理这块最初需求文档只写了入库、出库、库存查询三个功能。我在实际调研时发现4S店的配件管理远比想象中复杂有原厂件、副厂件、拆车件之分同一种配件可能对应多个供应商而且部分新能源配件比如动力电池模组、高压线束价格极高且采购周期长必须设置安全库存线。数据库设计上配件表parts存配件编码、名称、规格、适配车型、单位、当前库存、安全库存、采购价、销售价。库存流水表inventory_records存出入库类型、关联单号、数量变化、操作人、时间。工单领料时系统先校验库存充足然后扣减库存并写一条出库流水同时关联工单ID这样月末对账时每条出库记录都能追溯到是哪张工单消耗的。低库存预警我用一个定时任务实现每天上午9点扫描一次配件表把当前库存 安全库存的配件列表生成一张采购建议单在系统首页的待办中心展示。这个定时任务用node-cron库来跑配合一个is_notified字段避免重复提醒同一批配件除非库存继续下降触发更高级别的预警。这里有一个实操细节配件出库的库存扣减不要在API层直接写UPDATE parts SET stock stock - 1 WHERE id ?这种裸操作而是要用事务把扣库存和写流水绑定在一起任一步失败都回滚。我曾经因为图省事省了事务结果并发领料时库存出现了负数排查半天才找到原因。3.4 新能源车辆健康档案的建模车辆健康档案是这套系统区别于传统维修系统最有特色的模块。每次车辆进店做保养或维修时技师会录入一组检测数据包括电池健康度SOHState of Health、电池内阻、各模组电压差、绝缘电阻值、充电系统状态、电机状态等。这些数据按车辆ID和时间维度存储前端用ECharts渲染成趋势曲线。电池健康度SOH的数据模型我单独建了battery_health_records表字段包括车辆ID、检测日期、SOH百分比、电池温度、绝缘阻值、检测里程、检测技师、备注。这里有一个专业细节SOH的值不是单点数据而是经过充放电测试后计算出的综合指标录入时系统会提示技师确认测试方式容量测试法还是内阻测试法不同测试方式的结果会标注区分避免后续对比时产生误导。体检报告页面的ECharts趋势图我用了双轴设计X轴是检测时间左Y轴是SOH百分比右Y轴是绝缘阻值。因为两个指标的数值范围差异大单轴显示会压缩掉SOH的波动幅度。这个细节是数据分析上的常识但在业务系统里很容易被忽略我因为一开始没做双轴曲线平坦得完全看不出电池衰减趋势返工了一次。4. 前后端联调与高频问题排查实录4.1 开发环境搭建npm脚本执行策略与Node版本坑开发环境这块网上搜vue nodejs相关教程热度最高的几个坑我基本都踩了一遍。首先就是Windows环境下npm命令无法执行的问题错误提示是npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1因为在此系统上禁止运行脚本。这个问题的原因是PowerShell的执行策略默认是Restricted不允许运行.ps1脚本文件。解决办法有两种一种是以管理员身份打开PowerShell执行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned另一种是改用cmd或Git Bash来跑npm命令。我推荐第二种因为修改全局执行策略有一定安全风险而且在cmd里跑npm没有这个问题更省事。Node.js版本管理也是一大坑。项目开发过程中发现Vite 5对Node版本有要求必须是18.0以上。而很多老机器上装的是Node 16甚至更老。更难受的是团队里不同成员的开发机Node版本不统一有的代码在A机器上跑得好好的到B机器上直接语法报错。后来我统一给团队成员装上了nvm-windows通过.nvmrc文件锁定了Node.js的版本又一次解决了版本不一致的问题。这里给个建议任何Node.js项目建仓库时第一件事就是加.nvmrc文件里面写20.11.0这样的具体版本号并且在README里写明安装步骤这个习惯能省掉后面无数个为什么我跑不起来的群聊时刻。4.2 Vue Router 路由设计与权限拦截前端路由我分了两种公共路由和权限路由。公共路由只有登录页和404页其他所有页面都挂到登录之后才能访问的布局组件下。登录成功后前端根据当前用户的角色动态生成可访问的路由表用router.addRoute()动态挂载然后跳转到首页。动态路由的典型坑是页面刷新后路由丢失。因为动态路由是通过addRoute()加进去的刷新浏览器后内存里的路由表重置如果静态路由里没有匹配项页面就白屏。解决方案是在路由全局前置守卫里加一个判断如果当前用户已登录但动态路由还没注册过就重新拉取用户信息并注册路由注册完成后再放行导航。这个逻辑我封装在permission.js文件里它是整个前端路由控制的核心。// router/permission.js router.beforeEach(async (to, from, next) { const token localStorage.getItem(token); if (!token) { if (to.path /login) return next(); return next(/login?redirect${to.fullPath}); } if (to.path /login) return next(/); // 已登录但动态路由未注册时注册后重定向 if (!store.getters.routesLoaded) { try { const userInfo await store.dispatch(fetchUserInfo); const routes generateRoutesByRole(userInfo.role); routes.forEach(route router.addRoute(route)); store.commit(SET_ROUTES_LOADED, true); return next({ ...to, replace: true }); } catch (e) { await store.dispatch(logout); return next(/login); } } next(); });还有一个小细节动态路由注册是按角色过滤的不同角色看到的路由配置不同配合按钮级的v-permission指令控制操作权限。我给Vue注册了一个全局自定义指令v-permissionworkorder:create这样在按钮上声明需要的权限码不满足权限的按钮直接移除DOM。这样比单纯隐藏元素更安全因为移除DOM意味着元素根本不在页面里就算用户改浏览器调试工具也找不到按钮。4.3 跨域配置与Axios请求封装前后端分离开发时跨域问题几乎必然出现。前端开发服务器跑在5173端口后端跑在3000端口浏览器直接请求后端接口会报CORS错误。我的方案是在后端统一用CORS中间件处理// app.js const cors require(cors); app.use(cors({ origin: process.env.NODE_ENV development ? http://localhost:5173 : https://admin.example.com, credentials: true, allowedHeaders: [Content-Type, Authorization] }));生产环境的origin建议写死具体的域名不要用*通配符因为*配合credentials: true会出现浏览器兼容问题。实际部署时如果前端和后端走Nginx同域反向代理跨域问题其实也可以绕过——把/api路径代理到后端服务前端请求同域地址就不存在跨域了。两种方案我最后都用上了开发环境用CORS中间件生产环境直接让Nginx做代理前端代码里的baseURL写成相对路径/api这样前端打包后不管部署到哪个域名下都不用改配置。Axios请求封装是前端工程质量的关键。我在src/api/request.js里统一配置了Axios实例设置了基础路径、超时时间、请求拦截器和响应拦截器。请求拦截器负责从localStorage取token加到请求头响应拦截器统一处理后端返回结构的code字段code为0时直接返回数据非0时弹出错误提示并区分处理401token过期跳登录、403无权限、业务错误提示具体原因。4.4 接口联调中的Mock与调试技巧前后端并行开发时Mock数据是不可缺少的环节。我们是两个人在做前端先搭好页面后端接口还没写完这时如果没有Mock前端就只能等。我用的是Vite插件vite-plugin-mock直接在项目里配置Mock数据文件接口路径写法和真实后端完全一致后端好了之后只需要把Vite的代理从Mock切到真实服务即可前端代码一行都不用改。联调阶段我推荐在浏览器里装Vue Devtools插件配合Network面板看请求响应。排查接口问题时我的固定顺序是先看Network里请求是否发出、状态码是多少再看响应体里的code字段和message最后才看后端日志。很多新手容易一上来就盯着代码看半天其实大部分问题看Network面板就能定位——要么是请求没带上token返回401要么是传的参数格式和后端对不上返回500。有个特别容易踩的坑是JSON字段命名风格不一致。后端我用了snake_case如work_order_id前端习惯用camelCase如workOrderId如果不做统一转换联调时就会频繁出现字段取不到值的问题。我的解决办法是在前端响应拦截器里统一做一层键名转换把snake_case转成camelCase再交给页面使用这个转换函数用递归实现几十行代码搞定却省掉了大量联调时字段名对不上的沟通成本。5. 项目部署与性能优化心得5.1 前端构建与Nginx部署部署方案用的是经典的前后端分离部署前端打包成静态文件交给Nginx托管后端Node.js服务用PM2守护进程运行端口3000对外不直接暴露Nginx把/api前缀的请求反向代理到后端。前端构建这一步有个容易忽略的点Vite打包后的dist目录需要在Nginx里配置try_files参数把所有路由请求都回退到index.html否则用户直接从浏览器访问/work-orders这种没有对应物理文件的路径时Nginx会返回404。server { listen 80; server_name admin.example.com; # 前端静态文件 root /var/www/4s-system/dist; index index.html; # 前端路由history模式回退 location / { try_files $uri $uri/ /index.html; } # 后端API反向代理 location /api/ { proxy_pass http://127.0.0.1:3000/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }数据库这块我加了定时备份的crontab任务每天凌晨用mysqldump导出SQL文件保留最近30天的备份。这个习惯是项目上线后一个真实事故教出来的——有一次数据库服务器磁盘满了binlog写不进去直接把正在处理的工单数据卡住了。从那以后备份策略和磁盘监控就成了部署清单里的必选项。5.2 后端接口性能优化这个系统的接口量不算大但有两个接口在数据量增长后明显变慢了一个是工单列表接口一个是统计报表接口。工单列表慢的原因是联表查询太多一条工单要关联客户、车辆、预约、技师、工单项等多张表。优化思路是先去掉不必要的关联查询列表页只展示基础字段明细数据改为点击工单单号时再单独请求详情接口这样一个列表接口的响应时间从800ms降到了200ms左右。统计报表接口的优化是用MySQL的聚合查询直接在数据库层完成计算而不是把所有流水数据拉到Node.js内存里用JS做求和。月度产值报表核心就是一条GROUP BY语句按日分组汇总工时费和配件费配合索引优化在created_at和work_order_id上建了联合索引报表从秒级响应提升到了300ms以内。这里给我的经验是Node.js后端做统计时能下推到数据库的操作就不要在应用层做数据库的聚合计算比JS的遍历高效得多。5.3 一些不太容易注意到的细节最后分享几个做这类管理系统时的细节经验。第一个是操作日志。除了数据库主表的CRUD我还建了一张operation_logs表所有敏感操作删除记录、修改价格、重置密码、修改权限都写入日志记录操作人、操作时间、IP、操作内容和前后值对比。这个表的功能平时没人注意但一旦出现数据异常或纠纷它就是排查的唯一线索。实现上我直接写了一个中间件在指定的接口路由上附加日志记录逻辑代码侵入很小。第二个是前端表格的性能。工单列表页的表格如果一次性渲染几百行数据Element Plus的表格会出现明显的卡顿。我的处理是启用服务端分页每页20条加上表格的v-loading指令优化交互体验。对于筛选后的导出功能直接让后端生成Excel文件返回给前端下载而不是在前端把所有数据加载到内存里用js导出库处理因为后者在数据量大时会卡死浏览器。第三个是系统初始化的坑。上线首日客户要导入存量数据历史客户档案、车辆信息、手写工单等。这些数据质量参差不齐Excel里有大量重复和格式错误。我提前写了清洗脚本做数据校验和去重但没预料到的是手工工单的配件名称和系统配件表里的标准名称对不上导致大量工单领料匹配失败。解决方案是在导入时增加了模糊匹配提示由前台人员在界面上手动确认挂接。这个流程一开始觉得麻烦但实际跑下来确实避免了大量脏数据进入正式表。写在最后的一些实际体会这套系统从需求调研到上线前后一个多月中间经历了需求反复改、联调对接不顺、上线后数据处理等一系列问题。我个人最大的体会是做业务管理系统技术永远是为了业务流程服务的先把客户的业务链条理清楚再谈技术选型和代码实现才能做出真正好用的系统。如果现在重新做一遍我可能会考虑几个改进点。比如引入消息队列来处理工单状态变更后的通知推送客户短信通知、技师任务提醒比如把前端打包体积做进一步的代码分割优化又比如在电池健康模块引入跟厂家标准数据的自动比对功能。这些想法当时因为时间原因没有落地但对于打算自己从零做类似系统的朋友可以作为扩展方向的参考。最后说一个最实在的忠告如果你也在做一个以工单流转为核心的管理系统一定要在动工前把状态机定义清楚把每个状态下允许的操作列表打印出来贴在工位上。这个设计花半天时间能为后面所有模块的开发省下至少一周的返工量。技术上的坑都有解决方案业务模型想不通才是真正的返工来源。
返回列表