简介:基于微信小程序的企业生产管理系统源码包,面向高校毕业设计、小程序开发学习者以及需要快速搭建企业管理后台的开发者。系统完整实现用户登录与权限管理、仓库出入库和库存预警、采购计划审批、销售出库与退货入库等业务流程,同时包括首页库存概况、按月销售金额折线图、消息通知、管理员授权等页面与交互,能直接作为课设或毕设的完整参照。包内共519个文件,以js逻辑、json配置、wxss样式、wxml页面结构及ts类型定义为主,另有png/jpg图片素材与说明文档,整体压缩包仅1.5MB,目录结构与文件名规则清晰,方便按模块检索学习。源码覆盖用户、仓库、采购、销售四大模块的前端页面与交互逻辑,业务划分直观,适合二次开发和毕业设计说明书撰写;对于想理解小程序端企业级管理流程的开发者,也是一份完整可运行的参考工程。目前已有900人浏览学习,印证了其作为毕业设计参考资源的使用价值。
1. 一个年产值过亿的企业,车间里还在靠纸质工单和微信群传进度
我接过一个制造企业的内部项目:车间里二十多个工单同时在跑,排产表靠 Excel 传到群里,报工靠手填纸质单,夜班干完的活要等第二天早上白班的人来录系统。老板问“现在到底哪道工序卡住了”,没人能答上来。基于微信小程序的企业生产管理系统,解决的就是这类场景——让一线员工用手机完成扫码、报工、领料、质检,让班组长和管理者实时看到每笔工单的进度与异常,把车间从“人传人”变成“数据流动”。
这类系统的价值不在技术多新,而在“轻”。一线干活的人不需要培训一星期的操作流程,装个微信扫码就行。管理端也不需要额外开发 App,小程序里一个报表页面就能覆盖。适合谁?中小制造企业、OEM 厂、组装车间,以及那些想上 MES 但预算和 IT 人力都不足的公司。本文从架构选型、权限模型、核心业务流程,到离线容错和性能避坑,给你一条可以直接照着落地的路径。
2. 微信小程序做企业生产管理:先想清架构与数据模型
2.1 为什么是微信小程序,而不是原生 App 或 H5
企业生产管理系统要跑在车间里,使用频率极高,但每次操作都很短——扫码、填数量、提交。微信小程序正好卡在这个使用模式上:员工不用装 App,微信里扫一扫就进系统,培训成本接近零。相比 H5,小程序有 wx.login 的天然身份通道、扫码 API、订阅消息能力和更可控的离线缓存机制;相比原生 App,省去了安装、升级、设备碎片化的运维成本。
起步阶段最怕的是选了重型方案。某公司最初想用原生 App 做全套 MES,账号、排产、追溯、设备监控都要上,结果开发大半年还没进试点,车间员工手机型号从老安卓到低端机全都有,光兼容测试就压垮了节奏。后来换小程序做核心闭环,先把派工、报工、质检、领料跑通,才把项目盘活。企业生产管理系统的第一版,重心应该放在“让数据先流动起来”,而不是功能大而全。
核心选型结论是:后端 API 用自建服务,不依赖微信云开发的一体化绑定。原因很实际——车间数据迟早要和 ERP、财务、供应商门户打通,自建后端的表结构、接口权限、数据留痕都掌握在自己手里,迁移成本低。云开发适合原型验证,但不适合作为企业生产数据的唯一底座。
2.2 推荐的前后端结构与核心数据表
一个能落地的分工方式:小程序端只做采集与展示,不直接连数据库;后端提供 RESTful API,负责鉴权、校验、写入;数据库侧采用关系型数据库,工单、报工、质检、库存都用结构化表,方便后续做报表和追溯。Redis 只处理 token、验证码这类短生命周期数据,不承担生产数据的持久化。
以下是一套从模拟项目 X 沉淀下来的核心表结构,字段做了精简,但覆盖了生产管理系统的必需闭环:
| 表名 | 用途 | 关键字段 |
|---|---|---|
| work_order | 工单主表 | work_order_no, product_code, plan_quantity, reported_quantity, status, workline |
| report_record | 报工记录 | record_id, work_order_no, operator_no, quantity, device_no, report_time |
| quality_check | 质检记录 | check_id, work_order_no, checked_by, qualified_quantity, defect_code, check_time |
| inventory_record | 物料出入库 | record_type, material_code, quantity, source_order, operator_no |
| sys_user | 用户与角色 | user_id, employee_no, name, role_id, workline |
CREATE TABLE work_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, work_order_no VARCHAR(32) NOT NULL UNIQUE, product_code VARCHAR(64) NOT NULL, plan_quantity INT NOT NULL, reported_quantity INT DEFAULT 0, status TINYINT DEFAULT 0 COMMENT '0待生产 1生产中 2已完工 3已暂停', workline VARCHAR(32) COMMENT '产线编号', create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );这张表是整个生产管理的状态源。work_order_no 是业务主键,工单号一旦生成,整个流转都靠它关联;status 字段控制工单在流程里的位置。特别要注意 plan_quantity 和 reported_quantity 分别存计划量和累计报工量,不要用“计划减报工”倒推剩余数,因为实际生产中有报废、返工、超额报工,分开存才能追溯。
2.3 用微信小程序登录打通用户体系
在小程序端,登录是第一步。常见做法是 wx.login 拿到临时 code,后端拿着 code 向微信接口换取 openid,再结合员工工号绑定身份,下发自定义 token。不要直接拿 openid 当业务主键,openid 只是外部身份标识,业务上要关联 employee_no。
wx.login({ success: async (res) => { if (res.code) { const resp = await request({ url: '/api/auth/login', method: 'POST', data: { code: res.code, employeeNo: input.value } }) wx.setStorageSync('token', resp.data.token) wx.setStorageSync('employeeNo', resp.data.employeeNo) } } })code 有效期只有五分钟,必须在拿到后立即传给后端,不能缓存。employeeNo 需要员工手动输入一次,和 openid 绑定成功后,下次自动登录。token 建议设置 12 小时过期,车间一个班次不超过 12 小时,过期后重新拉起登录,比永久 token 安全得多。后端接口必须校验 token 和 employeeNo 是否匹配,否则会出现用别人身份报工的问题。
小程序生产管理的登录方案里,有一个容易忽略的配置:request 合法域名。开发阶段可以勾选“不校验合法域名”,但体验版和正式版必须把后端 API 域名加到微信后台的白名单里,否则所有请求都会失败。这个坑每个接手的开发者都会踩一次。
3. 权限模型与数据隔离:车间主管不该看到全厂的数据
3.1 角色权限设计的边界:到底要分多少层
企业生产管理系统的权限,不能照搬 OA 的“管理员/普通用户”两层。车间里有人只看自己产线的数据,有人能改工单状态,有人只能报工,有人能导出报表。我通常把权限拆成五类角色:系统管理员、车间主管、班组长、操作工、质检员。明确一点:角色是“职责组合”,不是“职级高低”。
| 角色 | 核心权限 | 数据范围 |
|---|---|---|
| 系统管理员 | 用户管理、工单创建、基础数据维护 | 全厂 |
| 车间主管 | 工单派工、暂停、报表查看 | 本车间 |
| 班组长 | 报工审核、异常上报、产量查看 | 本产线 |
| 操作工 | 扫码报工、领料 | 本工位 |
| 质检员 | 质检录入、不良登记 | 本车间 |
操作工不能打开工单管理页面,质检员不能修改报工数量,这些属于功能权限,用 role_id 控制即可。最容易忽略的是数据隔离:主管登录后能看到多少数据。如果接口不做数据范围过滤,主管能看全厂数据,一旦手机丢了对车间管理是灾难。数据隔离的统一做法是给每个用户绑定 workline 或 workshop 字段,后端在查询 SQL 里强制追加过滤条件。
3.2 用户表设计的陷阱:不要把角色塞进 user 表
我见过一种设计:sys_user 表里直接加一个 role 字段,字符串拼接“主管,班组长”,看着省事,后面改权限或者加角色时非常痛。正确做法是拆成 user_role 和 role_permission 两张关联表。下面是用 SQL 表达的数据隔离查询方式:
SELECT wo.work_order_no, wo.plan_quantity, wo.reported_quantity, wo.status, wo.workline FROM work_order wo JOIN sys_user u ON u.workline = wo.workline WHERE u.employee_no = #{operatorNo} AND u.role_id IN (SELECT rp.role_id FROM role_permission rp WHERE rp.permission_code = 'work_order_view') ORDER BY wo.create_time DESC LIMIT #{pageSize} OFFSET #{offset}这段 SQL 的关键点有两个:第一,用 sys_user 的 workline 和工单表做关联,天然实现数据隔离——用户只能看到自己产线的工单;第二,通过 role_permission 子查询判断是否拥有查看权限,权限变更不需要改代码,只需要改表数据。LIMIT 和 OFFSET 是分页参数,pageSize 建议固定 20,避免一次拉太多数据导致小程序渲染卡顿。
数据隔离还要考虑一个边界场景:车间主管被调去管另一条线,或者某个工单临时跨线。这种场景下,固定 workline 过滤会挡住跨线工单。我一般会在 work_order 表加一个 visible_worklines 字段,存 JSON 数组;主管的数据范围就是本车间多条产线的并集。复杂一点,但为好用值得。
3.3 微信小程序端登录态刷新与接口鉴权的联动
前端不能只存 token,还要存角色的权限标识。页面加载时要先拉取用户信息,包括 roleId 和 permissions,再决定显示哪些入口。如果用户已登录但权限被后台改了,前端要能感知到。常见做法是每次调用接口时,后端返回 401 时清除本地 token 并跳转登录页;返回 403 时提示“无权限”,不清除登录态。
const requestWithAuth = (url, data) => { return new Promise((resolve, reject) => { wx.request({ url, method: 'POST', data, header: { Authorization: wx.getStorageSync('token') }, success: (res) => { if (res.statusCode === 401) { wx.removeStorageSync('token') wx.navigateTo({ url: '/pages/login/index' }) reject(new Error('登录过期')) } else if (res.statusCode === 403) { wx.showToast({ title: '无权限操作', icon: 'none' }) reject(new Error('无权限')) } else { resolve(res.data) } }, fail: reject }) }) }注意这个代码里的拦截策略:401 和 403 的处理逻辑刻意分开。车间里员工手机信号不稳定,接口偶发失败时不应清除登录态,否则一次网络抖动就让所有人重新登录。网络错误在 fail 里处理,不区分 401/403。权限变化导致的 403 只提示不跳转,因为跳登录页解决不了权限不足的问题。
4. 工单流转与扫码报工:核心业务怎么一步步落地
4.1 工单下达与派工:小程序端只做展示,状态变更走后端
整个生产管理系统里,工单是贯穿所有环节的主线。工单由计划员在 PC 端创建,小程序端给班组长提供“开始生产”“暂停”“完工”三个操作。这里设计原则是:小程序端不能直接改工单状态,只调用后端接口,由后端校验当前状态是否允许切换。例如未完工人不能标记完工,已暂停的工单不能直接报工。
接口设计上,状态流转接口统一为“动作”而不是“改状态”。例如 POST /api/work-order/{no}/start,而不是 POST /api/work-order/{no}/update-status。前者是命令语义,后者是数据语义。命令语义的好处是后端可以在一个方法里完成校验、审计和状态更新,避免前端误传状态码导致数据错乱。生产中一个常见错误是前端把状态码硬编码,后端加了新状态后老版本小程序还在提交旧状态,命令式接口能杜绝这个问题。
4.2 扫码报工:扫什么码直接决定了后面能不能追溯
扫码报工是这个系统的重点。code 设计上有两种路线:只扫工单码,或者扫物料批号/序列码。小规模试点可以从扫工单码开始,一个工单扫码后填数量提交;要做质量追溯,必须扫物料批次码。我建议直接上第二种,趁试点把数据规范建立起来,避免后面追溯时发现根本没采集批次信息。
const scanAndReport = async (workOrderNo) => { const scanRes = await wx.scanCode({}) const materialBatchNo = scanRes.result const reportInfo = { workOrderNo, materialBatchNo, quantity: Number(wx.getStorageSync('tempQuantity')) || 1, deviceNo: wx.getStorageSync('deviceNo'), operatorNo: wx.getStorageSync('employeeNo'), reportTime: new Date().toISOString(), requestId: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}` } const resp = await requestWithAuth('/api/report/submit', reportInfo) if (resp.data.reportedQuantity >= resp.data.planQuantity) { wx.showToast({ title: '工单已完工', icon: 'success' }) } }requestId 是幂等键,这是整个报工接口最重要的字段。车间网络不稳定,一次报工请求超时,操作工可能再点一次,如果没有幂等键,同一批数量就会重复入库。后端收到 requestId 后先查库,已存在则直接返回成功,不重复累加。这个设计在离线场景里更是必不可少,后面避坑章节会展开。
报工数量不建议在小程序里手填大数字。操作工的工作状态是连续重复的,每做一箱扫一次码,每次固定数量,尽量做到一次扫码一次提交。常见做法是允许设置“默认批量数量”,操作工不需要每次输入,页面只显示一个数字和确认按钮。减少输入操作就是在减少错数据。
4.3 质检与不良品处理:报工完成不等于生产结束
生产管理系统的第二个关键闭环是质检。质检结果必须关联到工单和报工批次,否则出了问题没法定位是哪一箱料。基本流程是:操作工报工后,质检员扫工单码或批次码,录入合格数、不良数和不良代码。
不良代码需要提前维护一套企业标准,比如“尺寸超差”“表面划伤”“装配松动”。不要用文本输入框让质检员自由填写,否则一个月后你会得到几十种表达同一个问题的文字。常见的做法是在小程序端做下拉选择,代码表维护在数据库中,支持管理员随时增改。
CREATE TABLE quality_check ( id BIGINT PRIMARY KEY AUTO_INCREMENT, check_id VARCHAR(32) NOT NULL UNIQUE, work_order_no VARCHAR(32) NOT NULL, report_record_id VARCHAR(32) NOT NULL, checked_by VARCHAR(32) NOT NULL, qualified_quantity INT NOT NULL, reject_quantity INT DEFAULT 0, defect_code VARCHAR(16), check_time DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (work_order_no) REFERENCES work_order(work_order_no) );report_record_id 关联到具体的报工记录,这一步是追溯的关键。没有这个关联,质检只能知道某个工单不良多,却查不出是哪天哪个班次哪个人报的那批货出了问题。defect_code 用代码而非中文文本,是为了后续统计报表能按代码聚合,不然同一个不良现象会出现多个枚举值。
4.4 库存与领料:避免“账实不符”的常见设计
车间领料是生产管理里的高频操作,也是最容易让系统失去信任的环节。如果系统库存和实物对不上,员工就会绕过系统去“手工记账”,整个系统就废了。我见过最典型的错误是:领料直接扣减库存总数,不考虑工单归属和批次,结果月底对账时怎么也平不了。
正确做法是库存流水只做记录,不做全量库存的实时减法。每次领料记录 source_order、material_code、quantity、operator_no,库存总数由流水表汇总计算得出。这样任何时点都能回答“这批料从哪张工单领的”“谁领的”这类追溯问题。同时工单完工时,系统自动核销已领未用的物料,减少月末盘点的痛苦。
5. 微信小程序生产管理系统的五个高发坑:从翻车到止损
5.1 扫码返回的码值和你以为的不一致
现象:扫同一个工单码,iOS 和安卓返回的 result 不一样;有些码扫出来带前缀,有些带空格。原因:不同码制的物理码内容本身可能不同,微信扫码返回的是码内原始内容,不含码制信息。解决:后端统一做清洗,去掉换行、空格、统一前缀;测试阶段用同一台设备扫多张实物码验证,别只在模拟器里测。
5.2 离线断网时大量报工丢失
现象:车间 WIFI 覆盖不全,操作工在工位上报了半天工,网络恢复后小程序白屏或报错,数据没了。原因:请求全部依赖在线发送,失败后直接丢弃。解决:前端离线队列,失败请求落本地缓存,网络恢复后自动重放,结合 requestId 幂等键防止重复入库。这个必须在一开始就做,后期补的工作量大得多。
const offlineQueue = { pending: wx.getStorageSync('pendingReports') || [], push(data) { data.requestId = `${Date.now()}-${Math.random().toString(36).slice(2, 8)}` this.pending.push(data) wx.setStorageSync('pendingReports', this.pending) }, flush() { if (!this.pending.length) return wx.request({ url: '/api/report/batch-submit', method: 'POST', data: { records: this.pending }, success: () => { wx.removeStorageSync('pendingReports') }, fail: () => {} }) } }注意这个代码里我用了批量提交接口而不是逐个重放。原因很实际:车间断网可能积压几十条报工,逐一请求会把后端和微信请求队列都打满,而且容易触发频率限制。批量接口一次提交整个队列,后端循环处理并幂等去重,效率高得多。flush 时机放在 wx.onNetworkStatusChange 回调里,网络恢复时自动触发。
5.3 操作工误触导致重复报工
现象:报工页面按钮在手机底部,操作工放到口袋里或因手套误触,提交了两次相同数量。原因:缺少二次确认和幂等机制。解决:提交按钮弹出确认框,显示本次报工数量、工单号和批次号;后端基于 requestId 做幂等校验,同一批次同一操作工同一时间窗口内重复提交自动拒绝。
5.4 工单列表数据量大了之后小程序卡顿
现象:工单列表拉到几百条时,页面滚动明显掉帧,甚至白屏。原因:一次性渲染了全部数据,没有做分页和列表复用。解决:小程序端使用 onReachBottom 触底加载,每页 20 条;列表项用 wx:for 加 unique key,避免整列表重渲染。还要注意后端返回字段不要随手 select *,只返回列表页需要的字段,能显著减少传输体积。
5.5 权限改了但前端不生效
现象:管理员在后台把某操作工从 A 产线调到 B 产线,但操作工小程序里还是只能看到 A 产线。原因:前端只在前一次登录时拉取了权限数据,存在本地缓存不再更新。解决:每次小程序启动时静默拉取最新用户信息,对比本地缓存;发现权限变化就清空相关页面缓存并重新加载。不要把权限缓存设成永久,建议最长不超过两小时。
6. 从能用推向好用:报表、追溯与小程序端体验优化
6.1 产量看板:用订阅消息替代轮询刷新
车间主管的刚需是“实时看到产线产量”。很多团队会做一个轮询接口,小程序端每 30 秒拉一次数据,费流量且造成服务器压力。微信小程序有个更合适的方案:订阅消息。当操作工提交报工时,后端检测到工单累计数量跨越整百阈值,就给该工单关联的班组长和主管发送一条订阅消息。不用轮询,消息主动触达,体验更好。
订阅消息的关键限制:用户一次订阅只能授权一次推送,所以要在合适的时机引导。常见做法是登录后弹窗引导订阅“报工完成提醒”,或者操作工第一次提交报工时弹订阅请求。如果用户拒绝了,后端要降级为小程序内红点提醒,不能丢掉这个能力。
6.2 报表:不要在小程序里做复杂图表
车间主管要看每班产量、工序不良率、工单达成率。小程序生态里图表库不少,但把复杂报表全塞进小程序是个错误方向——小屏看报表本来就别扭,还要考虑图表库体积和渲染性能。常见的做法是报表只在 PC 管理端做,小程序端只展示当班的关键数字卡片:完成数、不良数、在产工单数。用四个大字卡片展示,主管扫一眼就能做决策。
6.3 批量报工与扫码枪兼容:一套数据规范通吃
车间里除了手机,还有不少固定工位配了 USB 扫码枪,它本质是个键盘输入设备,扫描结果直接输出到输入框然后回车。设计小程序时,报工页面要同时兼容“调用摄像头扫码”和“输入框聚焦后扫码枪输入”两种模式。做法是监听输入框的值变化,当长度达到码长阈值时自动提交,不需要点按钮。这个细节极大提升固定工位效率。
6.4 关键验证:试点两周后盯这三个指标
系统上线前,用两周时间在一到两条产线试点,盯三个指标:报工数据准确性、工单状态更新及时性、操作工主动使用率。数据准确性主要看同一工单多次报工后 reported_quantity 是否和实物一致;及时性看操作工提交后主管手机多久能看到;使用率最直观,看一周后是否有人还在用纸质单。如果这三个指标没有改善,说明系统设计有问题,加再多功能也白搭。
我最早那版项目把报工做成强在线依赖,车间一断网,操作工就把手机扔一边等恢复,现场一片混乱。后来把离线队列和幂等提交补上,断网照常干活,恢复后自动补传,大家才开始真正用起来。生产管理系统的价值九成在流程和数据规范上,小程序只是载体——先让数据跑起来,再谈好看。希望帮到你。
本文还有配套的精品资源,点击获取