From a7290f1803661c60f9d644a7d42af70bd9d75226 Mon Sep 17 00:00:00 2001 From: hwj Date: Mon, 29 Jun 2026 16:02:57 +0800 Subject: [PATCH] =?UTF-8?q?style=EF=BC=9A=E7=9B=98=E7=82=B9=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E5=88=97=E8=A1=A8-=E6=93=8D=E4=BD=9C=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pages/productCheck/index.vue | 80 ++++++++++++++----- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/src/pages_function/pages/productCheck/index.vue b/src/pages_function/pages/productCheck/index.vue index 9941478..0c4e987 100644 --- a/src/pages_function/pages/productCheck/index.vue +++ b/src/pages_function/pages/productCheck/index.vue @@ -67,11 +67,19 @@ - {{ t('productCheck.execute') }} + + {{ t('productCheck.execute') }} + {{ t('productCheck.submitAudit') }} - {{ t('productCheck.auditPass') }} - {{ t('productCheck.auditReject') }} - {{ t('productCheck.delete') }} + {{ t('productCheck.auditPass') }} + {{ t('productCheck.auditReject') }} + + {{ t('productCheck.delete') }} + @@ -149,19 +157,27 @@ import { useI18n } from 'vue-i18n' import NavBar from '@/components/common/NavBar.vue' import { auditProductCheck, deleteProductCheck, getProductCheckPage, submitProductCheck } from '@/api/mes/productCheck' import { getConfigPage } from '@/api/infra/config' +import { DICT_TYPE, useDict } from '@/utils/dict' const { t } = useI18n() +const { erp_audit_status } = useDict(DICT_TYPE.ERP_AUDIT_STATUS) const selectedStatus = ref('') const searchKeyword = ref('') const statusPickerRef = ref(null) -const statusOptions = computed(() => [ +const fallbackStatusOptions = computed(() => [ { label: t('productCheck.statusDraft'), value: '0' }, { label: t('productCheck.statusAuditing'), value: '10' }, { label: t('productCheck.statusApproved'), value: '20' }, { label: t('productCheck.statusRejected'), value: '1' } ]) +const statusOptions = computed(() => { + const dictOptions = (erp_audit_status.value || []) + .filter((item) => item?.label !== undefined && item?.value !== undefined) + .map((item) => ({ ...item, value: String(item.value) })) + return dictOptions.length ? dictOptions : fallbackStatusOptions.value +}) const selectedStatusLabel = computed(() => { - const current = statusOptions.value.find((item) => item.value === selectedStatus.value) + const current = statusOptions.value.find((item) => String(item.value) === String(selectedStatus.value)) return current ? current.label : '' }) const list = ref([]) @@ -214,13 +230,8 @@ function normalizePageData(res) { } function statusText(s) { - const map = { - 0: t('productCheck.statusDraft'), - 1: t('productCheck.statusRejected'), - 10: t('productCheck.statusAuditing'), - 20: t('productCheck.statusApproved') - } - return map[Number(s)] || textValue(s) + const current = statusOptions.value.find((item) => String(item.value) === String(s)) + return current ? current.label : textValue(s) } function statusClass(s) { @@ -240,6 +251,10 @@ function checkStatusText(s) { return Number(s) === 1 ? t('productCheck.checked') : t('productCheck.unchecked') } +function statusValue(item) { + return Number(item?.status) +} + function getProductNames(item) { const items = Array.isArray(item?.items) ? item.items : [] return [...new Set(items.map((row) => row.productName).filter(Boolean))].join('、') @@ -250,17 +265,34 @@ function getWarehouseNames(item) { return [...new Set(items.map((row) => row.warehouseName).filter(Boolean))].join('、') } +function shouldShowExecute(item) { + return !isChecked(item) || statusValue(item) === 1 +} + +function isExecuteDisabled(item) { + return statusValue(item) === 20 +} + function canExecute(item) { - return Number(item?.status) !== 20 && !isChecked(item) + return shouldShowExecute(item) && !isExecuteDisabled(item) } function canSubmitAudit(item) { - const status = Number(item?.status) - return (status === 0 || status === 1) && isChecked(item) + const status = statusValue(item) + const submitStatuses = isAuditDisabled.value ? [0, 1, 10] : [0, 1] + return submitStatuses.includes(status) && isChecked(item) +} + +function canAudit(item) { + return !isAuditDisabled.value && statusValue(item) === 10 && isChecked(item) +} + +function canDelete(item) { + return statusValue(item) !== 20 } function hasActions(item) { - return canExecute(item) || canSubmitAudit(item) || Number(item?.status) === 10 || Number(item?.status) !== 20 + return shouldShowExecute(item) || canSubmitAudit(item) || canAudit(item) || canDelete(item) } function hasIncompleteActualCount(item) { const rows = Array.isArray(item?.items) ? item.items : [] @@ -340,7 +372,7 @@ function openStatusPicker() { } async function selectStatus(option) { - selectedStatus.value = option.value + selectedStatus.value = String(option.value) statusPickerRef.value?.close() await fetchList(true) } @@ -366,6 +398,11 @@ function goExecute(item) { uni.navigateTo({ url: `/pages_function/pages/productCheck/execute?id=${encodeURIComponent(String(item.id))}` }) } +function handleExecute(item) { + if (!canExecute(item)) return + goExecute(item) +} + function goDetail(item) { if (!item?.id) return uni.navigateTo({ url: `/pages_function/pages/productCheck/execute?id=${encodeURIComponent(String(item.id))}&mode=detail` }) @@ -439,7 +476,7 @@ async function confirmSubmitAudit() { } async function handleApprove(item) { - if (!item?.id) return + if (!item?.id || !canAudit(item)) return uni.showModal({ title: t('productCheck.tip'), content: t('productCheck.confirmAuditPass'), @@ -458,7 +495,7 @@ async function handleApprove(item) { } async function handleReject(item) { - if (!item?.id) return + if (!item?.id || !canAudit(item)) return uni.showModal({ title: t('productCheck.tip'), content: t('productCheck.confirmAuditReject'), @@ -477,7 +514,7 @@ async function handleReject(item) { } async function handleDelete(item) { - if (!item?.id) return + if (!item?.id || !canDelete(item)) return uni.showModal({ title: t('productCheck.tip'), content: t('productCheck.confirmDelete'), @@ -557,6 +594,7 @@ onUnload(() => clearSearchTimer()) .reject-btn, .delete-btn { background: #fee2e2; color: #dc2626; } .submit-btn { background: #dbeafe; color: #1d4ed8; } +.action-btn-disabled { background: #f1f5f9; color: #94a3b8; } .record-tag.text-success { color: #15803d; background: #dcfce7; } .record-tag.text-danger { color: #dc2626; background: #fee2e2; } .record-tag.text-warning { color: #d97706; background: #fef3c7; }