From 0a3cd80cb9e319e2bc5533a0d648dbb92ec2343e Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 01 六月 2026 13:01:12 +0800
Subject: [PATCH] 新疆马铃薯 1.质量检验功能修改
---
src/views/qualityManagement/processInspection/components/formDia.vue | 68 +-
src/views/qualityManagement/finalInspection/components/quickCheckDia.vue | 327 ++++++++++++++
src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue | 12
src/views/qualityManagement/processInspection/components/quickCheckDia.vue | 327 ++++++++++++++
src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue | 327 ++++++++++++++
src/views/qualityManagement/finalInspection/components/formDia.vue | 53 ++
src/views/qualityManagement/rawMaterialInspection/components/formDia.vue | 10
src/views/qualityManagement/metricMaintenance/index.vue | 12
src/views/qualityManagement/rawMaterialInspection/index.vue | 35 -
src/views/qualityManagement/finalInspection/index.vue | 34 -
src/views/qualityManagement/processInspection/index.vue | 55 --
src/views/qualityManagement/metricBinding/index.vue | 14
12 files changed, 1,092 insertions(+), 182 deletions(-)
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 458ab96..9fcb6b1 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -190,7 +190,7 @@
import {userListNoPage} from "@/api/system/user.js";
import {qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId} from "@/api/qualityManagement/metricMaintenance.js";
import {qualityInspectParamInfo} from "@/api/qualityManagement/qualityInspectParam.js";
-import {ledgerListNoPage} from "@/api/salesManagement/salesLedger.js";
+import {ledgerListNoPage, productList} from "@/api/salesManagement/salesLedger.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits(['close'])
@@ -216,18 +216,18 @@
salesContractNo: "",
},
rules: {
- checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- process: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ process: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
},
});
const { form, rules } = toRefs(data);
@@ -296,6 +296,30 @@
form.value = {}
testStandardOptions.value = [];
tableData.value = [];
+
+ // 鏂板妯″紡涓嬶紝榛樿璁剧疆浜у搧鍚嶇О涓�"椹搩钖洩鑺辩矇"(id=320)
+ if (operationType.value === 'add') {
+ const defaultProductId = 320;
+ form.value.productId = defaultProductId;
+ currentProductId.value = defaultProductId;
+ form.value.productName = '椹搩钖洩鑺辩矇';
+ // 鍔犺浇瑙勬牸鍨嬪彿鍒楄〃
+ try {
+ const modelRes = await modelList({ id: defaultProductId });
+ modelOptions.value = modelRes || [];
+ // 榛樿閫変腑绗竴涓鏍煎瀷鍙�
+ if (modelOptions.value.length > 0) {
+ const firstModel = modelOptions.value[0];
+ form.value.productModelId = firstModel.id;
+ form.value.model = firstModel.model || '';
+ form.value.unit = firstModel.unit || '';
+ }
+ // 鍔犺浇鎸囨爣閫夐」
+ getList();
+ } catch (e) {
+ console.error('鍔犺浇榛樿浜у搧瑙勬牸鍨嬪彿澶辫触', e);
+ }
+ }
if (operationType.value === 'edit' || operationType.value === 'view') {
// 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
@@ -387,12 +411,25 @@
}
// 閿�鍞鍗曢�夋嫨鍙樺寲澶勭悊
-const handleSalesLedgerChange = (value) => {
+const handleSalesLedgerChange = async (value) => {
const selectedItem = salesLedgerOptions.value.find(item => item.id == value);
if (selectedItem) {
form.value.salesContractNo = selectedItem.salesContractNo || '';
+ // 鏍规嵁閿�鍞鍗旾D鏌ヨ浜у搧淇℃伅锛屽彧璧嬪�兼暟閲�
+ try {
+ const res = await productList({ salesLedgerId: value, type: 1 });
+ const productData = res.data && res.data.length > 0 ? res.data[0] : null;
+ if (productData) {
+ // 鍙嚜鍔ㄥ甫鍏ユ暟閲�
+ form.value.quantity = productData.quantity || 0;
+ }
+ } catch (e) {
+ console.error('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�', e);
+ proxy.$modal.msgError('鏌ヨ閿�鍞鍗曚骇鍝佷俊鎭け璐�');
+ }
} else {
form.value.salesContractNo = '';
+ form.value.quantity = undefined;
}
}
diff --git a/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..cf78973
--- /dev/null
+++ b/src/views/qualityManagement/finalInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <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" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ 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>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(2); // 鍑哄巶妫�楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ 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 openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 2
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/finalInspection/index.vue b/src/views/qualityManagement/finalInspection/index.vue
index 81d5595..88ba755 100644
--- a/src/views/qualityManagement/finalInspection/index.vue
+++ b/src/views/qualityManagement/finalInspection/index.vue
@@ -69,6 +69,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -115,6 +118,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/finalInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/finalInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/finalInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -122,7 +126,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/finalInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -322,6 +325,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const userList = ref([]);
@@ -402,32 +406,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const submittedCount = totalCount - unSubmittedRows.length;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/metricBinding/index.vue b/src/views/qualityManagement/metricBinding/index.vue
index 1ac268a..5d115d6 100644
--- a/src/views/qualityManagement/metricBinding/index.vue
+++ b/src/views/qualityManagement/metricBinding/index.vue
@@ -141,8 +141,8 @@
</el-form>
<template #footer>
<span class="dialog-footer">
- <el-button @click="closeBindingDialog">鍙栨秷</el-button>
<el-button type="primary" @click="submitBinding">纭畾</el-button>
+ <el-button @click="closeBindingDialog">鍙栨秷</el-button>
</span>
</template>
</el-dialog>
@@ -215,18 +215,6 @@
formatData: (val) => {
const map = { 0: '鍘熸潗鏂欐楠�', 1: '杩囩▼妫�楠�', 2: '鍑哄巶妫�楠�' }
return map[val] || val
- }
- },
- {
- label: '宸ュ簭',
- prop: 'processId',
- align: 'center',
- dataType: 'tag',
- formatData: (val) => {
- const target = processOptions.value.find(
- (item) => String(item.value) === String(val)
- )
- return target?.label || val
}
},
{
diff --git a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
index 38d535a..381dac4 100644
--- a/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
+++ b/src/views/qualityManagement/metricMaintenance/StandardFormDialog.vue
@@ -27,16 +27,6 @@
<el-option label="鍑哄巶妫�楠�" value="2" />
</el-select>
</el-form-item>
- <el-form-item label="宸ュ簭" prop="processId">
- <el-select v-model="form.processId" placeholder="璇烽�夋嫨宸ュ簭" style="width: 100%">
- <el-option
- v-for="item in processOptions"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
<el-form-item label="鐘舵��" prop="state">
<el-select v-model="form.state" placeholder="璇烽�夋嫨鐘舵��" style="width: 100%">
<el-option label="鑽夌" value="0" />
@@ -96,7 +86,7 @@
const formRef = ref(null)
-const computedTitle = computed(() => {
+ const computedTitle = computed(() => {
if (props.operationType === 'edit') return '缂栬緫妫�娴嬫爣鍑�'
if (props.operationType === 'copy') return '澶嶅埗妫�娴嬫爣鍑�'
return '鏂板妫�娴嬫爣鍑�'
diff --git a/src/views/qualityManagement/metricMaintenance/index.vue b/src/views/qualityManagement/metricMaintenance/index.vue
index deb3e5f..8d1dd1c 100644
--- a/src/views/qualityManagement/metricMaintenance/index.vue
+++ b/src/views/qualityManagement/metricMaintenance/index.vue
@@ -310,18 +310,6 @@
}
},
{
- label: '宸ュ簭',
- prop: 'processId',
- align: 'center',
- dataType: 'tag',
- formatData: (val) => {
- const target = processOptions.value.find(
- (item) => String(item.value) === String(val)
- )
- return target?.label || val
- }
- },
- {
label: '鐘舵��',
prop: 'state',
headerSlot: 'stateHeader',
diff --git a/src/views/qualityManagement/processInspection/components/formDia.vue b/src/views/qualityManagement/processInspection/components/formDia.vue
index 635360f..f34c963 100644
--- a/src/views/qualityManagement/processInspection/components/formDia.vue
+++ b/src/views/qualityManagement/processInspection/components/formDia.vue
@@ -11,17 +11,18 @@
ref="formRef">
<el-row :gutter="30">
<el-col :span="12">
- <el-form-item label="宸ュ簭锛�"
- prop="process">
- <el-select v-model="form.process"
- placeholder="璇烽�夋嫨宸ュ簭"
+ <el-form-item label="閲囪喘鍚堝悓鍙凤細"
+ prop="purchaseContractNo">
+ <el-select v-model="form.purchaseContractNo"
+ placeholder="璇烽�夋嫨"
clearable
- :disabled="isViewMode || processQuantityDisabled"
+ filterable
+ :disabled="isViewMode"
style="width: 100%">
- <el-option v-for="item in processList"
- :key="item.name"
- :label="item.name"
- :value="item.name" />
+ <el-option v-for="item in purchaseContractList"
+ :key="item.id"
+ :label="item.purchaseContractNo"
+ :value="item.purchaseContractNo" />
</el-select>
</el-form-item>
</el-col>
@@ -216,7 +217,7 @@
getCurrentInstance,
nextTick,
} from "vue";
- import { getOptions } from "@/api/procurementManagement/procurementLedger.js";
+ import { getOptions, getSalesNo } from "@/api/procurementManagement/procurementLedger.js";
import { modelList, productTreeList } from "@/api/basicData/product.js";
import {
qualityInspectAdd,
@@ -228,7 +229,7 @@
} from "@/api/qualityManagement/metricMaintenance.js";
import { userListNoPage } from "@/api/system/user.js";
import { qualityInspectParamInfo } from "@/api/qualityManagement/qualityInspectParam.js";
- import { list } from "@/api/productionManagement/productionProcess";
+
import qualified from "@/views/inventoryManagement/stockManagement/Qualified.vue";
const { proxy } = getCurrentInstance();
const emit = defineEmits(["close"]);
@@ -238,7 +239,6 @@
const data = reactive({
form: {
checkTime: "",
- process: "",
checkName: "",
productName: "",
productId: "",
@@ -251,20 +251,21 @@
unqualifiedQuantity: "",
checkCompany: "",
checkResult: "",
+ purchaseContractNo: "",
},
rules: {
- checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- process: [{ required: true, message: "璇烽�夋嫨宸ュ簭", trigger: "change" }],
+ checkTime: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkName: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
productId: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
productModelId: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
testStandardId: [{ required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- qualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
- unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
+ quantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ purchaseContractNo: [{ required: false, message: "璇烽�夋嫨", trigger: "change" }],
+ checkResult: [{ required: false, message: "璇疯緭鍏�", trigger: "change" }],
},
});
const userList = ref([]);
@@ -276,9 +277,10 @@
const v = form.value || {};
return !!(v.productMainId != null || v.purchaseLedgerId != null);
});
- const processList = ref([]); // 宸ュ簭涓嬫媺鍒楄〃锛堝伐搴忓悕绉� name锛�
+
const supplierList = ref([]);
const productOptions = ref([]);
+ const purchaseContractList = ref([]); // 閲囪喘鍚堝悓鍙峰垪琛�
const tableColumn = ref([
{
label: "鎸囨爣",
@@ -315,20 +317,19 @@
getOptions().then(res => {
supplierList.value = res.data;
});
- // 鍔犺浇宸ュ簭涓嬫媺鍒楄〃
- try {
- const res = await list({ size: -1, current: -1 });
- processList.value = res.data.records || [];
- } catch (e) {
- console.error("鍔犺浇宸ュ簭鍒楄〃澶辫触", e);
- processList.value = [];
- }
let userLists = await userListNoPage();
userList.value = userLists.data;
- // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡鈥滈棯涓�涓嬧�濓級
+ // 鍔犺浇閲囪喘鍚堝悓鍙峰垪琛�
+ try {
+ const contractRes = await getSalesNo();
+ purchaseContractList.value = contractRes || [];
+ } catch (e) {
+ console.error("鍔犺浇閲囪喘鍚堝悓鍙峰け璐�", e);
+ purchaseContractList.value = [];
+ }
+ // 鍏堥噸缃〃鍗曟暟鎹紙淇濇寔瀛楁瀹屾暣锛岄伩鍏嶅脊绐楅娆℃覆鏌撴椂瑙﹀彂蹇呭~绾㈡"闂竴涓�"锛�
form.value = {
checkTime: "",
- process: "",
checkName: "",
productName: "",
productId: "",
@@ -339,6 +340,7 @@
quantity: "",
checkCompany: "",
checkResult: "",
+ purchaseContractNo: "",
};
testStandardOptions.value = [];
tableData.value = [];
@@ -370,7 +372,6 @@
let params = {
productId: currentProductId.value,
inspectType: 1,
- process: form.value.process || "",
};
qualityInspectDetailByProductId(params).then(res => {
testStandardOptions.value = res.data || [];
@@ -518,9 +519,16 @@
return;
}
+ // 鏍规嵁閲囪喘鍚堝悓鍙锋煡鎵惧搴旂殑 purchaseLedgerId
+ const selectedContract = purchaseContractList.value.find(
+ item => item.purchaseContractNo === form.value.purchaseContractNo
+ );
+ const purchaseLedgerId = selectedContract ? selectedContract.id : null;
+
const data = {
...form.value,
process: processName, // 淇濈暀 process 瀛楁浠ュ吋瀹瑰悗绔�
+ purchaseLedgerId: purchaseLedgerId, // 鎻愪氦 purchaseLedgerId
qualityInspectParams: tableData.value,
};
if (operationType.value === "add") {
diff --git a/src/views/qualityManagement/processInspection/components/quickCheckDia.vue b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..0aa069b
--- /dev/null
+++ b/src/views/qualityManagement/processInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <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" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ 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>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(1); // 杩囩▼妫�楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ 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 openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 1
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/processInspection/index.vue b/src/views/qualityManagement/processInspection/index.vue
index 85e3811..fef9b15 100644
--- a/src/views/qualityManagement/processInspection/index.vue
+++ b/src/views/qualityManagement/processInspection/index.vue
@@ -2,13 +2,6 @@
<div class="app-container">
<div class="search_form mb20">
<div>
- <span class="search_title">宸ュ簭锛�</span>
- <el-input v-model="searchForm.process"
- style="width: 240px"
- placeholder="璇疯緭鍏ュ伐搴忔悳绱�"
- @change="handleQuery"
- clearable
- :prefix-icon="Search" />
<span style="margin-left: 10px"
class="search_title">妫�娴嬫棩鏈燂細</span>
<el-date-picker v-model="searchForm.entryDate"
@@ -18,14 +11,6 @@
placeholder="璇烽�夋嫨"
clearable
@change="changeDaterange" />
- <span style="margin-left: 10px"
- class="search_title">鐢熶骇宸ュ崟鍙凤細</span>
- <el-input v-model="searchForm.workOrderNo"
- style="width: 240px"
- placeholder="璇疯緭鍏ョ敓浜у伐鍗曞彿鎼滅储"
- @change="handleQuery"
- clearable
- :prefix-icon="Search" />
<el-button type="primary"
@click="handleQuery"
style="margin-left: 10px">鎼滅储</el-button>
@@ -54,6 +39,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -100,6 +88,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/processInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/processInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/processInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -107,7 +96,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/processInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -116,7 +104,6 @@
const data = reactive({
searchForm: {
- process: "",
entryDate: undefined, // 褰曞叆鏃ユ湡
workOrderNo: "",
entryDateStart: undefined,
@@ -133,11 +120,6 @@
label: "妫�娴嬫棩鏈�",
prop: "checkTime",
width: 120,
- },
- {
- label: "宸ュ簭",
- prop: "process",
- width: 230,
},
{
label: "妫�楠屽憳",
@@ -311,6 +293,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const changeDaterange = value => {
@@ -385,32 +368,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const submittedCount = totalCount - unSubmittedRows.length;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑鏂板妫�楠屽脊妗�
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
index 8bcc72b..8c91275 100644
--- a/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/components/formDia.vue
@@ -197,18 +197,18 @@
checkResult: "",
},
rules: {
- checkTime: [{required: true, message: "璇疯緭鍏�", trigger: "blur"},],
+ checkTime: [{required: false, message: "璇疯緭鍏�", trigger: "blur"},],
supplier: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
checkName: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
productId: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
productModelId: [{required: true, message: "璇烽�夋嫨浜у搧鍨嬪彿", trigger: "change"}],
testStandardId: [{required: false, message: "璇烽�夋嫨鎸囨爣", trigger: "change"}],
unit: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- quantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- qualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
- unqualifiedQuantity: [{required: true, message: "璇疯緭鍏�", trigger: "blur"}],
+ quantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+ qualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
+ unqualifiedQuantity: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
checkCompany: [{required: false, message: "璇疯緭鍏�", trigger: "blur"}],
- checkResult: [{required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
+ checkResult: [{required: false, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change"}],
},
});
const tableColumn = ref([
diff --git a/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
new file mode 100644
index 0000000..b8229ef
--- /dev/null
+++ b/src/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue
@@ -0,0 +1,327 @@
+<template>
+ <div>
+ <el-dialog
+ v-model="dialogVisible"
+ title="蹇�熸楠�"
+ width="70%"
+ @close="closeDialog"
+ >
+ <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬬粨鏋滐細" prop="checkResult">
+ <el-select v-model="form.checkResult" placeholder="璇烽�夋嫨妫�娴嬬粨鏋�" style="width: 100%" @change="handleCheckResultChange">
+ <el-option label="鍚堟牸" value="鍚堟牸" />
+ <el-option label="涓嶅悎鏍�" value="涓嶅悎鏍�" />
+ <el-option label="閮ㄥ垎鍚堟牸" value="閮ㄥ垎鍚堟牸" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="鎸囨爣閫夋嫨锛�" prop="testStandardId">
+ <el-select v-model="form.testStandardId" placeholder="璇烽�夋嫨鎸囨爣" style="width: 100%" @change="handleTestStandardChange">
+ <el-option
+ v-for="item in testStandardOptions"
+ :key="item.id"
+ :label="item.standardName || item.standardNo"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <template v-if="form.checkResult">
+ <el-row :gutter="30">
+ <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" @change="handleQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬪崟浣嶏細" prop="checkCompany">
+ <el-input v-model="form.checkCompany" placeholder="璇疯緭鍏ユ娴嬪崟浣�" clearable/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="鍚堟牸鏁伴噺锛�" prop="qualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.qualifiedQuantity" placeholder="璇疯緭鍏ュ悎鏍兼暟閲�" clearable :precision="2" @change="handleQualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="涓嶅悎鏍兼暟閲忥細" prop="unqualifiedQuantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.unqualifiedQuantity" placeholder="璇疯緭鍏ヤ笉鍚堟牸鏁伴噺" clearable :precision="2" @change="handleUnqualifiedQuantityChange"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="30">
+ <el-col :span="12">
+ <el-form-item label="妫�楠屽憳锛�" prop="checkName">
+ <el-select v-model="form.checkName" placeholder="璇烽�夋嫨妫�楠屽憳" clearable style="width: 100%">
+ <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
+ <el-date-picker
+ v-model="form.checkTime"
+ type="date"
+ placeholder="璇烽�夋嫨妫�娴嬫棩鏈�"
+ value-format="YYYY-MM-DD"
+ format="YYYY-MM-DD"
+ clearable
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </template>
+ </el-form>
+ <PIMTable
+ rowKey="id"
+ :column="tableColumn"
+ :tableData="tableData"
+ :tableLoading="tableLoading"
+ 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>
+ <el-button @click="closeDialog">鍙栨秷</el-button>
+ </div>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, reactive, toRefs, getCurrentInstance, nextTick } from "vue";
+import { userListNoPage } from "@/api/system/user.js";
+import { batchQuickInspect } from "@/api/qualityManagement/rawMaterialInspection.js";
+import { qualityInspectDetailByProductId, getQualityTestStandardParamByTestStandardId } from "@/api/qualityManagement/metricMaintenance.js";
+
+const { proxy } = getCurrentInstance();
+const emit = defineEmits(['close', 'success']);
+
+const dialogVisible = ref(false);
+const userList = ref([]);
+const selectedIds = ref([]);
+const selectedRows = ref([]);
+const testStandardOptions = ref([]);
+const inspectType = ref(0); // 鍘熸潗鏂欐楠岀被鍨�
+
+const data = reactive({
+ form: {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ },
+ rules: {
+ checkResult: [{ required: true, message: "璇烽�夋嫨妫�娴嬬粨鏋�", trigger: "change" }],
+ testStandardId: [{ required: true, message: "璇烽�夋嫨鎸囨爣", trigger: "change" }],
+ quantity: [{ required: true, message: "璇疯緭鍏ユ暟閲�", trigger: "blur" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
+ checkCompany: [{ required: true, message: "璇疯緭鍏ユ娴嬪崟浣�", trigger: "blur" }],
+ checkName: [{ required: true, message: "璇烽�夋嫨妫�楠屽憳", trigger: "change" }],
+ checkTime: [{ 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 openDialog = async (ids, rows) => {
+ selectedIds.value = ids;
+ selectedRows.value = rows;
+ dialogVisible.value = true;
+
+ // 鍔犺浇鐢ㄦ埛鍒楄〃
+ const userListsRes = await userListNoPage();
+ userList.value = userListsRes.data;
+
+ // 鍔犺浇鎸囨爣閫夐」锛堟牴鎹涓�涓�変腑琛岀殑浜у搧ID锛�
+ if (rows && rows.length > 0 && rows[0].productId) {
+ const params = {
+ productId: rows[0].productId,
+ inspectType: 0
+ };
+ const res = await qualityInspectDetailByProductId(params);
+ testStandardOptions.value = res.data || [];
+ } else {
+ testStandardOptions.value = [];
+ }
+
+ // 閲嶇疆琛ㄥ崟
+ form.value = {
+ checkResult: '',
+ testStandardId: '',
+ quantity: undefined,
+ qualifiedQuantity: undefined,
+ unqualifiedQuantity: undefined,
+ checkCompany: '',
+ checkName: '',
+ checkTime: '',
+ };
+ tableData.value = [];
+
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+};
+
+// 鎸囨爣閫夋嫨鍙樺寲澶勭悊
+const handleTestStandardChange = async (testStandardId) => {
+ if (!testStandardId) {
+ tableData.value = [];
+ return;
+ }
+ tableLoading.value = true;
+ try {
+ const res = await getQualityTestStandardParamByTestStandardId(testStandardId);
+ tableData.value = (res.data || []).map(item => ({
+ ...item,
+ id: null,
+ testValue: ''
+ }));
+ } catch (error) {
+ console.error('鑾峰彇鏍囧噯鍙傛暟澶辫触:', error);
+ tableData.value = [];
+ } finally {
+ tableLoading.value = false;
+ }
+};
+
+// 妫�娴嬬粨鏋滃彉鍖栧鐞�
+const handleCheckResultChange = (value) => {
+ if (value === '鍚堟牸') {
+ // 鍚堟牸鏃讹紝鍚堟牸鏁伴噺绛変簬鏁伴噺锛屼笉鍚堟牸鏁伴噺涓�0
+ form.value.qualifiedQuantity = form.value.quantity || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (value === '涓嶅悎鏍�') {
+ // 涓嶅悎鏍兼椂锛屽悎鏍兼暟閲忎负0锛屼笉鍚堟牸鏁伴噺绛変簬鏁伴噺
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = form.value.quantity || 0;
+ }
+};
+
+// 鏁伴噺鍙樺寲澶勭悊
+const handleQuantityChange = (value) => {
+ if (form.value.checkResult === '鍚堟牸') {
+ form.value.qualifiedQuantity = value || 0;
+ form.value.unqualifiedQuantity = 0;
+ } else if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0;
+ form.value.unqualifiedQuantity = value || 0;
+ }
+};
+
+// 鍚堟牸鏁伴噺鍙樺寲澶勭悊
+const handleQualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("鍚堟牸鏁伴噺涓嶈兘澶т簬鎬绘暟閲�");
+ form.value.qualifiedQuantity = quantity;
+ form.value.unqualifiedQuantity = 0;
+ } else {
+ form.value.unqualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 涓嶅悎鏍兼暟閲忓彉鍖栧鐞�
+const handleUnqualifiedQuantityChange = (value) => {
+ const quantity = form.value.quantity || 0;
+ if (value > quantity) {
+ proxy.$modal.msgWarning("涓嶅悎鏍兼暟閲忎笉鑳藉ぇ浜庢�绘暟閲�");
+ form.value.unqualifiedQuantity = quantity;
+ form.value.qualifiedQuantity = 0;
+ } else {
+ form.value.qualifiedQuantity = Number((quantity - value).toFixed(2));
+ }
+ updateCheckResult();
+};
+
+// 鏍规嵁鍚堟牸/涓嶅悎鏍兼暟閲忔洿鏂版娴嬬粨鏋�
+const updateCheckResult = () => {
+ const qualified = form.value.qualifiedQuantity || 0;
+ const unqualified = form.value.unqualifiedQuantity || 0;
+ const quantity = form.value.quantity || 0;
+
+ if (qualified === quantity && unqualified === 0) {
+ form.value.checkResult = '鍚堟牸';
+ } else if (unqualified === quantity && qualified === 0) {
+ form.value.checkResult = '涓嶅悎鏍�';
+ } else if (qualified > 0 && unqualified > 0) {
+ form.value.checkResult = '閮ㄥ垎鍚堟牸';
+ }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+ proxy.$refs.formRef.validate((valid) => {
+ if (valid) {
+ const data = {
+ ids: selectedIds.value,
+ inspectType: inspectType.value,
+ ...form.value,
+ paramList: tableData.value
+ };
+ batchQuickInspect(data).then(res => {
+ proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
+ emit('success');
+ closeDialog();
+ });
+ }
+ });
+};
+
+// 鍏抽棴寮规
+const closeDialog = () => {
+ dialogVisible.value = false;
+ emit('close');
+};
+
+defineExpose({
+ openDialog,
+});
+</script>
+
+<style scoped>
+</style>
diff --git a/src/views/qualityManagement/rawMaterialInspection/index.vue b/src/views/qualityManagement/rawMaterialInspection/index.vue
index 609176e..df33f61 100644
--- a/src/views/qualityManagement/rawMaterialInspection/index.vue
+++ b/src/views/qualityManagement/rawMaterialInspection/index.vue
@@ -55,6 +55,9 @@
@close="handleQuery"></FormDia>
<files-dia ref="filesDia"
@close="handleQuery"></files-dia>
+ <QuickCheckDia ref="quickCheckDia"
+ @close="handleQuery"
+ @success="getList"></QuickCheckDia>
<el-dialog v-model="dialogFormVisible"
title="缂栬緫妫�楠屽憳"
width="30%"
@@ -101,6 +104,7 @@
} from "vue";
import InspectionFormDia from "@/views/qualityManagement/rawMaterialInspection/components/inspectionFormDia.vue";
import FormDia from "@/views/qualityManagement/rawMaterialInspection/components/formDia.vue";
+ import QuickCheckDia from "@/views/qualityManagement/rawMaterialInspection/components/quickCheckDia.vue";
import { ElMessageBox } from "element-plus";
import {
downloadQualityInspect,
@@ -108,7 +112,6 @@
qualityInspectListPage,
qualityInspectUpdate,
submitQualityInspect,
- batchQuickInspect,
} from "@/api/qualityManagement/rawMaterialInspection.js";
import FilesDia from "@/views/qualityManagement/rawMaterialInspection/components/filesDia.vue";
import dayjs from "dayjs";
@@ -322,6 +325,7 @@
const formDia = ref();
const filesDia = ref();
const inspectionFormDia = ref();
+ const quickCheckDia = ref();
const { proxy } = getCurrentInstance();
const userStore = useUserStore();
const changeDaterange = value => {
@@ -396,33 +400,8 @@
return;
}
- const totalCount = selectedRows.value.length;
- const unSubmittedCount = unSubmittedRows.length;
- const submittedCount = totalCount - unSubmittedCount;
-
- let confirmMessage = `宸查�夋嫨 ${totalCount} 鏉℃楠屽崟`;
- if (submittedCount > 0) {
- confirmMessage += `锛堝叾涓� ${submittedCount} 鏉″凡鎻愪氦锛屽皢鑷姩璺宠繃锛塦;
- }
- confirmMessage += `\n\n纭鍚庡皢鑷姩锛歕n路 妫�楠岀粨鏋滆涓�"鍚堟牸"\n路 鍚堟牸鏁伴噺璁句负鎬绘暟\n路 涓嶅悎鏍兼暟閲忚涓� 0\n路 鎻愪氦骞跺叆搴揱;
-
- ElMessageBox.confirm(confirmMessage, "蹇�熸楠�", {
- confirmButtonText: "纭",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- dangerouslyUseHTMLString: false,
- })
- .then(() => {
- // 璋冪敤鎵归噺蹇�熸楠屾帴鍙�
- const ids = unSubmittedRows.map(item => item.id);
- batchQuickInspect(ids).then(res => {
- proxy.$modal.msgSuccess(res.msg || "蹇�熸楠屽畬鎴�");
- getList();
- });
- })
- .catch(() => {
- proxy.$modal.msg("宸插彇娑�");
- });
+ const ids = unSubmittedRows.map(item => item.id);
+ quickCheckDia.value?.openDialog(ids, unSubmittedRows);
};
// 鎵撳紑闄勪欢寮规
const openFilesFormDia = (type, row) => {
--
Gitblit v1.9.3