feat(qc): 新增批量检验功能并优化数据处理流程

- 添加 BatchInspectionMainBo 和 BatchInspectionTensileBo 数据传输对象
- 集成检验明细列表到 WmsInspectionMainBo 和 WmsInspectionTensileDetailBo
- 在 inspectionMain 控制器中实现批量插入检验主数据接口
- 在 inspectionTensileDetail 控制器中实现批量插入拉伸试验明细接口
- 重构前端检验样品页面,合并主表和明细表的保存操作
- 优化前端拉伸试验页面的批量新增逻辑,统一使用批量插入接口
- 更新服务层实现以支持批量插入并更新申请单关联ID列表
- 移除前端页面中单独的明细表增删改操作接口调用
This commit is contained in:
2026-07-08 13:43:31 +08:00
parent 51b27cf536
commit 7cf9f4eca4
14 changed files with 228 additions and 45 deletions

View File

@@ -42,3 +42,12 @@ export function delInspectionMain(mainId) {
method: 'delete'
})
}
// 批量新增检验主及明细并更新申请单detailIds
export function batchInsertMainWithDetails(data) {
return request({
url: '/wms/inspectionMain/batchInsertWithDetails',
method: 'post',
data: data
})
}

View File

@@ -42,3 +42,12 @@ export function delInspectionTensileDetail(detailId) {
method: 'delete'
})
}
// 批量插入明细并更新申请单detailIds
export function batchInsertTensileDetails(data) {
return request({
url: '/wms/inspectionTensileDetail/batchInsertDetails',
method: 'post',
data: data
})
}

View File

@@ -142,7 +142,7 @@
<script>
import { listInspectionMain, addInspectionMain, updateInspectionMain, delInspectionMain } from '@/api/mes/qc/inspectionMain'
import { listInspectionDetail, addInspectionDetail, updateInspectionDetail } from '@/api/mes/qc/inspectionDetail'
import { listInspectionDetail } from '@/api/mes/qc/inspectionDetail'
import { listInspectionItemTemplate, getInfoByInspectionItem } from '@/api/mes/qc/inspectionItemTemplate'
export default {
@@ -391,36 +391,28 @@ export default {
handleSaveMain(row) {
row._saving = true
const detailList = this.checkItems.map(checkItem => {
const itemData = row._items[checkItem.itemName]
if (!itemData || (!itemData.itemValue && !itemData.detailId)) return null
return {
detailId: itemData.detailId,
mainId: row.mainId,
itemName: itemData.itemName,
itemValue: itemData.itemValue || '',
itemUnit: itemData.itemUnit || '',
upperLimit: itemData.upperLimit,
lowerLimit: itemData.lowerLimit,
rangeDesc: itemData.rangeDesc || ''
}
}).filter(Boolean)
updateInspectionMain({
mainId: row.mainId,
sampleName: row.sampleName,
sampleNo: row.sampleNo,
batchNo: row.batchNo,
inspectionDate: row.inspectionDate,
remark: row.remark
}).then(() => {
const items = this.checkItems.map(checkItem => {
const itemData = row._items[checkItem.itemName]
return itemData || { itemName: checkItem.itemName }
})
const promises = items.map(item => {
const data = {
mainId: row.mainId,
itemName: item.itemName,
itemValue: item.itemValue,
itemUnit: item.itemUnit,
upperLimit: item.upperLimit,
lowerLimit: item.lowerLimit
}
if (item.detailId) {
data.detailId = item.detailId
return updateInspectionDetail(data)
} else if (item.itemValue) {
return addInspectionDetail(data)
}
return Promise.resolve()
})
return Promise.all(promises)
remark: row.remark,
detailList: detailList
}).then(() => {
this.$message.success('保存成功')
return listInspectionDetail({ mainId: row.mainId, pageNum: 1, pageSize: 9999 })

View File

@@ -519,7 +519,7 @@
<script>
import { listInspectionTensile, getInspectionTensile, addInspectionTensile, updateInspectionTensile } from '@/api/mes/qc/inspectionTensile'
import { listInspectionTensileDetail, addInspectionTensileDetail, updateInspectionTensileDetail, delInspectionTensileDetail } from '@/api/mes/qc/inspectionTensileDetail'
import { listInspectionTensileDetail, addInspectionTensileDetail, updateInspectionTensileDetail, delInspectionTensileDetail, batchInsertTensileDetails } from '@/api/mes/qc/inspectionTensileDetail'
import { listMaterialCoil } from '@/api/wms/coil'
import { listChemicalItem } from '@/api/mes/qc/chemicalItem'
import { listPhysicalItem } from '@/api/mes/qc/physicalItem'
@@ -765,16 +765,12 @@ export default {
this.$message.warning('请选择钢卷')
return
}
let successCount = 0
let failCount = 0
this.detailLoading = true
for (let index = 0; index < coils.length; index++) {
const coil = coils[index]
const detailList = []
for (const coil of coils) {
try {
const data = await this.fetchLatestChemAndPhys(coil.enterCoilNo)
addInspectionTensileDetail({
detailList.push({
testMainId: this.currentTestId,
steelCoilNo: coil.currentCoilNo,
material: coil.material,
@@ -782,21 +778,27 @@ export default {
rawMaterialNo: coil.enterCoilNo,
...data
})
successCount++
} catch {
failCount++
// skip failed coil
}
}
this.batchAddDialogVisible = false
if (failCount === 0) {
this.$message.success(`批量新增成功,共新增 ${successCount} 条明细`)
} else if (successCount === 0) {
this.$message.error('批量新增失败')
} else {
this.$message.warning(`批量新增完成,成功 ${successCount} 条,失败 ${failCount}`)
if (detailList.length === 0) {
this.detailLoading = false
this.$message.error('批量新增失败,请稍后重试')
return
}
this.getDetailList()
updateInspectionTensile({
testId: this.currentTestId,
detailList: detailList
}).then(() => {
this.$message.success(`批量新增成功,共新增 ${detailList.length} 条明细`)
}).catch(() => {
this.$message.error('批量新增失败')
}).finally(() => {
this.batchAddDialogVisible = false
this.detailLoading = false
this.getDetailList()
})
},
// 保存明细