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:
Generated
-42
@@ -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其他
|
||||
|
||||
@@ -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: '如 100;0=不预警' },
|
||||
{ name: '说明', source: '手工填写(可空)。', purpose: '补充描述', fill: '可空' }
|
||||
]
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 → 其他(与区域汇总口径一致),否则按管理粒度
|
||||
// 聚合行类型标签:按物料档案类型(matManageMode)1结构件/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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user