build: update frontend build asset hashes

this commit updates all the static asset file hashes in index.html templates, and adds/removes the corresponding chunk files, which is typical after a frontend project rebuild to deploy updated static resources.
This commit is contained in:
SunYF
2026-08-29 08:11:44 +08:00
parent 940c2ea0c5
commit e82b744bbd
38 changed files with 253 additions and 195 deletions
+91 -79
View File
@@ -1,143 +1,154 @@
// 页面级操作说明:每个页面/弹窗的整体介绍 + 各字段 来源/用途/怎么填
// MES 管理后台 页面级操作说明:整体流程 + 各字段 数据来源/用途/怎么填
// 由 components/PageHelp.vue 在左下角 "?" 按钮弹出展示。
// 说明:这里的"数据来源"特指该字段的数据由谁产生、从哪个系统/页面来,帮助跑通真实流程。
export const helpProductType = {
title: '产品类型',
overview: '产品类型是对“生产什么产品”的分类档案,好比“产品种类”。新建工单时必须先选择产品类型。\n只有先维护好产品类型,工单、BOM 才能正常建立。',
title: '产品类型(档案维护)',
overview:
'产品类型是"生产什么产品"的分类档案,是整条产线的源头基础数据。\n\n生产主数据链条:产品类型 → 建工单(选产品类型) → 配物料清单(BOM) → 日排产 → 备料 → PLC/AGV 配送 → 工位装配。\n必须先在这里维护好产品类型,后面所有环节(工单/BOM/备料/拧紧/追溯)才有可选对象。',
fields: [
{ name: '名称', source: '手填写', purpose: '产品类型的中文名,用于识别', fill: '如:智能电表、断路器、配电柜' },
{ name: '编码', source: '手填写', purpose: '产品类型的唯一编码,BOM/工单按此关联', fill: '如METER-01(尽量唯一,不重复)' },
{ name: '类别', source: '手填写', purpose: '产品所属大类,便分类统计', fill: '如:计量表 / 开关柜可空' },
{ name: '启用', source: '开关选择', purpose: '启用后才在新建工单/备料被选到', fill: '默认开启;暂不用的可关闭' },
{ name: '备注', source: '手填写', purpose: '补充说明文字', fill: '可不填' }
{ name: '名称', source: '手填写。用户自定义,无上游来源。', purpose: '产品类型的中文名,用于识别与下拉展示', fill: '如:智能电表、断路器、配电柜' },
{ name: '编码', source: '手填写。你自定义的编码,保存入库后成为该记录的唯一标识。', purpose: '产品唯一编码,工单/物料清单等下游按此关联', fill: '如 METER-01;全局唯一,建了不要随意改,否则下游关联会断' },
{ name: '类别', source: '手填写。可选,无上游来源。', purpose: '产品所属大类,便分类统计', fill: '如:计量表 / 开关柜可空' },
{ name: '启用', source: '开关选择。默认开启。', purpose: '启用后才允许在新建工单/备料的下拉里被选到', fill: '默认开启;暂时停产的可关闭(不删除,保留档案)' },
{ name: '备注', source: '手填写。可选。', purpose: '补充说明', fill: '可不填' }
]
}
export const helpWorkOrder = {
title: '工单管理(新建 / 编辑工单)',
overview: '工单是一个“合同/生产批次”的唯一载体,也是仓库出库挂靠的唯一对象。\n流程:建工单 → 配 BOM(单台用哪些料)→ 日排产(今天产多少台)→ 系统按排产备料 → AGV 配送到各工位。',
overview:
'工单 = 一个"合同/生产批次"的唯一载体,是生产执行和仓库出库挂靠的核心对象。\n\n全流程:先有产品类型 → 建工单(选产品类型、定数量、定工序组合) → 进"物料清单"给该工单配料 → 行内"日排产"排哪天产多少 → 仓库按排产备料出库 → 产线装配/拧紧/报工 → 完工。\n工单号会贯穿 备料单、拧紧查询、扫码报工、工件追溯、操作日志 全链路。',
fields: [
{ name: '工单号', source: '系统自动生成,可改', purpose: '唯一标识一个工单,备料/出库/报工都挂在此号下', fill: '如 WO20260828保证唯一' },
{ name: '产品类型', source: '先维护“产品类型”后选择', purpose: '说明这批生产的是什么产品', fill: '下拉选择已启用的产品类型' },
{ name: '产品编码', source: '手填写', purpose: '产品唯一编码(通常与产品类型编码一致)', fill: '如 METER-01' },
{ name: '产品名称', source: '手填写', purpose: '产品中文名,用于展示与追溯', fill: '如 智能电表' },
{ name: '数量', source: '手填写', purpose: '本工单总数量(如一个合同 100 台)', fill: '填写整数 ≥1' },
{ name: '工序组合', source: '手填写', purpose: '本工单在产线执行的工序序列PLC 按此下发', fill: '135=做第1/3/5序;全工序=123456789101112' },
{ name: '状态', source: '系统流程驱动', purpose: '工单生命周期:创建→发布→生产→完成', fill: '新建时选已创建,后续流程推进' }
{ name: '工单号', source: '系统自动生成(WO+时间戳),可手工改。新建时自动带出。', purpose: '唯一标识一个工单,备料/出库/报工/追溯都挂在此号下', fill: '打开新建对话框时已自动生成,一般不用改;如改动须保证唯一' },
{ name: '产品类型', source: '下拉选择。数据来自"产品类型"页面已启用的记录。', purpose: '说明这批生产的是什么产品,并决定物料清单内容', fill: '先到"产品类型"页面建好记录,再到这边下拉选择;没有可选项=还没建产品类型' },
{ name: '产品编码', source: '手填写。通常与所选产品类型的编码一致。', purpose: '产品唯一编码,用于展示与追溯', fill: '如 METER-01,与产品类型编码对齐' },
{ name: '产品名称', source: '手填写。通常与产品类型名称一致。', purpose: '产品中文名,用于展示', fill: '如 智能电表' },
{ name: '数量', source: '手填写整数。', purpose: '本工单生产总数量(合同台数),决定需求量与排产上限', fill: '整数 ≥1,如 100' },
{ name: '工序组合', source: '手填写数字序列。', purpose: '本工单在产线执行的工序集合PLC 按此组合下发到各工位', fill: '组合写入PLC135=做第1/3/5序;全工序=123456789101112' },
{ name: '状态', source: '手动选择(新建时)。后续由系统流程自动推进。', purpose: '工单生命周期:创建→发布→生产→完成', fill: '新建时选"已创建",后续流程推进无需手改' }
],
sections: [
{
title: '日排产弹窗',
overview: '只排“哪天生产多少台”,是仓库备料/配送的前瞻参考,不直接触发出库与下单。',
title: '行内"日排产"弹窗',
overview: '对当前这行工单,排"哪天生产多少台"。排产结果会通知仓库按此备料/配送。',
fields: [
{ name: '日期', source: '手动选择', purpose: '计划生产日期', fill: '选一个日期,可排未来多天' },
{ name: '计划数量', source: '手动填写', purpose: '当天计划产量(≤ 工单总数量)', fill: '填写整数,如今天产 20 台' }
{ name: '日期', source: '手动选择日期。', purpose: '计划生产日期,仓库按它哪天备料', fill: '选一个日期,可对同一工单排未来多天' },
{ name: '计划数量', source: '手动填写整数。', purpose: '当天计划产量,作为仓库备料/AGV配送的前瞻依据', fill: '≤ 工单总数量;如今天产 20 台' }
]
}
]
}
export const helpBom = {
title: 'BOM(添加 BOM 物料)',
overview: 'BOM 列出“生产 1 台该工单产品需要哪些物料、各用多少”。系统按它是算备料/出库的需求量,并强约束出库不能超需求。',
title: '物料清单(BOM',
overview:
'物料清单 = 生产 1 台该工单产品需要哪些物料、各用多少。\n仓库按它计算备料/出库需求量,并强约束累计出库 ≤ 需求总量。\n\n数据链路:先建工单 → 到本页选工单 → 为它逐条添加物料(编码要与 WMS 物料档案一致) → 之后仓库才能按此为工单领料。',
fields: [
{ name: '物料编码', source: '手动填写', purpose: '该物料在全库房的唯一编码(与 WMS 物料档案一致)', fill: '如螺丝=SCREW-M3,芯片=IC-001' },
{ name: '物料名称', source: '手填写', purpose: '物料中文名,用于识别', fill: '如 十字螺丝、主控芯片' },
{ name: '规格', source: '手填写', purpose: '物料的规格型号', fill: '如 M3×8 / SMT-48脚' },
{ name: '单位', source: '手填写', purpose: '计量单位,用于算量', fill: '个 / 件 / 套 / kg' },
{ name: '管理方式', source: '单选,按物料类型', purpose: '精密件=逐件按SN管理;结构件=按批次管理', fill: '电子件选精密件(SN);螺丝等选结构件(批次)' },
{ name: '单台用量', source: '手动填写', purpose: '生产 1 台产品用多少个该物料', fill: '如每台用 8 颗螺丝 → 填 8' },
{ name: '损耗率%', source: '手填写', purpose: '考虑报废/损耗的加放比例', fill: '如 2% 填 20 表示不计算' },
{ name: '需求量', source: '通常自动算出,可覆盖', purpose: '总需求 = 数量×单台用量×(1+损耗率)', fill: '自动算,也可手动修正' }
{ name: '工单号', source: '下拉/输入选择。来自已建的工单。', purpose: '要为哪个工单配置物料清单', fill: '选择工单号后加载该工单已有清单' },
{ name: '物料编码', source: '手填写。必须与 WMS(库房) 物料档案的编码一致。', purpose: '物料在库房的全库唯一编码,两条系统靠它关联', fill: '如 螺丝=SCREW-M3、主控芯片=IC-001;编码对不上 WMS 将无法备料' },
{ name: '物料名称', source: '手填写', purpose: '物料中文名,便于识别', fill: '如 十字螺丝、主控芯片' },
{ name: '规格', source: '手填写', purpose: '物料规格型号', fill: '如 M3×8 / SMT-48脚' },
{ name: '单位', source: '手工填写。', purpose: '计量单位,用于算量', fill: '个 / 件 / 套 / kg' },
{ name: '管理方式', source: '单选。按物料类型决定,与 WMS 一致。', purpose: '精密件=逐件按SN管理;结构件=按批次管理', fill: '电子件选"精密件 SN";螺丝等标准件选"结构件 批次"' },
{ name: '单台用量', source: '手填写', purpose: '生产 1 台产品用的该物料数量', fill: '如每台 8 颗螺丝 → 填 8' },
{ name: '损耗率%', source: '手工填写。', purpose: '考虑报废/损耗的加放比例', fill: '如 2% 填 20=不计算损耗' },
{ name: '需求量', source: '自动计算 = 数量×单台用量×(1+损耗率),可覆盖。', purpose: '该物料总需求,出库不能超它', fill: '一般自动算,不必改' }
]
}
export const helpMaterial = {
title: '备料单',
overview: '备料单是按“日排产”自动算出的:该日生产所需物料清单。仓库看它备料,再用 AGV 配送到对应工位(DOCK01~20)。',
title: '备料单(查询)',
overview:
'备料单按"日排产"自动算出某天需要的全部物料,仓库据此备料、由 AGV 配送到各工位(DOCK)。\n本页是只读查询,不修改数据。\n\n数据链路:日排产(工单内) → 本页按日期取那天所有工单的物料汇总 → 仓库出库 → AGV 配送。',
fields: [
{ name: '日期', source: '手动选择', purpose: '哪一天的排产生成备料', fill: '选择某排产日期' },
{ name: '工单号', source: '筛选条件', purpose: '只查看指定工单的备料', fill: '可空,空=全部' },
{ name: '状态', source: '筛选条件', purpose: '按备料状态筛选', fill: '可空' }
{ name: '日期', source: '手动选择。筛选条件。', purpose: '查看哪一天的备料需求', fill: '选择某排产日期' },
{ name: '工单号', source: '手动输入。筛选条件', purpose: '只查看指定工单的备料', fill: '可空,空=全部工单' },
{ name: '状态', source: '下拉。数据来自备料执行状态。', purpose: '按备料进度筛选', fill: '可空' }
]
}
export const helpPlc = {
title: 'PLC 工序下发',
overview: '把工序组合(如 135)写入西门子 S7-1214 的寄存器,产线传送带据此只做对应工序。\n系统遵循“未收到完成信号,绝不下发下一条”,保证产线不会串序。',
overview:
'把工序组合写入西门子 S7-1214 PLC 寄存器,产线传送带据此只执行对应工序。\n系统遵循"未收到完成信号不下发下一条",确保产线不串序。\n\n数据链路:工单(含工序组合) → 下发到 S7-1214 → PLC 驱动工位/传送带 → 收到完成信号再下发下一条。',
fields: [
{ name: '工单号', source: '手动填写', purpose: '当前生产的工单号,用于追溯', fill: '选择或输入工单号' },
{ name: '工件SN', source: '扫码枪扫', purpose: '当前流经的工件唯一序列号', fill: '扫码枪扫描,可空按工单整体下发' },
{ name: '工位', source: '手动填写', purpose: '下发到哪个工位1~12', fill: '输入 1~12 的整数' },
{ name: '工序组合', source: '手动填写', purpose: '该工位要执行的工序,PLC 组合执行', fill: '如 135做第1/3/5序),全序=123456789101112' }
{ name: '工单号', source: '手动输入/选择。来自工单。', purpose: '当前生产的工单,追溯依据', fill: '选择或输入工单号' },
{ name: '工件SN', source: '扫码枪扫描。来自工件条码。', purpose: '当前流经的工件唯一序列号', fill: '扫码枪扫入;可空(按工单整体下发)' },
{ name: '工位', source: '手动填写', purpose: '下发到哪个工位(1~12)', fill: '输入 1~12 的整数' },
{ name: '工序组合', source: '手动填写。通常与工单的工序组合一致。', purpose: '该工位要执行的工序,PLC 组合执行', fill: '如 135(做第1/3/5序)全序=123456789101112' }
]
}
export const helpTorque = {
title: '拧紧数据(查询 / 扫码录入)',
overview: '接收丹尼科尔拧紧工具的采集结果(扭矩/角度/时间/结果/操作人),用于质量追溯。工位终端点“完成”后数据才会报到这里。',
title: '拧紧数据(查询/录入)',
overview:
'接收丹尼科尔拧紧工具的采集结果(扭矩/角度/时间/结果/操作人),用于质量追溯。\n数据在工位终端点"工序完成上报"后由拧紧枪数据同步到 MES。本页可查询,也可手工补录。',
fields: [
{ name: 'SN', source: '扫码枪 / 手工', purpose: '被拧紧的工件唯一序列号', fill: '扫码枪扫描' },
{ name: '工单号', source: '自动带出/选择', purpose: '该工件所属工单', fill: '选择工单号' },
{ name: '工位', source: '手动填写', purpose: '拧紧发生在哪道工位', fill: '如 3' },
{ name: '扭矩', source: '拧紧工具采集', purpose: '实际拧紧扭矩(N·m)', fill: '工具自动带出,可手工录' },
{ name: '角度', source: '拧紧工具采集', purpose: '实际旋转角度(°)', fill: '工具自动带出' },
{ name: '操作人', source: '登录账号', purpose: '执行拧紧操作的人,用于追溯', fill: '默认当前登录用户,可改' }
{ name: 'SN', source: '扫码枪/手工。来自工件条码。', purpose: '被拧紧的工件唯一序列号', fill: '扫码枪扫描' },
{ name: '工单号', source: '自动带出/选择。来自工单。', purpose: '该工件所属工单', fill: '选择工单号' },
{ name: '工位', source: '手动填写', purpose: '拧紧发生在哪道工位', fill: '如 3' },
{ name: '扭矩', source: '拧紧枪自动采集(丹尼科尔工具)。', purpose: '实际拧紧扭矩(N·m),判定是否达标', fill: '工具自动带出;补录时手填' },
{ name: '角度', source: '拧紧枪自动采集', purpose: '实际旋转角度(°),判定滑牙/屈服', fill: '工具自动带出;补录时手填' },
{ name: '操作人', source: '登录账号自动带出。', purpose: '执行拧紧的人,用于追溯', fill: '默认当前登录用户,可改' }
]
}
export const helpScan = {
title: '扫码报工',
overview: '产线扫码枪扫到工件,按类型记录该工件在各工序的流转:进线、工序完成、完工、暂存退回。这是工单进度与追溯的数据来源。',
overview:
'扫码枪扫到工件,按类型记录工件在产线的流转事件。这是工单进度与工件追溯的核心数据来源。\n\n类型含义:进线(进入产线) → 工序(完成某道工序) → 完工(整件完成) → 暂存退回(退回库房)。',
fields: [
{ name: 'SN', source: '扫码枪扫', purpose: '工件的唯一序列号', fill: '扫码枪扫' },
{ name: '工单号', source: '自动带出/选择', purpose: '工件所属工单', fill: '输入或选择' },
{ name: '工位', source: '扫码枪绑定', purpose: '当前扫码的工位编号', fill: '如 5' },
{ name: '类型', source: '按操作选择', purpose: '本次扫码的业务含义', fill: '进线ONLINE / 工序PROCESS / 完工DONE / 暂存TEMP_STORE' },
{ name: '工序号', source: '手动填写', purpose: 'PROCESS 时填第几道工序', fill: '如 3' }
{ name: 'SN', source: '扫码枪扫描。来自工件条码。', purpose: '工件的唯一序列号', fill: '扫码枪扫' },
{ name: '工单号', source: '自动带出/选择。来自工单。', purpose: '工件所属工单', fill: '输入或选择' },
{ name: '工位', source: '手动填写/扫码枪绑定', purpose: '当前扫码的工位编号', fill: '如 5' },
{ name: '类型', source: '下拉选择。业务定义的事件类型。', purpose: '本次扫码的业务含义', fill: '进线 ONLINE / 工序 PROCESS / 完工 DONE / 暂存 TEMP_STORE' },
{ name: '工序号', source: '手动填写', purpose: '类型为"工序"时填第几道工序', fill: '如 3' }
]
}
export const helpTrace = {
title: '工件追溯',
overview: '输入工件的 SN,即可查到它的完整履历:进线/完工时间、各工序时间线、步骤考核数据(扭矩/角度等)、拧紧记录、以及它用了哪些批次/精密件(成品关联)。',
overview:
'输入工件 SN,查它的完整履历:进线/完工时间、各工序时间线、步骤考核数据(扭矩/角度)、拧紧记录、以及它用了哪些批次/精密件。\n\n数据来源:全部由前端各环节自动写入(扫码报工、拧紧采集、PLC下发、工序完成),本页只读查询。',
fields: [
{ name: '工件SN', source: '扫码枪 / 手输', purpose: '要追溯的工件唯一序列号', fill: '扫SN条码或手动输入后点查询' }
{ name: '工件SN', source: '扫码枪/手输。来自工件条码。', purpose: '要追溯的工件唯一序列号', fill: '扫 SN 或手动输入后点查询' }
]
}
export const helpRbac = {
title: '角色权限管理(用户 / 角色 / 权限)',
overview: '管控谁能登录、能看哪些菜单。建议:只给操作员分配其工序所需的菜单权限。登录 token 有效期短(1800 秒),超时自动失效。',
title: '角色权限管理(用户/角色/权限)',
overview:
'管控谁能登录、能看哪些菜单。建议只给操作员分配其工序所需菜单权限。\n登录 token 有效期短(1800秒),超时自动失效需重新登录。',
sections: [
{
title: '用户(新建 / 编辑)',
title: '用户(新建/编辑)',
fields: [
{ name: '用户名', source: '手填写', purpose: '登录账号,唯一', fill: '如 operator1' },
{ name: '密码', source: '手填写', purpose: '登录密码,保存时加密', fill: '≥6 位;编辑时留空=不修改' },
{ name: '姓名', source: '手填写', purpose: '真实姓名,用于操作日志追溯', fill: '如 张三' },
{ name: '角色', source: '下拉选择', purpose: '决定该用户有哪些菜单权限', fill: '选择已建角色' },
{ name: '状态', source: '选择', purpose: '禁用后无法登录', fill: '启用 / 禁用' }
{ name: '用户名', source: '手填写', purpose: '登录账号,唯一', fill: '如 operator1' },
{ name: '密码', source: '手填写,保存时加密存储。', purpose: '登录密码', fill: '≥6位;编辑时留空=不修改' },
{ name: '姓名', source: '手填写', purpose: '真实姓名,操作日志追溯', fill: '如 张三' },
{ name: '角色', source: '下拉选择。来自"角色"页已建的角色。', purpose: '决定该用户菜单权限', fill: '选择已建角色' },
{ name: '状态', source: '选择', purpose: '禁用后无法登录', fill: '启用 / 禁用' }
]
},
{
title: '角色(新建 / 编辑)',
title: '角色(新建/编辑)',
fields: [
{ name: '名称', source: '手填写', purpose: '角色中文名', fill: '如 装配工、质检员' },
{ name: '编码', source: '手填写', purpose: '角色唯一编码SUPER_ADMIN 为超级管理员内置码,勿改', fill: '如 OPERATOR' },
{ name: '备注', source: '手填写', purpose: '说明文字', fill: '可空' },
{ name: '权限', source: '多选勾选', purpose: '勾选该角色可见的菜单/功能', fill: '勾选所需权限码' }
{ name: '名称', source: '手填写', purpose: '角色中文名', fill: '如 装配工、质检员' },
{ name: '编码', source: '手填写', purpose: '角色唯一编码(SUPER_ADMIN 为内置超级管理员,勿改)', fill: '如 OPERATOR' },
{ name: '备注', source: '手填写', purpose: '说明', fill: '可空' },
{ name: '权限', source: '多选。来自"权限"页的权限码。', purpose: '勾选该角色可见的菜单/功能', fill: '勾选所需权限码(如 produce.workorder)' }
]
},
{
title: '权限(新增 / 编辑)',
title: '权限(新增/编辑)',
overview: '通常由系统预置,一般无需手动新增。',
fields: [
{ name: '编码', source: '系统预置', purpose: '权限唯一码如 produce.workorder', fill: '按系统预置填写' },
{ name: '名称', source: '手填写', purpose: '权限名', fill: '如 工单管理' },
{ name: '类型', source: '手填写', purpose: 'MENU=菜单权限 / API=接口权限', fill: '如 MENU' },
{ name: '路径', source: '手填写', purpose: 'MESU 对应的前端路由路径', fill: '如 /work-order' },
{ name: '排序', source: '手填写', purpose: '菜单显示顺序', fill: '数字,越小越靠前' }
{ name: '编码', source: '系统预置/手工。', purpose: '权限唯一码', fill: '如 produce.workorder' },
{ name: '名称', source: '手填写', purpose: '权限名', fill: '如 工单管理' },
{ name: '类型', source: '手填写', purpose: 'MENU=菜单权限 / API=接口权限', fill: '如 MENU' },
{ name: '路径', source: '手填写', purpose: 'MENU 对应的前端路由路径', fill: '如 /work-order' },
{ name: '排序', source: '手填写', purpose: '菜单显示顺序', fill: '数字,越小越靠前' }
]
}
]
@@ -145,10 +156,11 @@ export const helpRbac = {
export const helpEventLog = {
title: '操作日志',
overview: '记录所有关键业务操作(建工单、BOM维护、备料、PLC下发、拧紧、扫码报工等),按工单号、操作人、实体可追溯。',
overview:
'记录所有关键业务操作(建工单、物料清单维护、备料、PLC下发、拧紧、扫码报工等),按工单号、操作人、实体可追溯。\n数据由系统在各操作发生时自动写入,本页只读查询。',
fields: [
{ name: '工单号', source: '筛选条件', purpose: '按工单号过滤该工单的所有操作', fill: '输入工单号,可空=全部' },
{ name: '操作人', source: '筛选条件', purpose: '按操作人过滤', fill: '输入姓名/账号,可空=全部' },
{ name: '类型', source: '筛选条件', purpose: '按事件类型过滤', fill: '如 EVENT_WORK_ORDER / EVENT_TORQUE,可空' }
{ name: '工单号', source: '筛选条件。数据来自日志中的 workOrderNo 字段。', purpose: '按工单号过滤该工单的所有操作', fill: '输入工单号,可空=全部' },
{ name: '操作人', source: '筛选条件。数据来自日志中的 operator 字段。', purpose: '按操作人过滤', fill: '输入姓名/账号,可空=全部' },
{ name: '类型', source: '筛选条件。数据来自日志中的事件类型字段。', purpose: '按事件类型过滤', fill: '如 EVENT_WORK_ORDER / EVENT_TORQUE,可空' }
]
}