椰泰生产管理系统
一、立项背景与目标
饮料厂生产线每天几十个工人、多个小组、好几种产品同时生产。以前靠纸笔记产量、Excel 算工资,主管每天要忙到深夜才能够统计完。
这套系统就干一件事:工人手机上点两下录产量,主管随时看全厂数据,工资自动算好,追溯码一扫就知道谁产的。节省了大量人工时间,更加方便管理。
二、核心功能
工人端(3个功能)
生产录入:选产品→填卡板数→提交,自动算出件数和当天产值
追溯码:提交后弹出二维码,扫码能看到产品、组别、工人、日期
我的:看本组今天产了多少、每人分别多少
主管端(7个功能)
看板:一眼看完当天总产量、小组排名、品种分布、工资总额
产品管理:新增/删除产品,设定规格和工价
小组管理:增删小组和成员
包装:记录包装材料入库,生产时自动扣库存
生产记录:按天查看各小组各品种的产量汇总,支持归档和历史
工资:自动均分小组产值到每个人,一键发薪
任务:设定每天目标卡板数,实时看完成进度
三、业务流程
工人上班
→ 打开APP → 选小组 → 选名字
→ 选产品 → 输卡板数 → 提交
→ 弹出二维码(追溯码)
→ 自动扣包装库存
主管打开APP
→ 看板实时刷新(产量、排名、工资全有了)
→ 生产标签看各小组汇总
→ 工资标签一键发薪
下班
→ 点"归档今日" → 当天数据存历史 → 看板清零
→ 点"历史"随时翻看之前每天的生产情况
数据存服务器,多台手机共享。
椰泰生产管理系统 — 实现途径
一、整体架构与设计思路
系统分三层:安卓 APK 做客户端,Python Flask 做服务端,SQLite 做数据库,全部跑在一台阿里云 Linux 上。
客户端是一个 HTML 文件(933行,65KB),Java 起 WebView 加载,剩下全部逻辑用纯 JavaScript 写完。不装 Android Studio,不用 Gradle,靠安卓 SDK 自带的命令行工具 javac、d8、aapt2、apksigner 编译打包,6 秒出一个 APK。JS 全程用 ES5 语法(var、function),因为国内低端安卓机的 WebView 内核太老,箭头函数和 let 直接报错不执行。
服务端 370 行 Python,8 个 API 端点。数据库用 SQLite 单文件,不装 MySQL。API 设计成远程 KV 存储模式,和原来 localStorage 用法一致,改动量极小。
QR 二维码库 19KB 内嵌在 HTML 里,不依赖 CDN。扫追溯码打开同一台服务器的网页,微信和浏览器都能看。
二、我负责的模块与量化成果
整个项目从零到交付我独立完成。20 天内编译发布 30 多个 APK 版本,从单机 V7 迭代到网络版 V9.8。
客户端 800 多行 JavaScript,实现主管端 7 个模块(看板、产品、小组、包装、工资、生产记录含归档历史、任务管理)和工人端 3 个模块(生产录入、追溯码、我的产量)。服务端 370 行 Python,8 个 API 端点外加追溯网页。
单机版迁移网络版时只改了不到 30 行代码,核心是把 localStorage.setItem 换成 fetch,其余全部不动。
三、遇到的难点与解决方案
第一,老安卓不支持 ES6。按钮全没反应,排查发现 WebView 碰到箭头函数就停止执行。强制改用 var 和 function,问题消失。
第二,QR 码对中文编码失败。零糖生椰能生成二维码,椰汁不行。根因是 qrcodejs 库的 s() 函数低估中文字节数,选的 QR 版本容量不够。把返回值乘了 3 倍安全系数解决。
第三,网络版跨域被拦。APK 从 file:// 发请求到 http:// 服务器,浏览器直接拦截。在 Flask 加了 after_request 注入 CORS 头加 OPTIONS 预检解决。
第四,confirm() 弹窗在老安卓上不弹。改用按钮二次点击确认——第一次变红字"再点确认归档",3 秒内再点才执行。
第五,classList.add 在旧 WebView 静默失败。弹窗显示出不来但不报错。全部换成直接操作 className 属性解决。