Add Batch Process Equipment Registration Functionality

- Implemented a new endpoint for batch registration of process equipment, allowing users to add multiple equipment codes at once while skipping duplicates.
- Enhanced error handling to provide detailed feedback on the registration process, including the number of successfully inserted and skipped items.
- Updated the process info routes to include the new batch registration functionality.

(TASK: ERP-node-087)
This commit is contained in:
kjs
2026-05-19 18:09:57 +09:00
parent ffd5ffc4c0
commit b2c96e616a
11 changed files with 384 additions and 150 deletions

View File

@@ -200,6 +200,47 @@ export async function addProcessEquipment(req: AuthenticatedRequest, res: Respon
}
}
// 다중 설비 일괄 등록 (TASK:ERP-node-087). 중복은 건너뛰고 신규만 INSERT.
export async function addProcessEquipmentBatch(req: AuthenticatedRequest, res: Response) {
try {
const companyCode = req.user!.companyCode;
const writer = req.user!.userId;
const { process_code } = req.body;
const codes: string[] = Array.isArray(req.body?.equipment_codes)
? Array.from(new Set(req.body.equipment_codes.filter(Boolean)))
: [];
if (!process_code || codes.length === 0) {
return res.status(400).json({ success: false, message: "공정코드와 설비를 선택해주세요." });
}
const dup = await pool.query(
`SELECT equipment_code FROM process_equipment
WHERE process_code=$1 AND company_code=$2 AND equipment_code = ANY($3::text[])`,
[process_code, companyCode, codes]
);
const exists = new Set(dup.rows.map((r: any) => r.equipment_code));
const toInsert = codes.filter((c) => !exists.has(c));
let inserted = 0;
for (const code of toInsert) {
await pool.query(
`INSERT INTO process_equipment (id, company_code, process_code, equipment_code, writer)
VALUES (gen_random_uuid()::text, $1, $2, $3, $4)`,
[companyCode, process_code, code, writer]
);
inserted++;
}
return res.json({
success: true,
data: { inserted, skipped: codes.length - inserted, total: codes.length },
});
} catch (error: any) {
logger.error("공정 설비 일괄 등록 실패", { error: error.message });
return res.status(500).json({ success: false, message: error.message });
}
}
export async function removeProcessEquipment(req: AuthenticatedRequest, res: Response) {
try {
const companyCode = req.user!.companyCode;

View File

@@ -19,6 +19,7 @@ router.post("/processes/delete", ctrl.deleteProcesses);
// 공정별 설비 관리
router.get("/processes/:processCode/equipments", ctrl.getProcessEquipments);
router.post("/process-equipments", ctrl.addProcessEquipment);
router.post("/process-equipments/batch", ctrl.addProcessEquipmentBatch);
router.delete("/process-equipments/:id", ctrl.removeProcessEquipment);
// 설비 목록 (드롭다운용)