更新记录
1.0.0(2026-11-07)
首个版本:节拍 = 可用生产时间 ÷ 需求数量,同时算理论最少工位。排序用位置权重法(RPW),位置权重 = 本工序工时 + 全部后继工时之和,汇合处的工序只算一次(不重复计入,这是和「后继 rank 反向累加」的分界,后者会把汇合点算重、权重排序失真)。装位两种模式:按节拍装满就开新工位;按工位数装以「总量 ÷ 工位数」为目标负荷从前往后塞。前置关系是硬约束,前置没排完的工序不许提前上工位;前置编号越界、自环、成环都在计算前拦下,成环会把绕不开的工序名字点出来。指标给循环时间 CT、平衡率 = Σ工时 ÷ (工位数 × CT)、平衡损失率、平滑指数 SI = √(Σ(CT − Ti)² ÷ 工位数)、瓶颈工位、日产能、人力工时与空闲工时;85% / 70% 是装配现场经验分档,不是标准条文。改善建议做一次邻域搜索:把瓶颈工位上的每道工序试挪到每个可行工位,且检查前后继(不能挪到前置之前、不能把后继甩到后面),取平衡率提升最大的一手;挪不动时说明是拆工序还是加工位。瓶颈工时大于节拍时单独标 taktMiss 并优先提示「按现在的工位数出不来需求数量」。台账解析容忍表头、# 注释、缺列、非数字工时、全角符号与多种前置分隔符(1 / 1,2 / 1、2 / 1/2)。导出工位分配表 6 列与工序明细表 6 列两份 CSV,UTF-8 带 BOM。UTS→Kotlin 编译通过(index.kt 1384 行、classes.dex 57380 字节),159 项回归测试全部通过;真机未执行(adb devices 为空,测试机不在线),市场截图为 H5 渲染并标注示例数据。
平台兼容性
uni-app
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | √ | × | × | √ | × | √ | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
生产线平衡与工位分配
给车间主任与工艺工程师:这条线该开几个工位、每个工位干什么、谁在等活干、瓶颈卡在哪道工序。
线平衡的表自己用 Excel 也能画,问题在两件事:前置关系不能乱(装了驱动才能装扩散板,不能为了凑负荷把顺序倒过来),以及改完到底好没好要重算一遍。本插件把这两件事做成一步。
怎么算
| 环节 | 做法 |
|---|---|
| 节拍 | 可用生产时间 ÷ 需求数量(秒/件);也可以不算节拍,直接给工位数 |
| 排序 | 位置权重法(RPW):位置权重 = 本工序工时 + 全部后继工时之和(汇合处的工序只算一次,不重复计入),权重大的先排 |
| 装位 | 按节拍装:装满就开新工位;按工位数装:目标负荷 = 总量 ÷ 工位数,从前往后塞,塞不下才往后挪 |
| 硬约束 | 前置没排完的工序不许上工位,这条不做妥协 |
| 指标 | 循环时间 CT = 最大工位负荷;平衡率 = Σ工时 ÷ (工位数 × CT);平衡损失 = 1 − 平衡率;平滑指数 SI = √(Σ(CT − Ti)² ÷ 工位数) |
| 改善 | 把瓶颈工位上的每道工序试挪到每个可行工位,取平衡率提升最大的那一手 |
| 超节拍 | 瓶颈工时 > 节拍时直接判定「出不来需求数量」(taktMiss),这比平衡率高低更紧急 |
平衡率 85% 以上算线体均衡、70–85% 可接受、70% 以下要重排。这三个档是装配现场的经验值,不是标准条文,你们自己厂如果有内控线,按内控改。
它回答什么
- 今天要出 300 台、8 小时减 30 分钟休息,节拍是多少、最少几个工位;
- 现在这条线 6 个工位,平衡率 73%,那 27% 是谁在等;
- 瓶颈工位是哪个,它超了循环时间多少秒;
- 把哪道工序挪到哪个工位最划算,挪完平衡率到多少;
- 一天最多能出多少台,人力工时里有多少是空闲;
- 当前工位数到底够不够:够不够的判据是「瓶颈工时有没有超过节拍」,不是平衡率好不好看。
用法
import { lineBalance, lineTakt, lineCheck, lineExport } from '@/uni_modules/szhzy-line-balance'
// 按需求算节拍再排(8 小时减 30 分钟休息 = 27000 秒,出 300 台 → 节拍 90 秒)
const r1 = lineBalance({
availSec: 27000,
demand: 300,
tasks: [
{ name: '装灯板', timeSec: 42 },
{ name: '接线', timeSec: 35, pred: '1' },
{ name: '装驱动', timeSec: 28, pred: '1' },
{ name: '装扩散板', timeSec: 30, pred: '3' },
{ name: '老化测试', timeSec: 55, pred: '4' },
{ name: '包装', timeSec: 40, pred: '5' }
]
})
// r1.taktSec 90 / r1.stationCount / r1.cycleSec / r1.balanceRate / r1.bottleneck
// r1.stations: [{ index, load, taskNames, utilPct, idleSec }]
// r1.move: 改善建议(ok=false 时 note 说明为什么挪不动)
// r1.taktMiss: 瓶颈工时超过节拍(true 时现有人数出不来需求数量)
// 按现有工位数硬排(线已经开了 4 个工位,只想看平衡率)
const r2 = lineBalance({ stationCount: 4, tasks: rows })
// 只算节拍
lineTakt({ availSec: 27000, demand: 300, totalSec: 230 })
// taktSec 90 / minStation 3
pred 用工序序号(从 1 开始,按数组顺序),支持 '1'、'1,2'、'1、2';也可以传 preds: [1, 2] 数组。
台账
工序,工时秒,前置
装灯板,42,
接线,35,1
装驱动,28,1
装扩散板,30,3
老化测试,55,4
包装,40,5
逗号、制表符、分号、竖线都认;表头行与 # 注释跳过;工时解析不了的行丢掉。
导出
- 工位分配表:工位号、负荷秒、利用率%、空闲秒、工序数、工序清单;
- 工序明细表:工序号、工序名、工时、前置、位置权重、所在工位。
两份都是 UTF-8 带 BOM,Excel 双击不乱码,默认写应用外部私有目录,不需要存储权限。
验证状态
- 纯逻辑测试见
docs/line-balance/测试记录.md,覆盖位置权重、前置约束、成环检测、两种装位模式、平衡率与平滑指数手算对照、改善搜索。 - UTS → Kotlin 编译:
compiled successfully,产物行数与字节数见测试记录。 - 真机未执行:当晚
adb devices为空,测试机不在线,真机运行与真机截图都没做;市场截图为 H5 渲染,页面已标示例数据。
购买前必读
- 工时必须是你自己测得的标准工时(含宽放),不是拍脑袋估的。工时错了,平衡率再准也没意义。
- 插件按「单件流、工序不可拆」建模:不处理并行工位、不处理一人多机、不处理换型时间。
- 改善建议是一次邻域搜索(挪一道工序),不是全局最优。找不到可挪的工序时,说明该拆工序或加工位,不是算法偷懒。
- 只支持 Android,iOS / 鸿蒙不支持;uni-app Vue3。

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 13
赞赏 0
下载 12749782
赞赏 1959
赞赏
京公网安备:11010802035340号