feat(qc): 质量评审模块增加库区管理功能

1. 为钢卷评审实体类新增改判前后逻辑库区相关字段
2. 新增数据库迁移脚本添加库区字段到qc_quality_review_coil表
3. 移除硬编码的技术部库区逻辑,改为支持手动指定目标库区
4. 在前端页面新增库区展示列和改判后库区选择器
5. 自动带出钢卷当前库区信息
This commit is contained in:
王文昊
2026-07-06 10:14:27 +08:00
parent cf4e5b78fc
commit ed69b65e96
8 changed files with 154 additions and 38 deletions

View File

@@ -124,12 +124,22 @@
<el-tag size="mini" type="danger">{{ scope.row.beforeQuality }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="regradeQuality" label="改判后" width="110" align="center">
<el-table-column prop="regradeQuality" label="改判后" width="100" align="center">
<template slot-scope="scope">
<el-tag v-if="scope.row.regradeQuality" size="mini" type="warning">{{ scope.row.regradeQuality }}</el-tag>
<span v-else class="text-muted">待指定</span>
</template>
</el-table-column>
<el-table-column prop="beforeWarehouseName" label="当前库区" width="100">
<template slot-scope="scope">
<span>{{ scope.row.beforeWarehouseName || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="targetWarehouseName" label="改判后库区" width="120">
<template slot-scope="scope">
<span>{{ scope.row.targetWarehouseName || '不移动' }}</span>
</template>
</el-table-column>
</el-table>
</el-card>
@@ -170,9 +180,15 @@
<el-table-column prop="beforeQuality" label="当前等级" width="80" align="center">
<template slot-scope="s"><el-tag size="mini" type="danger">{{ s.row.beforeQuality }}</el-tag></template>
</el-table-column>
<el-table-column prop="regradeQuality" label="改判后等级" width="110" align="center">
<el-table-column prop="regradeQuality" label="改判后等级" width="100" align="center">
<template slot-scope="s"><el-tag size="mini" type="warning">{{ s.row.regradeQuality }}</el-tag></template>
</el-table-column>
<el-table-column prop="beforeWarehouseName" label="当前库区" width="100" />
<el-table-column prop="targetWarehouseName" label="改判后库区" width="120">
<template slot-scope="s">
<span>{{ s.row.targetWarehouseName || '不移动' }}</span>
</template>
</el-table-column>
</el-table>
</div>
@@ -228,7 +244,7 @@
</div>
<!-- 编辑弹窗 -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="960px" :close-on-click-modal="false" append-to-body class="review-dialog">
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="1200px" :close-on-click-modal="false" append-to-body class="review-dialog">
<el-form ref="form" :model="editForm" :rules="rules" label-width="100px" size="small">
<!-- ===== 基本信息 ===== -->
<div class="dialog-section">
@@ -274,19 +290,37 @@
<el-table-column prop="supplierCoilNo" label="原料卷号" min-width="130" />
<el-table-column prop="spec" label="规格(mm)" width="100" />
<el-table-column prop="netWeight" label="卷重(t)" width="80" align="right" />
<el-table-column prop="defectDesc" label="缺陷描述" min-width="160">
<el-table-column prop="defectDesc" label="缺陷描述" min-width="150">
<template slot-scope="scope">
<el-input v-model="scope.row.defectDesc" size="mini" placeholder="输入缺陷描述" />
<el-input v-model="scope.row.defectDesc" size="mini" placeholder="输入缺陷" />
</template>
</el-table-column>
<el-table-column prop="regradeQuality" label="改判后等级" min-width="130">
<el-table-column prop="beforeQuality" label="当前等级" width="80" align="center">
<template slot-scope="scope">
<el-select v-model="scope.row.regradeQuality" placeholder="请选择" size="mini">
<el-tag size="mini" type="danger">{{ scope.row.beforeQuality }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="regradeQuality" label="改判后等级" width="120">
<template slot-scope="scope">
<el-select v-model="scope.row.regradeQuality" placeholder="请选择" size="mini" style="width:100%;">
<el-option v-for="item in dict.type.coil_quality_status" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" width="60" align="center">
<el-table-column prop="beforeWarehouseName" label="当前库区" width="100">
<template slot-scope="scope">
<span>{{ scope.row.beforeWarehouseName || '-' }}</span>
</template>
</el-table-column>
<el-table-column prop="targetWarehouseId" label="改判后库区" width="140">
<template slot-scope="scope">
<el-select v-model="scope.row.targetWarehouseId" placeholder="请选择" size="mini" style="width:100%;" @change="onTargetWarehouseChange(scope.row)">
<el-option label="不移动" :value="null" />
<el-option v-for="w in warehouseOptions" v-if="w.warehouseType === 1" :key="w.warehouseId" :label="w.warehouseName" :value="w.warehouseId" />
</el-select>
</template>
</el-table-column>
<el-table-column label="操作" width="55" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-delete" @click="editForm.coilList.splice(scope.$index, 1)"></el-button>
</template>
@@ -372,6 +406,7 @@ import { listQualityReview, getQualityReview, addQualityReview, updateQualityRev
submitQualityReview, approveQualityReview, rejectQualityReview, executeQualityReview,
listQualityReviewCoil, listQualityReviewLog } from '@/api/mes/qc/qualityReview'
import CoilSelector from '@/components/CoilSelector'
import { listWarehouse } from '@/api/wms/warehouse'
export default {
name: 'QualityReview',
@@ -398,6 +433,7 @@ export default {
// 钢卷选择
showCoilSelector: false,
warehouseOptions: [], // 库区下拉选项
// 编辑弹窗
dialogVisible: false,
@@ -436,6 +472,11 @@ export default {
created() {
this.getList()
},
watch: {
dialogVisible(val) {
if (val) this.loadWarehouseOptions()
}
},
methods: {
// ===== 列表 =====
handleQuery() {
@@ -546,24 +587,51 @@ export default {
// ===== 钢卷选择(弹窗内) =====
onDialogCoilConfirm(selected) {
if (!selected || selected.length === 0) return
const existingIds = new Set(this.editForm.coilList.map(c => c.coilId))
const newSelected = selected.filter(coil => !existingIds.has(coil.coilId))
const dupCount = selected.length - newSelected.length
if (dupCount > 0) {
this.$message.warning(`已跳过 ${dupCount} 个重复钢卷`)
}
if (newSelected.length === 0) return
const startIdx = this.editForm.coilList.length || 0
const newCoils = selected.map((coil, idx) => ({
const newCoils = newSelected.map((coil, idx) => ({
coilId: coil.coilId,
currentCoilNo: coil.currentCoilNo,
supplierCoilNo: coil.supplierCoilNo || coil.enterCoilNo,
spec: coil.specification, // CoilSelector返回的字段名为specification
spec: coil.specification,
netWeight: coil.netWeight,
defectDesc: '',
regradeQuality: '', // 改判后等级,由创建者填写
regradeQuality: '',
beforeWarehouseId: coil.warehouseId || null,
beforeWarehouseName: this.getWarehouseName(coil.warehouseId),
targetWarehouseId: null,
targetWarehouseName: '',
groupSeq: startIdx + idx + 1,
beforeQuality: coil.qualityStatus || 'O'
}))
this.editForm.coilList = [...(this.editForm.coilList || []), ...newCoils]
},
getWarehouseName(warehouseId) {
if (!warehouseId) return ''
const wh = this.warehouseOptions.find(w => w.warehouseId === warehouseId)
return wh ? wh.warehouseName : ''
},
handleRemoveCoil(index) {
this.coilList.splice(index, 1)
},
// ===== 库区选择 =====
loadWarehouseOptions() {
listWarehouse().then(res => {
this.warehouseOptions = res.data || []
})
},
onTargetWarehouseChange(row) {
const selected = this.warehouseOptions.find(w => w.warehouseId === row.targetWarehouseId)
row.targetWarehouseName = selected ? selected.warehouseName : ''
},
// ===== 提交送审 =====
handleSubmit() {
this.$confirm('确认提交送审?', '提示', { type: 'warning' }).then(() => {

View File

@@ -64,9 +64,15 @@
<el-table-column prop="beforeQuality" label="当前等级" width="80" align="center">
<template slot-scope="s"><el-tag size="mini" type="danger">{{ s.row.beforeQuality }}</el-tag></template>
</el-table-column>
<el-table-column prop="regradeQuality" label="改判后等级" width="110" align="center">
<el-table-column prop="regradeQuality" label="改判后等级" width="100" align="center">
<template slot-scope="s"><el-tag size="mini" type="warning">{{ s.row.regradeQuality }}</el-tag></template>
</el-table-column>
<el-table-column prop="beforeWarehouseName" label="当前库区" width="100" />
<el-table-column prop="targetWarehouseName" label="改判后库区" width="120">
<template slot-scope="s">
<span>{{ s.row.targetWarehouseName || '不移动' }}</span>
</template>
</el-table-column>
</el-table>
</div>
<div style="margin-top:12px;">