fix(audit): 실사 승인 대기 목록 필터링 오류 수정 및 승인완료 배지 표시 추가

- GET /api/audit/pending API에서 PENDING 상태인 내역만 반환하도록 SQL 쿼리 수정
- 실사 승인 및 맵 저장 시 asset_location.location_detail에 표준 상세 위치가 저장되도록 개선
- 실사 승인 완료된 자산에 대해 상세 모달, 위치 보기, 목록 보기에 '승인완료' 배지 노출 처리
- 목록 보기에서 기존 위치 표시 형식 및 툴팁을 훼손하지 않도록 배지를 분리하여 렌더링
This commit is contained in:
이태훈
2026-06-24 17:56:41 +09:00
parent 1eca0ede91
commit 0bfff08af6
4 changed files with 34 additions and 4 deletions

View File

@@ -143,6 +143,9 @@ app.get('/api/assets/master', async (req, res) => {
s.hw_status, s.model_name, s.mainboard, s.os, s.cpu, s.ram, s.gpu,
s.monitoring, s.price, s.monitor_inch, s.serial_num,
l.location, l.location_detail, l.location_photo, l.loc_x, l.loc_y,
(
SELECT EXISTS(SELECT 1 FROM asset_audit_pending WHERE asset_code = c.asset_code AND status = 'APPROVED')
) AS is_audit_approved,
(
SELECT JSON_ARRAYAGG(JSON_OBJECT('type', net_type, 'name', net_name, 'val1', net_value1, 'val2', net_value2))
FROM asset_remote WHERE asset_id = c.id AND is_active = 1
@@ -786,11 +789,13 @@ app.post('/api/maps/save', async (req, res) => {
);
// Insert new active location mapping
const pathPartsForMap = path.split('/');
const stdDetailForMap = pathPartsForMap[pathPartsForMap.length - 2] || locDetail;
await connection.query(`
INSERT INTO asset_location
(asset_id, location, location_detail, location_photo, loc_x, loc_y, physical_location_code, is_active)
VALUES (?, ?, ?, ?, ?, ?, ?, 1)
`, [box.asset_id, locName, locDetail, path, box.x, box.y, locCode]);
`, [box.asset_id, locName, stdDetailForMap, path, box.x, box.y, locCode]);
}
}
@@ -867,6 +872,7 @@ app.get('/api/audit/pending', async (req, res) => {
JOIN asset_core c ON c.asset_code = ap.asset_code
JOIN physical_locations pl ON pl.location_code = ap.physical_location_code
LEFT JOIN asset_location l ON l.asset_id = c.id AND l.is_active = 1
WHERE ap.status = 'PENDING'
ORDER BY ap.scanned_at DESC
`);
res.json(rows);
@@ -923,11 +929,13 @@ app.post('/api/audit/approve', async (req, res) => {
);
// 5. Insert new active location
const pathPartsForApprove = loc.map_image.split('/');
const stdDetailForApprove = pathPartsForApprove[pathPartsForApprove.length - 2] || loc.location_detail;
await connection.query(`
INSERT INTO asset_location
(asset_id, location, location_detail, location_photo, loc_x, loc_y, physical_location_code, is_active)
VALUES (?, ?, ?, ?, ?, ?, ?, 1)
`, [assetId, loc.location_name, loc.location_detail, loc.map_image, loc.map_x, loc.map_y, physical_location_code]);
`, [assetId, loc.location_name, stdDetailForApprove, loc.map_image, loc.map_x, loc.map_y, physical_location_code]);
// 6. Update pending audit status
await connection.query(