feat(purchase): 소모품 신청 시스템 v2 — 모바일 최적화, 스마트 검색, 그룹화, 입고 알림
- 4단계 상태 플로우: pending → grouped → purchased → received - 한국어 스마트 검색: 초성 매칭(ㅁㅈㄱ→면장갑), 별칭 테이블, 인메모리 캐시 - 모바일 전용 신청 페이지: 바텀시트 UI, FAB, 카드 리스트, 스크롤 페이지네이션 - 인라인 품목 등록: 미등록 품목 검색→등록→신청 단일 트랜잭션 - 관리자 그룹화: 체크박스 다중 선택, 구매 그룹(batch) 생성/일괄 구매/입고 - 입고 처리: 사진+보관위치 등록, 부분 입고 허용, batch 자동 상태 전환 - 알림: notifyHelper에 target_user_ids 추가, 구매진행중/입고완료 시 신청자 ntfy+push Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
47
system1-factory/api/controllers/itemAliasController.js
Normal file
47
system1-factory/api/controllers/itemAliasController.js
Normal file
@@ -0,0 +1,47 @@
|
||||
const ItemAliasModel = require('../models/itemAliasModel');
|
||||
const koreanSearch = require('../utils/koreanSearch');
|
||||
const logger = require('../utils/logger');
|
||||
|
||||
const ItemAliasController = {
|
||||
getAll: async (req, res) => {
|
||||
try {
|
||||
const rows = await ItemAliasModel.getAll();
|
||||
res.json({ success: true, data: rows });
|
||||
} catch (err) {
|
||||
logger.error('ItemAlias getAll error:', err);
|
||||
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
|
||||
}
|
||||
},
|
||||
|
||||
create: async (req, res) => {
|
||||
try {
|
||||
const { item_id, alias_name } = req.body;
|
||||
if (!item_id || !alias_name || !alias_name.trim()) {
|
||||
return res.status(400).json({ success: false, message: '품목 ID와 별칭을 입력해주세요.' });
|
||||
}
|
||||
const id = await ItemAliasModel.create(item_id, alias_name);
|
||||
koreanSearch.clearCache();
|
||||
res.status(201).json({ success: true, data: { alias_id: id }, message: '별칭이 등록되었습니다.' });
|
||||
} catch (err) {
|
||||
if (err.code === 'ER_DUP_ENTRY') {
|
||||
return res.status(400).json({ success: false, message: '이미 등록된 별칭입니다.' });
|
||||
}
|
||||
logger.error('ItemAlias create error:', err);
|
||||
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
|
||||
}
|
||||
},
|
||||
|
||||
delete: async (req, res) => {
|
||||
try {
|
||||
const deleted = await ItemAliasModel.delete(req.params.id);
|
||||
if (!deleted) return res.status(404).json({ success: false, message: '별칭을 찾을 수 없습니다.' });
|
||||
koreanSearch.clearCache();
|
||||
res.json({ success: true, message: '별칭이 삭제되었습니다.' });
|
||||
} catch (err) {
|
||||
logger.error('ItemAlias delete error:', err);
|
||||
res.status(500).json({ success: false, message: '서버 오류가 발생했습니다.' });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = ItemAliasController;
|
||||
Reference in New Issue
Block a user