feat(qc): 新增检化验申请单相关API,优化检验项模板接口并清理冗余页面

1. 将检验项模板查询接口从POST改为GET请求
2. 新增检化验申请单的增删改查、批量保存检验数据API
3. 删除多个冗余的质检历史、检验项、检验任务页面
This commit is contained in:
砂糖
2026-07-08 16:49:22 +08:00
parent d630920c06
commit 212b79be56
14 changed files with 1685 additions and 4278 deletions

View File

@@ -3,14 +3,14 @@
<div v-loading="filterLoading" style="margin-bottom: 16px; min-height: 50px;">
<div style="display: flex; align-items: center; margin-bottom: 6px;">
<span style="font-size: 13px; color: #909399; white-space: nowrap; margin-right: 12px; width: 68px; text-align: right;">所属单位</span>
<el-radio-group v-model="selectedCompany" size="small" @change="handleCompanyChange">
<el-radio-group v-model="selectedCompany" size="small" :disabled="mainLoading" @change="handleCompanyChange">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button v-for="company in companyOptions" :key="company" :label="company">{{ company }}</el-radio-button>
</el-radio-group>
</div>
<div style="display: flex; align-items: center; margin-bottom: 6px;">
<span style="font-size: 13px; color: #909399; white-space: nowrap; margin-right: 12px; width: 68px; text-align: right;">方案名称</span>
<el-radio-group v-model="selectedScheme" size="small" @change="handleSchemeChange">
<el-radio-group v-model="selectedScheme" size="small" :disabled="mainLoading" @change="handleSchemeChange">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button v-for="scheme in schemeOptions" :key="scheme" :label="scheme">{{ scheme }}</el-radio-button>
</el-radio-group>
@@ -42,6 +42,9 @@
<el-table v-loading="mainLoading" :data="mainList" border stripe class="dynamic-table" fit max-height="calc(100vh - 260px)">
<el-table-column label="日期" align="center" width="150" fixed="left">
<template slot="header">
<span class="required-mark">日期</span>
</template>
<template slot-scope="scope">
<el-date-picker
v-model="scope.row.inspectionDate"
@@ -113,30 +116,6 @@
/>
</div>
<el-empty v-else description="请先选择所属单位和检验方案" />
<el-dialog :title="'新增检验记录'" :visible.sync="addMainDialogVisible" width="600px" append-to-body>
<el-form ref="addMainForm" :model="addMainFormData" label-width="100px">
<el-form-item label="样品名称" prop="sampleName">
<el-input v-model="addMainFormData.sampleName" placeholder="请输入样品名称" />
</el-form-item>
<el-form-item label="样品编号" prop="sampleNo">
<el-input v-model="addMainFormData.sampleNo" placeholder="请输入样品编号" />
</el-form-item>
<el-form-item label="来样编号" prop="batchNo">
<el-input v-model="addMainFormData.batchNo" placeholder="请输入来样编号" />
</el-form-item>
<el-form-item label="检验日期" prop="inspectionDate">
<el-date-picker v-model="addMainFormData.inspectionDate" type="date" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择检验日期" style="width:100%" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="addMainFormData.remark" type="textarea" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="addMainDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitAddMain">确定</el-button>
</div>
</el-dialog>
</div>
</template>
@@ -151,7 +130,6 @@ export default {
return {
filterLoading: false,
mainLoading: false,
addMainDialogVisible: false,
templateList: [],
cascadeData: {},
companyOptions: [],
@@ -166,14 +144,7 @@ export default {
pageNum: 1,
pageSize: 1000
},
dateRange: [],
addMainFormData: {
sampleName: '',
sampleNo: '',
batchNo: '',
inspectionDate: '',
remark: ''
}
dateRange: []
}
},
created() {
@@ -247,6 +218,7 @@ export default {
},
handleCompanyChange() {
if (this.mainLoading) return
this.selectedScheme = ''
if (this.selectedCompany) {
this.schemeOptions = this.cascadeData[this.selectedCompany] || []
@@ -262,6 +234,7 @@ export default {
},
handleSchemeChange() {
if (this.mainLoading) return
if (!this.selectedScheme) {
this.currentTemplate = null
this.mainList = []
@@ -365,31 +338,39 @@ export default {
},
handleAddMain() {
this.addMainFormData = {
const itemMap = {}
if (this.checkItems.length > 0) {
this.checkItems.forEach(item => {
itemMap[item.itemName] = {
detailId: undefined,
mainId: undefined,
itemName: item.itemName,
itemValue: '',
itemUnit: item.unit,
upperLimit: item.targetUpper,
lowerLimit: item.targetLower,
rangeDesc: ''
}
})
}
const newRow = {
_isNew: true,
_items: itemMap,
_originalItems: JSON.parse(JSON.stringify(itemMap)),
inspectionDate: '',
sampleName: '',
sampleNo: '',
batchNo: '',
inspectionDate: '',
remark: ''
}
this.addMainDialogVisible = true
},
submitAddMain() {
const data = {
...this.addMainFormData,
templateId: this.currentTemplate.templateId
}
addInspectionMain(data).then(() => {
this.$message.success('新增成功')
this.addMainDialogVisible = false
this.getMainList()
}).catch(() => {
this.$message.error('新增失败')
})
this.mainList.unshift(newRow)
},
handleSaveMain(row) {
if (!row.inspectionDate) {
this.$message.warning('请选择检验日期')
return
}
row._saving = true
const detailList = this.checkItems.map(checkItem => {
const itemData = row._items[checkItem.itemName]
@@ -405,38 +386,20 @@ export default {
rangeDesc: itemData.rangeDesc || ''
}
}).filter(Boolean)
updateInspectionMain({
mainId: row.mainId,
const requestData = {
sampleName: row.sampleName,
sampleNo: row.sampleNo,
batchNo: row.batchNo,
inspectionDate: row.inspectionDate,
remark: row.remark,
templateId: this.currentTemplate.templateId,
detailList: detailList
}).then(() => {
}
const isNew = row._isNew || !row.mainId
const apiCall = isNew ? addInspectionMain(requestData) : updateInspectionMain({ ...requestData, mainId: row.mainId })
apiCall.then(() => {
this.$message.success('保存成功')
return listInspectionDetail({ mainId: row.mainId, pageNum: 1, pageSize: 9999 })
}).then(response => {
const details = response.rows || []
if (this.checkItems.length > 0) {
this.checkItems.forEach(item => {
const found = details.find(d => d.itemName === item.itemName)
if (found) {
row._items[item.itemName] = {
detailId: found.detailId,
mainId: found.mainId,
itemName: found.itemName,
itemValue: found.itemValue || '',
itemUnit: found.itemUnit || item.unit,
upperLimit: found.upperLimit,
lowerLimit: found.lowerLimit,
rangeDesc: found.rangeDesc
}
}
})
}
row._originalItems = JSON.parse(JSON.stringify(row._items))
row._saving = false
this.getMainList()
}).catch(() => {
this.$message.error('保存失败')
row._saving = false
@@ -515,4 +478,10 @@ export default {
::v-deep .dynamic-table .el-table__body-wrapper {
overflow-x: auto;
}
.required-mark::before {
content: '*';
color: #f56c6c;
margin-right: 4px;
}
</style>