refactor: 清理MES端本地product_type冗余代码,对齐WMS主数据架构

1.  移除MES端本地product_type实体、schema及相关CRUD代码,改为通过WMS内部API代理获取物料主数据
2.  更新物料管理粒度逻辑,新增"其他"类型(3)支持,同步更新入库校验规则
3.  修复前端物料选择、库存筛选等页面的类型判断逻辑,统一使用manage_mode区分管理类型
4.  清理静态资源文件冗余的样式代码,调整前端页面展示逻辑
5.  更新帮助文档,修正物料类型的说明描述
This commit is contained in:
SunYF
2026-09-22 07:41:40 +08:00
parent 12ca493c61
commit 932700ca65
84 changed files with 698 additions and 3955 deletions
-42
View File
@@ -564,9 +564,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -679,9 +676,6 @@
"arm"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -696,9 +690,6 @@
"arm"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -713,9 +704,6 @@
"arm64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -730,9 +718,6 @@
"arm64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -747,9 +732,6 @@
"loong64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -764,9 +746,6 @@
"loong64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -781,9 +760,6 @@
"ppc64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -798,9 +774,6 @@
"ppc64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -815,9 +788,6 @@
"riscv64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -832,9 +802,6 @@
"riscv64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -849,9 +816,6 @@
"s390x"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -866,9 +830,6 @@
"x64"
],
"dev": true,
"libc": [
"glibc"
],
"license": "MIT",
"optional": true,
"os": [
@@ -883,9 +844,6 @@
"x64"
],
"dev": true,
"libc": [
"musl"
],
"license": "MIT",
"optional": true,
"os": [
@@ -21,9 +21,9 @@ const emit = defineEmits(['update:modelValue', 'item-change'])
const options = ref([])
const loading = ref(false)
// 类型标签(问题18 类型含「其他」):其他品类(itemType=4)统一显示「其他」,否则按管理粒度分结构件/电气件
// 类型标签:类型 manage_mode 1结构件/2电气件/3其他(与入库「结构件/电气件/其他」三页签同源)
function typeLabel(m) {
if (m?.itemType === 4) return '其他'
if (m?.manageMode === 3) return '其他'
return m?.manageMode === 2 ? '电气件' : '结构件'
}
// 品类标签:1原材料/2半成品/3成品/4其他
+2 -2
View File
@@ -89,7 +89,7 @@ export const helpInventory = {
'查看当前库存:全品类统一一张库存主表——原材料(结构件按批次/电气件按SN)、半成品(MES 暂存退库)、成品(MES 完工自动回流,系统生成 SN)。数据由入库、出库、检验、盘点及 MES 回流等业务实时维护,本页只读。\n\n本页四个视图页签(首屏默认「物料汇总」):\n· 物料汇总:一物料一行,直接回答"这个物料总共有多少"——总量/锁定/可用 + 质量分布(合格/未检/不合格) + 分布在哪些区域;点行下钻该物料的批次/SN 明细。\n· 库位明细:按 物料 × 区域 × 货架 × 层 × 位置 聚合(质量三列与批次/SN 数为列,不进分组键),支持区域→货架→层→位置四级联动筛选 + 质量快捷筛选(全部/未检/合格/不合格);点击行下钻批次/SN 明细。\n· 区域汇总:一区域一行六列(合格/未检/不合格/结构件/电气件/其他)+最近入库时间;质量状态与类型均降为列、不再拆行。\n· 缺料补货:拉取 MES 未来5天排产需求,对比本地可用量,分两列列出「安全库存补货量」(常规补货)与「排产缺料量」(订单驱动紧急补料),在途量暂无数据源显示"—";排产窗口标注需求起止日期。\n\n层级概念:入库单 → 批次/SN → 库存行。区域/库位/质量状态/批次/最近入库时间都是某物料的一对多属性,放在下钻明细中查看,不在物料行上并排平铺。',
fields: [
{ name: '图号 / 物料名称', source: '筛选条件(物料汇总、库位明细视图生效)。', purpose: '只看某个物料', fill: '输入图号或名称,可空=全部' },
{ name: '库存类型', source: '单选(全部/结构件/电气件/其他)。结构件=管理粒度1且排除其他”类;电气件=管理粒度2;其他=品类 item_type=4(辅料/工装/试验设备)。', purpose: '类型三分互斥:结构件=批次数量管理;电气件=SN 单件管理;其他=辅料/工装/试验设备(按批次管理)', fill: '全部 / 结构件 / 电气件 / 其他;物料汇总与库位明细视图生效' },
{ name: '库存类型', source: '单选(全部/结构件/电气件/其他)。结构件=类型1且排除其他;电气件=类型2;其他=类型3(辅料/工装/试验设备)。', purpose: '类型三分互斥:结构件=批次数量管理;电气件=SN 单件管理;其他=辅料/工装/试验设备(按批次管理)', fill: '全部 / 结构件 / 电气件 / 其他;物料汇总与库位明细视图生效' },
{ name: '品类', source: '单选(全部/原材料/半成品/成品/其他)。', purpose: '按品类过滤:原材料=采购到货入库;半成品=MES 工位暂存退库;成品=MES 完工自动回流(成品 SN 系统生成,入库单号形如 MES:工单号);其他=辅料/工装/试验设备(ITEM_TYPE=4)', fill: '全部 / 原材料 / 半成品 / 成品 / 其他;物料汇总与库位明细视图生效' },
{ name: '库位明细-区域/货架/层/位置', source: '四级联动下拉(仅「库位明细」视图生效)。区域来自"区域维护";选区域后联动出货架、选货架联动出层、选层联动出位置,上级清空自动清空下级。', purpose: '精确到货位筛选库存,与入库/出库库位四级贯通', fill: '逐级选择;只选区域也可只按大区筛;切换上级自动清空下级' },
{ name: '库位明细-质量状态', source: '单选(全部/未检/合格/不合格,仅「库位明细」生效)。', purpose: '不合格品一屏定位(需求A5)', fill: '选「不合格」直接看所有隔离中的不良库存' },
@@ -281,7 +281,7 @@ export const helpMaterial = {
{ name: '规格', source: '手工填写(必填)。', purpose: '规格型号', fill: '如 M3×8' },
{ name: '单位', source: '手工填写(必填)。', purpose: '计量单位', fill: '如 个/套' },
{ name: '品类', source: '必填。创建时默认"原材料";成品品类也可在 MES 的「物料档案」页维护(两系统同一份主数据,以本表为准)。', purpose: '区分原材料/半成品/成品/其他,与统一库存主表品类对应;原材料为进货、半成品/成品为自产', fill: '查询区可选 原材料/半成品/成品/其他' },
{ name: '类型', source: '必填(「其他」类不做 SN,固定为结构件)。选择:1=结构件(批次管理) / 2=电气件(SN 管理)。语义由库房定:结构件按批次管理,电气件按 SN 逐件管理。', purpose: '决定入库方式:结构件走批次、电气件走 SN 逐件扫码', fill: '结构件(批次) / 电气件(SN)' },
{ name: '类型', source: '必填(与「品类」相互独立)。选择:1=结构件(批次管理) / 2=电气件(SN 管理) / 3=其他(辅料/工装/试验设备,按批次数量管理。', purpose: '决定入库方式:结构件/其他走批次、电气件走 SN 逐件扫码', fill: '结构件(批次) / 电气件(SN) / 其他' },
{ name: '安全库存', source: '必填整数(默认0)。', purpose: '该物料的最低库存警戒线;可用量低于它会在「库房看板」首页触发缺货预警', fill: '如 1000=不预警' },
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
]
+15 -22
View File
@@ -382,7 +382,7 @@ async function saveMaterial() {
ElMessage.warning('品类为必填项')
return
}
if (Number(mForm.itemType) !== 4 && !Number(mForm.manageMode)) {
if (![1, 2, 3].includes(Number(mForm.manageMode))) {
ElMessage.warning('类型为必填项')
return
}
@@ -393,8 +393,8 @@ async function saveMaterial() {
if (!okSave) return
mSaving.value = true
try {
// 「其他」类(品类=4)不做 SN,管理粒度固定结构件(1),与后端收敛口径一致
const manageMode = Number(mForm.itemType) === 4 ? 1 : Number(mForm.manageMode)
// 类型(1结构件/2电气件/3其他)与品类相互独立,原样提交
const manageMode = Number(mForm.manageMode)
const base = {
name: String(mForm.name || '').trim(),
spec: String(mForm.spec || '').trim(),
@@ -434,10 +434,6 @@ function itemTypeText(t) {
function itemTypeTagType(t) {
return t === 3 ? 'success' : t === 2 ? 'warning' : t === 4 ? 'danger' : 'info'
}
// 品类切换:其他类强制按数量管理(不做 SN)
function onItemTypeChange(v) {
if (Number(v) === 4) mForm.manageMode = 1
}
// 区域维护 / 物料档案共用同一组件:切换菜单时复用,watch(mode, immediate) 保证进入即加载
watch(
@@ -868,9 +864,10 @@ async function onMaterialFile(e) {
@keyup.enter="searchMaterials" />
</el-form-item>
<el-form-item label="类型">
<el-select v-model="matFilter.manageMode" placeholder="全部" clearable style="width:120px" @change="searchMaterials">
<el-option label="结构件(批次)" :value="1" />
<el-option label="电气件(SN)" :value="2" />
<el-select v-model="matFilter.manageMode" placeholder="全部" clearable style="width:150px" @change="searchMaterials">
<el-option label="结构件(批次管理)" :value="1" />
<el-option label="电气件(SN管理)" :value="2" />
<el-option label="其他辅料/工装/试验设备" :value="3" />
</el-select>
</el-form-item>
<el-form-item label="品类">
@@ -893,7 +890,7 @@ async function onMaterialFile(e) {
<el-button v-if="can('material:create')" type="success" @click="openMatCreate">新增物料</el-button>
<el-button v-if="can('material:import')" type="warning" :loading="matImporting" @click="pickMaterialFile">导入</el-button>
<el-button v-if="can('material:export')" :loading="matExporting" @click="exportMaterials">导出</el-button>
<el-tooltip v-if="can('material:import')" content="Excel 首行表头按名称识别列顺序可变可含多余列图号 | 名称 | 规格 | 单位 | 类型(结构件/电气件) | 品类(原材料/半成品/成品/其他可选) | 说明说明品类外均为必填">
<el-tooltip v-if="can('material:import')" content="Excel 首行表头按名称识别列顺序可变可含多余列图号 | 名称 | 规格 | 单位 | 类型(结构件/电气件/其他) | 品类(原材料/半成品/成品/其他可选) | 说明说明品类外均为必填">
<el-link type="info" :underline="false" style="margin-left:4px">导入说明</el-link>
</el-tooltip>
<input ref="matFileRef" type="file" accept=".xlsx,.xls" style="display:none" @change="onMaterialFile" />
@@ -917,8 +914,8 @@ async function onMaterialFile(e) {
</el-table-column>
<el-table-column label="类型" width="140" align="center">
<template #default="{ row }">
<el-tag :type="row.itemType === 4 ? 'info' : (row.manageMode === 2 ? 'warning' : 'primary')" size="small">
{{ row.itemType === 4 ? '其他' : (row.manageMode === 2 ? '电气件(SN)' : '结构件(批次)') }}
<el-tag :type="row.manageMode === 3 ? 'info' : (row.manageMode === 2 ? 'warning' : 'primary')" size="small">
{{ row.manageMode === 3 ? '其他' : (row.manageMode === 2 ? '电气件(SN)' : '结构件(批次)') }}
</el-tag>
</template>
</el-table-column>
@@ -958,7 +955,7 @@ async function onMaterialFile(e) {
<el-input v-model="mForm.unit" placeholder=" /" clearable />
</el-form-item>
<el-form-item label="品类" required>
<el-select v-model="mForm.itemType" placeholder="请选择" style="width:100%" @change="onItemTypeChange">
<el-select v-model="mForm.itemType" placeholder="请选择" style="width:100%">
<el-option :value="1" label="原材料" />
<el-option :value="2" label="半成品" />
<el-option :value="3" label="成品" />
@@ -966,14 +963,10 @@ async function onMaterialFile(e) {
</el-select>
</el-form-item>
<el-form-item label="类型" required>
<el-select v-model="mForm.manageMode" placeholder="请选择" style="width:100%" :disabled="Number(mForm.itemType) === 4">
<template v-if="Number(mForm.itemType) === 4">
<el-option :value="1" label="其他辅料/工装/试验设备" />
</template>
<template v-else>
<el-option :value="1" label="结构件批次管理" />
<el-option :value="2" label="电气件SN 管理" />
</template>
<el-select v-model="mForm.manageMode" placeholder="请选择" style="width:100%">
<el-option :value="1" label="结构件批次管理" />
<el-option :value="2" label="电气件SN 管理" />
<el-option :value="3" label="其他辅料/工装/试验设备" />
</el-select>
</el-form-item>
<el-form-item label="安全库存" required>
+13 -3
View File
@@ -613,7 +613,7 @@ onActivated(() => {
<el-form-item label="物料" prop="materialCode">
<el-tooltip content="请选择物料;若列表中找不到所需物料,请先到「物料档案」新增" placement="top" :append-to-body="true">
<div style="width:100%">
<MaterialSelect v-model="form1.materialCode" :manage-mode="1" :exclude-item-type="4" placeholder="选择结构件物料" />
<MaterialSelect v-model="form1.materialCode" :manage-mode="1" placeholder="选择结构件物料" />
</div>
</el-tooltip>
</el-form-item>
@@ -818,7 +818,7 @@ onActivated(() => {
<el-form-item label="物料" prop="materialCode">
<el-tooltip content="请选择物料若列表为空请先到物料档案新增其他类物料规格型号必填" placement="top" :append-to-body="true">
<div style="width:100%">
<MaterialSelect v-model="form3.materialCode" :item-type="4"
<MaterialSelect v-model="form3.materialCode" :manage-mode="3"
placeholder="选择其他类物料辅料/工装/试验设备"
@item-change="onOtherMaterial" />
</div>
@@ -1019,7 +1019,17 @@ onActivated(() => {
:header="excelResult.failed > 0 ? '导入结果:被拒绝(整体回退,未发生写入)' : '导入结果:成功'">
<el-alert v-if="excelResult.failed > 0" type="error" :closable="false"
:title="`${excelResult.failed} 行存在错误,已整体回退(未写入任何数据),请修正后重传`" />
<el-alert v-else type="success" :closable="false" :title="`批量导入成功:共 ${excelResult.success}`" />
<template v-else>
<el-alert type="success" :closable="false"
:title="`批量导入成功:共 ${excelResult.success} 行,生成 ${(excelResult.inboundNos || []).length} 张入库单`" />
<div v-if="excelResult.inboundNos && excelResult.inboundNos.length" style="margin-top:10px">
<div style="font-size:12px;color:#909399;margin-bottom:4px">本次生成的入库单号(点击可复制):</div>
<el-tag v-for="no in excelResult.inboundNos" :key="no" size="small" class="mr4 mb4"
style="cursor:pointer" @click="navigator.clipboard.writeText(no).then(() => ElMessage.success('已复制 ' + no))">
{{ no }}
</el-tag>
</div>
</template>
<el-table v-if="excelResult.failed > 0" :data="excelResult.errors || []" size="small" border
max-height="320" style="margin-top:10px">
<el-table-column prop="row" label="行号" width="70" align="center" />
@@ -65,7 +65,7 @@ async function loadPicker(kw = '') {
const params = { keyword: kw || '', page: 1, pageSize: 100 }
if (targetType.value === 'SN') params.manageMode = 2
else if (targetType.value === 'BATCH') params.manageMode = 1
else if (targetType.value === 'OTHER') params.itemType = 4 // 其他入库物料(itemType=4)
else if (targetType.value === 'OTHER') params.itemType = 4 // 其他入库物料(详情按类型=3 过滤)
if (isFinal) params.category = 3
const data = await request.get('/stock/details', { params })
pickerOptions.value = data?.list || []
@@ -128,7 +128,7 @@ function onTargetTypeChange() {
function sendToEntry(details, row) {
if (!details.length) return
const allSn = details.every((d) => d.manageMode === 2)
const allOther = !allSn && details.every((d) => d.itemType === 4) // 其他类(itemType=4)按 1 件判定
const allOther = !allSn && details.every((d) => d.matManageMode === 3) // 其他类(类型=3按 1 件判定
targetType.value = allSn ? 'SN' : allOther ? 'OTHER' : 'BATCH'
for (const d of details) {
addItem(d.targetId, d.quantity)
@@ -267,7 +267,7 @@ const inboundTypeLabel = (t) => {
const m = { purchase: '采购入库', semi: '半成品入库', finished: '成品入库', return: '退库入库', other: '其他入库' }
return m[t] || t || '-'
}
const pendingTargetLabel = (d) => (d.itemType === 4 ? '其他' : d.manageMode === 2 ? 'SN' : '批次')
const pendingTargetLabel = (d) => (d.matManageMode === 3 ? '其他' : d.manageMode === 2 ? 'SN' : '批次')
function loadPending() {
pendingLoading.value = true
+19 -27
View File
@@ -44,12 +44,12 @@ const list = ref([])
const total = ref(0)
const page = reactive({ current: 1, size: 20 })
// 类型三分互斥(§A1):结构件=管理粒度1且排除“其他”类(itemType=4);电气件=管理粒度2;其他=itemType=4
// 类型下拉与「类型」枚举(manage_mode)一一对应:结构件=1 / 电气件=2 / 其他=3,不借用品类(itemType)字段
function typeParams() {
if (filters.manageMode === 'OTHER') return { manageMode: '', itemType: 4, itemTypeNot: '' }
if (filters.manageMode === '1') return { manageMode: '1', itemType: '', itemTypeNot: 4 }
if (filters.manageMode === '2') return { manageMode: '2', itemType: '', itemTypeNot: '' }
return { manageMode: '', itemType: '', itemTypeNot: '' }
if (filters.manageMode === 'OTHER') return { manageMode: '3' }
if (filters.manageMode === '1') return { manageMode: '1' }
if (filters.manageMode === '2') return { manageMode: '2' }
return { manageMode: '' }
}
// 区域/货架/层/位置 四级联动数据源
@@ -148,11 +148,9 @@ async function loadMaterial() {
params: {
materialCode: filters.materialCode.trim(),
materialName: filters.materialName.trim(),
manageMode: tp.manageMode,
itemType: tp.itemType,
itemTypeNot: tp.itemTypeNot,
category: filters.category,
page: matPage.current,
manageMode: tp.manageMode,
category: filters.category,
page: matPage.current,
pageSize: matPage.size
}
})
@@ -177,11 +175,9 @@ async function loadDetail() {
layerNo: filters.layerNo,
positionNo: filters.positionNo,
qualityStatus: filters.qualityStatus,
manageMode: tp.manageMode,
itemType: tp.itemType,
itemTypeNot: tp.itemTypeNot,
category: filters.category,
startDate: filters.startDate,
manageMode: tp.manageMode,
category: filters.category,
startDate: filters.startDate,
endDate: filters.endDate,
page: page.current,
pageSize: page.size
@@ -250,11 +246,11 @@ const detailPage = reactive({ current: 1, size: 50 })
const detailCond = reactive({ materialCode: '', zoneCode: '', shelfNo: '', layerNo: '', positionNo: '', qualityStatus: '', manageMode: '' })
function typeLabel(m) {
return m === 1 ? '结构件' : m === 2 ? '电气件' : '-'
return m === 1 ? '结构件' : m === 2 ? '电气件' : m === 3 ? '其他' : '-'
}
// 聚合行类型标签:itemType=4 → 其他(与区域汇总口径一致),否则按管理粒度
// 聚合行类型标签:按物料档案类型(matManageMode1结构件/2电气件/3其他
function rowTypeLabel(row) {
return row.itemType === 4 ? '其他' : typeLabel(row.manageMode)
return typeLabel(row.matManageMode)
}
// 品类标签:1原材料/2半成品/3成品/4其他(辅料/工装/试验设备)
function categoryLabel(c) {
@@ -322,9 +318,7 @@ async function exportCsv() {
view: 'material',
materialCode: filters.materialCode.trim(),
materialName: filters.materialName.trim(),
manageMode: tp.manageMode,
itemType: tp.itemType,
itemTypeNot: tp.itemTypeNot
manageMode: tp.manageMode
}, '物料汇总.xlsx', { count: matTotal.value, name: '物料汇总' })
return
}
@@ -340,10 +334,8 @@ async function exportCsv() {
layerNo: filters.layerNo,
positionNo: filters.positionNo,
qualityStatus: filters.qualityStatus,
manageMode: tp.manageMode,
itemType: tp.itemType,
itemTypeNot: tp.itemTypeNot,
startDate: filters.startDate,
manageMode: tp.manageMode,
startDate: filters.startDate,
endDate: filters.endDate
}, '库存明细.xlsx', { count: total.value, name: '库存明细' })
} catch (e) {
@@ -453,7 +445,7 @@ onMounted(() => {
</el-table-column>
<el-table-column label="类型" width="90" align="center">
<template #default="{ row }">
<el-tag size="small" :type="row.itemType === 4 ? 'info' : row.manageMode === 1 ? 'primary' : 'warning'">{{ rowTypeLabel(row) }}</el-tag>
<el-tag size="small" :type="row.matManageMode === 3 ? 'info' : row.matManageMode === 1 ? 'primary' : 'warning'">{{ rowTypeLabel(row) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="totalQty" label="总数量" width="85" align="center" />
@@ -513,7 +505,7 @@ onMounted(() => {
</el-table-column>
<el-table-column label="类型" width="90" align="center">
<template #default="{ row }">
<el-tag size="small" :type="row.itemType === 4 ? 'info' : row.manageMode === 1 ? 'primary' : 'warning'">{{ rowTypeLabel(row) }}</el-tag>
<el-tag size="small" :type="row.matManageMode === 3 ? 'info' : row.matManageMode === 1 ? 'primary' : 'warning'">{{ rowTypeLabel(row) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="zoneCode" label="区域" width="90" align="center">
+8 -2
View File
@@ -190,7 +190,7 @@ async function loadBatchOptions(code) {
// 物料选中(问题18:出库类型由物料档案自动判定,杜绝客户手选「电气件/结构件」)
function onMaterialPick(m) {
genForm.mode = m && m.manageMode === 2 ? 2 : 1
pickedType.value = m ? (m.itemType === 4 ? 'other' : (m.manageMode === 2 ? 'sn' : 'batch')) : ''
pickedType.value = m ? (m.manageMode === 3 ? 'other' : (m.manageMode === 2 ? 'sn' : 'batch')) : ''
genForm.batchNo = ''
snList.value = []
snInput.value = ''
@@ -331,7 +331,7 @@ async function submitGen() {
try {
const res = await request.post('/outbound/general', payload)
ElMessage.success(`通用出库成功:${res?.outboundNo}${res?.boxNo ? ' 箱号 ' + res.boxNo : ''}`)
Object.assign(genForm, { materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '', shelfNo: '', layerNo: '', positionNo: '', boxNo: '', contractNo: '', remark: '', outboundCategory: 'other', ownershipType: 'other', ownershipNo: '', targetStation: '' })
Object.assign(genForm, { outboundNo: '', materialCode: '', mode: 1, batchNo: '', qty: 1, zoneCode: '', shelfNo: '', layerNo: '', positionNo: '', boxNo: '', contractNo: '', remark: '', outboundCategory: 'other', ownershipType: 'other', ownershipNo: '', targetStation: '', inspectionNo: '' })
snInput.value = ''
snList.value = []
batchOptions.value = []
@@ -616,6 +616,9 @@ onMounted(loadDicts)
<el-table-column prop="boxNo" label="箱号" min-width="120">
<template #default="{ row }">{{ row.boxNo || '-' }}</template>
</el-table-column>
<el-table-column prop="inspectionNo" label="检测单号" min-width="160">
<template #default="{ row }">{{ row.inspectionNo || '-' }}</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" align="center" />
<el-table-column label="时间" width="150" align="center">
<template #default="{ row }">{{ fmtTime(row.createdAt) }}</template>
@@ -720,6 +723,9 @@ onMounted(loadDicts)
<el-table-column prop="boxNo" label="箱号" min-width="120">
<template #default="{ row }">{{ row.boxNo || '-' }}</template>
</el-table-column>
<el-table-column prop="inspectionNo" label="检测单号" min-width="160">
<template #default="{ row }">{{ row.inspectionNo || '-' }}</template>
</el-table-column>
<el-table-column prop="operator" label="操作人" width="100" align="center" />
<el-table-column label="时间" width="150" align="center">
<template #default="{ row }">{{ fmtTime(row.createdAt) }}</template>