From fdd158306bf6dc3584f5110a385323f4a8dfb463 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 02 九月 2026 14:25:10 +0800
Subject: [PATCH] feat(wms): 重构仓库管理系统并优化图表显示
---
src/views/mes/qc/seedQuality/index.vue | 52 +++++++++++++++++++++++++++++++++++-----------------
1 files changed, 35 insertions(+), 17 deletions(-)
diff --git a/src/views/mes/qc/seedQuality/index.vue b/src/views/mes/qc/seedQuality/index.vue
index 0a61ccc..ca55a98 100644
--- a/src/views/mes/qc/seedQuality/index.vue
+++ b/src/views/mes/qc/seedQuality/index.vue
@@ -3,14 +3,12 @@
import { message, Modal } from 'ant-design-vue';
import { IconifyIcon } from '@vben/icons';
+import { MesWmWarehouseTypeEnum } from '@vben/constants';
import { gsap } from 'gsap';
-import MdItemSelect from '#/views/mes/md/item/components/select.vue';
-
-import {
- submitSeedQuality,
- type MesQcSeedQualityApi,
-} from '#/api/mes/qc/seedQuality';
+import type { MesWmWarehouseApi } from '#/api/mes/wm/warehouse';
+import { submitSeedQuality } from '#/api/mes/qc/seedQuality';
+import { getWarehouseSimpleList } from '#/api/mes/wm/warehouse';
interface IndicatorForm {
code: string;
@@ -23,12 +21,15 @@
const pageRoot = ref<HTMLElement>();
const code = ref('');
-const itemId = ref<number>();
const batchCode = ref('');
const reason = ref('');
const loading = ref(false);
const submittedId = ref<number>();
let animationContext: gsap.Context | undefined;
+
+/** 鍙�夊悎鏍间粨搴擄紙浠撳簱绫诲瀷=20 鍚堟牸搴擄級 */
+const qualifiedWarehouses = ref<MesWmWarehouseApi.Warehouse[]>([]);
+const qualifiedWarehouseId = ref<number>();
const indicators = ref<IndicatorForm[]>([
{ code: 'purity', label: '绾害', unit: '%', minValue: 0, maxValue: 100 },
@@ -50,7 +51,6 @@
function resetForm(clearResult = true) {
code.value = '';
- itemId.value = undefined;
batchCode.value = '';
reason.value = '';
if (clearResult) submittedId.value = undefined;
@@ -62,12 +62,16 @@
}
async function submit() {
- if (!code.value.trim() || !itemId.value) {
- message.warning('璇峰~鍐欒鐮佸苟閫夋嫨鐗╂枡');
+ if (!code.value.trim()) {
+ message.warning('璇峰~鍐欒鐮�');
return;
}
if (!allEntered.value) {
message.warning('璇峰厛濉啓鍥涢」鎸囨爣鐨勫疄娴嬪��');
+ return;
+ }
+ if (!qualifiedWarehouseId.value) {
+ message.warning('璇烽�夋嫨鍏ュ簱鍚堟牸搴�');
return;
}
if (indicators.value.some((item) => item.minValue === undefined || item.maxValue === undefined || item.minValue > item.maxValue)) {
@@ -98,7 +102,6 @@
try {
submittedId.value = await submitSeedQuality({
code: code.value.trim(),
- itemId: itemId.value,
batchCode: batchCode.value.trim() || undefined,
indicators: indicators.value.map(({ code: indicatorCode, value, minValue, maxValue }) => ({
code: indicatorCode,
@@ -107,6 +110,7 @@
maxValue: maxValue as number,
})),
reason: reason.value.trim() || undefined,
+ qualifiedWarehouseId: qualifiedWarehouseId.value,
});
message.success(`璐ㄦ鎻愪氦鎴愬姛锛岃川妫�缂栧彿锛�${submittedId.value}`);
if (pageRoot.value && !window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
@@ -122,6 +126,14 @@
}
onMounted(async () => {
+ try {
+ const warehouses = await getWarehouseSimpleList();
+ qualifiedWarehouses.value = (warehouses ?? []).filter(
+ (item) => item.type === MesWmWarehouseTypeEnum.QUALIFIED,
+ );
+ } catch {
+ qualifiedWarehouses.value = [];
+ }
await nextTick();
if (!pageRoot.value) return;
animationContext = gsap.context(() => {
@@ -162,10 +174,16 @@
<a-form layout="vertical">
<div class="base-grid">
<a-form-item label="琚嬬爜" required><a-input v-model:value="code" size="large" :disabled="loading" placeholder="璇疯緭鍏ユ垨鎵弿琚嬬爜" /></a-form-item>
- <a-form-item label="鐗╂枡" required>
- <MdItemSelect v-model="itemId" :disabled="loading" size="large" placeholder="璇烽�夋嫨鐗╂枡" />
- </a-form-item>
<a-form-item label="鐢熶骇鎵规"><a-input v-model:value="batchCode" size="large" :disabled="loading" placeholder="璇疯緭鍏ユ壒娆″彿锛堥�夊~锛�" /></a-form-item>
+ <a-form-item label="鍏ュ簱鍚堟牸搴�" required class="full-width">
+ <a-select
+ v-model:value="qualifiedWarehouseId"
+ size="large"
+ :disabled="loading"
+ placeholder="璇烽�夋嫨璐ㄦ鍚堟牸鍚庡叆搴撶殑鍚堟牸搴�"
+ :options="qualifiedWarehouses.map((item) => ({ label: `${item.name}锛�${item.code}锛塦, value: item.id }))"
+ />
+ </a-form-item>
</div>
<a-divider orientation="left">鎸囨爣缁撴灉</a-divider>
@@ -190,7 +208,7 @@
<template #title><div class="card-title"><IconifyIcon icon="ep:data-analysis" />鍒ゅ畾璇存槑</div></template>
<div class="result-hero" :class="overallPassed ? 'passed' : allEntered ? 'failed-result' : 'pending-result'"><IconifyIcon :icon="overallPassed ? 'ep:circle-check-filled' : allEntered ? 'ep:warning-filled' : 'ep:edit-pen'" /><strong>{{ overallPassed ? '褰撳墠缁撴灉鍚堟牸' : allEntered ? '褰撳墠瀛樺湪涓嶅悎鏍奸」' : '绛夊緟褰曞叆鎸囨爣' }}</strong><span>{{ allEntered ? '瀹炴祴鍊奸渶澶勪簬鏈�灏忓�间笌鏈�澶у�间箣闂�' : `宸插綍鍏� ${enteredCount} / 4 椤瑰疄娴嬪�糮 }}</span></div>
<div class="rule-list"><div><IconifyIcon icon="ep:check" /><span>鍥涢」鎸囨爣蹇呴』鍏ㄩ儴鎻愪氦</span></div><div><IconifyIcon icon="ep:check" /><span>杈圭晫鍊兼寜鍚堟牸澶勭悊</span></div><div><IconifyIcon icon="ep:check" /><span>涓嶅悎鏍肩粨鏋滈渶淇濈暀鍘熷洜</span></div><div><IconifyIcon icon="ep:check" /><span>璐ㄦ鍛樹笌妫�楠屾椂闂寸敱鏈嶅姟绔褰�</span></div></div>
- <a-alert message="搴撳瓨娴佽浆鐢卞悗绔鐞�" description="鍚堟牸鍝佸皢浠庢殏瀛樺簱杞叆姝e紡搴撳瓨锛涗笉鍚堟牸鍝佸皢鐩存帴娓呴櫎鏆傚瓨搴撳瓨骞朵繚鐣欎笉鍚堟牸鍘熷洜銆傝川妫�鍛樺拰妫�楠屾椂闂寸敱鏈嶅姟绔褰曪紝鏈〉闈笉閫夋嫨浠撳簱銆佸簱鍖烘垨搴撲綅銆�" type="info" show-icon />
+ <a-alert message="搴撳瓨娴佽浆鐢卞悗绔鐞�" description="鍚堟牸鍝佸皢鎸夋墍閫夈�屽叆搴撳悎鏍煎簱銆嶄粠鏆傚瓨搴撳瓨鍏ヨ鍚堟牸搴擄紱涓嶅悎鏍煎搧灏嗙洿鎺ユ竻闄ゆ殏瀛樺簱瀛樺苟淇濈暀涓嶅悎鏍煎師鍥犮�傝川妫�鍛樺拰妫�楠屾椂闂寸敱鏈嶅姟绔褰曘��" type="info" show-icon />
<div v-if="submittedId" class="success-note"><IconifyIcon icon="ep:success-filled" /><span>鏈�杩戞彁浜よ川妫�缂栧彿锛�<strong>{{ submittedId }}</strong></span></div>
</a-card>
</section>
@@ -200,9 +218,9 @@
<style scoped>
.quality-page { min-height: 100%; padding: 24px; background: #f4f7fb; color: #172033; }
.page-header { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 22px; }.eyebrow { color: #1677ff; font-size: 12px; font-weight: 700; letter-spacing: .08em; }.page-header h1 { margin: 6px 0; font-size: 28px; }.page-header p { margin: 0; color: #718096; }.header-badge { display: inline-flex; align-items: center; gap: 8px; padding: 9px 13px; border: 1px solid #cfe0fb; border-radius: 7px; color: #1677ff; background: #f0f6ff; font-size: 13px; font-weight: 600; }
-.summary-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 18px; }.summary-card { display: flex; align-items: flex-start; gap: 14px; padding: 17px 19px; border: 1px solid #e8edf5; border-radius: 10px; background: #fff; box-shadow: 0 3px 12px #243b5310; }.summary-card > .iconify { flex: 0 0 38px; width: 38px; height: 38px; padding: 9px; border-radius: 8px; font-size: 20px; }.summary-card.blue > .iconify { color: #1677ff; background: #eaf3ff; }.summary-card.green > .iconify { color: #17a673; background: #e6f8f0; }.summary-card.red > .iconify { color: #e05252; background: #fff0f0; }.summary-card span, .summary-card small { display: block; color: #7b8799; font-size: 12px; }.summary-card strong { display: block; margin: 4px 0; font-size: 23px; }.content-grid { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(310px, .75fr); gap: 18px; }.form-card, .result-card { border-radius: 10px; box-shadow: 0 3px 12px #243b5310; }.card-title { display: flex; align-items: center; gap: 9px; font-weight: 700; }.card-title :deep(.iconify) { color: #1677ff; }.base-grid { display: grid; grid-template-columns: 1.3fr 1fr 1.2fr; gap: 16px; }.full-width { width: 100%; }
+.summary-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 18px; }.summary-card { display: flex; align-items: flex-start; gap: 14px; padding: 17px 19px; border: 1px solid #e8edf5; border-radius: 10px; background: #fff; box-shadow: 0 3px 12px #243b5310; }.summary-card > .iconify { flex: 0 0 38px; width: 38px; height: 38px; padding: 9px; border-radius: 8px; font-size: 20px; }.summary-card.blue > .iconify { color: #1677ff; background: #eaf3ff; }.summary-card.green > .iconify { color: #17a673; background: #e6f8f0; }.summary-card.red > .iconify { color: #e05252; background: #fff0f0; }.summary-card span, .summary-card small { display: block; color: #7b8799; font-size: 12px; }.summary-card strong { display: block; margin: 4px 0; font-size: 23px; }.content-grid { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(310px, .75fr); gap: 18px; }.form-card, .result-card { border-radius: 10px; box-shadow: 0 3px 12px #243b5310; }.card-title { display: flex; align-items: center; gap: 9px; font-weight: 700; }.card-title :deep(.iconify) { color: #1677ff; }.base-grid { display: grid; grid-template-columns: 1.3fr 1.2fr; gap: 16px; }.full-width { width: 100%; }
.indicator-list { display: flex; flex-direction: column; gap: 10px; }.indicator-row { display: flex; align-items: center; gap: 9px; padding: 11px 12px; border: 1px solid #e8edf5; border-radius: 7px; background: #fbfcfe; }.indicator-row.failed { border-color: #ffd6d6; background: #fffafa; }.indicator-name { display: flex; align-items: center; gap: 8px; min-width: 82px; }.indicator-name small { color: #8793a5; font-size: 12px; }.indicator-dot { width: 8px; height: 8px; border-radius: 50%; }.indicator-dot.pass { background: #20b878; }.indicator-dot.fail { background: #e05252; }.indicator-input { width: 105px; }.range-input { width: 88px; }.range-separator { margin-left: auto; color: #8793a5; font-size: 12px; }.reason-item { margin-top: 18px; }.form-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 5px; }.form-actions :deep(.iconify) { margin-right: 5px; }
.result-hero { display: flex; flex-direction: column; align-items: center; gap: 8px; margin: 8px 0 22px; padding: 25px 15px; border-radius: 8px; text-align: center; }.result-hero :deep(.iconify) { font-size: 35px; }.result-hero strong { font-size: 18px; }.result-hero span { color: #718096; font-size: 12px; }.result-hero.passed { color: #16835b; background: #effaf5; }.result-hero.failed-result { color: #c53e3e; background: #fff3f3; }.result-hero.pending-result { color: #1677ff; background: #f0f6ff; }.rule-list { display: flex; flex-direction: column; gap: 14px; margin-bottom: 22px; }.rule-list div { display: flex; align-items: center; gap: 9px; color: #59677b; font-size: 13px; }.rule-list :deep(.iconify) { color: #20b878; }.success-note { display: flex; align-items: center; gap: 8px; margin-top: 16px; padding: 11px 12px; border-radius: 7px; color: #16835b; background: #effaf5; font-size: 13px; }
-@media (max-width: 1050px) { .content-grid { grid-template-columns: 1fr; }.base-grid { grid-template-columns: repeat(3, 1fr); } }
+@media (max-width: 1050px) { .content-grid { grid-template-columns: 1fr; }.base-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 760px) { .quality-page { padding: 14px; }.page-header { display: block; }.header-badge { margin-top: 14px; }.summary-grid, .base-grid { grid-template-columns: 1fr; }.indicator-row { flex-wrap: wrap; }.range-separator { margin-left: 0; }.indicator-input { flex: 1; min-width: 105px; }.range-input { flex: 1; min-width: 75px; } }
</style>
--
Gitblit v1.9.3