Update project memory and enhance table settings functionality
- Updated project memory configuration to reflect recent access counts and timestamps for various components. - Modified SQL queries in the processInfoController to utilize the correct equipment management table for improved data retrieval. - Enhanced the TableManagementService to automatically fill display columns for entity types during both creation and update processes. - Introduced new TableSettingsModal components across multiple pages for better user control over table configurations. - Improved the DynamicSearchFilter component to accept external filter configurations, enhancing the filtering capabilities for various data grids.
This commit is contained in:
@@ -148,9 +148,9 @@ export async function getProcessEquipments(req: AuthenticatedRequest, res: Respo
|
||||
const { processCode } = req.params;
|
||||
|
||||
const result = await pool.query(
|
||||
`SELECT pe.*, ei.equipment_name
|
||||
`SELECT pe.*, em.equipment_name
|
||||
FROM process_equipment pe
|
||||
LEFT JOIN equipment_info ei ON pe.equipment_code = ei.equipment_code AND pe.company_code = ei.company_code
|
||||
LEFT JOIN equipment_mng em ON pe.equipment_code = em.equipment_code AND pe.company_code = em.company_code
|
||||
WHERE pe.process_code = $1 AND pe.company_code = $2
|
||||
ORDER BY pe.equipment_code`,
|
||||
[processCode, companyCode]
|
||||
@@ -214,7 +214,7 @@ export async function getEquipmentList(req: AuthenticatedRequest, res: Response)
|
||||
const params = companyCode === "*" ? [] : [companyCode];
|
||||
|
||||
const result = await pool.query(
|
||||
`SELECT id, equipment_code, equipment_name FROM equipment_info ${condition} ORDER BY equipment_code`,
|
||||
`SELECT objid AS id, equipment_code, equipment_name FROM equipment_mng ${condition} ORDER BY equipment_code`,
|
||||
params
|
||||
);
|
||||
|
||||
|
||||
@@ -2717,6 +2717,43 @@ export class TableManagementService {
|
||||
logger.warn(`채번 자동 적용 중 오류 (무시됨): ${numErr.message}`);
|
||||
}
|
||||
|
||||
// entity 컬럼의 display_column 자동 채우기 (예: supplier_code → supplier_name)
|
||||
try {
|
||||
const companyCode = data.company_code || "*";
|
||||
const entityColsResult = await query<any>(
|
||||
`SELECT DISTINCT ON (column_name) column_name, reference_table, reference_column, display_column
|
||||
FROM table_type_columns
|
||||
WHERE table_name = $1 AND input_type = 'entity'
|
||||
AND reference_table IS NOT NULL AND reference_table != ''
|
||||
AND display_column IS NOT NULL AND display_column != ''
|
||||
AND company_code IN ($2, '*')
|
||||
ORDER BY column_name, CASE WHEN company_code = '*' THEN 1 ELSE 0 END`,
|
||||
[tableName, companyCode]
|
||||
);
|
||||
|
||||
for (const ec of entityColsResult) {
|
||||
const srcVal = data[ec.column_name];
|
||||
const displayCol = ec.display_column;
|
||||
// display_column이 테이블에 존재하고, 값이 비어있거나 없으면 자동 조회
|
||||
if (srcVal && columnTypeMap.has(displayCol) && (!data[displayCol] || data[displayCol] === "")) {
|
||||
try {
|
||||
const refResult = await query<any>(
|
||||
`SELECT "${displayCol}" FROM "${ec.reference_table}" WHERE "${ec.reference_column}" = $1 AND company_code = $2 LIMIT 1`,
|
||||
[srcVal, companyCode]
|
||||
);
|
||||
if (refResult.length > 0 && refResult[0][displayCol]) {
|
||||
data[displayCol] = refResult[0][displayCol];
|
||||
logger.info(`Entity auto-fill: ${tableName}.${displayCol} = ${data[displayCol]} (from ${ec.reference_table})`);
|
||||
}
|
||||
} catch (refErr: any) {
|
||||
logger.warn(`Entity auto-fill 조회 실패 (${ec.reference_table}.${displayCol}): ${refErr.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (entityErr: any) {
|
||||
logger.warn(`Entity auto-fill 중 오류 (무시됨): ${entityErr.message}`);
|
||||
}
|
||||
|
||||
// 🆕 테이블에 존재하는 컬럼만 필터링 (존재하지 않는 컬럼은 무시)
|
||||
const skippedColumns: string[] = [];
|
||||
const existingColumns = Object.keys(data).filter((col) => {
|
||||
@@ -2868,6 +2905,42 @@ export class TableManagementService {
|
||||
logger.info(`updated_date 자동 추가: ${updatedData.updated_date}`);
|
||||
}
|
||||
|
||||
// entity 컬럼의 display_column 자동 채우기 (수정 시)
|
||||
try {
|
||||
const companyCode = updatedData.company_code || originalData.company_code || "*";
|
||||
const entityColsResult = await query<any>(
|
||||
`SELECT DISTINCT ON (column_name) column_name, reference_table, reference_column, display_column
|
||||
FROM table_type_columns
|
||||
WHERE table_name = $1 AND input_type = 'entity'
|
||||
AND reference_table IS NOT NULL AND reference_table != ''
|
||||
AND display_column IS NOT NULL AND display_column != ''
|
||||
AND company_code IN ($2, '*')
|
||||
ORDER BY column_name, CASE WHEN company_code = '*' THEN 1 ELSE 0 END`,
|
||||
[tableName, companyCode]
|
||||
);
|
||||
|
||||
for (const ec of entityColsResult) {
|
||||
const srcVal = updatedData[ec.column_name];
|
||||
const displayCol = ec.display_column;
|
||||
if (srcVal && columnTypeMap.has(displayCol) && (!updatedData[displayCol] || updatedData[displayCol] === "")) {
|
||||
try {
|
||||
const refResult = await query<any>(
|
||||
`SELECT "${displayCol}" FROM "${ec.reference_table}" WHERE "${ec.reference_column}" = $1 AND company_code = $2 LIMIT 1`,
|
||||
[srcVal, companyCode]
|
||||
);
|
||||
if (refResult.length > 0 && refResult[0][displayCol]) {
|
||||
updatedData[displayCol] = refResult[0][displayCol];
|
||||
logger.info(`Entity auto-fill (edit): ${tableName}.${displayCol} = ${updatedData[displayCol]}`);
|
||||
}
|
||||
} catch (refErr: any) {
|
||||
logger.warn(`Entity auto-fill 조회 실패 (${ec.reference_table}.${displayCol}): ${refErr.message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (entityErr: any) {
|
||||
logger.warn(`Entity auto-fill 중 오류 (무시됨): ${entityErr.message}`);
|
||||
}
|
||||
|
||||
// SET 절 생성 (수정할 데이터) - 먼저 생성
|
||||
// 🔧 테이블에 존재하는 컬럼만 UPDATE (가상 컬럼 제외)
|
||||
const setConditions: string[] = [];
|
||||
|
||||
Reference in New Issue
Block a user