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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
// 설비 목록 (드롭다운용)
|
||||
|
||||
Reference in New Issue
Block a user