refactor(frontend): 优化基础数据页与文档,自动加载列表

1. 拆分基础数据帮助文档为区域维护和物料档案独立版本
2. 将onMounted加载列表改为watch immediate监听模式适配路由复用
3. 为盘点页添加页面自动加载历史盘点单
4. 为半成品页添加页面自动加载列表
5. 更新打包资源引用路径
This commit is contained in:
SunYF
2026-09-02 09:30:17 +08:00
parent 68f50ee46e
commit 8694162d94
5 changed files with 41 additions and 35 deletions
+22 -26
View File
@@ -140,33 +140,29 @@ export const helpLedger = {
]
}
export const helpBaseData = {
title: '区域维护 / 物料档案',
export const helpZone = {
title: '区域维护',
overview:
'维护库房系统的基础字典,供入库/出库/库存等所有业务下拉框选择。\n· 区域货品存放的库区(如待检、合格Z02、不合格…);入库时指明放到哪个区。\n· 物料档案:定义每一种物料叫什么、什么规格、是【结构件(批次)】还是【精密件(SN)】,决定后续入库方式。\n\n这两个字典是库房的第一道地基:先建好区域和物料,入库、检验、出库才能正常跑到数据。',
sections: [
{
title: 'Tab1 区域维护',
overview: '新增库区字典,供入库/半成品等页面的"区域"下拉使用。',
fields: [
{ name: '区域编码', source: '手工填写,仓库自定义。', purpose: '库区唯一编号,入库/出库定位存放位置', fill: '如 Z02、Z05,建议字母+数字,唯一' },
{ name: '区域名称', source: '手工填写。', purpose: '库区中文名,便于识别', fill: '如 合格区、待检区、不合格区' },
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
]
},
{
title: 'Tab2 物料档案',
overview: '定义物料字典。此处维护的物料会出现在入库/出库等页面的"物料"下拉中;此处选"结构件/精密件"直接决定入库走批次还是 SN。',
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: '选择。语义由库房定:结构件按批次管理,精密件按 SN 逐件管理。', purpose: '决定入库方式:结构件走批次、精密件走 SN', fill: '结构件(批次) / 精密件(SN)' },
{ name: '生命周期阶段', source: '物料主数据不再登记生命周期阶段(原“物料类型”字段已移除)。原料→半成品→成品的流转由库存实体各自承载:组件统一入 inventory 表(manage_mode1=结构件批次 / 2=精密件SN),半成品入 semifinished 固定业务表(首页“半成品在库”即统计此表)。', purpose: '避免主数据预判物料命运,消除与 semifinished 业务的歧义', fill: '无需填写;半成品/成品状态以实际库存与 semifinished 表为准' }
]
}
'维护库字典,供入库/半成品/出库等所有页面的"区域"下拉框选择。\n区域货品存放的物理库区(如待检、合格 Z02、不合格…);入库时必须指明放到哪个区,质量检验合格后再转移到合格区。\n\n区域字典是库房的第一道地基:先建好区域,入库、检验、出库才能选到正确的存放位置。',
fields: [
{ name: '区域编码', source: '手工填写,仓库自定义(新增后不可改)。', purpose: '库区唯一编号,入库/出库据此定位存放位置', fill: '如 Z02、Z05,建议字母+数字,唯一;新增后不可改' },
{ name: '区域名称', source: '手工填写。', purpose: '库区中文名,便于识别', fill: '如 合格区、待检区、不合格区' },
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
]
}
export const helpMaterial = {
title: '物料档案',
overview:
'定义每一种物料的字典:叫什么、什么规格、是【结构件(批次)】还是【精密件(SN)】。\n此处维护的物料会作为下拉选项出现在入库/出库/装箱等页面;其中"类型"直接决定后续入库方式——结构件走批次(一批多件)、精密件走 SN 逐件扫码(单件追溯)。\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: '选择:1=结构件(批次管理) / 2=精密件(SN 管理)。语义由库房定:结构件按批次管理,精密件按 SN 逐件管理。', purpose: '决定入库方式:结构件走批次、精密件走 SN 逐件扫码', fill: '结构件(批次) / 精密件(SN)' },
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
]
}
@@ -1,15 +1,18 @@
<script setup>
import { onMounted, reactive, ref } from 'vue'
import { computed, reactive, ref, watch } from 'vue'
import { ElMessage } from 'element-plus'
import request from '../utils/request'
import PageHelp from '../components/PageHelp.vue'
import { helpBaseData } from '../help'
import { helpZone, helpMaterial } from '../help'
// mode: 'zone' = 区域维护;'material' = 物料档案(同一组件拆成两个独立菜单)
const props = defineProps({
mode: { type: String, default: 'zone' }
})
// 帮助文档按菜单各自独立:区域维护 / 物料档案 分开展示
const helpData = computed(() => (props.mode === 'material' ? helpMaterial : helpZone))
/* ---------- 区域维护 ---------- */
const zones = ref([])
const zoneTotal = ref(0)
@@ -161,10 +164,13 @@ async function saveMaterial() {
}
}
onMounted(() => {
if (props.mode === 'material') loadMaterials()
else loadZones()
})
// 区域维护 / 物料档案 共用同一组件:切换菜单时组件实例被复用,
// onMounted 不会再次触发,故用 watch(mode, immediate) 保证进入即加载对应列表
watch(
() => props.mode,
(m) => { if (m === 'material') loadMaterials(); else loadZones() },
{ immediate: true }
)
</script>
<template>
@@ -303,7 +309,7 @@ onMounted(() => {
</el-dialog>
</template>
</el-card>
<PageHelp :data="helpBaseData" />
<PageHelp :data="helpData" />
</template>
<style scoped>
@@ -15,6 +15,7 @@ onMounted(async () => {
const ms = await request.get('/material/list')
materials.value = Array.isArray(ms) ? ms : ms?.list || []
} catch { /* 字典加载失败不阻塞入库 */ }
loadList()
})
const operator = getRealName()
@@ -1,5 +1,5 @@
<script setup>
import { nextTick, reactive, ref } from 'vue'
import { nextTick, onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import request from '../utils/request'
import { fmtTime } from '../utils/format'
@@ -113,6 +113,9 @@ async function loadHistory() {
historyLoading.value = false
}
}
// 进入页面即加载历史盘点单,无需手动点击查询
onMounted(() => { loadHistory() })
</script>
<template>