11개 모델 파일의 171개 콜백 메서드를 직접 return/throw 패턴으로 변환. 8개 컨트롤러에서 new Promise 래퍼와 중첩 콜백 제거, console.error→logger.error 교체. 미사용 pageAccessModel.js 삭제. 전체 -3,600줄 감소. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
194 lines
4.3 KiB
JavaScript
194 lines
4.3 KiB
JavaScript
const { getDb } = require('../dbPool');
|
|
|
|
/**
|
|
* 1. 여러 건 등록 (트랜잭션 사용)
|
|
*/
|
|
const createBatch = async (reports) => {
|
|
const db = await getDb();
|
|
const conn = await db.getConnection();
|
|
|
|
try {
|
|
await conn.beginTransaction();
|
|
|
|
const sql = `
|
|
INSERT INTO WorkReports
|
|
(\`date\`, worker_id, project_id, task_id, overtime_hours, work_details, memo)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
`;
|
|
|
|
for (const rpt of reports) {
|
|
const params = [
|
|
rpt.date,
|
|
rpt.worker_id,
|
|
rpt.project_id,
|
|
rpt.task_id || null,
|
|
rpt.overtime_hours || null,
|
|
rpt.work_details || null,
|
|
rpt.memo || null
|
|
];
|
|
await conn.query(sql, params);
|
|
}
|
|
|
|
await conn.commit();
|
|
} catch (err) {
|
|
await conn.rollback();
|
|
throw err;
|
|
} finally {
|
|
conn.release();
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 2. 단일 등록
|
|
*/
|
|
const create = async (report) => {
|
|
const db = await getDb();
|
|
const {
|
|
date, worker_id, project_id,
|
|
task_id, overtime_hours,
|
|
work_details, memo
|
|
} = report;
|
|
|
|
const [result] = await db.query(
|
|
`INSERT INTO WorkReports
|
|
(\`date\`, worker_id, project_id, task_id, overtime_hours, work_details, memo)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
|
[
|
|
date,
|
|
worker_id,
|
|
project_id,
|
|
task_id || null,
|
|
overtime_hours || null,
|
|
work_details || null,
|
|
memo || null
|
|
]
|
|
);
|
|
|
|
return result.insertId;
|
|
};
|
|
|
|
/**
|
|
* 3. 날짜별 조회
|
|
*/
|
|
const getAllByDate = async (date) => {
|
|
const db = await getDb();
|
|
const sql = `
|
|
SELECT
|
|
wr.worker_id,
|
|
wr.id,
|
|
wr.\`date\`,
|
|
w.worker_name,
|
|
p.project_name,
|
|
CONCAT(t.category, ':', t.subcategory) AS task_name,
|
|
wr.overtime_hours,
|
|
wr.work_details,
|
|
wr.memo
|
|
FROM WorkReports wr
|
|
LEFT JOIN workers w ON wr.worker_id = w.worker_id
|
|
LEFT JOIN projects p ON wr.project_id = p.project_id
|
|
LEFT JOIN Tasks t ON wr.task_id = t.task_id
|
|
WHERE wr.\`date\` = ?
|
|
ORDER BY w.worker_name ASC
|
|
`;
|
|
const [rows] = await db.query(sql, [date]);
|
|
return rows;
|
|
};
|
|
|
|
/**
|
|
* 4. 기간 조회
|
|
*/
|
|
const getByRange = async (start, end) => {
|
|
const db = await getDb();
|
|
const [rows] = await db.query(
|
|
`SELECT id, \`date\`, worker_id, project_id, morning_task_id, afternoon_task_id, overtime_hours, overtime_task_id, work_details, note, memo, created_at, updated_at, morning_project_id, afternoon_project_id, overtime_project_id, task_id FROM WorkReports
|
|
WHERE \`date\` BETWEEN ? AND ?
|
|
ORDER BY \`date\` ASC`,
|
|
[start, end]
|
|
);
|
|
return rows;
|
|
};
|
|
|
|
/**
|
|
* 5. ID로 조회
|
|
*/
|
|
const getById = async (id) => {
|
|
const db = await getDb();
|
|
const [rows] = await db.query(
|
|
`SELECT id, \`date\`, worker_id, project_id, morning_task_id, afternoon_task_id, overtime_hours, overtime_task_id, work_details, note, memo, created_at, updated_at, morning_project_id, afternoon_project_id, overtime_project_id, task_id FROM WorkReports WHERE id = ?`,
|
|
[id]
|
|
);
|
|
return rows[0];
|
|
};
|
|
|
|
/**
|
|
* 6. 수정
|
|
*/
|
|
const update = async (id, report) => {
|
|
const db = await getDb();
|
|
const {
|
|
date, worker_id, project_id,
|
|
task_id, overtime_hours,
|
|
work_details, memo
|
|
} = report;
|
|
|
|
const [result] = await db.query(
|
|
`UPDATE WorkReports
|
|
SET \`date\` = ?,
|
|
worker_id = ?,
|
|
project_id = ?,
|
|
task_id = ?,
|
|
overtime_hours = ?,
|
|
work_details = ?,
|
|
memo = ?,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE id = ?`,
|
|
[
|
|
date,
|
|
worker_id,
|
|
project_id,
|
|
task_id || null,
|
|
overtime_hours || null,
|
|
work_details || null,
|
|
memo || null,
|
|
id
|
|
]
|
|
);
|
|
|
|
return result.affectedRows;
|
|
};
|
|
|
|
/**
|
|
* 7. 삭제
|
|
*/
|
|
const remove = async (id) => {
|
|
const db = await getDb();
|
|
const [result] = await db.query(
|
|
`DELETE FROM WorkReports WHERE id = ?`,
|
|
[id]
|
|
);
|
|
return result.affectedRows;
|
|
};
|
|
|
|
/**
|
|
* 8. 중복 확인
|
|
*/
|
|
const existsByDateAndWorker = async (date, worker_id) => {
|
|
const db = await getDb();
|
|
const [rows] = await db.query(
|
|
`SELECT 1 FROM WorkReports WHERE \`date\` = ? AND worker_id = ? LIMIT 1`,
|
|
[date, worker_id]
|
|
);
|
|
return rows.length > 0;
|
|
};
|
|
|
|
module.exports = {
|
|
create,
|
|
createBatch,
|
|
getAllByDate,
|
|
getByRange,
|
|
getById,
|
|
update,
|
|
remove,
|
|
existsByDateAndWorker
|
|
};
|