feat(bom): 归档业务闭环——状态筛选+归档/取消归档入口

- get_bom_list/get_bom_summary 状态过滤支持 archived,enabled 语义改为“启用且未归档”
- get_bom_list 输出补 is_archived;新增 update_archived 与 POST /bom/archive(整组切换归档、清缓存、审计)
- “未指定版本自动取最新”硬化为仅认启用且未归档(get_bom_detail / get_bom_no_by_parent)
- 前端:状态按钮组加“归档”;列表状态列区分归档;操作列加“归档/取消归档”按钮
This commit is contained in:
yueli
2026-09-08 11:13:38 +08:00
parent 1daa60590c
commit 02f74278df
4 changed files with 106 additions and 10 deletions

View File

@ -61,6 +61,15 @@ export function updateBomStatus(data: { bom_no: string; version: string; is_enab
})
}
// 归档/取消归档(仍启用可编辑,但不再作为其它 BOM 子件的引用候选)
export function updateBomArchive(data: { bom_no: string; version: string; is_archived: boolean }) {
return request({
url: '/v1/bom/archive',
method: 'post',
data
})
}
// 保存BOM
export function saveBom(data: any) {
return request({

View File

@ -22,6 +22,7 @@
<el-radio-button :label="''">全部</el-radio-button>
<el-radio-button label="enabled">启用</el-radio-button>
<el-radio-button label="disabled">停用</el-radio-button>
<el-radio-button label="archived">归档</el-radio-button>
</el-radio-group>
<el-button @click="expandAllGroups" size="small" style="margin-right: 6px;">全部展开</el-button>
<el-button @click="collapseAllGroups" size="small" style="margin-right: 10px;">全部折叠</el-button>
@ -55,13 +56,15 @@
</el-table-column>
<el-table-column v-if="hasColumnPermission('status')" label="状态" width="100" align="center">
<template #default="{ row }">
<el-tag :type="row.is_enabled ? 'success' : 'danger'">{{ row.is_enabled ? '启用' : '禁用' }}</el-tag>
<el-tag v-if="row.is_archived" type="info">归档</el-tag>
<el-tag v-else :type="row.is_enabled ? 'success' : 'danger'">{{ row.is_enabled ? '启用' : '停用' }}</el-tag>
</template>
</el-table-column>
<el-table-column v-if="hasColumnPermission('child_count')" prop="child_count" label="子件数" width="80" align="center" />
<el-table-column v-if="userStore.hasPermission('bom_manage:operation')" label="操作" width="160" align="center" fixed="right">
<el-table-column v-if="userStore.hasPermission('bom_manage:operation')" label="操作" width="230" align="center" fixed="right">
<template #default="{ row }">
<el-button type="success" link @click="handleSaveAs(row)">另存为</el-button>
<el-button type="warning" link @click="handleArchive(row)">{{ row.is_archived ? '取消归档' : '归档' }}</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
@ -301,7 +304,7 @@ import { useRoute } from 'vue-router'
import { ElMessage, ElMessageBox, FormInstance, FormRules } from 'element-plus'
import { Plus, Search, EditPen, Upload } from '@element-plus/icons-vue'
import { useRouter } from 'vue-router'
import { getBomList, getBomSummary, getBomDetail, saveBom, deleteBom, getDraftDetail, saveDraft, publishDraft, getChildBomVersions, updateBomStatus } from '@/api/bom'
import { getBomList, getBomSummary, getBomDetail, saveBom, deleteBom, getDraftDetail, saveDraft, publishDraft, getChildBomVersions, updateBomStatus, updateBomArchive } from '@/api/bom'
import ImportDialog from '@/components/ImportDialog.vue'
import CompanySelector from '@/components/CompanySelector.vue'
import { searchMaterialBase } from '@/api/inbound/buy'
@ -316,6 +319,7 @@ interface BomItem {
parent_name: string
version: string
is_enabled: boolean
is_archived?: boolean
child_count: number
}
interface MaterialBase {
@ -1032,6 +1036,27 @@ const onEnabledStatusChange = async () => {
}
}
// ★ 归档/取消归档:仍启用可编辑,但不再作为其它 BOM 子件的版本候选
const handleArchive = async (row: any) => {
const target = !row.is_archived
const tip = target
? `确定归档 ${row.bom_no} (${row.version}) 吗?\n归档后仍可查看/编辑/取消归档,但不再作为其它 BOM 子件的版本候选。`
: `确定取消归档 ${row.bom_no} (${row.version}) 吗?`
try {
await ElMessageBox.confirm(tip, '提示', { type: 'warning' })
} catch (e) { return }
try {
const res: any = await updateBomArchive({ bom_no: row.bom_no, version: row.version, is_archived: target })
if (res?.code === 200) {
ElMessage.success(target ? '已归档' : '已取消归档')
groupCache.value = new Map()
fetchBomSummary()
} else {
ElMessage.error(res?.msg || '操作失败')
}
} catch (e) { ElMessage.error('归档操作失败') }
}
const handleDelete = (row: BomItem) => {
ElMessageBox.confirm(`确定删除 ${row.bom_no} (${row.version}) 吗?`, '警告', { type: 'warning' })
.then(async () => {