From ab6f485ee5e2f7b49ad2ba91975f25a70144529a Mon Sep 17 00:00:00 2001 From: chenhj <1263187585@qq.com> Date: 星期五, 08 八月 2025 17:39:44 +0800 Subject: [PATCH] 质量管理原材料检验修改。 --- src/views/qualityManagement/rawMaterialInspection/components/formDia.vue | 137 +++++++++++++++++++--- src/api/qualityManagement/rawMaterialInspection.js | 23 +++ src/views/qualityManagement/rawMaterialInspection/index.vue | 157 +++++++++++++++++++++++--- src/api/qualityManagement/metricMaintenance.js | 11 + 4 files changed, 290 insertions(+), 38 deletions(-) diff --git a/src/api/qualityManagement/metricMaintenance.js b/src/api/qualityManagement/metricMaintenance.js index 8857387..9bdff23 100644 --- a/src/api/qualityManagement/metricMaintenance.js +++ b/src/api/qualityManagement/metricMaintenance.js @@ -8,6 +8,7 @@ params: query, }) } + // 鏂板鎸囨爣鍒楄〃 export function qualityTestStandardAdd(query) { return request({ @@ -16,6 +17,7 @@ data: query, }) } + // 淇敼鎸囨爣鍒楄〃 export function qualityTestStandardUpdate(query) { return request({ @@ -24,6 +26,7 @@ data: query, }) } + // 鍒犻櫎鎸囨爣鍒楄〃 export function qualityTestStandardDel(query) { return request({ @@ -31,4 +34,12 @@ method: 'delete', data: query, }) +} + +// 鍒犻櫎鎸囨爣鍒楄〃 +export function qualityInspectDetailByProductId(productId) { + return request({ + url: '/quality/qualityTestStandard/product/' + productId, + method: 'get', + }) } \ No newline at end of file diff --git a/src/api/qualityManagement/rawMaterialInspection.js b/src/api/qualityManagement/rawMaterialInspection.js index e909d1a..dcb3869 100644 --- a/src/api/qualityManagement/rawMaterialInspection.js +++ b/src/api/qualityManagement/rawMaterialInspection.js @@ -8,6 +8,7 @@ params: query, }) } + // 鏂板鍘熸潗鏂欐楠� export function qualityInspectAdd(query) { return request({ @@ -16,6 +17,7 @@ data: query, }) } + // 淇敼鍘熸潗鏂欐楠� export function qualityInspectUpdate(query) { return request({ @@ -24,6 +26,7 @@ data: query, }) } + // 鍒犻櫎鍘熸潗鏂欐楠� export function qualityInspectDel(query) { return request({ @@ -32,3 +35,23 @@ data: query, }) } + +// 鎻愪氦鍘熸潗鏂欐楠� +export function submitQualityInspect(data) { + return request({ + url: '/quality/qualityInspect/submit', + method: 'post', + data: data, + }) +} + +// 鎻愪氦鍘熸潗鏂欐楠� +export function downloadQualityInspect(data) { + return request({ + url: '/quality/qualityInspect/down', + method: 'post', + data: data, + responseType: "blob", + }) +} + diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue index be15275..b61f84a 100644 --- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue +++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue @@ -54,7 +54,8 @@ </el-col> <el-col :span="12"> <el-form-item label="鏁伴噺锛�" prop="quantity"> - <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2"/> + <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" + clearable :precision="2"/> </el-form-item> </el-col> </el-row> @@ -67,8 +68,8 @@ <el-col :span="12"> <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult"> <el-select v-model="form.checkResult"> - <el-option label="鍚堟牸" value="鍚堟牸" /> - <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" /> + <el-option label="鍚堟牸" value="鍚堟牸"/> + <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�"/> </el-select> </el-form-item> </el-col> @@ -77,7 +78,7 @@ <el-col :span="12"> <el-form-item label="妫�楠屽憳锛�" prop="checkName"> <el-input v-model="form.checkName" placeholder="璇疯緭鍏�" clearable/> - + </el-form-item> </el-col> <el-col :span="12"> @@ -95,6 +96,22 @@ </el-col> </el-row> </el-form> + <div style="margin-bottom: 10px;text-align: right"> + <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button> + </div> + <PIMTable + rowKey="id" + :column="tableColumn" + :tableData="tableData" + :tableLoading="tableLoading" + :isSelection="true" + @selection-change="handleSelectionChange" + height="400" + > + <template #slot="{ row }"> + <el-input v-model="row.testValue" clearable/> + </template> + </PIMTable> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">纭</el-button> @@ -110,7 +127,11 @@ import {getOptions} from "@/api/procurementManagement/procurementLedger.js"; import {productTreeList} from "@/api/basicData/product.js"; import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js"; -const { proxy } = getCurrentInstance() +import {ElMessageBox} from "element-plus"; +import {qualityInspectParamDel, qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js"; +import {qualityInspectDetailByProductId} from "@/api/qualityManagement/metricMaintenance.js"; + +const {proxy} = getCurrentInstance() const emit = defineEmits(['close']) const dialogFormVisible = ref(false); @@ -129,20 +150,48 @@ checkResult: "", }, rules: { - checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" },], - supplier: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }], - productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - model: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }], - unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }], - quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }], - checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }], - checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }], + checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},], + supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}], + checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}], + productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}], + model: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}], + unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}], + quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}], + checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}], + checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}], }, }); -const { form, rules } = toRefs(data); +const tableColumn = ref([ + { + label: "鎸囨爣", + prop: "parameterItem", + }, + { + label: "鍗曚綅", + prop: "unit", + }, + { + label: "鏍囧噯鍊�", + prop: "standardValue", + }, + { + label: "鍐呮帶鍊�", + prop: "controlValue", + }, + { + label: "妫�楠屽��", + prop: "testValue", + dataType: 'slot', + slot: 'slot', + }, +]); +const tableData = ref([]); +const tableLoading = ref(false); + +const {form, rules} = toRefs(data); const supplierList = ref([]); const productOptions = ref([]); +const currentProductId = ref(0); // 鎵撳紑寮规 const openDialog = (type, row) => { @@ -154,6 +203,8 @@ getProductOptions(); if (operationType.value === 'edit') { form.value = {...row} + currentProductId.value = row.productId || 0 + getQualityInspectParamList(row.id) } } const getProductOptions = () => { @@ -162,7 +213,11 @@ }); }; const getModels = (value) => { + currentProductId.value = value form.value.productName = findNodeById(productOptions.value, value); + if (currentProductId) { + getList(); + } }; const findNodeById = (nodes, productId) => { for (let i = 0; i < nodes.length; i++) { @@ -178,9 +233,10 @@ } return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull }; + function convertIdToValue(data) { return data.map((item) => { - const { id, children, ...rest } = item; + const {id, children, ...rest} = item; const newItem = { ...rest, value: id, // 灏� id 鏀逛负 value @@ -188,22 +244,24 @@ if (children && children.length > 0) { newItem.children = convertIdToValue(children); } - + return newItem; }); } + // 鎻愪氦浜у搧琛ㄥ崟 const submitForm = () => { proxy.$refs.formRef.validate(valid => { if (valid) { form.value.inspectType = 0 + const data = {...form.value, qualityInspectParams: tableData.value} if (operationType.value === "add") { - qualityInspectAdd(form.value).then(res => { + qualityInspectAdd(data).then(res => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); closeDia(); }) } else { - qualityInspectUpdate(form.value).then(res => { + qualityInspectUpdate(data).then(res => { proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); closeDia(); }) @@ -211,9 +269,50 @@ } }) } + +const handleSelectionChange = (selection) => { + selectedRows.value = selection; +}; + +const handleDelete = () => { + let ids = []; + if (selectedRows.value.length > 0) { + ids = selectedRows.value.map((item) => item.id); + } else { + proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁"); + return; + } + ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "瀵煎嚭", { + confirmButtonText: "纭", + cancelButtonText: "鍙栨秷", + type: "warning", + }) + .then(() => { + qualityInspectParamDel(ids).then((res) => { + proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + getList(); + }); + }) + .catch(() => { + proxy.$modal.msg("宸插彇娑�"); + }); +}; + +const getList = () => { + qualityInspectDetailByProductId(currentProductId.value).then(res => { + tableData.value = res.data; + }) +} + +const getQualityInspectParamList = (id) => { + qualityInspectParamInfo(id).then(res => { + tableData.value = res.data; + }) +} // 鍏抽棴寮规 const closeDia = () => { proxy.resetForm("formRef"); + tableData.value = [] dialogFormVisible.value = false; emit('close') }; diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue index bbee1bc..16db3eb 100644 --- a/src/views/qualityManagement/rawMaterialInspection/index.vue +++ b/src/views/qualityManagement/rawMaterialInspection/index.vue @@ -11,11 +11,12 @@ clearable :prefix-icon="Search" /> - <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span> - <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange" - placeholder="璇烽�夋嫨" clearable @change="changeDaterange" /> + <span style="margin-left: 10px" class="search_title">妫�娴嬫棩鏈燂細</span> + <el-date-picker v-model="searchForm.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange" + placeholder="璇烽�夋嫨" clearable @change="changeDaterange"/> <el-button type="primary" @click="handleQuery" style="margin-left: 10px" - >鎼滅储</el-button + >鎼滅储 + </el-button > </div> <div> @@ -40,18 +41,42 @@ <InspectionFormDia ref="inspectionFormDia" @close="handleQuery"></InspectionFormDia> <FormDia ref="formDia" @close="handleQuery"></FormDia> <files-dia ref="filesDia" @close="handleQuery"></files-dia> + <el-dialog v-model="dialogFormVisible" title="缂栬緫妫�楠屽憳" width="70%" + @close="closeDia"> + <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> + <el-form-item label="妫�楠屽憳锛�" prop="checkName"> + <el-select v-model="form.checkName" placeholder="璇烽�夋嫨" clearable> + <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" + :value="item.nickName"/> + </el-select> + </el-form-item> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭</el-button> + <el-button @click="closeDia">鍙栨秷</el-button> + </div> + </template> + </el-dialog> + </div> </template> <script setup> -import { Search } from "@element-plus/icons-vue"; +import {Search} from "@element-plus/icons-vue"; import {onMounted, ref} from "vue"; import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue"; import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue"; import {ElMessageBox} from "element-plus"; -import {qualityInspectDel, qualityInspectListPage} from "@/api/qualityManagement/rawMaterialInspection.js"; +import { + downloadQualityInspect, + qualityInspectDel, + qualityInspectListPage, qualityInspectUpdate, + submitQualityInspect +} from "@/api/qualityManagement/rawMaterialInspection.js"; import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue"; import dayjs from "dayjs"; +import {userListNoPage} from "@/api/system/user.js"; const data = reactive({ searchForm: { @@ -63,8 +88,11 @@ entryDateStart: dayjs().format("YYYY-MM-DD"), entryDateEnd: dayjs().add(1, "day").format("YYYY-MM-DD"), }, + rules: { + checkName: [{required: true, message: "璇烽�夋嫨", trigger: "change"}], + }, }); -const { searchForm } = toRefs(data); +const {searchForm, rules} = toRefs(data); const tableColumn = ref([ { label: "妫�娴嬫棩鏈�", @@ -107,12 +135,23 @@ prop: "checkResult", dataType: "tag", formatType: (params) => { - if (params == '涓嶅悎鏍�') { + if (params === '涓嶅悎鏍�') { return "danger"; - } else if (params == '鍚堟牸') { + } else if (params === '鍚堟牸') { return "success"; } else { return null; + } + }, + }, + { + label: "鎻愪氦鐘舵��", + prop: "inspectState", + formatData: (params) => { + if (params) { + return "宸叉彁浜�"; + } else { + return "鏈彁浜�"; } }, }, @@ -121,7 +160,7 @@ label: "鎿嶄綔", align: "center", fixed: "right", - width: 190, + width: 250, operation: [ { name: "缂栬緫", @@ -131,17 +170,35 @@ }, }, { - name: "鏂板妫�楠岃褰�", - type: "text", - clickFun: (row) => { - openInspectionForm("edit", row); - }, - }, - { name: "闄勪欢", type: "text", clickFun: (row) => { openFilesFormDia(row); + }, + }, + { + name: "鎻愪氦", + type: "text", + clickFun: (row) => { + submit(row.id); + }, + }, + { + name: "鍒嗛厤妫�楠屽憳", + type: "text", + clickFun: (row) => { + if (!row.checkName) { + open(row) + } else { + proxy.$modal.msgError("妫�楠屽憳宸插瓨鍦�"); + } + }, + }, + { + name: "涓嬭浇", + type: "text", + clickFun: (row) => { + downLoadFile(row); }, }, ], @@ -150,15 +207,21 @@ const tableData = ref([]); const selectedRows = ref([]); const tableLoading = ref(false); +const userList = ref([]); +const dialogFormVisible = ref(false); +const form = ref({ + checkName: "" +}); const page = reactive({ current: 1, size: 100, total: 0 }); +const currentRow = ref(null) const formDia = ref() const filesDia = ref() const inspectionFormDia = ref() -const { proxy } = getCurrentInstance() +const {proxy} = getCurrentInstance() const changeDaterange = (value) => { searchForm.value.entryDateStart = undefined; searchForm.value.entryDateEnd = undefined; @@ -181,7 +244,7 @@ }; const getList = () => { tableLoading.value = true; - const params = { ...searchForm.value, ...page }; + const params = {...searchForm.value, ...page}; params.entryDate = undefined qualityInspectListPage({...params, inspectType: 0}).then(res => { tableLoading.value = false; @@ -253,6 +316,62 @@ proxy.$modal.msg("宸插彇娑�"); }); }; + +// 鎻愪环 +const submit = async (id) => { + const res = await submitQualityInspect({id: id}) + if (res.code === 200) { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + getList(); + } +} + +// 鍏抽棴寮规 +const closeDia = () => { + proxy.resetForm("formRef"); + dialogFormVisible.value = false; +}; + +const submitForm = () => { + if (currentRow.value) { + const data = { + ...form.value, + id: currentRow.value.id + } + qualityInspectUpdate(data).then(res => { + proxy.$modal.msgSuccess("鎻愪氦鎴愬姛"); + closeDia(); + getList(); + }) + } +}; + +const open = async (row) => { + let userLists = await userListNoPage(); + userList.value = userLists.data; + currentRow.value = row + dialogFormVisible.value = true +} + +const downLoadFile = (row) => { + downloadQualityInspect({id: row.id}).then(res => { + // 鍒涘缓 blob 瀵硅薄 + const blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'}) + const downloadUrl = window.URL.createObjectURL(blob) + + // 鍒涘缓涓存椂 <a> 鏍囩杩涜涓嬭浇 + const link = document.createElement('a') + link.href = downloadUrl + link.download = '妫�楠屾姤鍛�.docx' // 杩欓噷鍜屽悗绔竴鑷� + document.body.appendChild(link) + link.click() + + // 娓呯悊 + document.body.removeChild(link) + window.URL.revokeObjectURL(downloadUrl) + }) +}; + onMounted(() => { getList(); }); -- Gitblit v1.9.3