From bd0e9c3dd2c2079bf7ab1b1f69832e9d634660f3 Mon Sep 17 00:00:00 2001 From: weiwei Date: Thu, 12 Jun 2025 17:58:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BE=85=E5=8A=A9=E6=9D=A1=E7=A0=81=E5=8D=95?= =?UTF-8?q?=E4=BD=8D=E9=87=8D=E5=A4=8D=E9=80=89=E6=8B=A9=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E5=B9=B6=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useUniqueField.ts | 37 +++++++++++++++++++ .../components/auxiliary-code.vue | 18 +++++++++ 2 files changed, 55 insertions(+) create mode 100644 src/hooks/useUniqueField.ts diff --git a/src/hooks/useUniqueField.ts b/src/hooks/useUniqueField.ts new file mode 100644 index 0000000..f16afde --- /dev/null +++ b/src/hooks/useUniqueField.ts @@ -0,0 +1,37 @@ +import { Ref, ref, watchEffect } from "vue" + +const useUniqueField = (items: Ref, field: Ref | string) => { + const isUnique = ref(true) + const errorMessage = ref("") + + watchEffect(() => { + try { + const seen = new Set() + isUnique.value = true + errorMessage.value = "" + + // 处理非响应式的字段名 + const fieldKey = typeof field === "object" ? field.value : field + + for (const item of items.value) { + const value = item[fieldKey as keyof T] + + // 处理 undefined/null 的特殊情况 + const key = value === null ? "NULL" : value === undefined ? "UNDEFINED" : value + + if (seen.has(key)) { + isUnique.value = false + errorMessage.value = `字段 "${String(fieldKey)}" 存在重复值` + break + } + seen.add(key) + } + } catch (error: any) { + errorMessage.value = `验证失败: ${error.message}` + } + }) + + return { isUnique, errorMessage } +} + +export default useUniqueField diff --git a/src/views/supermarketerp/supermarketSpu/components/auxiliary-code.vue b/src/views/supermarketerp/supermarketSpu/components/auxiliary-code.vue index 16db13a..74dd8f4 100644 --- a/src/views/supermarketerp/supermarketSpu/components/auxiliary-code.vue +++ b/src/views/supermarketerp/supermarketSpu/components/auxiliary-code.vue @@ -130,6 +130,11 @@ const computedSmErpUnitEntityList = computed(() => props.smErpUnitEntityList?.fi // 包装单位下拉选择变化 const handleUnitIdChange = (unitId: string, rowIndex: number) => { + nextTick(() => { + if (!isFieldUnique(auxiliaryCodeList.value, "unit")) { + useMessage().error("包装单位重复") + } + }) ;(auxiliaryCodeList.value[rowIndex] as any).unit = computedSmErpUnitEntityList.value?.find((item: rowVU) => item.id == unitId)?.unit } @@ -144,6 +149,19 @@ const removeSelectRowEvent = () => { } } +// 判断辅助条码是否重复 +const isFieldUnique = (arr: any[], field: string) => { + const seen = new Set() + for (const item of arr) { + const value = item[field] + if (seen.has(value)) { + return false + } + seen.add(value) + } + return true +} + // 校验可编辑表格 成功返回 true 失败返回 false // const editableTableValidate = async () => { // // 全量校验