테스트용 채번규칙 API 추가: numberingRuleController에 테이블+컬럼 기반 채번규칙 조회 및 테스트 테이블에 채번규칙 저장 기능을 추가하였습니다. 이를 통해 개발 및 테스트 환경에서 채번규칙을 보다 쉽게 관리할 수 있도록 개선하였습니다.
This commit is contained in:
@@ -258,4 +258,67 @@ router.post("/:ruleId/reset", authenticateToken, async (req: AuthenticatedReques
|
||||
}
|
||||
});
|
||||
|
||||
// ====== 테스트용 API (menu_objid 없는 방식) ======
|
||||
|
||||
// [테스트] 테이블+컬럼 기반 채번규칙 조회
|
||||
router.get("/test/by-column", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const { tableName, columnName } = req.query;
|
||||
|
||||
try {
|
||||
if (!tableName || typeof tableName !== "string") {
|
||||
return res.status(400).json({ success: false, error: "tableName is required" });
|
||||
}
|
||||
if (!columnName || typeof columnName !== "string") {
|
||||
return res.status(400).json({ success: false, error: "columnName is required" });
|
||||
}
|
||||
|
||||
const rule = await numberingRuleService.getNumberingRuleByColumn(
|
||||
companyCode,
|
||||
tableName,
|
||||
columnName
|
||||
);
|
||||
|
||||
if (!rule) {
|
||||
return res.status(404).json({ success: false, error: "규칙을 찾을 수 없습니다" });
|
||||
}
|
||||
|
||||
return res.json({ success: true, data: rule });
|
||||
} catch (error: any) {
|
||||
logger.error("테이블+컬럼 기반 채번규칙 조회 실패", {
|
||||
error: error.message,
|
||||
companyCode,
|
||||
tableName,
|
||||
columnName,
|
||||
});
|
||||
return res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
// [테스트] 테스트 테이블에 채번규칙 저장
|
||||
router.post("/test/save", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
|
||||
const companyCode = req.user!.companyCode;
|
||||
const userId = req.user!.userId;
|
||||
const config = req.body;
|
||||
|
||||
try {
|
||||
if (!config.ruleId || !config.ruleName) {
|
||||
return res.status(400).json({ success: false, error: "ruleId and ruleName are required" });
|
||||
}
|
||||
if (!config.tableName || !config.columnName) {
|
||||
return res.status(400).json({ success: false, error: "tableName and columnName are required" });
|
||||
}
|
||||
|
||||
const savedRule = await numberingRuleService.saveRuleToTest(config, companyCode, userId);
|
||||
return res.json({ success: true, data: savedRule });
|
||||
} catch (error: any) {
|
||||
logger.error("테스트 테이블에 채번규칙 저장 실패", {
|
||||
error: error.message,
|
||||
companyCode,
|
||||
ruleId: config.ruleId,
|
||||
});
|
||||
return res.status(500).json({ success: false, error: error.message });
|
||||
}
|
||||
});
|
||||
|
||||
export default router;
|
||||
|
||||
@@ -1099,6 +1099,216 @@ class NumberingRuleService {
|
||||
);
|
||||
logger.info("시퀀스 초기화 완료", { ruleId, companyCode });
|
||||
}
|
||||
|
||||
/**
|
||||
* [테스트] 테이블명 + 컬럼명 기반으로 채번규칙 조회 (menu_objid 없이)
|
||||
* numbering_rules_test 테이블 사용
|
||||
*/
|
||||
async getNumberingRuleByColumn(
|
||||
companyCode: string,
|
||||
tableName: string,
|
||||
columnName: string
|
||||
): Promise<NumberingRuleConfig | null> {
|
||||
try {
|
||||
logger.info("테이블+컬럼 기반 채번 규칙 조회 시작 (테스트)", {
|
||||
companyCode,
|
||||
tableName,
|
||||
columnName,
|
||||
});
|
||||
|
||||
const pool = getPool();
|
||||
const query = `
|
||||
SELECT
|
||||
rule_id AS "ruleId",
|
||||
rule_name AS "ruleName",
|
||||
description,
|
||||
separator,
|
||||
reset_period AS "resetPeriod",
|
||||
current_sequence AS "currentSequence",
|
||||
table_name AS "tableName",
|
||||
column_name AS "columnName",
|
||||
company_code AS "companyCode",
|
||||
created_at AS "createdAt",
|
||||
updated_at AS "updatedAt",
|
||||
created_by AS "createdBy"
|
||||
FROM numbering_rules_test
|
||||
WHERE company_code = $1
|
||||
AND table_name = $2
|
||||
AND column_name = $3
|
||||
LIMIT 1
|
||||
`;
|
||||
const params = [companyCode, tableName, columnName];
|
||||
|
||||
const result = await pool.query(query, params);
|
||||
|
||||
if (result.rows.length === 0) {
|
||||
logger.info("테이블+컬럼 기반 채번 규칙을 찾을 수 없음", {
|
||||
companyCode,
|
||||
tableName,
|
||||
columnName,
|
||||
});
|
||||
return null;
|
||||
}
|
||||
|
||||
const rule = result.rows[0];
|
||||
|
||||
// 파트 정보 조회 (테스트 테이블)
|
||||
const partsQuery = `
|
||||
SELECT
|
||||
id,
|
||||
part_order AS "order",
|
||||
part_type AS "partType",
|
||||
generation_method AS "generationMethod",
|
||||
auto_config AS "autoConfig",
|
||||
manual_config AS "manualConfig"
|
||||
FROM numbering_rule_parts_test
|
||||
WHERE rule_id = $1 AND company_code = $2
|
||||
ORDER BY part_order
|
||||
`;
|
||||
const partsResult = await pool.query(partsQuery, [rule.ruleId, companyCode]);
|
||||
rule.parts = partsResult.rows;
|
||||
|
||||
logger.info("테이블+컬럼 기반 채번 규칙 조회 성공 (테스트)", {
|
||||
ruleId: rule.ruleId,
|
||||
ruleName: rule.ruleName,
|
||||
});
|
||||
return rule;
|
||||
} catch (error: any) {
|
||||
logger.error("테이블+컬럼 기반 채번 규칙 조회 실패 (테스트)", {
|
||||
error: error.message,
|
||||
stack: error.stack,
|
||||
companyCode,
|
||||
tableName,
|
||||
columnName,
|
||||
});
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [테스트] 테스트 테이블에 채번규칙 저장
|
||||
* numbering_rules_test 테이블 사용
|
||||
*/
|
||||
async saveRuleToTest(
|
||||
config: NumberingRuleConfig,
|
||||
companyCode: string,
|
||||
createdBy: string
|
||||
): Promise<NumberingRuleConfig> {
|
||||
const pool = getPool();
|
||||
const client = await pool.connect();
|
||||
|
||||
try {
|
||||
await client.query("BEGIN");
|
||||
|
||||
logger.info("테스트 테이블에 채번 규칙 저장 시작", {
|
||||
ruleId: config.ruleId,
|
||||
ruleName: config.ruleName,
|
||||
tableName: config.tableName,
|
||||
columnName: config.columnName,
|
||||
companyCode,
|
||||
});
|
||||
|
||||
// 기존 규칙 확인
|
||||
const existingQuery = `
|
||||
SELECT rule_id FROM numbering_rules_test
|
||||
WHERE rule_id = $1 AND company_code = $2
|
||||
`;
|
||||
const existingResult = await client.query(existingQuery, [config.ruleId, companyCode]);
|
||||
|
||||
if (existingResult.rows.length > 0) {
|
||||
// 업데이트
|
||||
const updateQuery = `
|
||||
UPDATE numbering_rules_test SET
|
||||
rule_name = $1,
|
||||
description = $2,
|
||||
separator = $3,
|
||||
reset_period = $4,
|
||||
table_name = $5,
|
||||
column_name = $6,
|
||||
updated_at = NOW()
|
||||
WHERE rule_id = $7 AND company_code = $8
|
||||
`;
|
||||
await client.query(updateQuery, [
|
||||
config.ruleName,
|
||||
config.description || "",
|
||||
config.separator || "-",
|
||||
config.resetPeriod || "none",
|
||||
config.tableName || "",
|
||||
config.columnName || "",
|
||||
config.ruleId,
|
||||
companyCode,
|
||||
]);
|
||||
|
||||
// 기존 파트 삭제
|
||||
await client.query(
|
||||
"DELETE FROM numbering_rule_parts_test WHERE rule_id = $1 AND company_code = $2",
|
||||
[config.ruleId, companyCode]
|
||||
);
|
||||
} else {
|
||||
// 신규 등록
|
||||
const insertQuery = `
|
||||
INSERT INTO numbering_rules_test (
|
||||
rule_id, rule_name, description, separator, reset_period,
|
||||
current_sequence, table_name, column_name, company_code,
|
||||
created_at, updated_at, created_by
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, NOW(), NOW(), $10)
|
||||
`;
|
||||
await client.query(insertQuery, [
|
||||
config.ruleId,
|
||||
config.ruleName,
|
||||
config.description || "",
|
||||
config.separator || "-",
|
||||
config.resetPeriod || "none",
|
||||
config.currentSequence || 1,
|
||||
config.tableName || "",
|
||||
config.columnName || "",
|
||||
companyCode,
|
||||
createdBy,
|
||||
]);
|
||||
}
|
||||
|
||||
// 파트 저장
|
||||
if (config.parts && config.parts.length > 0) {
|
||||
for (const part of config.parts) {
|
||||
const partInsertQuery = `
|
||||
INSERT INTO numbering_rule_parts_test (
|
||||
rule_id, part_order, part_type, generation_method,
|
||||
auto_config, manual_config, company_code, created_at
|
||||
) VALUES ($1, $2, $3, $4, $5, $6, $7, NOW())
|
||||
`;
|
||||
await client.query(partInsertQuery, [
|
||||
config.ruleId,
|
||||
part.order,
|
||||
part.partType,
|
||||
part.generationMethod,
|
||||
JSON.stringify(part.autoConfig || {}),
|
||||
JSON.stringify(part.manualConfig || {}),
|
||||
companyCode,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
await client.query("COMMIT");
|
||||
|
||||
logger.info("테스트 테이블에 채번 규칙 저장 완료", {
|
||||
ruleId: config.ruleId,
|
||||
companyCode,
|
||||
});
|
||||
|
||||
return config;
|
||||
} catch (error: any) {
|
||||
await client.query("ROLLBACK");
|
||||
logger.error("테스트 테이블에 채번 규칙 저장 실패", {
|
||||
error: error.message,
|
||||
stack: error.stack,
|
||||
ruleId: config.ruleId,
|
||||
companyCode,
|
||||
});
|
||||
throw error;
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const numberingRuleService = new NumberingRuleService();
|
||||
|
||||
Reference in New Issue
Block a user