초기 PM 소스 전체 업로드

This commit is contained in:
koj729
2026-06-12 17:14:03 +09:00
commit 4e33c9a02a
1769 changed files with 377797 additions and 0 deletions

View File

@@ -0,0 +1,710 @@
const path = require('path');
const pool = require('../db/pool.js');
const fs = require('fs');
const multer = require('multer');
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const { PutObjectCommand, GetObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
const onPremiseClient = require('../config/onPremiseClient.js');
const cloudClient = require('../config/cloudClient.js');
const storageClients = {
'ONPREMISE': onPremiseClient,
'CLOUD': cloudClient
}
const deploymentType = process.env.DEPLOYMENT_TYPE;
const s3 = storageClients[deploymentType];
exports.getData = async (req, res, next) => {
const client = await pool.connect();
try {
let { projectId } = req.query;
let queryString = `
select project_id,
project_no,
business_purpose,
location_img,
continent,
performance_area,
reference_area,
overview_img,
facility_size_overview,
task_nm_kr,
task_nm_en,
task_purpose,
task_type,
client,
financial,
financial_country,
bid,
selection_method,
joint_contract_nm,
joint_contract_shareratio,
contract_amount,
foreign_currency_amount,
contract_date,
commencement_date,
original_completion_date,
completion_date,
projectmanager_nm,
manager_nm,
nation_nm,
client_origin,
support_department,
support_manager_nm,
representative_company,
order_size_krw,
order_size_usd,
scheuled_commencement_date,
contract_period,
abbreviated_name,
department,
data_size,
issue,
currency_code,
joint_contract,
lead_company,
nation_code,
nation_offset
from ver4.tb_overview
where project_id = $1;
`;
const result = await client.query(queryString, [projectId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('getData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.getCalendarEventData = async (req, res) => {
const client = await pool.connect();
try {
let { nationName, projectId, currentYear, currentMonth } = req.query;
let queryString = `
SELECT
calendar_event_id,
project_id,
type,
title,
content,
color,
start_date,
end_date,
nation_nm
FROM ver4.tb_calendar_event
WHERE (
(type = 'holiday' AND nation_nm IN ('한국', $1)) OR
(type = 'schedule' AND project_id = $2)
)
AND EXTRACT(YEAR FROM TO_DATE(start_date, 'YYYY-MM-DD')) = $3
AND EXTRACT(MONTH FROM TO_DATE(start_date, 'YYYY-MM-DD')) = $4;
`
const result = await client.query(queryString, [nationName, projectId, currentYear, currentMonth]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('getCalendarEventData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message
});
} finally {
client.release();
}
}
exports.getTaskPeriodData = async (req, res) => {
const client = await pool.connect();
try {
let { projectId } = req.query;
let queryString = `
SELECT
task_history_id,
project_id,
task_order,
suspension_date,
suspension_reason,
resumption_date,
consultation_content,
change_date
FROM ver4.tb_task_history
WHERE project_id = $1;
`;
const result = await client.query(queryString, [projectId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('getTaskPeriodData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.getFacilitySizeData = async (req, res) => {
const client = await pool.connect();
try {
let { projectId } = req.query;
let queryString = `
SELECT
facility_id,
project_id,
key,
value,
title
FROM ver4.tb_facility_size AS t
WHERE project_id = $1
ORDER BY
(SELECT MIN(facility_id)
FROM ver4.tb_facility_size
WHERE title = t.title),
facility_id;
`;
const result = await client.query(queryString, [projectId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('getFacilitySizeData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.saveScheduleData = async (req, res) => {
const client = await pool.connect();
try {
let {scheduleId, projectId, title, content, color, startDateTimeStr, endDateTimeStr, country } = req.body;
const type = 'schedule';
let queryString;
let result;
if(scheduleId === undefined){
queryString = `
INSERT INTO ver4.tb_calendar_event (project_id, type, title, content, color, start_date, end_date, nation_nm)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
`
result = await client.query(queryString, [projectId, type, title, content, color, startDateTimeStr, endDateTimeStr, country]);
} else {
queryString = `
INSERT INTO ver4.tb_calendar_event (calendar_event_id, project_id, type, title, content, color, start_date, end_date, nation_nm)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
ON CONFLICT (calendar_event_id) DO UPDATE SET
project_id = EXCLUDED.project_id,
type = EXCLUDED.type,
title = EXCLUDED.title,
content = EXCLUDED.content,
color = EXCLUDED.color,
start_date = EXCLUDED.start_date,
end_date = EXCLUDED.end_date,
nation_nm = EXCLUDED.nation_nm
`;
result = await client.query(queryString, [scheduleId, projectId, type, title, content, color, startDateTimeStr, endDateTimeStr, country]);
}
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('saveScheduleData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
}
exports.deleteScheduleData = async (req, res) => {
const client = await pool.connect();
try {
let { scheduleId } = req.body;
let queryString = `
DELETE FROM ver4.tb_calendar_event
WHERE calendar_event_id = $1;
`;
const result = await client.query(queryString, [scheduleId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('deleteScheduleData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.deleteTaskPeriodData = async (req, res) => {
const client = await pool.connect();
try {
let { deleteArr } = req.body;
let queryString = `
DELETE FROM ver4.tb_task_history
WHERE task_history_id = ANY($1);
`;
const result = await client.query(queryString, [deleteArr]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('deleteTaskHistory error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.deleteSectionData = async (req, res) => {
const client = await pool.connect();
try {
let { title } = req.body;
let queryString = `
DELETE FROM ver4.tb_facility_size
WHERE title = $1;
`;
const result = await client.query(queryString, [title]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('deleteSectionData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.deleteCellData = async (req, res) => {
const client = await pool.connect();
try {
let { deleteArr } = req.body;
const ids = deleteArr.map(cell => cell.id);
let queryString = `
DELETE FROM ver4.tb_facility_size
WHERE facility_id = ANY($1);
`;
const result = await client.query(queryString, [ids]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('deleteCellData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.deleteLocationImgData = async (req, res) => {
const client = await pool.connect();
try {
let { projectId } = req.body;
let queryString = `
UPDATE ver4.tb_overview
SET location_img = ''
WHERE project_id = $1;
`;
const result = await client.query(queryString, [projectId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('updateLocationImgData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.deleteOverviewImgData = async (req, res) => {
const client = await pool.connect();
try {
let { projectId } = req.body;
let queryString = `
UPDATE ver4.tb_overview
SET overview_img = ''
WHERE project_id = $1;
`;
const result = await client.query(queryString, [projectId]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('updateLocationImgData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};
exports.saveSectionLeftData = async (req, res, next) => {
const client = await pool.connect();
try {
let {projectId, businessPurpose, continent, performanceArea, referenceArea, nation, facilityOverview, locationImgKey, originFileSize } = req.body;
let values = [projectId, businessPurpose, continent, performanceArea, referenceArea, nation, facilityOverview, locationImgKey, originFileSize];
let queryString = `
INSERT INTO ver4.tb_overview ( project_id, business_purpose, continent, performance_area, reference_area, nation_nm, facility_size_overview, location_img, data_size)
VALUES ( $1, $2, $3, $4, $5, $6, $7, $8, $9)
ON CONFLICT (project_id)
DO UPDATE SET business_purpose = EXCLUDED.business_purpose, location_img = EXCLUDED.location_img, continent = EXCLUDED.continent,performance_area = EXCLUDED.performance_area, reference_area = EXCLUDED.reference_area, data_size = EXCLUDED.data_size, nation_nm = EXCLUDED.nation_nm, facility_size_overview = EXCLUDED.facility_size_overview;
`;
const result = await client.query(queryString, values);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
next(error);
res.status(500).json({ success: false, message: '파일 업로드 중 오류가 발생했습니다.' });
} finally {
client.release();
}
}
exports.saveSectionMiddleData = async (req, res, next) => {
const client = await pool.connect();
try {
let {projectId, abbreviatedName, taskNmKr, taskNmEn, taskPurpose, orderSizeUsd, orderSizeKrw, scheduledCommencementDate, contractPeriod, clientOrigin, financial, financialCountry, selectionMethod, projectManagerNm, managerNm, supportDepartment, supportManagerNm, contractDate, commencementDate, originalCompletionDate, completionDate, projectNo, taskType, bid, relativeClient, department, jointContractComapnyName, jointContractShares, jointContractKrw, jointContractUsd, representativeCompany } = req.body;
let values = [projectId, abbreviatedName, taskNmKr, taskNmEn, taskPurpose, orderSizeUsd, orderSizeKrw, scheduledCommencementDate, contractPeriod, clientOrigin, financial, financialCountry, selectionMethod, projectManagerNm, managerNm, supportDepartment, supportManagerNm, contractDate, commencementDate, originalCompletionDate, completionDate, projectNo, taskType, bid, relativeClient, department, jointContractComapnyName, jointContractShares, jointContractKrw, jointContractUsd, representativeCompany];
let queryString = `
INSERT INTO ver4.tb_overview (
project_id, abbreviated_name, task_nm_kr, task_nm_en, task_purpose,
order_size_usd, order_size_krw, scheuled_commencement_date, contract_period,
client_origin, financial, financial_country, selection_method,
projectmanager_nm, manager_nm, support_department, support_manager_nm,
contract_date, commencement_date, original_completion_date, completion_date,
project_no, task_type, bid, client, department,
joint_contract_nm, joint_contract_shareratio, contract_amount, foreign_currency_amount, representative_company
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31
)
ON CONFLICT (project_id)
DO UPDATE SET
abbreviated_name = EXCLUDED.abbreviated_name,
task_nm_kr = EXCLUDED.task_nm_kr,
task_nm_en = EXCLUDED.task_nm_en,
task_purpose = EXCLUDED.task_purpose,
order_size_usd = EXCLUDED.order_size_usd,
order_size_krw = EXCLUDED.order_size_krw,
scheuled_commencement_date = EXCLUDED.scheuled_commencement_date,
contract_period = EXCLUDED.contract_period,
client_origin = EXCLUDED.client_origin,
financial = EXCLUDED.financial,
financial_country = EXCLUDED.financial_country,
selection_method = EXCLUDED.selection_method,
projectmanager_nm = EXCLUDED.projectmanager_nm,
manager_nm = EXCLUDED.manager_nm,
support_department = EXCLUDED.support_department,
support_manager_nm = EXCLUDED.support_manager_nm,
contract_date = EXCLUDED.contract_date,
commencement_date = EXCLUDED.commencement_date,
original_completion_date = EXCLUDED.original_completion_date,
completion_date = EXCLUDED.completion_date,
project_no = EXCLUDED.project_no,
task_type = EXCLUDED.task_type,
bid = EXCLUDED.bid,
client = EXCLUDED.client,
department = EXCLUDED.department,
joint_contract_nm = EXCLUDED.joint_contract_nm,
joint_contract_shareratio = EXCLUDED.joint_contract_shareratio,
contract_amount = EXCLUDED.contract_amount,
foreign_currency_amount = EXCLUDED.foreign_currency_amount,
representative_company = EXCLUDED.representative_company;
`
const result = await client.query(queryString, values);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
next(error);
res.status(500).json({ success: false, message: 'section2 Save Data Error' });
} finally {
client.release();
}
};
exports.saveTaskHistoryData = async (req, res, next) => {
const client = await pool.connect();
try {
for (let i = 0; i < req.body.length; i++) {
let { projectId, order, suspensionDate, suspensionReason, resumptionDate, consultationContent, changeDate } = req.body[i];
let queryString = `
INSERT INTO ver4.tb_task_history (project_id, task_order, suspension_date, suspension_reason, resumption_date, consultation_content, change_date)
VALUES ($1, $2, $3, $4, $5, $6, $7);
`
await client.query(queryString, [projectId, order, suspensionDate, suspensionReason, resumptionDate, consultationContent, changeDate]);
}
res.json({
success: true,
message: '200',
});
} catch (error) {
next(error);
res.status(500).json({ success: false, message: 'task history Save Data Error' });
} finally {
client.release();
}
};
exports.saveSectionLeftTabData = async (req, res, next) => {
const client = await pool.connect();
try {
const sections = req.body;
for (const title of Object.keys(sections)) {
const rows = sections[title];
for (let i = 0; i < rows.length; i++) {
const { key, value, id, projectId } = rows[i];
if (id == null || id === '') {
const queryStringInsert = `
INSERT INTO ver4.tb_facility_size (project_id, key, value, title)
VALUES ($1, $2, $3 , $4)
ON CONFLICT (facility_id)
DO UPDATE SET project_id = EXCLUDED.project_id, key = EXCLUDED.key, value = EXCLUDED.value, title = EXCLUDED.title;
`;
await client.query(queryStringInsert, [projectId, key, value, title]);
} else {
const queryStringUpdate = `
INSERT INTO ver4.tb_facility_size (project_id, key, value, facility_id, title)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (facility_id)
DO UPDATE SET project_id = EXCLUDED.project_id, key = EXCLUDED.key, value = EXCLUDED.value, title = EXCLUDED.title;
`;
await client.query(queryStringUpdate, [projectId, key, value, id, title]);
}
}
}
return res.json({ success: true, message: '200', });
} catch (error) {
next(error);
res.status(500).json({ success: false, message: 'FacilitySize Save Data Error' });
} finally {
client.release();
}
};
exports.saveIssueData = async (req, res, next) => {
const client = await pool.connect();
try {
let { projectId, issueData } = req.body;
let queryString = `
INSERT INTO ver4.tb_overview (
project_id, issue
) VALUES (
$1, $2
)
ON CONFLICT (project_id)
DO UPDATE SET
issue = EXCLUDED.issue
`
const result = await client.query(queryString, [projectId, issueData]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
next(error);
res.status(500).json({ success: false, message: 'Save Issue Data Error' });
} finally {
client.release();
}
};
exports.generateUploadImgUrl = async (req,res,next) => {
const projectId = req.baseUrl.split('/')[1];
let {fileName} = req.body;
let bucket = projectId;
let key = 'overview/' + fileName;
try{
// s3 명렁어 구성
const command = new PutObjectCommand({
Bucket: bucket,
Key: key,
ContentType: 'application/octet-stream'
});
// presigned url 생성
const url = await getSignedUrl(s3, command, { expiresIn: 60 * 5});
// 클라이언트에 return
res.json({ url, key });
}catch(error){
console.error('UploadPresigned URL 생성 실패: ', error);
next(error);
}
}
exports.generateGetImgUrl = async (req,res,next) => {
const projectId = req.baseUrl.split('/')[1];
let { key } = req.query;
let bucket = projectId;
try{
// s3 명렁어 구성
const command = new GetObjectCommand({
Bucket : bucket,
Key : key
});
const url = await getSignedUrl(s3, command, {expiresIn: 60});
res.json({ url });
} catch(error){
console.error('GetPresigned URL 생성 실패: ',error);
next(error);
}
}
exports.generateDeleteImgUrl = async (req, res, next) => {
const projectId = req.baseUrl.split('/')[1];
let { key } = req.body;
let bucket = projectId;
try{
// s3 명령어 구성
const command = new DeleteObjectCommand({
Bucket : bucket,
Key : key
});
const url = await getSignedUrl(s3, command, {expiresIn: 60});
res.json({ url });
} catch(error) {
console.error('DeletePresigned URL 생성 실패: ',error);
next(error)
}
}
exports.updateOverviewImgData = async (req, res) => {
const client = await pool.connect();
try {
let { projectId, locationImgKey, originFileSize } = req.body;
let queryString = `
UPDATE ver4.tb_overview
SET location_img = $2, data_size = $3
WHERE project_id = $1;
`;
const result = await client.query(queryString, [projectId, locationImgKey, originFileSize]);
res.json({
success: true,
message: '200',
data: result.rows,
});
} catch (error) {
console.error('updateLocationImgData error: ', error);
res.status(500).json({
success: false,
message: '500',
error: error.message,
});
} finally {
client.release();
}
};