Compare commits
2 Commits
login
...
46422e8544
| Author | SHA1 | Date | |
|---|---|---|---|
| 46422e8544 | |||
| a30f99f0ad |
49
server.js
49
server.js
@@ -134,19 +134,48 @@ app.get('/api/generate-asset-code', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { prefix } = req.query;
|
const { prefix } = req.query;
|
||||||
if (!prefix) return res.status(400).json({ error: 'Prefix is required' });
|
if (!prefix) return res.status(400).json({ error: 'Prefix is required' });
|
||||||
const tables = ['asset_pc', 'asset_server', 'asset_storage', 'asset_network', 'asset_survey', 'asset_pc_parts', 'asset_equipment', 'asset_office_supplies', 'asset_vip'];
|
|
||||||
|
// asset_code 컬럼이 있는 것으로 확인된 테이블 목록 (DESCRIBE 결과 기반)
|
||||||
|
const tables = [
|
||||||
|
'asset_pc', 'asset_server', 'asset_storage', 'asset_network',
|
||||||
|
'asset_equipment', 'asset_office_supplies', 'asset_survey', 'asset_vip'
|
||||||
|
];
|
||||||
|
|
||||||
let lastCode = '';
|
let lastCode = '';
|
||||||
|
let maxNum = 0;
|
||||||
|
|
||||||
for (const table of tables) {
|
for (const table of tables) {
|
||||||
const [rows] = await pool.query(`SELECT asset_code FROM ${table} WHERE asset_code LIKE ? ORDER BY asset_code DESC LIMIT 1`, [`${prefix}%`]);
|
try {
|
||||||
if (rows.length > 0 && rows[0].asset_code > lastCode) lastCode = rows[0].asset_code;
|
const [rows] = await pool.query(
|
||||||
|
`SELECT asset_code FROM ${table} WHERE asset_code LIKE ? ORDER BY asset_code DESC LIMIT 1`,
|
||||||
|
[`${prefix}%`]
|
||||||
|
);
|
||||||
|
|
||||||
|
if (rows.length > 0) {
|
||||||
|
const code = rows[0].asset_code;
|
||||||
|
// 숫자 부분 추출 (예: SVR048 -> 48)
|
||||||
|
const numMatch = code.match(/\d+/);
|
||||||
|
if (numMatch) {
|
||||||
|
const num = parseInt(numMatch[0]);
|
||||||
|
if (num > maxNum) {
|
||||||
|
maxNum = num;
|
||||||
|
lastCode = code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn(`[GENERATE CODE] Skipping ${table}: ${err.message}`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
let nextNum = 1;
|
|
||||||
if (lastCode) {
|
const nextNum = maxNum + 1;
|
||||||
const lastNum = parseInt(lastCode.split('-').pop() || '0');
|
const nextCode = `${prefix}${String(nextNum).padStart(3, '0')}`;
|
||||||
nextNum = lastNum + 1;
|
|
||||||
}
|
console.log(`🆕 [GENERATE CODE] Prefix: ${prefix}, Last: ${lastCode}, Next: ${nextCode}`);
|
||||||
res.json({ nextCode: `${prefix}${String(nextNum).padStart(3, '0')}` });
|
res.json({ nextCode });
|
||||||
} catch (err) { handleError(res, err, 'GENERATE CODE'); }
|
} catch (err) {
|
||||||
|
handleError(res, err, 'GENERATE CODE');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 6. Map Config API (Real-time Save)
|
// 6. Map Config API (Real-time Save)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import {
|
|||||||
bindLocationEvents,
|
bindLocationEvents,
|
||||||
applyDateMask
|
applyDateMask
|
||||||
} from './ModalUtils';
|
} from './ModalUtils';
|
||||||
import { CORP_LIST, LOCATION_DATA, CATEGORY_TYPE_MAP, HW_STATUS_LIST, ORG_LIST, IMAGE_LOCATIONS } from './SharedData';
|
import { CORP_LIST, LOCATION_DATA, CATEGORY_TYPE_MAP, HW_STATUS_LIST, ORG_LIST, IMAGE_LOCATIONS, TYPE_PREFIX_MAP } from './SharedData';
|
||||||
import { BaseModal } from './BaseModal';
|
import { BaseModal } from './BaseModal';
|
||||||
import { createIcons, X, History, Plus, Save, Paperclip, Calendar, Monitor, Cpu, Network, ShieldCheck } from 'lucide';
|
import { createIcons, X, History, Plus, Save, Paperclip, Calendar, Monitor, Cpu, Network, ShieldCheck } from 'lucide';
|
||||||
|
|
||||||
@@ -278,6 +278,23 @@ class HwAssetModal extends BaseModal {
|
|||||||
: '<option value="">구분을 먼저 선택하세요</option>';
|
: '<option value="">구분을 먼저 선택하세요</option>';
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.getElementById('btn-gen-hw-code')?.addEventListener('click', async () => {
|
||||||
|
const cat = categorySelect.value;
|
||||||
|
if (!cat) { alert('구분을 먼저 선택해주세요.'); return; }
|
||||||
|
|
||||||
|
const prefix = TYPE_PREFIX_MAP[cat] || 'ETC';
|
||||||
|
|
||||||
|
try {
|
||||||
|
const res = await fetch(`http://${location.hostname}:3000/api/generate-asset-code?prefix=${prefix}`);
|
||||||
|
const data = await res.json();
|
||||||
|
if (data.nextCode) {
|
||||||
|
setFieldValue('hw-asset_code', data.nextCode);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('코드 생성 실패:', err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
bldgSelect.addEventListener('change', () => setTimeout(() => this.updateMapButtonVisibility(), 100));
|
bldgSelect.addEventListener('change', () => setTimeout(() => this.updateMapButtonVisibility(), 100));
|
||||||
detailSelect.addEventListener('change', () => this.updateMapButtonVisibility());
|
detailSelect.addEventListener('change', () => this.updateMapButtonVisibility());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user