From 3388c1efdb2136ebddda219198e6a69957b51454 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Wed, 19 Aug 2026 11:46:39 +0800 Subject: [PATCH] feat: submit storage release reviews for one side only. Co-authored-by: Cursor --- .../StorageReleaseReviewDialog.vue | 83 ++++++++++++++++++- 1 file changed, 81 insertions(+), 2 deletions(-) diff --git a/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue b/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue index 2fe55ea6..b64c1385 100644 --- a/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue +++ b/web-admin/src/views/quality-inspection/storage-release-review/StorageReleaseReviewDialog.vue @@ -149,6 +149,11 @@ +
+ {{ peerSideLabel }}: + {{ peerConclusionText }} +
+ () const emit = defineEmits<{ @@ -367,7 +375,27 @@ const submittedCount = computed(() => Object.keys(queueDecision).length) const dialogTitle = computed(() => - isBatchMode.value ? `批量审核(${props.reviewIds.length} 条)` : '入库放行审核' + isBatchMode.value + ? `批量审核(${props.reviewIds.length} 条)` + : props.reviewSide === 'production' + ? '生产入库放行审核' + : '质检入库放行审核' + ) + + const peerSideLabel = computed(() => + props.reviewSide === 'production' ? '质检结论' : '生产结论' + ) + const peerConclusion = computed(() => { + const rev = activeDetail.value?.review + return props.reviewSide === 'production' + ? rev?.qcReviewConclusion || '' + : rev?.prodReviewConclusion || '' + }) + const peerConclusionText = computed(() => + peerConclusion.value ? storageReleaseConclusionLabel(peerConclusion.value) : '待审核' + ) + const peerTagType = computed(() => + peerConclusion.value ? storageReleaseConclusionTagType(peerConclusion.value) : 'info' ) const dialogWidth = computed(() => (isBatchMode.value ? '1480px' : '1200px')) @@ -490,17 +518,58 @@ return 'is-pending' } + function parseAttachmentUrls(urls: string): AttachmentItem[] { + if (!urls.trim()) return [] + return urls + .split(',') + .map((u, i) => { + const url = u.trim() + if (!url) return null + const name = url.includes('/') ? url.split('/').pop() || `附件${i + 1}` : url + return { + id: `att_${i}`, + fileName: name, + fileUrl: url, + fileType: '' + } + }) + .filter(Boolean) as AttachmentItem[] + } + + function applySidePrefill() { + const rev = activeDetail.value?.review + if (!rev) { + form.reviewConclusion = 'tg' + form.reviewRemark = '' + attachmentFiles.value = [] + _pendingList = null + return + } + const existing = + props.reviewSide === 'production' ? rev.prodReviewConclusion : rev.qcReviewConclusion + form.reviewConclusion = existing === 'tg' || existing === 'btg' ? existing : 'tg' + form.reviewRemark = + (props.reviewSide === 'production' ? rev.prodReviewRemark : rev.qcReviewRemark) || '' + const attachments = + props.reviewSide === 'production' ? rev.prodReviewAttachments : rev.qcReviewAttachments + attachmentFiles.value = parseAttachmentUrls(String(attachments || '')) + _pendingList = null + } + async function loadActiveDetail() { const id = activeReviewId.value if (!id || !showEvidenceLayout.value) { activeDetail.value = null + applySidePrefill() return } detailLoading.value = true try { activeDetail.value = await fetchStorageReleaseReviewDetail(id) + applySidePrefill() } catch { activeDetail.value = null + applySidePrefill() } finally { detailLoading.value = false } @@ -543,6 +612,7 @@ .map((f) => f.fileUrl) .join(',') return { + reviewSide: props.reviewSide, reviewConclusion: form.reviewConclusion, reviewRemark: form.reviewRemark.trim() || undefined, reviewAttachments: attachmentUrls || undefined @@ -911,6 +981,15 @@ border-radius: 8px; } + .review-peer-readonly { + display: flex; + gap: 8px; + align-items: center; + margin-bottom: 12px; + font-size: 14px; + color: var(--mint-text-muted, #334155); + } + .review-info-summary { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));