feat: 소프트웨어 자산 관리 기능 고도화 및 대시보드 누적 비용 분석 기능 추가
This commit is contained in:
46
server.js
46
server.js
@@ -44,12 +44,8 @@ async function ensureTables() {
|
||||
`);
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS asset_logs (
|
||||
id VARCHAR(50) PRIMARY KEY,
|
||||
asset_id VARCHAR(50),
|
||||
log_date VARCHAR(50),
|
||||
log_user VARCHAR(100),
|
||||
details TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
id INT AUTO_INCREMENT PRIMARY KEY, asset_id VARCHAR(50), log_date VARCHAR(50),
|
||||
log_user VARCHAR(100), details TEXT, cost DECIMAL(15,2) DEFAULT 0
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
`);
|
||||
await connection.query(`
|
||||
@@ -71,7 +67,7 @@ async function ensureTables() {
|
||||
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS sw_sub_assets (
|
||||
id VARCHAR(50) PRIMARY KEY, corp VARCHAR(100), asset_code VARCHAR(100),
|
||||
id VARCHAR(50) PRIMARY KEY, corp VARCHAR(100),
|
||||
category VARCHAR(100), dept VARCHAR(100), product_name VARCHAR(255),
|
||||
license_type VARCHAR(100), quantity INT, price VARCHAR(100), purchase_date VARCHAR(50),
|
||||
start_date VARCHAR(50), expiry_date VARCHAR(50), vendor VARCHAR(100), remarks TEXT
|
||||
@@ -79,10 +75,16 @@ async function ensureTables() {
|
||||
`);
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS sw_perm_assets (
|
||||
id VARCHAR(50) PRIMARY KEY, corp VARCHAR(100), asset_code VARCHAR(100),
|
||||
id VARCHAR(50) PRIMARY KEY, corp VARCHAR(100),
|
||||
category VARCHAR(100), dept VARCHAR(100), product_name VARCHAR(255),
|
||||
license_key VARCHAR(255), quantity INT, price VARCHAR(100), purchase_date VARCHAR(50),
|
||||
start_date VARCHAR(50), vendor VARCHAR(100), remarks TEXT
|
||||
start_date VARCHAR(50), expiry_date VARCHAR(50), vendor VARCHAR(100), remarks TEXT
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
`);
|
||||
await connection.query(`
|
||||
CREATE TABLE IF NOT EXISTS asset_logs (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY, asset_id VARCHAR(50), log_date VARCHAR(50),
|
||||
log_user VARCHAR(100), details TEXT, cost DECIMAL(15,2) DEFAULT 0
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||
`);
|
||||
await connection.query(`
|
||||
@@ -277,7 +279,7 @@ app.get('/api/sw/sub', async (req, res) => {
|
||||
try {
|
||||
const [rows] = await pool.query('SELECT * FROM sw_sub_assets');
|
||||
res.json(rows.map(r => ({
|
||||
id: r.id, type: '구독SW', 법인: r.corp, 자산번호: r.asset_code,
|
||||
id: r.id, type: '구독SW', 법인: r.corp,
|
||||
분야: r.category, 부서: r.dept, 제품명: r.product_name,
|
||||
라이선스유형: r.license_type, 수량: r.quantity, 금액: r.price,
|
||||
구매일: r.purchase_date, 시작일: r.start_date, 만료일: r.expiry_date,
|
||||
@@ -289,9 +291,9 @@ app.get('/api/sw/sub', async (req, res) => {
|
||||
app.post('/api/sw/sub/batch', async (req, res) => {
|
||||
try {
|
||||
const result = await batchSave('sw_sub_assets', req.body, (assets) => ({
|
||||
sql: `INSERT INTO sw_sub_assets (id, corp, asset_code, category, dept, product_name, license_type, quantity, price, purchase_date, start_date, expiry_date, vendor, remarks) VALUES ?`,
|
||||
sql: `INSERT INTO sw_sub_assets (id, corp, category, dept, product_name, license_type, quantity, price, purchase_date, start_date, expiry_date, vendor, remarks) VALUES ?`,
|
||||
values: assets.map(a => [
|
||||
a.id, a.법인||'', a.자산번호||'', a.분야||'', a.부서||'', a.제품명||'',
|
||||
a.id, a.법인||'', a.분야||'', a.부서||'', a.제품명||'',
|
||||
a.라이선스유형||'', a.수량||0, a.금액||'', a.구매일||'', a.시작일||'', a.만료일||'', a.납품업체||'', a.비고||''
|
||||
])
|
||||
}));
|
||||
@@ -304,10 +306,10 @@ app.get('/api/sw/perm', async (req, res) => {
|
||||
try {
|
||||
const [rows] = await pool.query('SELECT * FROM sw_perm_assets');
|
||||
res.json(rows.map(r => ({
|
||||
id: r.id, type: '영구SW', 법인: r.corp, 자산번호: r.asset_code,
|
||||
id: r.id, type: '영구SW', 법인: r.corp,
|
||||
분야: r.category, 부서: r.dept, 제품명: r.product_name,
|
||||
라이선스키: r.license_key, 수량: r.quantity, 금액: r.price,
|
||||
구매일: r.purchase_date, 시작일: r.start_date,
|
||||
구매일: r.purchase_date, 시작일: r.start_date, 만료일: r.expiry_date,
|
||||
납품업체: r.vendor, 비고: r.remarks
|
||||
})));
|
||||
} catch (err) { res.status(500).json({ error: err.message }); }
|
||||
@@ -315,11 +317,13 @@ app.get('/api/sw/perm', async (req, res) => {
|
||||
|
||||
app.post('/api/sw/perm/batch', async (req, res) => {
|
||||
try {
|
||||
console.log('📦 Permanent SW Batch Save Request:', req.body.length, 'items');
|
||||
if (req.body.length > 0) console.log('Sample:', req.body[0]);
|
||||
const result = await batchSave('sw_perm_assets', req.body, (assets) => ({
|
||||
sql: `INSERT INTO sw_perm_assets (id, corp, asset_code, category, dept, product_name, license_key, quantity, price, purchase_date, start_date, vendor, remarks) VALUES ?`,
|
||||
sql: `INSERT INTO sw_perm_assets (id, corp, category, dept, product_name, license_key, quantity, price, purchase_date, start_date, expiry_date, vendor, remarks) VALUES ?`,
|
||||
values: assets.map(a => [
|
||||
a.id, a.법인||'', a.자산번호||'', a.분야||'', a.부서||'', a.제품명||'',
|
||||
a.라이선스키||'', a.수량||0, a.금액||'', a.구매일||'', a.시작일||'', a.납품업체||'', a.비고||''
|
||||
a.id, a.법인||'', a.분야||'', a.부서||'', a.제품명||'',
|
||||
a.라이선스키||'', a.수량||0, a.금액||'', a.구매일||'', a.시작일||'', a.만료일||'', a.납품업체||'', a.비고||''
|
||||
])
|
||||
}));
|
||||
res.json(result);
|
||||
@@ -353,16 +357,16 @@ app.get('/api/logs', async (req, res) => {
|
||||
try {
|
||||
const [rows] = await pool.query('SELECT * FROM asset_logs ORDER BY log_date DESC');
|
||||
res.json(rows.map(r => ({
|
||||
id: r.id, assetId: r.asset_id, date: r.log_date, user: r.log_user, details: r.details
|
||||
id: r.id, assetId: r.asset_id, date: r.log_date, user: r.log_user, details: r.details, cost: r.cost
|
||||
})));
|
||||
} catch (err) { res.status(500).json({ error: err.message }); }
|
||||
});
|
||||
|
||||
app.post('/api/logs/batch', async (req, res) => {
|
||||
try {
|
||||
const result = await batchSave('asset_logs', req.body, (assets) => ({
|
||||
sql: `INSERT INTO asset_logs (id, asset_id, log_date, log_user, details) VALUES ?`,
|
||||
values: assets.map(a => [a.id, a.assetId||'', a.date||'', a.user||'', a.details||''])
|
||||
const result = await batchSave('asset_logs', req.body, (logs) => ({
|
||||
sql: `INSERT INTO asset_logs (asset_id, log_date, log_user, details, cost) VALUES ?`,
|
||||
values: logs.map(l => [l.assetId, l.date, l.user, l.details, l.cost || 0])
|
||||
}));
|
||||
res.json(result);
|
||||
} catch (err) { res.status(500).json({ error: err.message }); }
|
||||
|
||||
Reference in New Issue
Block a user