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
+69 -56
View File
@@ -1,34 +1,38 @@
// 库房客户端(WMS Client) 页面级操作说明:整体介绍 + 各字段 来源/用途/怎么填
// WMS 库房客户端 页面级操作说明:整体流程 + 各字段 数据来源/用途/怎么填
// 由 components/PageHelp.vue 在左下角 "?" 按钮弹出展示。
// 说明:这里的"数据来源"特指该字段数据由谁产生、从哪个系统/页面来,帮助跑通真实流程。
export const helpInbound = {
title: '入库',
overview: '把来料记入 WMS 库存。按物料类型分两种方式:\n· 结构件(螺丝/机加工件)→ 按【批次】入库,一进多件;\n· 精密件(芯片/器件)→ 按【SN 序列号】逐件扫码入库,单件可追溯。\n入库先选“物料模板”,否则需要手工填大量信息;支持连续扫码与 Excel 批量导入。',
title: '入库(来料入账)',
overview:
'把到货的来料记入 WMS 库存。按物料类型分两种入库方式:\n· 结构件(螺丝/机加工件) → 按【批次】入库,一批多件;\n· 精密件(芯片/器件) → 按【SN 序列号】逐件扫码,可单件追溯。\n\n物料类型由 WMS 的"物料档案"决定(精密件/结构件),入库方式随之自动给出。\n入库是整个库存链路的第一环:入库(Held) → 质量检验(合格Z02) → 之后才能被出库锁定。',
sections: [
{
title: 'Tab1 结构件入库(批次)',
title: 'Tab1 结构件入库(批次)',
overview: '适用于螺丝、机加工件等标准件,一次到货入一批。',
fields: [
{ name: '物料', source: '下拉选择(来自物料档案)', purpose: '入库的是什么物料;必须先有物料档案', fill: '选择物料编码,如 SCREW-M3' },
{ name: '批次号', source: '留空自动生成', purpose: '区到货批次,实现先进先出', fill: '留空系统按日期+序号自动生成,或手工填' },
{ name: '数量', source: '手填写', purpose: '本批到货数量', fill: '整数≥1' },
{ name: '区域', source: '下拉选择库区字典', purpose: '放到哪个库区待检/合格/不合格等)', fill: '通常先放待检区,检验后转合格区' },
{ name: '生产日期', source: '手动选择', purpose: '生产时间,用于时效/批次管理', fill: '选择日期' },
{ name: '供应商', source: '手填写', purpose: '来料来源', fill: '供应商名称,可空' }
{ name: '物料', source: '下拉选择。数据来自 WMS"物料档案"里类型为"结构件"的物料。', purpose: '入库的是什么物料;档案里必须存在才能选到', fill: '选择物料编码,如 SCREW-M3;选不到=还没建该物料档案' },
{ name: '批次号', source: '留空系统自动生成(日期+序号);也可手工填。', purpose: '区别不同到货批次,实现先进先出(FIFO)', fill: '默认留空自动生成;供应商自带批号时可手填' },
{ name: '数量', source: '手填写整数。', purpose: '本批到货数量', fill: '整数 ≥1' },
{ name: '区域', source: '下拉选择。数据来自库区字典', purpose: '放到哪个库区(待检/合格/不合格…)', fill: '新到货一般先放"待检"区,检验合格后再转"合格"区(Z02)' },
{ name: '生产日期', source: '手动选择日期。', purpose: '生产时间,用于时效批次管理', fill: '选择日期' },
{ name: '供应商', source: '手填写', purpose: '来料来源', fill: '供应商名称,可空' }
]
},
{
title: 'Tab2 精密件 SN 入库',
title: 'Tab2 精密件 SN 入库(逐件)',
overview: '适用于芯片、器件等需要单件追溯的来料,一件一个 SN。',
fields: [
{ name: '物料', source: '下拉选择', purpose: '入库的精密件物料', fill: '选择物料编码' },
{ name: '区域', source: '下拉选择', purpose: '放到哪个库区', fill: '可选,空则默认' },
{ name: '扫码录入', source: '扫码枪连续扫码', purpose: '逐件登记 SN,实现单件追溯', fill: '扫入/粘贴 SN 后回车追加,可一次多条' }
{ name: '物料', source: '下拉选择。来自"物料档案"类型为"精密件"的物料。', purpose: '入库的精密件物料', fill: '选择物料编码' },
{ name: '区域', source: '下拉选择。来自库区字典。', purpose: '放到哪个库区', fill: '可选,空则默认待检区' },
{ name: '扫码录入', source: '扫码枪连续扫码。来自每颗器件自带的 SN 条码。', purpose: '逐件登记 SN,实现单件追溯', fill: '扫入/粘贴 SN 后回车追加,可一次连续多条' }
]
},
{
title: 'Tab3 Excel 导入',
overview: '用于大批量结构件入库。列头顺序首行忽略:物料编码 | 批次号(空自动生成) | 数量 | 生产日期 | 供应商 | 区域。',
title: 'Tab3 Excel 批量导入',
overview: '用于大批量结构件入库。列头顺序(首行忽略):物料编码 | 批次号(空自动生成) | 数量 | 生产日期 | 供应商 | 区域。',
fields: [
{ name: '文件', source: '选择 .xlsx', purpose: '批量导入的物料清单', fill: '按列头顺序准备好 Excel选择上传' }
{ name: '文件', source: '选择本地 .xlsx 文件。', purpose: '批量导入的物料清单', fill: '按列头顺序准备好 Excel选择上传' }
]
}
]
@@ -36,78 +40,86 @@ export const helpInbound = {
export const helpOutbound = {
title: '出库(按工单领料)',
overview: '仓库按工单台账为生产备料出库。系统强约束:单物料累计出库 ≤ 工单需求总量,超发走补料流程。\n可一次出完,也可分多次、分批由 AGV 配送到各 DOCK(决策权在仓库)。',
overview:
'仓库按工单台账为生产备料出库。系统强约束:单物料累计出库 ≤ 工单需求总量,超发走补料流程。\n可一次出完,也可分多次、分批由 AGV 配送到各 DOCK(配送节奏由仓库决定)。\n\n前置条件:必须先有"工单物料台账"(GOMES 工单+物料清单导入),且该物料在【合格区Z02】有足够库存。',
fields: [
{ name: '工单号', source: '输入(来自 MES', purpose: '出库挂靠的工单,决定可领料总量', fill: '输入工单号回车查询台账' },
{ name: '操作人', source: '登录账号自动带出', purpose: '本次出库执行人,便于追溯', fill: '自动,无需填' },
{ name: '目标工位', source: '手动填写', purpose: '本次配送送达的接驳台/DOCK', fill: '如 DOCK-A,可空' },
{ name: '一键分配出库', source: '系统自动按 FIFO 分配', purpose: '从合格区(Z02)按批次先进先出凑够缺口并出库', fill: '点按钮,系统自动算批次并二次确认' }
{ name: '工单号', source: '手动输入。数据来自 MES 已建的工单及导入的物料台账。', purpose: '出库挂靠的工单,决定可领料总量与需求缺口', fill: '输入工单号回车查询该工单的物料台账' },
{ name: '操作人', source: '登录账号自动带出', purpose: '本次出库执行人,追溯', fill: '自动,无需填' },
{ name: '目标工位', source: '手动填写', purpose: '本次配送送达的接驳台/DOCK', fill: '如 DOCK-A,可空' },
{ name: '一键分配出库', source: '系统自动按 FIFO 分配。数据来自合格区Z02的批次库存。', purpose: '从合格区先进先出凑够缺口并出库', fill: '点按钮,系统自动算批次并二次确认' }
]
}
export const helpInventory = {
title: '库存查询',
overview: '查看当前库存:结构件按批次台账(数量/锁定/区域),精密件按 SN 序列号(状态/区域)。',
overview:
'查看当前库存:结构件按批次台账(数量/锁定/区域),精密件按 SN 序列号(状态/区域)。\n数据由入库、出库、盘点等业务实时维护,本页只读查询。',
fields: [
{ name: '物料编码', source: '筛选条件', purpose: '只看某物料', fill: '输入编码,可空=全部' },
{ name: '库存类型', source: '单选', purpose: '看批次还是 SN 序列', fill: '全部 / 批次 / SN 序列' },
{ name: '关键字', source: '筛选条件', purpose: '按批次号/物料名称/SN 模糊过滤', fill: '输入关键字,可空' }
{ name: '物料编码', source: '筛选条件', purpose: '只看某物料', fill: '输入编码,可空=全部' },
{ name: '库存类型', source: '单选', purpose: '看批次台账还是 SN 序列', fill: '全部 / 批次 / SN 序列' },
{ name: '关键字', source: '筛选条件', purpose: '按批次号/物料名称/SN 模糊过滤', fill: '输入关键字,可空' }
]
}
export const helpInspection = {
title: '质量检验',
overview: '对到货物料或 SN 做来料检:把“未检”翻转为【合格】或【不合格】。支持单条扫码录入与批量翻转。合格后才能被出库锁定(出库自动分配只取合格区)。',
title: '质量检验(来料检)',
overview:
'对入库的未检物料/SN 做检验:把"未检"翻转为【合格】或【不合格】。\n合格后才能被出库锁定(出库自动分配只取合格区Z02)。\n\n数据链路:入库(状态=未检) → 本页检验翻转 → 合格Z02 / 不合格隔离。',
fields: [
{ name: '目标类型', source: '单选', purpose: '检验对象是批次还是 SN', fill: '批次 BATCH / 序列号 SN' },
{ name: '检验结论', source: '单选', purpose: '判定结果', fill: '合格 / 不合格' },
{ name: '检验员', source: '手动填写默认当前用户', purpose: '谁检验的,用于追溯', fill: '检验员姓名' },
{ name: '扫码输入', source: '扫码枪', purpose: '单个目标编号', fill: '扫批次号或 SN,回车提交' },
{ name: '批量编号', source: '扫码枪连续录入', purpose: '一次性翻转多个目标的检验状态', fill: '每行一个编号' }
{ name: '目标类型', source: '单选', purpose: '检验对象是批次还是 SN', fill: '批次 BATCH / 序列号 SN' },
{ name: '检验结论', source: '单选', purpose: '判定结果', fill: '合格 / 不合格' },
{ name: '检验员', source: '手动填写(默认当前用户)。', purpose: '谁检验的,追溯', fill: '检验员姓名' },
{ name: '扫码输入', source: '扫码枪。来自批次号/SN条码。', purpose: '单个待检目标编号', fill: '扫批次号或 SN,回车提交' },
{ name: '批量编号', source: '扫码枪连续录入', purpose: '一次性翻转多个目标的检验状态', fill: '每行一个编号' }
]
}
export const helpStocktake = {
title: '盘点',
overview: '核对账面与实际库存,支持扫码快速盘点,完成时按差异修正库存。\n步骤:发起盘点(冻结快照)→ 扫码录入实盘数(入库)→ 完成并生成差异(可选:差异写回库存)。',
title: '盘点(库存核对)',
overview:
'核对账面与实际库存,支持扫码快速盘点,完成时按差异修正库存。\n流程:发起盘点(冻结快照) → 扫码录入实盘数(入库) → 完成并生成差异(可选:差异写回库存)。',
fields: [
{ name: '操作人', source: '登录账号', purpose: '发起盘点人', fill: '自动' },
{ name: '发起盘点', source: '按钮', purpose: '冻结当前库存快照,生成盘点单', fill: '点按钮发起' },
{ name: '差异写回库存', source: '开关', purpose: '完成后是否用实盘差异修正库存', fill: '开=写回,关闭=仅记录差异' },
{ name: '目标编号', source: '扫码枪', purpose: '要盘点的批次号或 SN', fill: '扫批次号/SN,回车提交' },
{ name: '实盘数量', source: '扫码/手输', purpose: '实际数到数量', fill: '非负整数;0 表示盘亏为零' }
{ name: '操作人', source: '登录账号自动带出。', purpose: '发起盘点人', fill: '自动' },
{ name: '发起盘点', source: '按钮操作。', purpose: '冻结当前库存快照,生成盘点单', fill: '点按钮发起' },
{ name: '差异写回库存', source: '开关', purpose: '完成后是否用实盘差异修正账面库存', fill: '开=写回;关=仅记录差异' },
{ name: '目标编号', source: '扫码枪。来自批次号/SN条码。', purpose: '要盘点的批次号或 SN', fill: '扫批次号/SN,回车提交' },
{ name: '实盘数量', source: '扫码/手输', purpose: '实际数到数量', fill: '非负整数;0=盘亏为零' }
]
}
export const helpPackage = {
title: '包装绑定(箱号 ↔ SN',
overview: '把若干精密件 SN 绑定到一个箱号,形成包装箱。用于发货/入库整箱追溯。',
overview:
'把若干精密件 SN 绑定到一个箱号,形成包装箱,用于发货/入库整箱追溯。\n数据链路:拣选出的 SN → 绑到箱号 → 一个箱号代表一箱货。',
fields: [
{ name: '箱号', source: '扫码/手输', purpose: '包装箱唯一号', fill: '扫描或手输箱号' },
{ name: '物料', source: '下拉选择可空', purpose: '箱内物料类型', fill: '可选' },
{ name: '操作人', source: '登录账号', purpose: '绑定人', fill: '自动' },
{ name: 'SN 录入', source: '扫码枪连续扫码', purpose: '装箱的 SN 序列号清单', fill: '扫入 SN 回车追加' }
{ name: '箱号', source: '扫码/手输', purpose: '包装箱唯一号', fill: '扫描或手输箱号' },
{ name: '物料', source: '下拉选择(可空)。来自物料档案。', purpose: '箱内物料类型', fill: '可选' },
{ name: '操作人', source: '登录账号自动带出。', purpose: '绑定人', fill: '自动' },
{ name: 'SN 录入', source: '扫码枪连续扫码。来自器件 SN 条码。', purpose: '装箱的 SN 清单', fill: '扫入 SN 回车追加' }
]
}
export const helpSemi = {
title: '半成品/成品(流转)',
overview: '产线工位“暂存/退回”的半成品或完工成品可在此入库(记录已完成工序),需要时再出库(重上线),MES 从下一工序继续。',
overview:
'产线工位"暂存/退回"的半成品或完工成品可在此入库(记录已完成工序),需要时再出库(重上线),MES 从下一工序继续。\n\n半成品生命周期:工位暂存退库 → 本页入库(记已完成工序) → 需要时本页出库→ MES 下发下一工序 → 工位继续装配。',
sections: [
{
title: '半成品/成品入库',
overview: '把产线退回的半成品或成品收进库房。',
fields: [
{ name: '物料', source: '下拉选择', purpose: '入库物料', fill: '选择物料编码' },
{ name: '已完成工序', source: '工位终端上报', purpose: '该件做到第几道工序,重上线时 MES 从这里继续', fill: '如 135,可空' },
{ name: '工单号', source: '手动填写(可空)', purpose: '来源工单', fill: '输入工单号' },
{ name: '区域', source: '手动填写可空', purpose: '存放库区', fill: '如 Z05' },
{ name: '扫码录入', source: '扫码枪连续扫码', purpose: '半成品 SN 清单', fill: '扫入 SN 回车追加' }
{ name: '物料', source: '下拉选择。来自物料档案。', purpose: '入库物料', fill: '选择物料编码' },
{ name: '已完成工序', source: '自动带出/手工填写。数据来自工位终端的"已完成工序"上报', purpose: '该件做到第几道工序,重上线时 MES 从这里继续', fill: '如 135,可空' },
{ name: '工单号', source: '自动带出/手工填写。来自工单。', purpose: '来源工单', fill: '输入工单号' },
{ name: '区域', source: '手动填写(可空)。', purpose: '存放库区', fill: '如 Z05' },
{ name: '扫码录入', source: '扫码枪连续扫码。来自工件 SN 条码。', purpose: '半成品 SN 清单', fill: '扫入 SN 回车追加' }
]
},
{
title: '半成品出库(重上线)',
overview: '把半成品重新送上线,MES 会从记录的下一个工序继续。',
fields: [
{ name: 'SN', source: '扫码枪/手输', purpose: '要重上线的半成品 SN', fill: '扫描或输入 SN,回车出库' }
{ name: 'SN', source: '扫码枪/手输。来自工件 SN 条码。', purpose: '要重上线的半成品 SN', fill: '扫描或输入 SN,回车出库' }
]
}
]
@@ -115,20 +127,21 @@ export const helpSemi = {
export const helpLedger = {
title: '工单物料台账',
overview: '实时展示每个物料:需求总量、累计已出库、剩余缺口。系统强约束累计出库 ≤ 需求总量,达到即“领料完结”。',
overview:
'实时展示每个物料:需求总量、累计已出库、剩余缺口。\n系统强约束累计出库 ≤ 需求总量,达到即"领料完结"。\n数据链路:MES 工单+物料清单 → 导入本台账 → 出库时自动扣减累计,形成缺口/完结。',
fields: [
{ name: '工单号', source: '输入', purpose: '查看哪个工单的领料台账', fill: '输入工单号查询' }
{ name: '工单号', source: '手动输入。来自 MES 工单。', purpose: '查看哪个工单的领料台账', fill: '输入工单号查询' }
]
}
export const helpDisplay = {
title: '库房总览显示',
overview: '给库房显示器用的只读总览页,展示库存与出入库概况。',
overview: '给库房显示器用的只读总览页,展示库存与出入库概况。\n数据实时读取库存统计,本页不可编辑。',
fields: []
}
export const helpDashboard = {
title: '库房看板',
overview: '只读看板:库存总量、物料种类、出入库动态等。',
overview: '只读看板:库存总量、物料种类、出入库动态等。\n数据实时读取统计接口,本页不可编辑。',
fields: []
}
@@ -1 +1 @@
import{_ as C,i as B,c as s,a as t,w as a,r as o,h as u,u as D,o as l,F as _,k as p,d as n,t as c,p as k,q as N,v as S,x as I,y as T,z as V,A as q,B as h,C as z,D as F,G as Q,f as A}from"./index-9NS-icag.js";import{r as E}from"./request-DS_8eNi1.js";import{f as G}from"./format-C9Ok6skr.js";const L={class:"kpi-label"},M={class:"kpi-value"},R={class:"entries"},$={__name:"Dashboard",setup(j){const m=D(),i=u({}),r=u(!1);async function f(){i.value=await E.get("/display/overview"),r.value=!0}B(f);const y=[{key:"totalQty",label:"在库总量"},{key:"lockedQty",label:"锁定量"},{key:"snInStock",label:"SN 在库数"},{key:"semiInStock",label:"半成品在库"},{key:"packageCount",label:"包装箱数"},{key:"batchCount",label:"批次数"},{key:"inToday",label:"今日入库单"},{key:"outToday",label:"今日出库单"}],v=[{path:"/inbound",title:"入库管理",icon:N},{path:"/outbound",title:"备料出库",icon:S},{path:"/inventory",title:"库存查询",icon:I},{path:"/inspection",title:"质量检验",icon:T},{path:"/stocktake",title:"库存盘点",icon:V},{path:"/semi",title:"半成品/成品",icon:q},{path:"/package",title:"包装绑定",icon:h},{path:"/ledger",title:"物料台账",icon:h},{path:"/display",title:"免登录大屏",icon:z}];return(H,J)=>{const d=o("el-card"),b=o("el-col"),g=o("el-row"),w=o("el-icon"),x=o("el-button");return l(),s("div",null,[t(g,{gutter:12},{default:a(()=>[(l(),s(_,null,p(y,e=>t(b,{key:e.key,xs:12,sm:8,md:6,style:{"margin-bottom":"12px"}},{default:a(()=>[t(d,{shadow:"hover"},{default:a(()=>[n("div",L,c(e.label),1),n("div",M,c(r.value?k(G)(i.value[e.key]):"—"),1)]),_:2},1024)]),_:2},1024)),64))]),_:1}),t(d,{shadow:"never",header:"快捷入口"},{default:a(()=>[n("div",R,[(l(),s(_,null,p(v,e=>t(x,{key:e.path,size:"large",onClick:K=>k(m).push(e.path)},{default:a(()=>[t(w,{style:{"margin-right":"6px"}},{default:a(()=>[(l(),F(Q(e.icon)))]),_:2},1024),A(c(e.title),1)]),_:2},1032,["onClick"])),64))])]),_:1})])}}},W=C($,[["__scopeId","data-v-3a500a05"]]);export{W as default};
import{_ as C,i as B,c as s,a as t,w as a,r as o,h as u,u as D,o as l,F as _,k as p,d as n,t as c,p as k,q as N,v as S,x as I,y as T,z as V,A as q,B as h,C as z,D as F,G as Q,f as A}from"./index-BhhFt5Di.js";import{r as E}from"./request-By4ij0Lz.js";import{f as G}from"./format-C9Ok6skr.js";const L={class:"kpi-label"},M={class:"kpi-value"},R={class:"entries"},$={__name:"Dashboard",setup(j){const m=D(),i=u({}),r=u(!1);async function f(){i.value=await E.get("/display/overview"),r.value=!0}B(f);const y=[{key:"totalQty",label:"在库总量"},{key:"lockedQty",label:"锁定量"},{key:"snInStock",label:"SN 在库数"},{key:"semiInStock",label:"半成品在库"},{key:"packageCount",label:"包装箱数"},{key:"batchCount",label:"批次数"},{key:"inToday",label:"今日入库单"},{key:"outToday",label:"今日出库单"}],v=[{path:"/inbound",title:"入库管理",icon:N},{path:"/outbound",title:"备料出库",icon:S},{path:"/inventory",title:"库存查询",icon:I},{path:"/inspection",title:"质量检验",icon:T},{path:"/stocktake",title:"库存盘点",icon:V},{path:"/semi",title:"半成品/成品",icon:q},{path:"/package",title:"包装绑定",icon:h},{path:"/ledger",title:"物料台账",icon:h},{path:"/display",title:"免登录大屏",icon:z}];return(H,J)=>{const d=o("el-card"),b=o("el-col"),g=o("el-row"),w=o("el-icon"),x=o("el-button");return l(),s("div",null,[t(g,{gutter:12},{default:a(()=>[(l(),s(_,null,p(y,e=>t(b,{key:e.key,xs:12,sm:8,md:6,style:{"margin-bottom":"12px"}},{default:a(()=>[t(d,{shadow:"hover"},{default:a(()=>[n("div",L,c(e.label),1),n("div",M,c(r.value?k(G)(i.value[e.key]):"—"),1)]),_:2},1024)]),_:2},1024)),64))]),_:1}),t(d,{shadow:"never",header:"快捷入口"},{default:a(()=>[n("div",R,[(l(),s(_,null,p(v,e=>t(x,{key:e.path,size:"large",onClick:K=>k(m).push(e.path)},{default:a(()=>[t(w,{style:{"margin-right":"6px"}},{default:a(()=>[(l(),F(Q(e.icon)))]),_:2},1024),A(c(e.title),1)]),_:2},1032,["onClick"])),64))])]),_:1})])}}},W=C($,[["__scopeId","data-v-3a500a05"]]);export{W as default};
@@ -1 +1 @@
import{r as w}from"./request-DS_8eNi1.js";import{f as o}from"./format-C9Ok6skr.js";import{_ as S,i as z,j as I,c as i,d as t,t as n,F as _,k,l as q,h,m as r,o as c,n as D}from"./index-9NS-icag.js";const $={class:"screen"},N={class:"head"},T={class:"side right"},x={class:"date"},M={class:"time"},Q={class:"kpi-grid"},B={class:"kpi-value"},C={class:"kpi-label"},j={class:"zones"},F={class:"zone-list"},L={class:"zone-name"},O={class:"bar-wrap"},V={class:"zone-qty"},E={key:0,class:"empty"},H={__name:"Display",setup(U){const v=h(new Date);let y=null,m=null;const l=h({}),g=r(()=>{const a=Object.values(u.value).map(e=>Number(e.qty)||0);return Math.max(...a,1)}),u=r(()=>{const a=l.value.zoneDetail||{};return Object.entries(a).map(([e,s])=>({zone:e,qty:Number(s)||0})).sort((e,s)=>s.qty-e.qty)}),b=r(()=>[{key:"totalQty",label:"在库总量",value:o(l.value.totalQty)},{key:"lockedQty",label:"锁定量",value:o(l.value.lockedQty)},{key:"snInStock",label:"SN 在库",value:o(l.value.snInStock)},{key:"semiInStock",label:"半成品在库",value:o(l.value.semiInStock)},{key:"packageCount",label:"包装箱数",value:o(l.value.packageCount)},{key:"inToday",label:"今日入库单",value:o(l.value.inToday)},{key:"outToday",label:"今日出库单",value:o(l.value.outToday)}]),f=["周日","周一","周二","周三","周四","周五","周六"],d=r(()=>{const a=v.value,e=s=>String(s).padStart(2,"0");return{date:`${a.getFullYear()}-${e(a.getMonth()+1)}-${e(a.getDate())}`,time:`${e(a.getHours())}:${e(a.getMinutes())}:${e(a.getSeconds())}`,week:`星期${f[a.getDay()].replace("周","")}`}});async function p(){try{l.value=await w.get("/display/overview")}catch{}}return z(()=>{y=setInterval(()=>{v.value=new Date},1e3),p(),m=setInterval(p,5e3)}),I(()=>{clearInterval(y),clearInterval(m)}),(a,e)=>(c(),i("div",$,[t("header",N,[e[0]||(e[0]=t("div",{class:"side left"},"北自所 · 库房监控",-1)),e[1]||(e[1]=t("h1",{class:"title"},"库存动态大屏",-1)),t("div",T,[t("span",x,n(d.value.date),1),t("span",M,n(d.value.time),1),t("span",null,n(d.value.week),1)])]),t("section",Q,[(c(!0),i(_,null,k(b.value,s=>(c(),i("div",{key:s.key,class:"kpi"},[t("div",B,n(s.value),1),t("div",C,n(s.label),1)]))),128))]),t("section",j,[e[2]||(e[2]=t("div",{class:"zone-title"},"区域明细(区域 / 质量状态)",-1)),t("div",F,[(c(!0),i(_,null,k(u.value,s=>(c(),i("div",{key:s.zone,class:"zone-row"},[t("div",L,n(s.zone),1),t("div",O,[t("div",{class:"bar",style:D({width:`${s.qty/g.value*100}%`})},null,4)]),t("div",V,n(s.qty.toLocaleString("zh-CN")),1)]))),128)),u.value.length?q("",!0):(c(),i("div",E,"暂无区域数据…"))])]),e[3]||(e[3]=t("footer",{class:"foot"},"数据来源:WMS 后端 · 每 5 秒自动刷新",-1))]))}},A=S(H,[["__scopeId","data-v-bd4d24ae"]]);export{A as default};
import{r as w}from"./request-By4ij0Lz.js";import{f as o}from"./format-C9Ok6skr.js";import{_ as S,i as z,j as I,c as i,d as t,t as n,F as _,k,l as q,h,m as r,o as c,n as D}from"./index-BhhFt5Di.js";const $={class:"screen"},N={class:"head"},T={class:"side right"},x={class:"date"},M={class:"time"},Q={class:"kpi-grid"},B={class:"kpi-value"},C={class:"kpi-label"},j={class:"zones"},F={class:"zone-list"},L={class:"zone-name"},O={class:"bar-wrap"},V={class:"zone-qty"},E={key:0,class:"empty"},H={__name:"Display",setup(U){const v=h(new Date);let y=null,m=null;const l=h({}),g=r(()=>{const a=Object.values(u.value).map(e=>Number(e.qty)||0);return Math.max(...a,1)}),u=r(()=>{const a=l.value.zoneDetail||{};return Object.entries(a).map(([e,s])=>({zone:e,qty:Number(s)||0})).sort((e,s)=>s.qty-e.qty)}),b=r(()=>[{key:"totalQty",label:"在库总量",value:o(l.value.totalQty)},{key:"lockedQty",label:"锁定量",value:o(l.value.lockedQty)},{key:"snInStock",label:"SN 在库",value:o(l.value.snInStock)},{key:"semiInStock",label:"半成品在库",value:o(l.value.semiInStock)},{key:"packageCount",label:"包装箱数",value:o(l.value.packageCount)},{key:"inToday",label:"今日入库单",value:o(l.value.inToday)},{key:"outToday",label:"今日出库单",value:o(l.value.outToday)}]),f=["周日","周一","周二","周三","周四","周五","周六"],d=r(()=>{const a=v.value,e=s=>String(s).padStart(2,"0");return{date:`${a.getFullYear()}-${e(a.getMonth()+1)}-${e(a.getDate())}`,time:`${e(a.getHours())}:${e(a.getMinutes())}:${e(a.getSeconds())}`,week:`星期${f[a.getDay()].replace("周","")}`}});async function p(){try{l.value=await w.get("/display/overview")}catch{}}return z(()=>{y=setInterval(()=>{v.value=new Date},1e3),p(),m=setInterval(p,5e3)}),I(()=>{clearInterval(y),clearInterval(m)}),(a,e)=>(c(),i("div",$,[t("header",N,[e[0]||(e[0]=t("div",{class:"side left"},"北自所 · 库房监控",-1)),e[1]||(e[1]=t("h1",{class:"title"},"库存动态大屏",-1)),t("div",T,[t("span",x,n(d.value.date),1),t("span",M,n(d.value.time),1),t("span",null,n(d.value.week),1)])]),t("section",Q,[(c(!0),i(_,null,k(b.value,s=>(c(),i("div",{key:s.key,class:"kpi"},[t("div",B,n(s.value),1),t("div",C,n(s.label),1)]))),128))]),t("section",j,[e[2]||(e[2]=t("div",{class:"zone-title"},"区域明细(区域 / 质量状态)",-1)),t("div",F,[(c(!0),i(_,null,k(u.value,s=>(c(),i("div",{key:s.zone,class:"zone-row"},[t("div",L,n(s.zone),1),t("div",O,[t("div",{class:"bar",style:D({width:`${s.qty/g.value*100}%`})},null,4)]),t("div",V,n(s.qty.toLocaleString("zh-CN")),1)]))),128)),u.value.length?q("",!0):(c(),i("div",E,"暂无区域数据…"))])]),e[3]||(e[3]=t("footer",{class:"foot"},"数据来源:WMS 后端 · 每 5 秒自动刷新",-1))]))}},A=S(H,[["__scopeId","data-v-bd4d24ae"]]);export{A as default};
@@ -1 +1 @@
import{_ as U,h as s,I as $,i as A,N as C,c as E,a as t,w as l,p as R,F,r as n,o as K,f as u,e as M,d as P,t as q,E as p}from"./index-9NS-icag.js";import{r as N}from"./request-DS_8eNi1.js";import{c as D,P as j}from"./help-BMgMow4j.js";const z={class:"tip"},G={__name:"Inspection",setup(J){const i=s("BATCH"),f=s("合格"),d=s($()),_=s(),v=s(""),g=s(!1);A(()=>C(()=>{var a;return(a=_.value)==null?void 0:a.focus()}));async function V(){const a=v.value.trim();if(!a){p.warning("请扫入或输入目标编号");return}if(!d.value.trim()){p.warning("请填写检验员");return}g.value=!0;try{await N.post("/inspection/create",{targetType:i.value,targetId:a,status:f.value,inspector:d.value.trim()}),p.success(`检验已记录:${i.value} ${a}${f.value}`),v.value="",C(()=>{var e;return(e=_.value)==null?void 0:e.focus()})}finally{g.value=!1}}const m=s(""),c=s(!1);function I(){return[...new Set(String(m.value).split(/\s+/).map(a=>a.trim()).filter(Boolean))]}async function S(){const a=I();if(!a.length){p.warning("请录入待检编号(每行一个)");return}if(!d.value.trim()){p.warning("请填写检验员");return}c.value=!0;try{const e=await N.post("/inspection/batch-flip",{targetType:i.value,targetIds:a,status:f.value,inspector:d.value.trim()});p.success(`批量检验完成:共处理 ${(e==null?void 0:e.flipped)??a.length}`),m.value=""}finally{c.value=!1}}return(a,e)=>{const w=n("el-radio-button"),x=n("el-radio-group"),r=n("el-form-item"),T=n("el-radio"),y=n("el-input"),B=n("el-divider"),b=n("el-button"),k=n("el-form"),H=n("el-card");return K(),E(F,null,[t(H,{shadow:"never",style:{"max-width":"760px",margin:"0 auto"}},{default:l(()=>[t(k,{"label-width":"110px"},{default:l(()=>[t(r,{label:"目标类型"},{default:l(()=>[t(x,{modelValue:i.value,"onUpdate:modelValue":e[0]||(e[0]=o=>i.value=o)},{default:l(()=>[t(w,{value:"BATCH"},{default:l(()=>[...e[6]||(e[6]=[u("批次 BATCH",-1)])]),_:1}),t(w,{value:"SN"},{default:l(()=>[...e[7]||(e[7]=[u("序列号 SN",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验结论"},{default:l(()=>[t(x,{modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=o=>f.value=o)},{default:l(()=>[t(T,{value:"合格"},{default:l(()=>[...e[8]||(e[8]=[u("合格",-1)])]),_:1}),t(T,{value:"不合格"},{default:l(()=>[...e[9]||(e[9]=[u("不合格",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验员"},{default:l(()=>[t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=o=>d.value=o),placeholder:"检验员姓名",clearable:"",style:{width:"260px"}},null,8,["modelValue"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[10]||(e[10]=[u("单个录入(扫码)",-1)])]),_:1}),t(r,{label:"扫码输入"},{default:l(()=>[t(y,{ref_key:"scanRef",ref:_,modelValue:v.value,"onUpdate:modelValue":e[3]||(e[3]=o=>v.value=o),autofocus:"",clearable:"",placeholder:"扫入批次号或 SN,回车提交",style:{width:"420px"},onKeyup:M(V,["enter"])},null,8,["modelValue"]),P("span",z,"当前目标:"+q(i.value==="BATCH"?"批次号":"SN 序列号"),1)]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:g.value,onClick:V},{default:l(()=>[...e[11]||(e[11]=[u("提交检验",-1)])]),_:1},8,["loading"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[12]||(e[12]=[u("批量翻转",-1)])]),_:1}),t(r,{label:"批量编号"},{default:l(()=>[t(y,{modelValue:m.value,"onUpdate:modelValue":e[4]||(e[4]=o=>m.value=o),type:"textarea",rows:6,placeholder:"每行一个编号,支持扫码枪连续录入"},null,8,["modelValue"])]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:c.value,onClick:S},{default:l(()=>[...e[13]||(e[13]=[u("批量提交",-1)])]),_:1},8,["loading"]),t(b,{onClick:e[5]||(e[5]=o=>m.value="")},{default:l(()=>[...e[14]||(e[14]=[u("清空",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(j,{data:R(D)},null,8,["data"])],64)}}},W=U(G,[["__scopeId","data-v-c4d8daa0"]]);export{W as default};
import{_ as U,h as s,I as $,i as A,N as C,c as E,a as t,w as l,p as R,F,r as n,o as K,f as u,e as M,d as P,t as q,E as p}from"./index-BhhFt5Di.js";import{r as N}from"./request-By4ij0Lz.js";import{c as D,P as j}from"./help-DfzkTHcJ.js";const z={class:"tip"},G={__name:"Inspection",setup(J){const i=s("BATCH"),f=s("合格"),d=s($()),_=s(),v=s(""),g=s(!1);A(()=>C(()=>{var a;return(a=_.value)==null?void 0:a.focus()}));async function V(){const a=v.value.trim();if(!a){p.warning("请扫入或输入目标编号");return}if(!d.value.trim()){p.warning("请填写检验员");return}g.value=!0;try{await N.post("/inspection/create",{targetType:i.value,targetId:a,status:f.value,inspector:d.value.trim()}),p.success(`检验已记录:${i.value} ${a}${f.value}`),v.value="",C(()=>{var e;return(e=_.value)==null?void 0:e.focus()})}finally{g.value=!1}}const m=s(""),c=s(!1);function I(){return[...new Set(String(m.value).split(/\s+/).map(a=>a.trim()).filter(Boolean))]}async function S(){const a=I();if(!a.length){p.warning("请录入待检编号(每行一个)");return}if(!d.value.trim()){p.warning("请填写检验员");return}c.value=!0;try{const e=await N.post("/inspection/batch-flip",{targetType:i.value,targetIds:a,status:f.value,inspector:d.value.trim()});p.success(`批量检验完成:共处理 ${(e==null?void 0:e.flipped)??a.length}`),m.value=""}finally{c.value=!1}}return(a,e)=>{const w=n("el-radio-button"),x=n("el-radio-group"),r=n("el-form-item"),T=n("el-radio"),y=n("el-input"),B=n("el-divider"),b=n("el-button"),k=n("el-form"),H=n("el-card");return K(),E(F,null,[t(H,{shadow:"never",style:{"max-width":"760px",margin:"0 auto"}},{default:l(()=>[t(k,{"label-width":"110px"},{default:l(()=>[t(r,{label:"目标类型"},{default:l(()=>[t(x,{modelValue:i.value,"onUpdate:modelValue":e[0]||(e[0]=o=>i.value=o)},{default:l(()=>[t(w,{value:"BATCH"},{default:l(()=>[...e[6]||(e[6]=[u("批次 BATCH",-1)])]),_:1}),t(w,{value:"SN"},{default:l(()=>[...e[7]||(e[7]=[u("序列号 SN",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验结论"},{default:l(()=>[t(x,{modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=o=>f.value=o)},{default:l(()=>[t(T,{value:"合格"},{default:l(()=>[...e[8]||(e[8]=[u("合格",-1)])]),_:1}),t(T,{value:"不合格"},{default:l(()=>[...e[9]||(e[9]=[u("不合格",-1)])]),_:1})]),_:1},8,["modelValue"])]),_:1}),t(r,{label:"检验员"},{default:l(()=>[t(y,{modelValue:d.value,"onUpdate:modelValue":e[2]||(e[2]=o=>d.value=o),placeholder:"检验员姓名",clearable:"",style:{width:"260px"}},null,8,["modelValue"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[10]||(e[10]=[u("单个录入(扫码)",-1)])]),_:1}),t(r,{label:"扫码输入"},{default:l(()=>[t(y,{ref_key:"scanRef",ref:_,modelValue:v.value,"onUpdate:modelValue":e[3]||(e[3]=o=>v.value=o),autofocus:"",clearable:"",placeholder:"扫入批次号或 SN,回车提交",style:{width:"420px"},onKeyup:M(V,["enter"])},null,8,["modelValue"]),P("span",z,"当前目标:"+q(i.value==="BATCH"?"批次号":"SN 序列号"),1)]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:g.value,onClick:V},{default:l(()=>[...e[11]||(e[11]=[u("提交检验",-1)])]),_:1},8,["loading"])]),_:1}),t(B,{"content-position":"left"},{default:l(()=>[...e[12]||(e[12]=[u("批量翻转",-1)])]),_:1}),t(r,{label:"批量编号"},{default:l(()=>[t(y,{modelValue:m.value,"onUpdate:modelValue":e[4]||(e[4]=o=>m.value=o),type:"textarea",rows:6,placeholder:"每行一个编号,支持扫码枪连续录入"},null,8,["modelValue"])]),_:1}),t(r,null,{default:l(()=>[t(b,{type:"primary",loading:c.value,onClick:S},{default:l(()=>[...e[13]||(e[13]=[u("批量提交",-1)])]),_:1},8,["loading"]),t(b,{onClick:e[5]||(e[5]=o=>m.value="")},{default:l(()=>[...e[14]||(e[14]=[u("清空",-1)])]),_:1})]),_:1})]),_:1})]),_:1}),t(j,{data:R(D)},null,8,["data"])],64)}}},W=U(G,[["__scopeId","data-v-c4d8daa0"]]);export{W as default};
@@ -1 +1 @@
import{_ as L,c as S,d as x,a as e,w as a,D as g,p as F,F as H,r as o,h as u,J as M,o as _,H as P,e as T,f as c,K as E,t as p,g as I}from"./index-9NS-icag.js";import{r as J}from"./request-DS_8eNi1.js";import{g as O,P as U}from"./help-BMgMow4j.js";const j={class:"pager"},A={__name:"Ledger",setup(G){const i=u(""),d=u(!1),v=u(!1),y=u([]),m=u(0),r=I({current:1,size:20});function N(t){return Math.max((t.totalQty||0)-(t.outQty||0),0)}async function b(){if(i.value.trim()){d.value=!0;try{const t=await J.get("/ledger/query",{params:{orderNo:i.value.trim(),page:r.current,pageSize:r.size}});y.value=(t==null?void 0:t.list)||[],m.value=(t==null?void 0:t.total)||0,v.value=!0}finally{d.value=!1}}}function f(){r.current=1,b()}function k(t){return t==="领料完结"?"success":t==="进行中"?"primary":"info"}return(t,s)=>{const z=o("el-input"),h=o("el-form-item"),C=o("el-button"),V=o("el-form"),w=o("el-card"),n=o("el-table-column"),B=o("el-tag"),D=o("el-table"),Q=o("el-pagination"),q=o("el-empty"),K=M("loading");return _(),S(H,null,[x("div",null,[e(w,{shadow:"never",class:"mb12"},{default:a(()=>[e(V,{inline:"",onSubmit:P(f,["prevent"])},{default:a(()=>[e(h,{label:"工单号"},{default:a(()=>[e(z,{modelValue:i.value,"onUpdate:modelValue":s[0]||(s[0]=l=>i.value=l),placeholder:"输入工单号查询物料台账",clearable:"",autofocus:"",style:{width:"280px"},onKeyup:T(f,["enter"])},null,8,["modelValue"])]),_:1}),e(h,null,{default:a(()=>[e(C,{type:"primary",loading:d.value,onClick:f},{default:a(()=>[...s[2]||(s[2]=[c("查询",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),v.value?(_(),g(w,{key:0,shadow:"never"},{header:a(()=>[c("工单 "+p(i.value)+" 物料台账(共 "+p(m.value)+" 条)",1)]),default:a(()=>[E((_(),g(D,{data:y.value,border:"","empty-text":"暂无台账数据"},{default:a(()=>[e(n,{prop:"orderNo",label:"工单号","min-width":"140"}),e(n,{prop:"materialCode",label:"物料编码","min-width":"150"}),e(n,{prop:"materialName",label:"物料名称","min-width":"150"},{default:a(({row:l})=>[c(p(l.materialName||"-"),1)]),_:1}),e(n,{prop:"totalQty",label:"需求总量",width:"100",align:"center"}),e(n,{prop:"outQty",label:"已出库",width:"90",align:"center"}),e(n,{label:"缺口",width:"90",align:"center"},{default:a(({row:l})=>[c(p(N(l)),1)]),_:1}),e(n,{label:"状态",width:"110",align:"center"},{default:a(({row:l})=>[e(B,{type:k(l.status),size:"small"},{default:a(()=>[c(p(l.status),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])),[[K,d.value]]),x("div",j,[e(Q,{background:"",layout:"total, prev, pager, next",total:m.value,"current-page":r.current,"page-size":r.size,onCurrentChange:s[1]||(s[1]=l=>{r.current=l,b()})},null,8,["total","current-page","page-size"])])]),_:1})):(_(),g(q,{key:1,description:"请输入工单号查询"}))]),e(U,{data:F(O)},null,8,["data"])],64)}}},Y=L(A,[["__scopeId","data-v-19f1447f"]]);export{Y as default};
import{_ as L,c as S,d as x,a as e,w as a,D as g,p as F,F as H,r as o,h as u,J as M,o as _,H as P,e as T,f as c,K as E,t as p,g as I}from"./index-BhhFt5Di.js";import{r as J}from"./request-By4ij0Lz.js";import{g as O,P as U}from"./help-DfzkTHcJ.js";const j={class:"pager"},A={__name:"Ledger",setup(G){const i=u(""),d=u(!1),v=u(!1),y=u([]),m=u(0),r=I({current:1,size:20});function N(t){return Math.max((t.totalQty||0)-(t.outQty||0),0)}async function b(){if(i.value.trim()){d.value=!0;try{const t=await J.get("/ledger/query",{params:{orderNo:i.value.trim(),page:r.current,pageSize:r.size}});y.value=(t==null?void 0:t.list)||[],m.value=(t==null?void 0:t.total)||0,v.value=!0}finally{d.value=!1}}}function f(){r.current=1,b()}function k(t){return t==="领料完结"?"success":t==="进行中"?"primary":"info"}return(t,s)=>{const z=o("el-input"),h=o("el-form-item"),C=o("el-button"),V=o("el-form"),w=o("el-card"),n=o("el-table-column"),B=o("el-tag"),D=o("el-table"),Q=o("el-pagination"),q=o("el-empty"),K=M("loading");return _(),S(H,null,[x("div",null,[e(w,{shadow:"never",class:"mb12"},{default:a(()=>[e(V,{inline:"",onSubmit:P(f,["prevent"])},{default:a(()=>[e(h,{label:"工单号"},{default:a(()=>[e(z,{modelValue:i.value,"onUpdate:modelValue":s[0]||(s[0]=l=>i.value=l),placeholder:"输入工单号查询物料台账",clearable:"",autofocus:"",style:{width:"280px"},onKeyup:T(f,["enter"])},null,8,["modelValue"])]),_:1}),e(h,null,{default:a(()=>[e(C,{type:"primary",loading:d.value,onClick:f},{default:a(()=>[...s[2]||(s[2]=[c("查询",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1}),v.value?(_(),g(w,{key:0,shadow:"never"},{header:a(()=>[c("工单 "+p(i.value)+" 物料台账(共 "+p(m.value)+" 条)",1)]),default:a(()=>[E((_(),g(D,{data:y.value,border:"","empty-text":"暂无台账数据"},{default:a(()=>[e(n,{prop:"orderNo",label:"工单号","min-width":"140"}),e(n,{prop:"materialCode",label:"物料编码","min-width":"150"}),e(n,{prop:"materialName",label:"物料名称","min-width":"150"},{default:a(({row:l})=>[c(p(l.materialName||"-"),1)]),_:1}),e(n,{prop:"totalQty",label:"需求总量",width:"100",align:"center"}),e(n,{prop:"outQty",label:"已出库",width:"90",align:"center"}),e(n,{label:"缺口",width:"90",align:"center"},{default:a(({row:l})=>[c(p(N(l)),1)]),_:1}),e(n,{label:"状态",width:"110",align:"center"},{default:a(({row:l})=>[e(B,{type:k(l.status),size:"small"},{default:a(()=>[c(p(l.status),1)]),_:2},1032,["type"])]),_:1})]),_:1},8,["data"])),[[K,d.value]]),x("div",j,[e(Q,{background:"",layout:"total, prev, pager, next",total:m.value,"current-page":r.current,"page-size":r.size,onCurrentChange:s[1]||(s[1]=l=>{r.current=l,b()})},null,8,["total","current-page","page-size"])])]),_:1})):(_(),g(q,{key:1,description:"请输入工单号查询"}))]),e(U,{data:F(O)},null,8,["data"])],64)}}},Y=L(A,[["__scopeId","data-v-19f1447f"]]);export{Y as default};
@@ -1 +1 @@
import{_ as v,c as V,a as s,w as a,r,u as k,b as h,o as x,d as u,e as q,f as E,s as R,E as B,g as C,h as c}from"./index-9NS-icag.js";import{r as N}from"./request-DS_8eNi1.js";const S={class:"login-page"},K={__name:"Login",setup(L){const f=k(),_=h(),d=c(),l=c(!1),o=C({username:"",password:""}),g={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function p(){await d.value.validate(),l.value=!0;try{const t=await N.post("/auth/login",{username:o.username,password:o.password});if(!(t!=null&&t.token))throw new Error("登录响应缺少 token");R(t.token,t.user||{}),B.success("登录成功");const e=_.query.redirect;f.push(e&&typeof e=="string"?e:"/")}finally{l.value=!1}}return(t,e)=>{const m=r("el-input"),i=r("el-form-item"),w=r("el-button"),y=r("el-form"),b=r("el-card");return x(),V("div",S,[s(b,{class:"card"},{default:a(()=>[e[3]||(e[3]=u("div",{class:"head"},[u("h2",null,"北自所库房客户端"),u("p",null,"请使用 WMS 账号登录")],-1)),s(y,{ref_key:"formRef",ref:d,model:o,rules:g,"label-position":"top",onKeyup:q(p,["enter"])},{default:a(()=>[s(i,{label:"用户名",prop:"username"},{default:a(()=>[s(m,{modelValue:o.username,"onUpdate:modelValue":e[0]||(e[0]=n=>o.username=n),placeholder:"用户名",autofocus:""},null,8,["modelValue"])]),_:1}),s(i,{label:"密码",prop:"password"},{default:a(()=>[s(m,{modelValue:o.password,"onUpdate:modelValue":e[1]||(e[1]=n=>o.password=n),type:"password","show-password":"",placeholder:"密码"},null,8,["modelValue"])]),_:1}),s(w,{type:"primary",class:"btn",loading:l.value,onClick:p},{default:a(()=>[...e[2]||(e[2]=[E("登 录",-1)])]),_:1},8,["loading"])]),_:1},8,["model"])]),_:1})])}}},I=v(K,[["__scopeId","data-v-86cfca92"]]);export{I as default};
import{_ as v,c as V,a as s,w as a,r,u as k,b as h,o as x,d as u,e as q,f as E,s as R,E as B,g as C,h as c}from"./index-BhhFt5Di.js";import{r as N}from"./request-By4ij0Lz.js";const S={class:"login-page"},K={__name:"Login",setup(L){const f=k(),_=h(),d=c(),l=c(!1),o=C({username:"",password:""}),g={username:[{required:!0,message:"请输入用户名",trigger:"blur"}],password:[{required:!0,message:"请输入密码",trigger:"blur"}]};async function p(){await d.value.validate(),l.value=!0;try{const t=await N.post("/auth/login",{username:o.username,password:o.password});if(!(t!=null&&t.token))throw new Error("登录响应缺少 token");R(t.token,t.user||{}),B.success("登录成功");const e=_.query.redirect;f.push(e&&typeof e=="string"?e:"/")}finally{l.value=!1}}return(t,e)=>{const m=r("el-input"),i=r("el-form-item"),w=r("el-button"),y=r("el-form"),b=r("el-card");return x(),V("div",S,[s(b,{class:"card"},{default:a(()=>[e[3]||(e[3]=u("div",{class:"head"},[u("h2",null,"北自所库房客户端"),u("p",null,"请使用 WMS 账号登录")],-1)),s(y,{ref_key:"formRef",ref:d,model:o,rules:g,"label-position":"top",onKeyup:q(p,["enter"])},{default:a(()=>[s(i,{label:"用户名",prop:"username"},{default:a(()=>[s(m,{modelValue:o.username,"onUpdate:modelValue":e[0]||(e[0]=n=>o.username=n),placeholder:"用户名",autofocus:""},null,8,["modelValue"])]),_:1}),s(i,{label:"密码",prop:"password"},{default:a(()=>[s(m,{modelValue:o.password,"onUpdate:modelValue":e[1]||(e[1]=n=>o.password=n),type:"password","show-password":"",placeholder:"密码"},null,8,["modelValue"])]),_:1}),s(w,{type:"primary",class:"btn",loading:l.value,onClick:p},{default:a(()=>[...e[2]||(e[2]=[E("登 录",-1)])]),_:1},8,["loading"])]),_:1},8,["model"])]),_:1})])}}},I=v(K,[["__scopeId","data-v-86cfca92"]]);export{I as default};
@@ -1,4 +1,4 @@
import{_ as E,I as K,c as B,d as D,a as t,w as n,D as C,p as M,F as T,r as i,h as $,J as I,o as m,H as Z,e as j,f as g,K as A,t as y,L as H,E as h,g as P,M as R,m as U}from"./index-9NS-icag.js";import{r as z}from"./request-DS_8eNi1.js";import{a as J,P as L}from"./help-BMgMow4j.js";const G={key:1,style:{color:"#67c23a"}},W={__name:"Outbound",setup(X){const v=P({orderNo:""}),k=K(),f=$(""),N=$(!1),S=$(!1),_=$([]),O=U(()=>_.value.filter(e=>e.status!=="领料完结"));function x(e){return Math.max((e.totalQty||0)-(e.outQty||0),0)}async function F(e){const l=x(e);if(l<=0)return;const d=await z.get("/stock/query",{params:{type:"batch",materialCode:e.materialCode,page:1,pageSize:200}}),p=((d==null?void 0:d.batch)||[]).filter(a=>a.qualityStatus==="合格"&&a.zoneCode==="Z02").sort((a,r)=>String(a.batchNo).localeCompare(String(r.batchNo))),c=[];let u=l;for(const a of p){if(u<=0)break;const r=(a.quantity||0)-(a.lockedQty||0);if(r<=0)continue;const o=Math.min(r,u);c.push({batchNo:a.batchNo,qty:o,zoneCode:a.zoneCode}),u-=o}if(!c.length){h.warning(`物料 ${e.materialCode} 在合格区(Z02)无可用批次库存`);return}if(u>0){h.error(`可用量不足:缺口 ${l}Z02 仅可凑 ${l-u},还差 ${u}`);return}const w=c.map(a=>`· 批次 ${a.batchNo} 出库 ${a.qty}`).join(`
import{_ as E,I as K,c as B,d as D,a as t,w as n,D as C,p as M,F as T,r as i,h as $,J as I,o as m,H as Z,e as j,f as g,K as A,t as y,L as H,E as h,g as P,M as R,m as U}from"./index-BhhFt5Di.js";import{r as z}from"./request-By4ij0Lz.js";import{a as J,P as L}from"./help-DfzkTHcJ.js";const G={key:1,style:{color:"#67c23a"}},W={__name:"Outbound",setup(X){const v=P({orderNo:""}),k=K(),f=$(""),N=$(!1),S=$(!1),_=$([]),O=U(()=>_.value.filter(e=>e.status!=="领料完结"));function x(e){return Math.max((e.totalQty||0)-(e.outQty||0),0)}async function F(e){const l=x(e);if(l<=0)return;const d=await z.get("/stock/query",{params:{type:"batch",materialCode:e.materialCode,page:1,pageSize:200}}),p=((d==null?void 0:d.batch)||[]).filter(a=>a.qualityStatus==="合格"&&a.zoneCode==="Z02").sort((a,r)=>String(a.batchNo).localeCompare(String(r.batchNo))),c=[];let u=l;for(const a of p){if(u<=0)break;const r=(a.quantity||0)-(a.lockedQty||0);if(r<=0)continue;const o=Math.min(r,u);c.push({batchNo:a.batchNo,qty:o,zoneCode:a.zoneCode}),u-=o}if(!c.length){h.warning(`物料 ${e.materialCode} 在合格区(Z02)无可用批次库存`);return}if(u>0){h.error(`可用量不足:缺口 ${l}Z02 仅可凑 ${l-u},还差 ${u}`);return}const w=c.map(a=>`· 批次 ${a.batchNo} 出库 ${a.qty}`).join(`
`);await R.confirm(`工单 ${e.orderNo} 物料 ${e.materialCode}
缺口 ${l} FIFO 分配如下
${w}
@@ -1,6 +0,0 @@
import{_ as y,o as l,c as t,a as d,w as f,f as n,d as e,t as o,l as m,F as v,k as h,D as b,r as p,h as x}from"./index-9NS-icag.js";const C={class:"page-help"},E={class:"ph-inner"},V={class:"ph-banner"},O={class:"ph-banner-title"},B={key:0,class:"ph-overview"},D={key:0,class:"ph-sec-title"},I={key:1,class:"ph-sec-overview"},M={class:"ph-fname"},T={class:"ph-fsource"},F={class:"ph-fpurpose"},P={class:"ph-ffill"},A={key:2,class:"ph-section"},H={class:"ph-fname"},K={class:"ph-fsource"},z={class:"ph-fpurpose"},L={class:"ph-ffill"},W={__name:"PageHelp",props:{data:{type:Object,default:()=>({title:"操作说明",overview:"",fields:[]})}},setup(i){const c=x(!1);function S(){c.value=!0}return(Z,a)=>{const _=p("el-button"),N=p("el-tooltip"),w=p("el-empty"),g=p("el-drawer");return l(),t("div",C,[d(N,{content:"本页操作说明",placement:"left"},{default:f(()=>[d(_,{class:"help-fab",circle:"",onClick:S},{default:f(()=>[...a[1]||(a[1]=[n("?",-1)])]),_:1})]),_:1}),d(g,{modelValue:c.value,"onUpdate:modelValue":a[0]||(a[0]=s=>c.value=s),title:i.data.title||"操作说明",size:"520px","append-to-body":"",class:"ph-drawer"},{default:f(()=>[e("div",E,[e("div",V,[e("div",O,o(i.data.title||"操作说明"),1),a[2]||(a[2]=e("div",{class:"ph-banner-sub"},"页面整体说明",-1))]),i.data.overview?(l(),t("div",B,o(i.data.overview),1)):m("",!0),a[3]||(a[3]=e("div",{class:"ph-legend"},[e("span",{class:"lg"},[e("i",{class:"ic lg-source"}),n("来源:这个字段从哪来、谁填")]),e("span",{class:"lg"},[e("i",{class:"ic lg-purpose"}),n("用途:它起什么作用")]),e("span",{class:"lg"},[e("i",{class:"ic lg-fill"}),n("怎么填:具体填什么")])],-1)),i.data.sections&&i.data.sections.length?(l(!0),t(v,{key:1},h(i.data.sections,(s,u)=>(l(),t("div",{key:u,class:"ph-section"},[s.title?(l(),t("div",D,o(s.title),1)):m("",!0),s.overview?(l(),t("div",I,o(s.overview),1)):m("",!0),(l(!0),t(v,null,h(s.fields,(r,k)=>(l(),t("div",{class:"ph-field",key:k},[e("div",M,[n(o(r.name)+" ",1),e("span",T,o(r.source),1)]),e("div",F,o(r.purpose),1),e("div",P,"👉 "+o(r.fill),1)]))),128))]))),128)):(l(),t("div",A,[i.data.fields&&i.data.fields.length?(l(!0),t(v,{key:0},h(i.data.fields,(s,u)=>(l(),t("div",{class:"ph-field",key:u},[e("div",H,[n(o(s.name)+" ",1),e("span",K,o(s.source),1)]),e("div",z,o(s.purpose),1),e("div",L,"👉 "+o(s.fill),1)]))),128)):(l(),b(w,{key:1,description:"暂无说明","image-size":70}))]))])]),_:1},8,["modelValue","title"])])}}},G=y(W,[["__scopeId","data-v-8a8f9cc9"]]),R={title:"入库",overview:`把来料记入 WMS 库存。按物料类型分两种方式:
· 结构件(螺丝/机加工件)→ 按【批次】入库,一进多件;
· 精密件(芯片/器件)→ 按【SN 序列号】逐件扫码入库,单件可追溯。
入库先选“物料模板”,否则需要手工填大量信息;支持连续扫码与 Excel 批量导入。`,sections:[{title:"Tab1 结构件入库(批次)",fields:[{name:"物料",source:"下拉选择(来自物料档案)",purpose:"入库的是什么物料;必须先有物料档案",fill:"选择物料编码,如 SCREW-M3"},{name:"批次号",source:"留空自动生成",purpose:"区看到货批次,实现先进先出",fill:"留空系统按日期+序号自动生成,或手工填"},{name:"数量",source:"手动填写",purpose:"本批到货数量",fill:"整数,≥1"},{name:"区域",source:"下拉选择(库区字典)",purpose:"放到哪个库区(待检/合格/不合格等)",fill:"通常先放待检区,检验后转合格区"},{name:"生产日期",source:"手动选择",purpose:"生产时间,用于时效/批次管理",fill:"选择日期"},{name:"供应商",source:"手动填写",purpose:"来料来源",fill:"供应商名称,可空"}]},{title:"Tab2 精密件 SN 入库",fields:[{name:"物料",source:"下拉选择",purpose:"入库的精密件物料",fill:"选择物料编码"},{name:"区域",source:"下拉选择",purpose:"放到哪个库区",fill:"可选,空则默认"},{name:"扫码录入",source:"扫码枪连续扫码",purpose:"逐件登记 SN,实现单件追溯",fill:"扫入/粘贴 SN 后回车追加,可一次多条"}]},{title:"Tab3 Excel 导入",overview:"用于大批量结构件入库。列头顺序(首行忽略):物料编码 | 批次号(可空自动生成) | 数量 | 生产日期 | 供应商 | 区域。",fields:[{name:"文件",source:"选择 .xlsx",purpose:"批量导入的物料清单",fill:"按列头顺序准备好 Excel 后选择上传"}]}]},U={title:"出库(按工单领料)",overview:`仓库按工单台账为生产备料出库。系统强约束:单物料累计出库 ≤ 工单需求总量,超发走补料流程。
可一次出完,也可分多次、分批由 AGV 配送到各 DOCK(决策权在仓库)。`,fields:[{name:"工单号",source:"输入(来自 MES",purpose:"出库挂靠的工单,决定可领料总量",fill:"输入工单号回车查询台账"},{name:"操作人",source:"登录账号自动带出",purpose:"本次出库执行人,便于追溯",fill:"自动,无需填"},{name:"目标工位",source:"手动填写",purpose:"本次配送送达的接驳台/DOCK",fill:"如 DOCK-A,可空"},{name:"一键分配出库",source:"系统自动按 FIFO 分配",purpose:"从合格区(Z02)按批次先进先出凑够缺口并出库",fill:"点按钮,系统自动算批次并二次确认"}]},q={title:"库存查询",overview:"查看当前库存:结构件按批次台账(数量/锁定/区域),精密件按 SN 序列号(状态/区域)。",fields:[{name:"物料编码",source:"筛选条件",purpose:"只看某物料",fill:"输入编码,可空=全部"},{name:"库存类型",source:"单选",purpose:"看批次还是看 SN 序列",fill:"全部 / 批次 / SN 序列"},{name:"关键字",source:"筛选条件",purpose:"按批次号/物料名称/SN 模糊过滤",fill:"输入关键字,可空"}]},J={title:"质量检验",overview:"对到货物料或 SN 做来料检:把“未检”翻转为【合格】或【不合格】。支持单条扫码录入与批量翻转。合格后才能被出库锁定(出库自动分配只取合格区)。",fields:[{name:"目标类型",source:"单选",purpose:"检验对象是批次还是 SN",fill:"批次 BATCH / 序列号 SN"},{name:"检验结论",source:"单选",purpose:"判定结果",fill:"合格 / 不合格"},{name:"检验员",source:"手动填写(默认当前用户)",purpose:"谁检验的,用于追溯",fill:"检验员姓名"},{name:"扫码输入",source:"扫码枪",purpose:"单个目标编号",fill:"扫批次号或 SN,回车提交"},{name:"批量编号",source:"扫码枪连续录入",purpose:"一次性翻转多个目标的检验状态",fill:"每行一个编号"}]},Q={title:"盘点",overview:`核对账面与实际库存,支持扫码快速盘点,完成时按差异修正库存。
步骤:发起盘点(冻结快照)→ 扫码录入实盘数(入库)→ 完成并生成差异(可选:差异写回库存)。`,fields:[{name:"操作人",source:"登录账号",purpose:"发起盘点人",fill:"自动"},{name:"发起盘点",source:"按钮",purpose:"冻结当前库存快照,生成盘点单",fill:"点按钮发起"},{name:"差异写回库存",source:"开关",purpose:"完成后是否用实盘差异修正库存",fill:"开启=写回,关闭=仅记录差异"},{name:"目标编号",source:"扫码枪",purpose:"要盘点的批次号或 SN",fill:"扫批次号/SN,回车提交"},{name:"实盘数量",source:"扫码/手输",purpose:"实际数到的数量",fill:"非负整数;0 表示盘亏为零"}]},X={title:"包装绑定(箱号 ↔ SN",overview:"把若干精密件 SN 绑定到一个箱号,形成包装箱。用于发货/入库整箱追溯。",fields:[{name:"箱号",source:"扫码/手输",purpose:"包装箱唯一号",fill:"扫描或手输箱号"},{name:"物料",source:"下拉选择(可空)",purpose:"箱内物料类型",fill:"可选"},{name:"操作人",source:"登录账号",purpose:"绑定人",fill:"自动"},{name:"SN 录入",source:"扫码枪连续扫码",purpose:"装箱的 SN 序列号清单",fill:"扫入 SN 回车追加"}]},Y={title:"半成品/成品(流转)",overview:"产线工位“暂存/退回”的半成品或完工成品可在此入库(记录已完成工序),需要时再出库(重上线),MES 从下一工序继续。",sections:[{title:"半成品/成品入库",fields:[{name:"物料",source:"下拉选择",purpose:"入库物料",fill:"选择物料编码"},{name:"已完成工序",source:"工位终端上报",purpose:"该件做到第几道工序,重上线时 MES 从这里继续",fill:"如 135,可空"},{name:"工单号",source:"手动填写(可空)",purpose:"来源工单",fill:"输入工单号"},{name:"区域",source:"手动填写(可空)",purpose:"存放库区",fill:"如 Z05"},{name:"扫码录入",source:"扫码枪连续扫码",purpose:"半成品 SN 清单",fill:"扫入 SN 回车追加"}]},{title:"半成品出库(重上线)",fields:[{name:"SN",source:"扫码枪/手输",purpose:"要重上线的半成品 SN",fill:"扫描或输入 SN,回车出库"}]}]},$={title:"工单物料台账",overview:"实时展示每个物料:需求总量、累计已出库、剩余缺口。系统强约束累计出库 ≤ 需求总量,达到即“领料完结”。",fields:[{name:"工单号",source:"输入",purpose:"查看哪个工单的领料台账",fill:"输入工单号查询"}]};export{G as P,U as a,q as b,J as c,Q as d,Y as e,X as f,$ as g,R as h};
@@ -0,0 +1 @@
.page-help[data-v-e02e7155]{position:fixed;left:18px;bottom:18px;z-index:2050}.help-fab[data-v-e02e7155]{width:42px;height:42px;background:#1668dc;color:#fff;font-weight:700;font-size:20px;box-shadow:0 3px 10px #16324f4d;transition:transform .15s}.help-fab[data-v-e02e7155]:hover{background:#0e57c3;transform:scale(1.06)}.ph-inner[data-v-e02e7155]{padding:0 6px 24px}.ph-banner[data-v-e02e7155]{background:linear-gradient(120deg,#1668dc,#3a98f0);color:#fff;border-radius:10px;padding:16px 18px;margin-bottom:16px}.ph-banner-title[data-v-e02e7155]{font-size:20px;font-weight:700}.ph-banner-sub[data-v-e02e7155]{font-size:12px;opacity:.85;margin-top:4px}.ph-overview[data-v-e02e7155]{color:#3f536e;line-height:1.8;font-size:14px;margin-bottom:16px;background:#f4f7fb;border:1px solid #e4ecf5;border-radius:8px;padding:12px 14px;white-space:pre-line}.ph-legend[data-v-e02e7155]{display:flex;flex-wrap:wrap;gap:12px 16px;margin-bottom:16px;padding:10px 14px;background:#fafbfc;border:1px dashed #d9e0e8;border-radius:8px;font-size:12px;color:#6b7785}.ph-legend .lg[data-v-e02e7155]{display:inline-flex;align-items:center;gap:6px}.ph-legend .ic[data-v-e02e7155]{display:inline-block;width:10px;height:10px;border-radius:3px}.lg-source[data-v-e02e7155]{background:#8fa5f5}.lg-purpose[data-v-e02e7155]{background:#22b07d}.lg-fill[data-v-e02e7155]{background:#f5a623}.ph-section[data-v-e02e7155]{margin-bottom:18px}.ph-sec-title[data-v-e02e7155]{font-size:15px;font-weight:700;color:#1b2a3a;margin:0 0 4px;padding-left:10px;border-left:4px solid #1668dc;line-height:1.4}.ph-sec-overview[data-v-e02e7155]{color:#7a8694;font-size:13px;margin:4px 0 10px;line-height:1.7}.ph-field[data-v-e02e7155]{background:#fff;border:1px solid #eef1f6;border-radius:8px;padding:10px 14px;margin-bottom:8px}.ph-fname[data-v-e02e7155]{display:flex;align-items:center;gap:8px;font-weight:700;color:#1b2a3a;font-size:14px}.ph-fsource[data-v-e02e7155]{font-weight:400;font-size:11px;color:#1668dc;background:#e8f1ff;border-radius:4px;padding:1px 8px}.ph-fpurpose[data-v-e02e7155]{color:#22b07d;font-size:13px;line-height:1.6;margin-top:6px}.ph-fpurpose[data-v-e02e7155]:before{content:"用途:";font-weight:600;color:#1b8d63}.ph-ffill[data-v-e02e7155]{color:#8a5b00;font-size:13px;line-height:1.6;margin-top:4px}.ph-ffill[data-v-e02e7155]:before{content:"怎么填:";font-weight:600;color:#8a5b00}
@@ -1 +0,0 @@
.page-help[data-v-8a8f9cc9]{position:fixed;left:18px;bottom:18px;z-index:2050}.help-fab[data-v-8a8f9cc9]{width:42px;height:42px;background:#1668dc;color:#fff;font-weight:700;font-size:20px;box-shadow:0 3px 10px #16324f4d;transition:transform .15s}.help-fab[data-v-8a8f9cc9]:hover{background:#0e57c3;transform:scale(1.06)}.ph-inner[data-v-8a8f9cc9]{padding:0 6px 24px}.ph-banner[data-v-8a8f9cc9]{background:linear-gradient(120deg,#1668dc,#3a98f0);color:#fff;border-radius:10px;padding:16px 18px;margin-bottom:16px}.ph-banner-title[data-v-8a8f9cc9]{font-size:20px;font-weight:700}.ph-banner-sub[data-v-8a8f9cc9]{font-size:12px;opacity:.85;margin-top:4px}.ph-overview[data-v-8a8f9cc9]{color:#3f536e;line-height:1.8;font-size:14px;margin-bottom:16px;background:#f4f7fb;border:1px solid #e4ecf5;border-radius:8px;padding:12px 14px;white-space:pre-line}.ph-legend[data-v-8a8f9cc9]{display:flex;flex-wrap:wrap;gap:12px 16px;margin-bottom:16px;padding:10px 14px;background:#fafbfc;border:1px dashed #d9e0e8;border-radius:8px;font-size:12px;color:#6b7785}.ph-legend .lg[data-v-8a8f9cc9]{display:inline-flex;align-items:center;gap:6px}.ph-legend .ic[data-v-8a8f9cc9]{display:inline-block;width:10px;height:10px;border-radius:3px}.lg-source[data-v-8a8f9cc9]{background:#8fa5f5}.lg-purpose[data-v-8a8f9cc9]{background:#22b07d}.lg-fill[data-v-8a8f9cc9]{background:#f5a623}.ph-section[data-v-8a8f9cc9]{margin-bottom:18px}.ph-sec-title[data-v-8a8f9cc9]{font-size:15px;font-weight:700;color:#1b2a3a;margin:0 0 4px;padding-left:10px;border-left:4px solid #1668dc;line-height:1.4}.ph-sec-overview[data-v-8a8f9cc9]{color:#7a8694;font-size:13px;margin:4px 0 10px;line-height:1.7}.ph-field[data-v-8a8f9cc9]{background:#fff;border:1px solid #eef1f6;border-radius:8px;padding:10px 14px;margin-bottom:8px}.ph-fname[data-v-8a8f9cc9]{display:flex;align-items:center;gap:8px;font-weight:700;color:#1b2a3a;font-size:14px}.ph-fsource[data-v-8a8f9cc9]{font-weight:400;font-size:11px;color:#1668dc;background:#e8f1ff;border-radius:4px;padding:1px 8px}.ph-fpurpose[data-v-8a8f9cc9]{color:#22b07d;font-size:13px;line-height:1.6;margin-top:6px}.ph-fpurpose[data-v-8a8f9cc9]:before{content:"用途:";font-weight:600;color:#1b8d63}.ph-ffill[data-v-8a8f9cc9]{color:#8a5b00;font-size:13px;line-height:1.6;margin-top:4px}.ph-ffill[data-v-8a8f9cc9]:before{content:"怎么填:";font-weight:600;color:#8a5b00}
@@ -0,0 +1,19 @@
import{_ as b,o,c as i,a as f,w as v,f as n,d as e,t,l as r,F as m,k as h,D as y,r as p,h as E}from"./index-BhhFt5Di.js";const M={class:"page-help"},x={class:"ph-inner"},C={class:"ph-banner"},O={class:"ph-banner-title"},V={key:0,class:"ph-overview"},Z={key:1,class:"ph-section"},F={class:"ph-fname"},I={class:"ph-fsource"},B={class:"ph-fpurpose"},D={class:"ph-ffill"},T={key:0,class:"ph-sec-title"},H={key:1,class:"ph-sec-overview"},P={class:"ph-fname"},W={class:"ph-fsource"},A={class:"ph-fpurpose"},K={class:"ph-ffill"},z={__name:"PageHelp",props:{data:{type:Object,default:()=>({title:"操作说明",overview:"",fields:[]})}},setup(s){const u=E(!1);function S(){u.value=!0}return(G,a)=>{const N=p("el-button"),w=p("el-tooltip"),_=p("el-empty"),g=p("el-drawer");return o(),i("div",M,[f(w,{content:"本页操作说明",placement:"left"},{default:v(()=>[f(N,{class:"help-fab",circle:"",onClick:S},{default:v(()=>[...a[1]||(a[1]=[n("?",-1)])]),_:1})]),_:1}),f(g,{modelValue:u.value,"onUpdate:modelValue":a[0]||(a[0]=l=>u.value=l),title:s.data.title||"操作说明",size:"520px","append-to-body":"",class:"ph-drawer"},{default:v(()=>[e("div",x,[e("div",C,[e("div",O,t(s.data.title||"操作说明"),1),a[2]||(a[2]=e("div",{class:"ph-banner-sub"},"页面整体说明",-1))]),s.data.overview?(o(),i("div",V,t(s.data.overview),1)):r("",!0),a[3]||(a[3]=e("div",{class:"ph-legend"},[e("span",{class:"lg"},[e("i",{class:"ic lg-source"}),n("来源:这个字段从哪来、谁填")]),e("span",{class:"lg"},[e("i",{class:"ic lg-purpose"}),n("用途:它起什么作用")]),e("span",{class:"lg"},[e("i",{class:"ic lg-fill"}),n("怎么填:具体填什么")])],-1)),s.data.fields&&s.data.fields.length?(o(),i("div",Z,[(o(!0),i(m,null,h(s.data.fields,(l,d)=>(o(),i("div",{class:"ph-field",key:"top"+d},[e("div",F,[n(t(l.name)+" ",1),e("span",I,t(l.source),1)]),e("div",B,t(l.purpose),1),e("div",D,"👉 "+t(l.fill),1)]))),128))])):r("",!0),s.data.sections&&s.data.sections.length?(o(!0),i(m,{key:2},h(s.data.sections,(l,d)=>(o(),i("div",{key:d,class:"ph-section"},[l.title?(o(),i("div",T,t(l.title),1)):r("",!0),l.overview?(o(),i("div",H,t(l.overview),1)):r("",!0),(o(!0),i(m,null,h(l.fields,(c,k)=>(o(),i("div",{class:"ph-field",key:k},[e("div",P,[n(t(c.name)+" ",1),e("span",W,t(c.source),1)]),e("div",A,t(c.purpose),1),e("div",K,"👉 "+t(c.fill),1)]))),128))]))),128)):r("",!0),!s.data.fields&&!(s.data.sections&&s.data.sections.length)?(o(),y(_,{key:3,description:"暂无说明","image-size":70})):r("",!0)])]),_:1},8,["modelValue","title"])])}}},j=b(z,[["__scopeId","data-v-e02e7155"]]),R={title:"入库(来料入账)",overview:`把到货的来料记入 WMS 库存。按物料类型分两种入库方式:
· 结构件(螺丝/机加工件) → 按【批次】入库,一批多件;
· 精密件(芯片/器件) → 按【SN 序列号】逐件扫码,可单件追溯。
物料类型由 WMS 的"物料档案"决定(精密件/结构件),入库方式随之自动给出。
入库是整个库存链路的第一环:入库(Held) → 质量检验(合格Z02) → 之后才能被出库锁定。`,sections:[{title:"Tab1 结构件入库(按批次)",overview:"适用于螺丝、机加工件等标准件,一次到货入一批。",fields:[{name:"物料",source:'下拉选择。数据来自 WMS"物料档案"里类型为"结构件"的物料。',purpose:"入库的是什么物料;档案里必须存在才能选到",fill:"选择物料编码,如 SCREW-M3;选不到=还没建该物料档案"},{name:"批次号",source:"留空系统自动生成(日期+序号);也可手工填。",purpose:"区别不同到货批次,实现先进先出(FIFO)",fill:"默认留空自动生成;供应商自带批号时可手填"},{name:"数量",source:"手工填写整数。",purpose:"本批到货数量",fill:"整数 ≥1"},{name:"区域",source:"下拉选择。数据来自库区字典。",purpose:"放到哪个库区(待检/合格/不合格…)",fill:'新到货一般先放"待检"区,检验合格后再转"合格"区(Z02)'},{name:"生产日期",source:"手动选择日期。",purpose:"生产时间,用于时效和批次管理",fill:"选择日期"},{name:"供应商",source:"手工填写。",purpose:"来料来源",fill:"供应商名称,可空"}]},{title:"Tab2 精密件 SN 入库(逐件)",overview:"适用于芯片、器件等需要单件追溯的来料,一件一个 SN。",fields:[{name:"物料",source:'下拉选择。来自"物料档案"类型为"精密件"的物料。',purpose:"入库的精密件物料",fill:"选择物料编码"},{name:"区域",source:"下拉选择。来自库区字典。",purpose:"放到哪个库区",fill:"可选,空则默认待检区"},{name:"扫码录入",source:"扫码枪连续扫码。来自每颗器件自带的 SN 条码。",purpose:"逐件登记 SN,实现单件追溯",fill:"扫入/粘贴 SN 后回车追加,可一次连续多条"}]},{title:"Tab3 Excel 批量导入",overview:"用于大批量结构件入库。列头顺序(首行忽略):物料编码 | 批次号(空自动生成) | 数量 | 生产日期 | 供应商 | 区域。",fields:[{name:"文件",source:"选择本地 .xlsx 文件。",purpose:"批量导入的物料清单",fill:"按列头顺序准备好 Excel,选择上传"}]}]},U={title:"出库(按工单领料)",overview:`仓库按工单台账为生产备料出库。系统强约束:单物料累计出库 ≤ 工单需求总量,超发走补料流程。
可一次出完,也可分多次、分批由 AGV 配送到各 DOCK(配送节奏由仓库决定)。
前置条件:必须先有"工单物料台账"(GOMES 工单+物料清单导入),且该物料在【合格区Z02】有足够库存。`,fields:[{name:"工单号",source:"手动输入。数据来自 MES 已建的工单及导入的物料台账。",purpose:"出库挂靠的工单,决定可领料总量与需求缺口",fill:"输入工单号回车,查询该工单的物料台账"},{name:"操作人",source:"登录账号自动带出。",purpose:"本次出库执行人,追溯用",fill:"自动,无需填"},{name:"目标工位",source:"手动填写。",purpose:"本次配送送达的接驳台/DOCK",fill:"如 DOCK-A,可空"},{name:"一键分配出库",source:"系统自动按 FIFO 分配。数据来自合格区Z02的批次库存。",purpose:"从合格区按先进先出凑够缺口并出库",fill:"点按钮,系统自动算批次并二次确认"}]},q={title:"库存查询",overview:`查看当前库存:结构件按批次台账(数量/锁定/区域),精密件按 SN 序列号(状态/区域)。
数据由入库、出库、盘点等业务实时维护,本页只读查询。`,fields:[{name:"物料编码",source:"筛选条件。",purpose:"只看某物料",fill:"输入编码,可空=全部"},{name:"库存类型",source:"单选。",purpose:"看批次台账还是 SN 序列",fill:"全部 / 批次 / SN 序列"},{name:"关键字",source:"筛选条件。",purpose:"按批次号/物料名称/SN 模糊过滤",fill:"输入关键字,可空"}]},J={title:"质量检验(来料检)",overview:`对入库的未检物料/SN 做检验:把"未检"翻转为【合格】或【不合格】。
合格后才能被出库锁定(出库自动分配只取合格区Z02)。
数据链路:入库(状态=未检) → 本页检验翻转 → 合格Z02 / 不合格隔离。`,fields:[{name:"目标类型",source:"单选。",purpose:"检验对象是批次还是 SN",fill:"批次 BATCH / 序列号 SN"},{name:"检验结论",source:"单选。",purpose:"判定结果",fill:"合格 / 不合格"},{name:"检验员",source:"手动填写(默认当前用户)。",purpose:"谁检验的,追溯用",fill:"检验员姓名"},{name:"扫码输入",source:"扫码枪。来自批次号/SN条码。",purpose:"单个待检目标编号",fill:"扫批次号或 SN,回车提交"},{name:"批量编号",source:"扫码枪连续录入。",purpose:"一次性翻转多个目标的检验状态",fill:"每行一个编号"}]},Q={title:"盘点(库存核对)",overview:`核对账面与实际库存,支持扫码快速盘点,完成时按差异修正库存。
流程:发起盘点(冻结快照) → 扫码录入实盘数(入库) → 完成并生成差异(可选:差异写回库存)。`,fields:[{name:"操作人",source:"登录账号自动带出。",purpose:"发起盘点人",fill:"自动"},{name:"发起盘点",source:"按钮操作。",purpose:"冻结当前库存快照,生成盘点单",fill:"点按钮发起"},{name:"差异写回库存",source:"开关。",purpose:"完成后是否用实盘差异修正账面库存",fill:"开=写回;关=仅记录差异"},{name:"目标编号",source:"扫码枪。来自批次号/SN条码。",purpose:"要盘点的批次号或 SN",fill:"扫批次号/SN,回车提交"},{name:"实盘数量",source:"扫码/手输。",purpose:"实际数到数量",fill:"非负整数;0=盘亏为零"}]},X={title:"包装绑定(箱号 ↔ SN",overview:`把若干精密件 SN 绑定到一个箱号,形成包装箱,用于发货/入库整箱追溯。
数据链路:拣选出的 SN → 绑到箱号 → 一个箱号代表一箱货。`,fields:[{name:"箱号",source:"扫码/手输。",purpose:"包装箱唯一号",fill:"扫描或手输箱号"},{name:"物料",source:"下拉选择(可空)。来自物料档案。",purpose:"箱内物料类型",fill:"可选"},{name:"操作人",source:"登录账号自动带出。",purpose:"绑定人",fill:"自动"},{name:"SN 录入",source:"扫码枪连续扫码。来自器件 SN 条码。",purpose:"装箱的 SN 清单",fill:"扫入 SN 回车追加"}]},Y={title:"半成品/成品(流转)",overview:`产线工位"暂存/退回"的半成品或完工成品可在此入库(记录已完成工序),需要时再出库(重上线),MES 从下一工序继续。
半成品生命周期:工位暂存退库 → 本页入库(记已完成工序) → 需要时本页出库→ MES 下发下一工序 → 工位继续装配。`,sections:[{title:"半成品/成品入库",overview:"把产线退回的半成品或成品收进库房。",fields:[{name:"物料",source:"下拉选择。来自物料档案。",purpose:"入库物料",fill:"选择物料编码"},{name:"已完成工序",source:'自动带出/手工填写。数据来自工位终端的"已完成工序"上报。',purpose:"该件做到第几道工序,重上线时 MES 从这里继续",fill:"如 135,可空"},{name:"工单号",source:"自动带出/手工填写。来自工单。",purpose:"来源工单",fill:"输入工单号"},{name:"区域",source:"手动填写(可空)。",purpose:"存放库区",fill:"如 Z05"},{name:"扫码录入",source:"扫码枪连续扫码。来自工件 SN 条码。",purpose:"半成品 SN 清单",fill:"扫入 SN 回车追加"}]},{title:"半成品出库(重上线)",overview:"把半成品重新送上线,MES 会从记录的下一个工序继续。",fields:[{name:"SN",source:"扫码枪/手输。来自工件 SN 条码。",purpose:"要重上线的半成品 SN",fill:"扫描或输入 SN,回车出库"}]}]},$={title:"工单物料台账",overview:`实时展示每个物料:需求总量、累计已出库、剩余缺口。
系统强约束累计出库 ≤ 需求总量,达到即"领料完结"。
数据链路:MES 工单+物料清单 → 导入本台账 → 出库时自动扣减累计,形成缺口/完结。`,fields:[{name:"工单号",source:"手动输入。来自 MES 工单。",purpose:"查看哪个工单的领料台账",fill:"输入工单号查询"}]};export{j as P,U as a,q as b,J as c,Q as d,Y as e,X as f,$ as g,R as h};
+1 -1
View File
@@ -4,7 +4,7 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>北自所库房客户端</title>
<script type="module" crossorigin src="/assets/index-9NS-icag.js"></script>
<script type="module" crossorigin src="/assets/index-BhhFt5Di.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-qGEetQKd.css">
</head>
<body>