From 6ed939c6bfb2f1c82d5c1259e050d416a3177549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=ED=83=9C=ED=9B=88?= Date: Thu, 25 Jun 2026 13:41:31 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20CPU,=20GPU,=20RAM=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=20=EC=8B=9C=20=EB=B6=80=ED=92=88=20=EB=A7=88=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=20=EA=B8=B0=EC=A4=80=20=EC=A0=95=ED=95=A9=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=95=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 24 ++++++++++++++++++++++++ src/components/Modal/HWModal.ts | 21 +++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/server.js b/server.js index 5b57665..865ffc1 100644 --- a/server.js +++ b/server.js @@ -261,6 +261,30 @@ app.post('/api/asset/:category/save', async (req, res) => { connection = await pool.getConnection(); await connection.beginTransaction(); + // 3.0.0 CPU, GPU, RAM 부품 마스터 유효성 검사 + const partsToCheck = [ + { value: asset.cpu, category: 'CPU', label: 'CPU' }, + { value: asset.gpu, category: 'GPU', label: 'GPU' }, + { value: asset.ram, category: 'RAM', label: 'RAM' } + ]; + + for (const part of partsToCheck) { + const val = String(part.value || '').trim(); + if (val) { + const [rows] = await connection.query( + 'SELECT id FROM hardware_components_master WHERE UPPER(category) = ? AND LOWER(TRIM(component_name)) = ?', + [part.category, val.toLowerCase()] + ); + if (rows.length === 0) { + await connection.rollback(); + return res.status(400).json({ + success: false, + message: `입력하신 ${part.label} "${val}"은(는) 부품 마스터에 존재하지 않는 규격입니다.` + }); + } + } + } + // 3.0 History Tracking & Auto Field Update const [oldCoreRows] = await connection.query('SELECT * FROM asset_core WHERE id = ?', [asset.id]); const [oldSpecRows] = await connection.query('SELECT * FROM asset_spec WHERE asset_id = ?', [asset.id]); diff --git a/src/components/Modal/HWModal.ts b/src/components/Modal/HWModal.ts index 945cf18..815699c 100644 --- a/src/components/Modal/HWModal.ts +++ b/src/components/Modal/HWModal.ts @@ -454,6 +454,27 @@ class HwAssetModal extends BaseModal { formData.forEach((value, key) => { if (key !== 'id') updated[key] = value; }); updated.location = bldgSelect.value; + // 부품 마스터 기준 정합성 검증 (CPU, GPU, RAM) + const checkFields = [ + { name: 'cpu', label: 'CPU', category: 'CPU' }, + { name: 'gpu', label: 'GPU', category: 'GPU' }, + { name: 'ram', label: 'RAM', category: 'RAM' } + ]; + + for (const field of checkFields) { + const value = String(updated[field.name] || '').trim(); + if (value) { + const isExists = this.masterComponents.some(c => + c.category.toUpperCase() === field.category && + c.component_name.trim().toLowerCase() === value.toLowerCase() + ); + if (!isExists) { + alert(`입력하신 ${field.label} "${value}"은(는) 부품 마스터에 등록되지 않은 규격입니다. 자동완성 목록에서 선택하거나 부품마스터에 먼저 등록해 주세요.`); + return; + } + } + } + if (await saveAsset(this.getCategoryKey(updated), updated)) { alert(UI_TEXT.MESSAGES.SAVE_SUCCESS); onSave(); this.close(); closeModals();