chore: 批量完成项目多模块迭代优化
1. 废弃半成品库存表并统一库存主表 2. 修复列表排序与搜索大小写不敏感问题 3. 新增用户最近登录时间、工单BOM名称字段 4. 完善角色管理、工位选择器功能 5. 增加拧紧数据补录、成品自动回流WMS能力 6. 统一导出时间范围校验规则 7. 丰富物料/备料单筛选条件 8. 调整菜单与权限命名适配产品型号业务
This commit is contained in:
@@ -60,10 +60,11 @@ export const helpOutbound = {
|
||||
export const helpInventory = {
|
||||
title: '库存查询',
|
||||
overview:
|
||||
'查看当前库存:结构件按批次(数量/锁定/区域),精密件按 SN(状态/区域)。数据由入库、出库、检验、盘点等业务实时维护,本页只读。\n\n本页三个视图页签(首屏默认「物料汇总」):\n· 物料汇总:一物料一行,直接回答"这个物料总共有多少"——总量/锁定/可用 + 质量分布(合格/未检/不合格) + 分布在哪些区域;ID 与创建时间取自物料主表,另有最近入库单/最近入库时间;点行下钻该物料的批次/SN 明细。\n· 库存明细:按 物料 × 区域 × 质量 聚合,可组合 区域/质量状态/入库时间 筛选(物料汇总不受区域/质量筛选影响)。\n· 区域汇总:按 区域 × 质量状态 × 类型 看各库区的货量;ID 与创建时间取自区域主表,另有组内最近入库时间;支持全量导出。\n\n层级概念:入库单 → 批次/SN → 库存行。区域/质量状态/批次/最近入库单都是某物料的一对多属性,放在下钻明细中查看,不在物料行上并排平铺。',
|
||||
'查看当前库存:全品类统一一张库存主表——原材料(结构件按批次/精密件按SN)、半成品(MES 暂存退库)、成品(MES 完工自动回流,系统生成 SN)。数据由入库、出库、检验、盘点及 MES 回流等业务实时维护,本页只读。\n\n本页三个视图页签(首屏默认「物料汇总」):\n· 物料汇总:一物料一行,直接回答"这个物料总共有多少"——总量/锁定/可用 + 质量分布(合格/未检/不合格) + 分布在哪些区域;ID 与创建时间取自物料主表,另有最近入库单/最近入库时间;点行下钻该物料的批次/SN 明细。\n· 库存明细:按 物料 × 区域 × 质量 聚合,可组合 区域/质量状态/入库时间/品类 筛选(物料汇总不受区域/质量筛选影响)。\n· 区域汇总:按 区域 × 质量状态 × 类型(批次/精密件/半成品/成品) 看各库区的货量;ID 与创建时间取自区域主表,另有组内最近入库时间;支持全量导出。\n\n层级概念:入库单 → 批次/SN → 库存行。区域/质量状态/批次/最近入库单都是某物料的一对多属性,放在下钻明细中查看,不在物料行上并排平铺。',
|
||||
fields: [
|
||||
{ name: '物料编码 / 物料名称', source: '筛选条件。', purpose: '只看某个物料', fill: '输入编码或名称,可空=全部' },
|
||||
{ name: '库存类型', source: '单选(全部/结构件/精密件)。', purpose: '按管理粒度过滤', fill: '全部 / 结构件(批次) / 精密件(SN)' },
|
||||
{ name: '品类', source: '单选(全部/原材料/半成品/成品)。', purpose: '按品类过滤:原材料=采购到货入库;半成品=MES 工位暂存退库;成品=MES 完工自动回流(成品 SN 系统生成,入库单号形如 MES:工单号)', fill: '全部 / 原材料 / 半成品 / 成品;三个视图与导出均生效' },
|
||||
{ name: '物料汇总-质量分布', source: '系统按当前在库行统计。', purpose: '一个物料合格/未检/不合格各多少', fill: '合格/未检/不合格三列,自动统计' },
|
||||
{ name: '物料汇总-分布区域', source: '系统统计该物料当前占用了哪些区域。', purpose: '一个物料可跨多个区域存放(批次可拆分),物料行不写死单一区域', fill: '如 Z02、Z05;点行下钻可看每个批次/SN 具体在哪个区' },
|
||||
{ name: '库存明细-区域/质量/入库时间', source: '仅「库存明细」视图生效的筛选。', purpose: '在物料基础上再按存放区/质量状态/入库时间收窄', fill: '可组合筛选' },
|
||||
@@ -105,18 +106,18 @@ export const helpStocktake = {
|
||||
export const helpSemi = {
|
||||
title: '半成品管理(流转)',
|
||||
overview:
|
||||
'产线工位"暂存/退回"的半成品或完工成品先在此入库(记已完成工序),需要时再出库(重上线),MES 从下一工序继续。\n\n闭环逻辑(与 MES 自动打通):\n' +
|
||||
'产线工位"暂存/退回"的半成品先在此入库(记已完成工序),需要时再出库(重上线),MES 从下一工序继续;成品则由 MES 完工后自动回流入库(品类=成品),不经本页手工操作。\n\n闭环逻辑(与 MES 自动打通):\n' +
|
||||
'① 工位终端"暂存退库" → 调 MES 工序流转接口 → MES 自动调 WMS /api/internal/semi/inbound 入库(带 SN、工单号、已完成工序码)。\n' +
|
||||
'② WMS 收到后生成"半成品库存"记录,并写入 SN 台账,状态=在库。\n' +
|
||||
'② WMS 收到后写入统一库存主表(品类=半成品),与原材料/成品同表管理——库存查询三视图、区域汇总、导出都能看到它。\n' +
|
||||
'③ 该件后续要接着做时,在本页"半成品出库"或 MES 重上线 → WMS /api/internal/semi/outbound 把状态置为出库。\n' +
|
||||
'④ MES 据此下发下一工序,工位继续装配,直至完工。\n\n' +
|
||||
'SN 是两系统唯一的追溯锚点,因此物料编码非必填:MES 调用时不传,WMS 会优先用请求里的、其次按 SN 反查序列号台账,都没有则留空,不影响闭环。',
|
||||
'SN 是两系统唯一的追溯锚点。物料编码以请求传入为准,WMS 会同时从物料档案补齐物料名称(档案缺失不阻塞入库,只用编码兜底)。',
|
||||
sections: [
|
||||
{
|
||||
title: '半成品/成品入库',
|
||||
overview: '把产线退回的半成品或成品收进库房(手工录入或 MES 自动同步均走此接口)。',
|
||||
fields: [
|
||||
{ name: '物料', source: '下拉选择。来自物料档案。', purpose: '入库物料(MES 自动同步时通常留空,由 WMS 反查)', fill: '选择物料编码' },
|
||||
{ name: '物料', source: '下拉选择。来自物料档案(最近100条+模糊搜索)。', purpose: '入库物料(MES 自动同步时以请求传入为准,WMS 补齐物料名称)', fill: '选择物料编码' },
|
||||
{ name: '已完成工序', source: 'MES 自动带出(doneProcessCodes,如 [1,3,5]);手工录入填逗号分隔,如 1,3,5。', purpose: '该件已做到哪些工序,重上线时 MES 从下一工序继续', fill: '如 1,3,5,可空' },
|
||||
{ name: '工单号', source: '自动带出/手工填写。来自工单。', purpose: '来源工单', fill: '输入工单号' },
|
||||
{ name: '区域', source: '手动填写(可空)。', purpose: '存放库区', fill: '如 Z05' },
|
||||
@@ -174,13 +175,14 @@ export const helpZone = {
|
||||
export const helpMaterial = {
|
||||
title: '物料档案',
|
||||
overview:
|
||||
'定义每一种物料的字典:叫什么、什么规格、是【结构件(批次)】还是【精密件(SN)】。\n此处维护的物料会作为下拉选项出现在入库/出库/装箱等页面;其中"类型"直接决定后续入库方式——结构件走批次(一批多件)、精密件走 SN 逐件扫码(单件追溯)。\n\n物料档案是库房的另一道地基:先建好物料,入库时才能选到;类型选错会导致入库方式与追溯粒度不符。',
|
||||
'定义每一种物料的字典:叫什么、什么规格、什么品类(原材料/半成品/成品)、是【结构件(批次)】还是【精密件(SN)】。\n此处维护的物料会作为下拉选项出现在入库/出库/装箱等页面;其中"类型"直接决定后续入库方式——结构件走批次(一批多件)、精密件走 SN 逐件扫码(单件追溯)。\n\n品类说明:1=原材料(默认) / 2=半成品 / 3=成品。编码主数据单一来源在本表:产品型号档案即本表中"成品"品类的行(MES 实时拉取,不双录);库存主表 inventories 的品类与其呼应。列表支持按品类筛选,导出含品类列。\n\n物料档案是库房的另一道地基:先建好物料,入库时才能选到;类型选错会导致入库方式与追溯粒度不符。',
|
||||
fields: [
|
||||
{ name: '物料编码', source: '手工填写,仓库自定义(新增后不可改)。', purpose: '物料唯一编号', fill: '如 SCREW-M3;新增后不可改编码' },
|
||||
{ name: '名称', source: '手工填写。', purpose: '物料名称', fill: '如 螺丝 M3' },
|
||||
{ name: '简称', source: '手工填写(可空)。', purpose: '简写', fill: '可空' },
|
||||
{ name: '规格', source: '手工填写(可空)。', purpose: '规格型号', fill: '可空' },
|
||||
{ name: '单位', source: '手工填写。', purpose: '计量单位', fill: '如 个/套' },
|
||||
{ name: '品类', source: '创建时默认"原材料";成品品类由「产品型号」页维护(自动生成),本页查询/导出覆盖全部品类。', purpose: '区分原材料/半成品/成品,与统一库存主表品类对应', fill: '查询区可选 原材料/半成品/成品' },
|
||||
{ name: '类型', source: '选择:1=结构件(批次管理) / 2=精密件(SN 管理)。语义由库房定:结构件按批次管理,精密件按 SN 逐件管理。', purpose: '决定入库方式:结构件走批次、精密件走 SN 逐件扫码', fill: '结构件(批次) / 精密件(SN)' },
|
||||
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
|
||||
]
|
||||
|
||||
@@ -106,7 +106,7 @@ const materials = ref([])
|
||||
const materialTotal = ref(0)
|
||||
const materialLoading = ref(false)
|
||||
const matFilter = reactive({
|
||||
materialCode: '', name: '', spec: '', manageMode: '', startDate: defaultStart(), endDate: ''
|
||||
materialCode: '', name: '', spec: '', manageMode: '', itemType: '', startDate: defaultStart(), endDate: ''
|
||||
})
|
||||
const matPage = reactive({ current: 1, size: 10 })
|
||||
|
||||
@@ -127,6 +127,7 @@ async function loadMaterials() {
|
||||
name: matFilter.name.trim(),
|
||||
spec: matFilter.spec.trim(),
|
||||
manageMode: matFilter.manageMode,
|
||||
itemType: matFilter.itemType,
|
||||
startDate: matFilter.startDate,
|
||||
endDate: matFilter.endDate,
|
||||
page: matPage.current,
|
||||
@@ -213,7 +214,8 @@ async function exportMaterials() {
|
||||
materialCode: matFilter.materialCode.trim(),
|
||||
name: matFilter.name.trim(),
|
||||
spec: matFilter.spec.trim(),
|
||||
manageMode: matFilter.manageMode
|
||||
manageMode: matFilter.manageMode,
|
||||
itemType: matFilter.itemType
|
||||
}, '物料档案.xlsx')
|
||||
ElMessage.success('已导出:' + name)
|
||||
} catch (e) {
|
||||
@@ -388,6 +390,13 @@ async function onMaterialFile(e) {
|
||||
<el-table-column prop="unit" label="单位" width="70" align="center">
|
||||
<template #default="{ row }">{{ row.unit || '-' }}</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="品类" width="90" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.itemType === 3 ? 'success' : (row.itemType === 2 ? 'warning' : 'info')" size="small">
|
||||
{{ row.itemType === 3 ? '成品' : (row.itemType === 2 ? '半成品' : '原材料') }}
|
||||
</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="类型" width="140" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag :type="row.manageMode === 2 ? 'warning' : 'info'" size="small">
|
||||
|
||||
@@ -25,11 +25,12 @@ function defaultStart() {
|
||||
return `${y}-${m}-${day}`
|
||||
}
|
||||
|
||||
// manageMode: ''=全部 1=结构件 2=精密件
|
||||
// manageMode: ''=全部 1=结构件 2=精密件;category: ''=全部 1=原材料 2=半成品 3=成品
|
||||
const filters = reactive({
|
||||
materialCode: '',
|
||||
materialName: '',
|
||||
manageMode: '',
|
||||
category: '',
|
||||
zoneCode: '',
|
||||
qualityStatus: '',
|
||||
startDate: defaultStart(),
|
||||
@@ -72,6 +73,7 @@ async function loadMaterial() {
|
||||
materialCode: filters.materialCode.trim(),
|
||||
materialName: filters.materialName.trim(),
|
||||
manageMode: filters.manageMode,
|
||||
category: filters.category,
|
||||
page: matPage.current,
|
||||
pageSize: matPage.size
|
||||
}
|
||||
@@ -94,6 +96,7 @@ async function loadDetail() {
|
||||
zoneCode: filters.zoneCode,
|
||||
qualityStatus: filters.qualityStatus,
|
||||
manageMode: filters.manageMode,
|
||||
category: filters.category,
|
||||
startDate: filters.startDate,
|
||||
endDate: filters.endDate,
|
||||
page: page.current,
|
||||
@@ -457,6 +460,11 @@ onMounted(() => {
|
||||
<el-tag size="small" :type="row.manageMode === 1 ? 'primary' : 'warning'">{{ typeLabel(row.manageMode) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="品类" width="85" align="center">
|
||||
<template #default="{ row }">
|
||||
<el-tag size="small" type="info" effect="plain">{{ categoryLabel(row.category) }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="zoneCode" label="区域" width="100" align="center">
|
||||
<template #default="{ row }">{{ row.zoneCode || '未分区' }}</template>
|
||||
</el-table-column>
|
||||
|
||||
Reference in New Issue
Block a user