From c6c1caafba75438cc0eff215f19e9e0b900778d7 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 15 五月 2026 15:54:06 +0800
Subject: [PATCH] feat: 质检数量区分合格/不合格
---
src/views/qualityManagement/finalInspection/components/formDia.vue | 287 ++++++++++++++++++++++++++++++++++++++++++++------------
1 files changed, 223 insertions(+), 64 deletions(-)
diff --git a/src/views/qualityManagement/finalInspection/components/formDia.vue b/src/views/qualityManagement/finalInspection/components/formDia.vue
index 8dfd3ba..42689f0 100644
--- a/src/views/qualityManagement/finalInspection/components/formDia.vue
+++ b/src/views/qualityManagement/finalInspection/components/formDia.vue
@@ -49,6 +49,11 @@
</el-select>
</el-form-item>
</el-col>
+ <el-col :span="12">
+ <el-form-item label="鍘氬害(mm)锛�" prop="thickness">
+ <el-input v-model="form.thickness" placeholder="璇疯緭鍏�" disabled/>
+ </el-form-item>
+ </el-col>
</el-row>
<el-row :gutter="30">
<el-col :span="12">
@@ -57,8 +62,21 @@
</el-form-item>
</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-form-item label="鎬绘暟閲忥細" prop="quantity">
+ <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="form.quantity" placeholder="璇疯緭鍏�" clearable :precision="2" :disabled="quantityDisabled"
+ @change="onTotalQuantityChange"/>
+ </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="onQualifiedQuantityChange"/>
+ </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="onUnqualifiedQuantityChange"/>
</el-form-item>
</el-col>
</el-row>
@@ -69,16 +87,6 @@
</el-form-item>
</el-col>
<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-select>
- </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>
<el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
@@ -86,6 +94,8 @@
</el-select>
</el-form-item>
</el-col>
+ </el-row>
+ <el-row :gutter="30">
<el-col :span="12">
<el-form-item label="妫�娴嬫棩鏈燂細" prop="checkTime">
<el-date-picker
@@ -123,7 +133,7 @@
</template>
<script setup>
-import {ref, reactive, toRefs, getCurrentInstance, nextTick} from "vue";
+import {ref, reactive, toRefs, computed, getCurrentInstance, nextTick} from "vue";
import {getOptions} from "@/api/procurementManagement/procurementLedger.js";
import {modelList, productTreeList} from "@/api/basicData/product.js";
import {qualityInspectAdd, qualityInspectUpdate} from "@/api/qualityManagement/rawMaterialInspection.js";
@@ -147,12 +157,14 @@
testStandardId: "",
unit: "",
quantity: "",
+ qualifiedQuantity: null,
+ unqualifiedQuantity: null,
checkCompany: "",
- checkResult: "",
+ thickness:""
},
rules: {
checkTime: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" },],
- process: [{ required: true, 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" }],
@@ -160,10 +172,123 @@
unit: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
quantity: [{ required: true, message: "璇疯緭鍏�", trigger: "blur" }],
checkCompany: [{ required: false, message: "璇疯緭鍏�", trigger: "blur" }],
- checkResult: [{ required: true, message: "璇疯緭鍏�", trigger: "change" }],
+ qualifiedQuantity: [{ required: true, message: "璇疯緭鍏ュ悎鏍兼暟閲�", trigger: "blur" }],
+ unqualifiedQuantity: [{ required: true, message: "璇疯緭鍏ヤ笉鍚堟牸鏁伴噺", trigger: "blur" }],
},
});
const { form, rules } = toRefs(data);
+
+function normalizeQuantitiesFromLegacy() {
+ const qty = form.value.quantity != null ? Number(form.value.quantity) : null
+ if (qty == null || Number.isNaN(qty)) return
+ const hasQ = form.value.qualifiedQuantity != null && form.value.qualifiedQuantity !== ''
+ const hasU = form.value.unqualifiedQuantity != null && form.value.unqualifiedQuantity !== ''
+ if (hasQ && hasU) return
+ if (form.value.checkResult === '涓嶅悎鏍�') {
+ form.value.qualifiedQuantity = 0
+ form.value.unqualifiedQuantity = qty
+ } else {
+ form.value.qualifiedQuantity = qty
+ form.value.unqualifiedQuantity = 0
+ }
+}
+
+function assertQtySplitOrError() {
+ const total = Number(form.value.quantity)
+ const a = form.value.qualifiedQuantity != null ? Number(form.value.qualifiedQuantity) : NaN
+ const b = form.value.unqualifiedQuantity != null ? Number(form.value.unqualifiedQuantity) : NaN
+ if (!Number.isFinite(total) || total < 0) {
+ proxy.$modal.msgError('璇峰厛濉啓鏈夋晥鐨勬�绘暟閲�')
+ return false
+ }
+ if (!Number.isFinite(a) || !Number.isFinite(b) || a < 0 || b < 0) {
+ proxy.$modal.msgError('璇峰~鍐欏悎鏍兼暟閲忎笌涓嶅悎鏍兼暟閲�')
+ return false
+ }
+ if (a + b - total > 0.001) {
+ proxy.$modal.msgError('鍚堟牸鏁伴噺涓庝笉鍚堟牸鏁伴噺涔嬪拰涓嶈兘瓒呰繃鎬绘暟閲�')
+ return false
+ }
+ return true
+}
+
+function roundQty(n) {
+ if (!Number.isFinite(n)) return 0
+ return Math.round(n * 100) / 100
+}
+
+function parseTotalQty() {
+ const t = Number(form.value.quantity)
+ return Number.isFinite(t) && t >= 0 ? t : null
+}
+
+function onQualifiedQuantityChange(val) {
+ const total = parseTotalQty()
+ if (total == null) return
+ let q = val == null || val === '' ? 0 : Number(val)
+ if (!Number.isFinite(q) || q < 0) q = 0
+ if (q > total) q = total
+ q = roundQty(q)
+ form.value.qualifiedQuantity = q
+ form.value.unqualifiedQuantity = roundQty(total - q)
+}
+
+function onUnqualifiedQuantityChange(val) {
+ const total = parseTotalQty()
+ if (total == null) return
+ let u = val == null || val === '' ? 0 : Number(val)
+ if (!Number.isFinite(u) || u < 0) u = 0
+ if (u > total) u = total
+ u = roundQty(u)
+ form.value.unqualifiedQuantity = u
+ form.value.qualifiedQuantity = roundQty(total - u)
+}
+
+function onTotalQuantityChange() {
+ const total = parseTotalQty()
+ if (total == null) return
+ const q = form.value.qualifiedQuantity != null && form.value.qualifiedQuantity !== '' ? Number(form.value.qualifiedQuantity) : NaN
+ const u = form.value.unqualifiedQuantity != null && form.value.unqualifiedQuantity !== '' ? Number(form.value.unqualifiedQuantity) : NaN
+ if (!Number.isFinite(q) && !Number.isFinite(u)) {
+ form.value.qualifiedQuantity = roundQty(total)
+ form.value.unqualifiedQuantity = 0
+ return
+ }
+ if (Number.isFinite(q) && Number.isFinite(u)) {
+ const sum = q + u
+ if (sum > total + 0.001) {
+ const nq = roundQty(Math.min(Math.max(0, q), total))
+ form.value.qualifiedQuantity = nq
+ form.value.unqualifiedQuantity = roundQty(total - nq)
+ }
+ return
+ }
+ if (Number.isFinite(q)) {
+ const nq = roundQty(Math.min(Math.max(0, q), total))
+ form.value.qualifiedQuantity = nq
+ form.value.unqualifiedQuantity = roundQty(total - nq)
+ } else if (Number.isFinite(u)) {
+ const nu = roundQty(Math.min(Math.max(0, u), total))
+ form.value.unqualifiedQuantity = nu
+ form.value.qualifiedQuantity = roundQty(total - nu)
+ }
+}
+
+function ensureQtyPairInitialized() {
+ const total = parseTotalQty()
+ if (total == null) return
+ const qEmpty = form.value.qualifiedQuantity == null || form.value.qualifiedQuantity === ''
+ const uEmpty = form.value.unqualifiedQuantity == null || form.value.unqualifiedQuantity === ''
+ if (qEmpty && uEmpty) {
+ form.value.qualifiedQuantity = roundQty(total)
+ form.value.unqualifiedQuantity = 0
+ }
+}
+// 缂栬緫鏃讹細productMainId 鎴� purchaseLedgerId 浠讳竴鏈夊�煎垯鏁伴噺缃伆
+const quantityDisabled = computed(() => {
+ const v = form.value || {};
+ return !!(v.productMainId != null || v.purchaseLedgerId != null);
+});
const supplierList = ref([]);
const productOptions = ref([]);
const tableColumn = ref([
@@ -201,64 +326,93 @@
const openDialog = async (type, row) => {
operationType.value = type;
dialogFormVisible.value = true;
- getOptions().then((res) => {
- supplierList.value = res.data;
- });
- let userLists = await userListNoPage();
- userList.value = userLists.data;
- form.value = {}
+ // 鍏堟竻绌鸿〃鍗曢獙璇佺姸鎬侊紝閬垮厤闂儊
+ await nextTick();
+ proxy.$refs.formRef?.clearValidate();
+
+ // 骞惰鍔犺浇鍩虹鏁版嵁
+ const [userListsRes] = await Promise.all([
+ userListNoPage(),
+ getProductOptions(),
+ getOptions().then((res) => {
+ supplierList.value = res.data;
+ })
+ ]);
+ userList.value = userListsRes.data;
+
+ form.value = {}
testStandardOptions.value = [];
tableData.value = [];
- getProductOptions();
+
if (operationType.value === 'edit') {
// 鍏堜繚瀛� testStandardId锛岄伩鍏嶈娓呯┖
const savedTestStandardId = row.testStandardId;
// 鍏堣缃〃鍗曟暟鎹紝浣嗘殏鏃舵竻绌� testStandardId锛岀瓑閫夐」鍔犺浇瀹屾垚鍚庡啀璁剧疆
form.value = {...row, testStandardId: ''}
- currentProductId.value = row.productId || 0
- // 缂栬緫妯″紡涓嬶紝鍏堝姞杞芥寚鏍囬�夐」锛岀劧鍚庡姞杞藉弬鏁板垪琛�
- if (currentProductId.value) {
- // 鍏堝姞杞芥寚鏍囬�夐」
- let params = {
- productId: currentProductId.value,
- inspectType: 2
- }
- qualityInspectDetailByProductId(params).then(res => {
- testStandardOptions.value = res.data || [];
- // 浣跨敤 nextTick 鍜� setTimeout 纭繚閫夐」宸茬粡娓叉煋鍒� DOM
- nextTick(() => {
- setTimeout(() => {
- // 濡傛灉缂栬緫鏁版嵁涓湁 testStandardId锛屽垯璁剧疆骞跺姞杞藉搴旂殑鍙傛暟
- if (savedTestStandardId) {
- // 纭繚绫诲瀷鍖归厤锛坕tem.id 鍙兘鏄暟瀛楁垨瀛楃涓诧級
- const matchedOption = testStandardOptions.value.find(item =>
- item.id == savedTestStandardId || String(item.id) === String(savedTestStandardId)
- );
- if (matchedOption) {
- // 纭繚浣跨敤鍖归厤椤圭殑 id锛堜繚鎸佺被鍨嬩竴鑷达級
- form.value.testStandardId = matchedOption.id;
- // 缂栬緫鍦烘櫙淇濈暀宸叉湁妫�楠屽�硷紝鐩存帴鎷夊彇鍘熷弬鏁版暟鎹�
- getQualityInspectParamList(row.id);
- } else {
- // 濡傛灉鎵句笉鍒板尮閰嶉」锛屽皾璇曠洿鎺ヤ娇鐢ㄥ師鍊�
- console.warn('鏈壘鍒板尮閰嶇殑鎸囨爣閫夐」锛宼estStandardId:', savedTestStandardId, '鍙敤閫夐」:', testStandardOptions.value);
- form.value.testStandardId = savedTestStandardId;
- getQualityInspectParamList(row.id);
- }
- } else {
- // 鍚﹀垯浣跨敤鏃х殑閫昏緫
- getQualityInspectParamList(row.id);
- }
- }, 100);
- });
- });
- } else {
- getQualityInspectParamList(row.id);
- }
+ normalizeQuantitiesFromLegacy()
+ currentProductId.value = row.productId || 0
+ // 娓呯┖楠岃瘉鐘舵�侊紝閬垮厤鏁版嵁鍔犺浇杩囩▼涓殑鏍¢獙闂儊
+ nextTick(() => {
+ proxy.$refs.formRef?.clearValidate();
+ });
+
+ // 缂栬緫妯″紡涓嬶紝骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
+ if (currentProductId.value) {
+ // 璁剧疆浜у搧鍚嶇О
+ form.value.productName = findNodeById(productOptions.value, currentProductId.value);
+
+ // 骞惰鍔犺浇瑙勬牸鍨嬪彿鍜屾寚鏍囬�夐」
+ const params = {
+ productId: currentProductId.value,
+ inspectType: 2
+ };
+
+ Promise.all([
+ modelList({ id: currentProductId.value }),
+ qualityInspectDetailByProductId(params)
+ ]).then(([modelRes, testStandardRes]) => {
+ // 璁剧疆瑙勬牸鍨嬪彿閫夐」
+ modelOptions.value = modelRes || [];
+ // 濡傛灉琛ㄥ崟涓凡鏈� productModelId锛岃缃搴旂殑 model 鍜� unit
+ if (form.value.productModelId && modelOptions.value.length > 0) {
+ const selectedModel = modelOptions.value.find(item => item.id == form.value.productModelId);
+ if (selectedModel) {
+ form.value.model = selectedModel.model || '';
+ form.value.unit = selectedModel.unit || '';
+ form.value.thickness = selectedModel.thickness || ''
+ }
+ }
+
+ // 璁剧疆鎸囨爣閫夐」
+ testStandardOptions.value = testStandardRes.data || [];
+
+ // 璁剧疆 testStandardId 骞跺姞杞藉弬鏁板垪琛�
+ nextTick(() => {
+ if (savedTestStandardId) {
+ // 纭繚绫诲瀷鍖归厤锛坕tem.id 鍙兘鏄暟瀛楁垨瀛楃涓诧級
+ const matchedOption = testStandardOptions.value.find(item =>
+ item.id == savedTestStandardId || String(item.id) === String(savedTestStandardId)
+ );
+ if (matchedOption) {
+ // 纭繚浣跨敤鍖归厤椤圭殑 id锛堜繚鎸佺被鍨嬩竴鑷达級
+ form.value.testStandardId = matchedOption.id;
+ } else {
+ // 濡傛灉鎵句笉鍒板尮閰嶉」锛屽皾璇曠洿鎺ヤ娇鐢ㄥ師鍊�
+ console.warn('鏈壘鍒板尮閰嶇殑鎸囨爣閫夐」锛宼estStandardId:', savedTestStandardId, '鍙敤閫夐」:', testStandardOptions.value);
+ form.value.testStandardId = savedTestStandardId;
+ }
+ }
+ // 缂栬緫鍦烘櫙淇濈暀宸叉湁妫�楠屽�硷紝鐩存帴鎷夊彇鍘熷弬鏁版暟鎹�
+ getQualityInspectParamList(row.id);
+ });
+ });
+ } else {
+ getQualityInspectParamList(row.id);
+ }
}
}
const getProductOptions = () => {
- productTreeList().then((res) => {
+ return productTreeList().then((res) => {
productOptions.value = convertIdToValue(res);
});
};
@@ -279,6 +433,7 @@
const handleChangeModel = (value) => {
form.value.model = modelOptions.value.find(item => item.id == value)?.model || '';
form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || '';
+ form.value.thickness = modelOptions.value.find(item => item.id == value)?.thickness || '';
}
const findNodeById = (nodes, productId) => {
@@ -313,6 +468,10 @@
const submitForm = () => {
proxy.$refs.formRef.validate(valid => {
if (valid) {
+ ensureQtyPairInitialized()
+ if (!assertQtySplitOrError()) {
+ return
+ }
form.value.inspectType = 2
if (operationType.value === "add") {
tableData.value.forEach((item) => {
--
Gitblit v1.9.3