feat: 데이터베이스 및 웹 UI 대규모 리팩토링
- 삭제된 DB 테이블들과 관련 코드 정리: * 12개 사용하지 않는 테이블 삭제 (activity_logs, CuttingPlan, DailyIssueReports 등) * 관련 모델, 컨트롤러, 라우트 파일들 삭제 * index.js에서 삭제된 라우트들 제거 - 웹 UI 페이지 정리: * 21개 사용하지 않는 페이지 삭제 * issue-reports 폴더 전체 삭제 * 모든 사용자 권한을 그룹장 대시보드로 통일 - 데이터베이스 스키마 정리: * v1 스키마로 통일 (daily_work_reports 테이블) * JSON 데이터 임포트 스크립트 구현 * 외래키 관계 정리 및 데이터 일관성 확보 - 통합 Docker Compose 설정: * 모든 서비스를 단일 docker-compose.yml로 통합 * 20000번대 포트 유지 * JWT 시크릿 및 환경변수 설정 - 문서화: * DATABASE_SCHEMA.md: 현재 DB 스키마 문서화 * DELETED_TABLES.md: 삭제된 테이블 목록 * DELETED_PAGES.md: 삭제된 페이지 목록
This commit is contained in:
@@ -19,29 +19,9 @@ const login = async (req, res) => {
|
||||
return res.status(result.status || 400).json({ error: result.error });
|
||||
}
|
||||
|
||||
// 로그인 성공 후, 역할에 따라 리디렉션 URL을 결정
|
||||
// 로그인 성공 후, 모든 권한을 그룹장 대시보드로 통일
|
||||
const user = result.data.user;
|
||||
let redirectUrl;
|
||||
|
||||
switch (user.role) {
|
||||
case 'system': // 시스템 계정 전용 대시보드
|
||||
redirectUrl = '/pages/dashboard/system.html';
|
||||
break;
|
||||
case 'admin':
|
||||
redirectUrl = '/pages/dashboard/admin.html';
|
||||
break;
|
||||
case 'leader':
|
||||
redirectUrl = '/pages/dashboard/group-leader.html';
|
||||
break;
|
||||
case 'support':
|
||||
// 예시: 지원팀 대시보드가 있다면
|
||||
// redirectUrl = '/pages/dashboard/support.html';
|
||||
// 없다면 일반 사용자 대시보드로
|
||||
redirectUrl = '/pages/dashboard/user.html';
|
||||
break;
|
||||
default:
|
||||
redirectUrl = '/pages/dashboard/user.html';
|
||||
}
|
||||
let redirectUrl = '/pages/dashboard/group-leader.html'; // 모든 사용자를 그룹장 대시보드로 리다이렉트
|
||||
|
||||
// 최종 응답에 redirectUrl을 포함하여 전달
|
||||
res.json({
|
||||
|
||||
@@ -1,85 +0,0 @@
|
||||
// controllers/cuttingPlanController.js
|
||||
const cuttingPlanModel = require('../models/cuttingPlanModel');
|
||||
|
||||
// 1. 생성
|
||||
exports.createCuttingPlan = async (req, res) => {
|
||||
try {
|
||||
const planData = req.body;
|
||||
const lastID = await new Promise((resolve, reject) => {
|
||||
cuttingPlanModel.create(planData, (err, id) => {
|
||||
if (err) return reject(err);
|
||||
resolve(id);
|
||||
});
|
||||
});
|
||||
res.json({ success: true, cutting_plan_id: lastID });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 2. 전체 조회
|
||||
exports.getAllCuttingPlans = async (req, res) => {
|
||||
try {
|
||||
const rows = await new Promise((resolve, reject) => {
|
||||
cuttingPlanModel.getAll((err, data) => {
|
||||
if (err) return reject(err);
|
||||
resolve(data);
|
||||
});
|
||||
});
|
||||
res.json(rows);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 3. 단일 조회
|
||||
exports.getCuttingPlanById = async (req, res) => {
|
||||
try {
|
||||
const cutting_plan_id = parseInt(req.params.cutting_plan_id, 10);
|
||||
const row = await new Promise((resolve, reject) => {
|
||||
cuttingPlanModel.getById(cutting_plan_id, (err, data) => {
|
||||
if (err) return reject(err);
|
||||
resolve(data);
|
||||
});
|
||||
});
|
||||
if (!row) return res.status(404).json({ error: 'CuttingPlan not found' });
|
||||
res.json(row);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 4. 수정
|
||||
exports.updateCuttingPlan = async (req, res) => {
|
||||
try {
|
||||
const cutting_plan_id = parseInt(req.params.cutting_plan_id, 10);
|
||||
const planData = { ...req.body, cutting_plan_id };
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
cuttingPlanModel.update(planData, (err, count) => {
|
||||
if (err) return reject(err);
|
||||
resolve(count);
|
||||
});
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'No changes or not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 5. 삭제
|
||||
exports.removeCuttingPlan = async (req, res) => {
|
||||
try {
|
||||
const cutting_plan_id = parseInt(req.params.cutting_plan_id, 10);
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
cuttingPlanModel.remove(cutting_plan_id, (err, count) => {
|
||||
if (err) return reject(err);
|
||||
resolve(count);
|
||||
});
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'CuttingPlan not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
@@ -1,80 +0,0 @@
|
||||
// controllers/equipmentListController.js
|
||||
const equipmentListModel = require('../models/equipmentListModel');
|
||||
|
||||
// 1. 등록
|
||||
exports.createEquipment = async (req, res) => {
|
||||
try {
|
||||
const equipmentData = req.body;
|
||||
const id = await new Promise((resolve, reject) => {
|
||||
equipmentListModel.create(equipmentData, (err, insertId) =>
|
||||
err ? reject(err) : resolve(insertId)
|
||||
);
|
||||
});
|
||||
res.json({ success: true, equipment_id: id });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 2. 전체 조회
|
||||
exports.getAllEquipment = async (req, res) => {
|
||||
try {
|
||||
const rows = await new Promise((resolve, reject) => {
|
||||
equipmentListModel.getAll((err, data) =>
|
||||
err ? reject(err) : resolve(data)
|
||||
);
|
||||
});
|
||||
res.json(rows);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 3. 단일 조회
|
||||
exports.getEquipmentById = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.equipment_id, 10);
|
||||
const row = await new Promise((resolve, reject) => {
|
||||
equipmentListModel.getById(id, (err, data) =>
|
||||
err ? reject(err) : resolve(data)
|
||||
);
|
||||
});
|
||||
if (!row) return res.status(404).json({ error: 'Equipment not found' });
|
||||
res.json(row);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 4. 수정
|
||||
exports.updateEquipment = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.equipment_id, 10);
|
||||
const data = { ...req.body, equipment_id: id };
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
equipmentListModel.update(data, (err, affectedRows) =>
|
||||
err ? reject(err) : resolve(affectedRows)
|
||||
);
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'No changes or not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 5. 삭제
|
||||
exports.removeEquipment = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.equipment_id, 10);
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
equipmentListModel.remove(id, (err, affectedRows) =>
|
||||
err ? reject(err) : resolve(affectedRows)
|
||||
);
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'Equipment not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
@@ -1,80 +0,0 @@
|
||||
// controllers/factoryInfoController.js
|
||||
const factoryInfoModel = require('../models/factoryInfoModel');
|
||||
|
||||
// 1. 공장 정보 생성
|
||||
exports.createFactoryInfo = async (req, res) => {
|
||||
try {
|
||||
const factoryData = req.body;
|
||||
const id = await new Promise((resolve, reject) => {
|
||||
factoryInfoModel.create(factoryData, (err, insertId) =>
|
||||
err ? reject(err) : resolve(insertId)
|
||||
);
|
||||
});
|
||||
res.json({ success: true, factory_id: id });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 2. 전체 공장 정보 조회
|
||||
exports.getAllFactoryInfo = async (req, res) => {
|
||||
try {
|
||||
const rows = await new Promise((resolve, reject) => {
|
||||
factoryInfoModel.getAll((err, data) =>
|
||||
err ? reject(err) : resolve(data)
|
||||
);
|
||||
});
|
||||
res.json(rows);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 3. 단일 조회
|
||||
exports.getFactoryInfoById = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.factory_id, 10);
|
||||
const row = await new Promise((resolve, reject) => {
|
||||
factoryInfoModel.getById(id, (err, data) =>
|
||||
err ? reject(err) : resolve(data)
|
||||
);
|
||||
});
|
||||
if (!row) return res.status(404).json({ error: 'FactoryInfo not found' });
|
||||
res.json(row);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 4. 수정
|
||||
exports.updateFactoryInfo = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.factory_id, 10);
|
||||
const data = { ...req.body, factory_id: id };
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
factoryInfoModel.update(data, (err, affectedRows) =>
|
||||
err ? reject(err) : resolve(affectedRows)
|
||||
);
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'No changes or not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 5. 삭제
|
||||
exports.removeFactoryInfo = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.factory_id, 10);
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
factoryInfoModel.remove(id, (err, affectedRows) =>
|
||||
err ? reject(err) : resolve(affectedRows)
|
||||
);
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'FactoryInfo not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
@@ -1,25 +0,0 @@
|
||||
// controllers/pingController.js
|
||||
const { getDb } = require('../dbPool');
|
||||
const pingModel = require('../models/pingModel');
|
||||
|
||||
exports.ping = async (req, res) => {
|
||||
const data = pingModel.ping();
|
||||
try {
|
||||
// DB 연결 테스트
|
||||
const db = await getDb();
|
||||
await db.query('SELECT 1');
|
||||
return res.json({
|
||||
success: true,
|
||||
...data,
|
||||
db: 'ok'
|
||||
});
|
||||
} catch (err) {
|
||||
console.error('[PING ERROR]', err);
|
||||
return res.status(500).json({
|
||||
success: false,
|
||||
message: 'db error',
|
||||
timestamp: data.timestamp,
|
||||
error: err.message
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -1,127 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
// ✅ 전체 스펙 목록 (프론트 드롭다운용 label 포함)
|
||||
exports.getAll = async (req, res) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`
|
||||
SELECT spec_id, material, diameter_in, schedule
|
||||
FROM PipeSpecs
|
||||
ORDER BY material, diameter_in
|
||||
`);
|
||||
|
||||
const result = rows.map(row => ({
|
||||
spec_id: row.spec_id,
|
||||
label: `${row.material} / ${row.diameter_in} / ${row.schedule}`
|
||||
}));
|
||||
|
||||
res.json(result);
|
||||
} catch (err) {
|
||||
console.error('[getAll 오류]', err);
|
||||
res.status(500).json({ error: '파이프 스펙 전체 조회 실패' });
|
||||
}
|
||||
};
|
||||
|
||||
// ✅ 등록
|
||||
exports.create = async (req, res) => {
|
||||
try {
|
||||
const { material, diameter_in, schedule } = req.body;
|
||||
if (!material || !diameter_in || !schedule) {
|
||||
return res.status(400).json({ error: '모든 항목이 필요합니다.' });
|
||||
}
|
||||
|
||||
const db = await getDb();
|
||||
|
||||
// 중복 체크
|
||||
const [existing] = await db.query(
|
||||
`SELECT * FROM PipeSpecs WHERE material = ? AND diameter_in = ? AND schedule = ?`,
|
||||
[material.trim(), diameter_in.trim(), schedule.trim()]
|
||||
);
|
||||
|
||||
if (existing.length > 0) {
|
||||
return res.status(409).json({ error: '이미 등록된 스펙입니다.' });
|
||||
}
|
||||
|
||||
await db.query(
|
||||
`INSERT INTO PipeSpecs (material, diameter_in, schedule) VALUES (?, ?, ?)`,
|
||||
[material.trim(), diameter_in.trim(), schedule.trim()]
|
||||
);
|
||||
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
console.error('[create 오류]', err);
|
||||
res.status(500).json({ error: '파이프 스펙 등록 실패' });
|
||||
}
|
||||
};
|
||||
|
||||
// ✅ 삭제
|
||||
exports.remove = async (req, res) => {
|
||||
const { spec_id } = req.params;
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM PipeSpecs WHERE spec_id = ?`,
|
||||
[spec_id]
|
||||
);
|
||||
if (result.affectedRows === 0) {
|
||||
return res.status(404).json({ error: '해당 스펙이 존재하지 않습니다.' });
|
||||
}
|
||||
res.json({ success: true });
|
||||
} catch (err) {
|
||||
console.error('[remove 오류]', err);
|
||||
res.status(500).json({ error: '파이프 스펙 삭제 실패' });
|
||||
}
|
||||
};
|
||||
|
||||
// ✅ 재질 목록
|
||||
exports.getMaterials = async (req, res) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT DISTINCT material FROM PipeSpecs ORDER BY material`
|
||||
);
|
||||
res.json(rows.map(row => row.material));
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: '재질 목록 조회 실패' });
|
||||
}
|
||||
};
|
||||
|
||||
// ✅ 직경 목록 (material 기준)
|
||||
exports.getDiameters = async (req, res) => {
|
||||
const { material } = req.query;
|
||||
if (!material) {
|
||||
return res.status(400).json({ error: 'material 파라미터가 필요합니다.' });
|
||||
}
|
||||
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT DISTINCT diameter_in FROM PipeSpecs WHERE material = ? ORDER BY diameter_in`,
|
||||
[material]
|
||||
);
|
||||
res.json(rows.map(row => row.diameter_in));
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: '직경 목록 조회 실패' });
|
||||
}
|
||||
};
|
||||
|
||||
// ✅ 스케줄 목록 (material + 직경 기준)
|
||||
exports.getSchedules = async (req, res) => {
|
||||
const { material, diameter_in } = req.query;
|
||||
if (!material || !diameter_in) {
|
||||
return res.status(400).json({ error: 'material과 diameter_in이 필요합니다.' });
|
||||
}
|
||||
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT DISTINCT schedule FROM PipeSpecs
|
||||
WHERE material = ? AND diameter_in = ?
|
||||
ORDER BY schedule`,
|
||||
[material, diameter_in]
|
||||
);
|
||||
res.json(rows.map(row => row.schedule));
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: '스케줄 목록 조회 실패' });
|
||||
}
|
||||
};
|
||||
@@ -1,100 +0,0 @@
|
||||
const processModel = require('../models/processModel');
|
||||
const projectModel = require('../models/projectModel');
|
||||
|
||||
// 1. 공정 등록
|
||||
exports.createProcess = async (req, res) => {
|
||||
try {
|
||||
const processData = req.body;
|
||||
|
||||
if (!processData.process_end) {
|
||||
const project = await new Promise((resolve, reject) => {
|
||||
projectModel.getById(processData.project_id, (err, row) => {
|
||||
if (err) return reject(err);
|
||||
if (!row) return reject({ status: 404, message: 'Project not found' });
|
||||
resolve(row);
|
||||
});
|
||||
});
|
||||
|
||||
processData.process_end = project.due_date;
|
||||
}
|
||||
|
||||
const lastID = await new Promise((resolve, reject) => {
|
||||
processModel.create(processData, (err, id) => (err ? reject(err) : resolve(id)));
|
||||
});
|
||||
|
||||
res.json({ success: true, process_id: lastID });
|
||||
} catch (err) {
|
||||
const status = err.status || 500;
|
||||
res.status(status).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 2. 전체 조회
|
||||
exports.getAllProcesses = async (req, res) => {
|
||||
try {
|
||||
const rows = await new Promise((resolve, reject) => {
|
||||
processModel.getAll((err, data) => (err ? reject(err) : resolve(data)));
|
||||
});
|
||||
res.json(rows);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 3. 단일 조회
|
||||
exports.getProcessById = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.process_id, 10);
|
||||
const row = await new Promise((resolve, reject) => {
|
||||
processModel.getById(id, (err, data) => (err ? reject(err) : resolve(data)));
|
||||
});
|
||||
if (!row) return res.status(404).json({ error: 'Process not found' });
|
||||
res.json(row);
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 4. 수정
|
||||
exports.updateProcess = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.process_id, 10);
|
||||
const processData = { ...req.body, process_id: id };
|
||||
|
||||
if (!processData.process_end) {
|
||||
const project = await new Promise((resolve, reject) => {
|
||||
projectModel.getById(processData.project_id, (err, row) => {
|
||||
if (err) return reject(err);
|
||||
if (!row) return reject({ status: 404, message: 'Project not found' });
|
||||
resolve(row);
|
||||
});
|
||||
});
|
||||
|
||||
processData.process_end = project.due_date;
|
||||
}
|
||||
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
processModel.update(processData, (err, ch) => (err ? reject(err) : resolve(ch)));
|
||||
});
|
||||
|
||||
if (changes === 0) return res.status(404).json({ error: 'No changes or not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
const status = err.status || 500;
|
||||
res.status(status).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
|
||||
// 5. 삭제
|
||||
exports.removeProcess = async (req, res) => {
|
||||
try {
|
||||
const id = parseInt(req.params.process_id, 10);
|
||||
const changes = await new Promise((resolve, reject) => {
|
||||
processModel.remove(id, (err, ch) => (err ? reject(err) : resolve(ch)));
|
||||
});
|
||||
if (changes === 0) return res.status(404).json({ error: 'Process not found' });
|
||||
res.json({ success: true, changes });
|
||||
} catch (err) {
|
||||
res.status(500).json({ error: err.message || String(err) });
|
||||
}
|
||||
};
|
||||
@@ -16,6 +16,7 @@ class WorkAnalysisController {
|
||||
this.getErrorAnalysis = this.getErrorAnalysis.bind(this);
|
||||
this.getMonthlyComparison = this.getMonthlyComparison.bind(this);
|
||||
this.getWorkerSpecialization = this.getWorkerSpecialization.bind(this);
|
||||
this.getProjectWorkTypeAnalysis = this.getProjectWorkTypeAnalysis.bind(this);
|
||||
}
|
||||
|
||||
// 날짜 유효성 검사
|
||||
@@ -367,6 +368,142 @@ class WorkAnalysisController {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// 프로젝트별-작업별 시간 분석 (총시간, 정규시간, 에러시간)
|
||||
async getProjectWorkTypeAnalysis(req, res) {
|
||||
try {
|
||||
const { start, end } = req.query;
|
||||
this.validateDateRange(start, end);
|
||||
|
||||
const db = await getDb();
|
||||
|
||||
// 먼저 데이터 존재 여부 확인
|
||||
const testQuery = `
|
||||
SELECT
|
||||
COUNT(*) as total_count,
|
||||
MIN(report_date) as min_date,
|
||||
MAX(report_date) as max_date,
|
||||
SUM(work_hours) as total_hours
|
||||
FROM daily_work_reports
|
||||
WHERE report_date BETWEEN ? AND ?
|
||||
`;
|
||||
|
||||
const testResults = await db.query(testQuery, [start, end]);
|
||||
console.log('📊 데이터 확인:', testResults[0]);
|
||||
|
||||
// 프로젝트별-작업별 시간 분석 쿼리 (간단한 버전으로 테스트)
|
||||
const query = `
|
||||
SELECT
|
||||
COALESCE(p.project_id, 0) as project_id,
|
||||
COALESCE(p.project_name, 'Unknown Project') as project_name,
|
||||
COALESCE(p.job_no, 'N/A') as job_no,
|
||||
dwr.work_type_id,
|
||||
CONCAT('Work Type ', dwr.work_type_id) as work_type_name,
|
||||
|
||||
-- 총 시간
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
|
||||
-- 정규 시간 (work_status_id = 1)
|
||||
SUM(CASE WHEN dwr.work_status_id = 1 THEN dwr.work_hours ELSE 0 END) as regular_hours,
|
||||
|
||||
-- 에러 시간 (work_status_id = 2)
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN dwr.work_hours ELSE 0 END) as error_hours,
|
||||
|
||||
-- 작업 건수
|
||||
COUNT(*) as total_reports,
|
||||
COUNT(CASE WHEN dwr.work_status_id = 1 THEN 1 END) as regular_reports,
|
||||
COUNT(CASE WHEN dwr.work_status_id = 2 THEN 1 END) as error_reports,
|
||||
|
||||
-- 에러율 계산
|
||||
ROUND(
|
||||
(SUM(CASE WHEN dwr.work_status_id = 2 THEN dwr.work_hours ELSE 0 END) /
|
||||
SUM(dwr.work_hours)) * 100, 2
|
||||
) as error_rate_percent
|
||||
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
GROUP BY p.project_id, p.project_name, p.job_no, dwr.work_type_id
|
||||
ORDER BY p.project_name, dwr.work_type_id
|
||||
`;
|
||||
|
||||
const results = await db.query(query, [start, end]);
|
||||
|
||||
// 데이터를 프로젝트별로 그룹화
|
||||
const groupedData = {};
|
||||
|
||||
results.forEach(row => {
|
||||
const projectKey = `${row.project_id}_${row.project_name}`;
|
||||
|
||||
if (!groupedData[projectKey]) {
|
||||
groupedData[projectKey] = {
|
||||
project_id: row.project_id,
|
||||
project_name: row.project_name,
|
||||
job_no: row.job_no,
|
||||
total_project_hours: 0,
|
||||
total_regular_hours: 0,
|
||||
total_error_hours: 0,
|
||||
work_types: []
|
||||
};
|
||||
}
|
||||
|
||||
// 프로젝트 총계 누적
|
||||
groupedData[projectKey].total_project_hours += parseFloat(row.total_hours);
|
||||
groupedData[projectKey].total_regular_hours += parseFloat(row.regular_hours);
|
||||
groupedData[projectKey].total_error_hours += parseFloat(row.error_hours);
|
||||
|
||||
// 작업 유형별 데이터 추가
|
||||
groupedData[projectKey].work_types.push({
|
||||
work_type_id: row.work_type_id,
|
||||
work_type_name: row.work_type_name,
|
||||
total_hours: parseFloat(row.total_hours),
|
||||
regular_hours: parseFloat(row.regular_hours),
|
||||
error_hours: parseFloat(row.error_hours),
|
||||
total_reports: row.total_reports,
|
||||
regular_reports: row.regular_reports,
|
||||
error_reports: row.error_reports,
|
||||
error_rate_percent: parseFloat(row.error_rate_percent) || 0
|
||||
});
|
||||
});
|
||||
|
||||
// 프로젝트별 에러율 계산
|
||||
Object.values(groupedData).forEach(project => {
|
||||
project.project_error_rate = project.total_project_hours > 0
|
||||
? Math.round((project.total_error_hours / project.total_project_hours) * 100 * 100) / 100
|
||||
: 0;
|
||||
});
|
||||
|
||||
// 전체 요약 통계
|
||||
const totalStats = {
|
||||
total_projects: Object.keys(groupedData).length,
|
||||
total_work_types: new Set(results.map(r => r.work_type_id)).size,
|
||||
grand_total_hours: Object.values(groupedData).reduce((sum, p) => sum + p.total_project_hours, 0),
|
||||
grand_regular_hours: Object.values(groupedData).reduce((sum, p) => sum + p.total_regular_hours, 0),
|
||||
grand_error_hours: Object.values(groupedData).reduce((sum, p) => sum + p.total_error_hours, 0)
|
||||
};
|
||||
|
||||
totalStats.grand_error_rate = totalStats.grand_total_hours > 0
|
||||
? Math.round((totalStats.grand_error_hours / totalStats.grand_total_hours) * 100 * 100) / 100
|
||||
: 0;
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {
|
||||
summary: totalStats,
|
||||
projects: Object.values(groupedData),
|
||||
period: { start, end }
|
||||
},
|
||||
message: '프로젝트별-작업별 시간 분석 완료'
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('프로젝트별-작업별 시간 분석 오류:', error);
|
||||
res.status(400).json({
|
||||
success: false,
|
||||
error: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = new WorkAnalysisController();
|
||||
381
api.hyungi.net/controllers/workReportAnalysisController.js
Normal file
381
api.hyungi.net/controllers/workReportAnalysisController.js
Normal file
@@ -0,0 +1,381 @@
|
||||
// controllers/workReportAnalysisController.js - 데일리 워크 레포트 분석 전용 컨트롤러
|
||||
const dailyWorkReportModel = require('../models/dailyWorkReportModel');
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
/**
|
||||
* 📋 분석용 필터 데이터 조회 (프로젝트, 작업자, 작업유형 목록)
|
||||
*/
|
||||
const getAnalysisFilters = async (req, res) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
|
||||
// 프로젝트 목록
|
||||
const [projects] = await db.query(`
|
||||
SELECT DISTINCT p.project_id, p.project_name
|
||||
FROM projects p
|
||||
INNER JOIN daily_work_reports dwr ON p.project_id = dwr.project_id
|
||||
ORDER BY p.project_name
|
||||
`);
|
||||
|
||||
// 작업자 목록
|
||||
const [workers] = await db.query(`
|
||||
SELECT DISTINCT w.worker_id, w.worker_name
|
||||
FROM workers w
|
||||
INNER JOIN daily_work_reports dwr ON w.worker_id = dwr.worker_id
|
||||
ORDER BY w.worker_name
|
||||
`);
|
||||
|
||||
// 작업 유형 목록
|
||||
const [workTypes] = await db.query(`
|
||||
SELECT DISTINCT wt.id as work_type_id, wt.name as work_type_name
|
||||
FROM work_types wt
|
||||
INNER JOIN daily_work_reports dwr ON wt.id = dwr.work_type_id
|
||||
ORDER BY wt.name
|
||||
`);
|
||||
|
||||
// 날짜 범위 (최초/최신 데이터)
|
||||
const [dateRange] = await db.query(`
|
||||
SELECT
|
||||
MIN(report_date) as min_date,
|
||||
MAX(report_date) as max_date
|
||||
FROM daily_work_reports
|
||||
`);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
projects,
|
||||
workers,
|
||||
workTypes,
|
||||
dateRange: dateRange[0]
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('필터 데이터 조회 오류:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: '필터 데이터 조회 중 오류가 발생했습니다.',
|
||||
detail: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 📊 기간별 작업 분석 데이터 조회
|
||||
*/
|
||||
const getAnalyticsByPeriod = async (req, res) => {
|
||||
try {
|
||||
const { start_date, end_date, project_id, worker_id } = req.query;
|
||||
|
||||
if (!start_date || !end_date) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'start_date와 end_date가 필요합니다.',
|
||||
example: 'start_date=2025-08-01&end_date=2025-08-31'
|
||||
});
|
||||
}
|
||||
|
||||
const db = await getDb();
|
||||
|
||||
// 기본 조건
|
||||
let whereConditions = ['dwr.report_date BETWEEN ? AND ?'];
|
||||
let queryParams = [start_date, end_date];
|
||||
|
||||
// 프로젝트 필터
|
||||
if (project_id) {
|
||||
whereConditions.push('dwr.project_id = ?');
|
||||
queryParams.push(project_id);
|
||||
}
|
||||
|
||||
// 작업자 필터
|
||||
if (worker_id) {
|
||||
whereConditions.push('dwr.worker_id = ?');
|
||||
queryParams.push(worker_id);
|
||||
}
|
||||
|
||||
const whereClause = whereConditions.join(' AND ');
|
||||
|
||||
// 1. 전체 요약 통계 (에러 분석 포함)
|
||||
const overallSql = `
|
||||
SELECT
|
||||
COUNT(*) as total_entries,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
COUNT(DISTINCT dwr.worker_id) as unique_workers,
|
||||
COUNT(DISTINCT dwr.project_id) as unique_projects,
|
||||
COUNT(DISTINCT dwr.report_date) as working_days,
|
||||
AVG(dwr.work_hours) as avg_hours_per_entry,
|
||||
COUNT(DISTINCT dwr.created_by) as contributors,
|
||||
COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) as error_entries,
|
||||
ROUND((COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) / COUNT(*)) * 100, 2) as error_rate
|
||||
FROM daily_work_reports dwr
|
||||
WHERE ${whereClause}
|
||||
`;
|
||||
|
||||
const [overallStats] = await db.query(overallSql, queryParams);
|
||||
|
||||
// 2. 일별 통계
|
||||
const dailyStatsSql = `
|
||||
SELECT
|
||||
dwr.report_date,
|
||||
SUM(dwr.work_hours) as daily_hours,
|
||||
COUNT(*) as daily_entries,
|
||||
COUNT(DISTINCT dwr.worker_id) as daily_workers
|
||||
FROM daily_work_reports dwr
|
||||
WHERE ${whereClause}
|
||||
GROUP BY dwr.report_date
|
||||
ORDER BY dwr.report_date ASC
|
||||
`;
|
||||
|
||||
const [dailyStats] = await db.query(dailyStatsSql, queryParams);
|
||||
|
||||
// 2.5. 일별 에러 발생 통계
|
||||
const dailyErrorStatsSql = `
|
||||
SELECT
|
||||
dwr.report_date,
|
||||
COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) as daily_errors,
|
||||
COUNT(*) as daily_total,
|
||||
ROUND((COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) / COUNT(*)) * 100, 2) as daily_error_rate
|
||||
FROM daily_work_reports dwr
|
||||
WHERE ${whereClause}
|
||||
GROUP BY dwr.report_date
|
||||
ORDER BY dwr.report_date ASC
|
||||
`;
|
||||
|
||||
const [dailyErrorStats] = await db.query(dailyErrorStatsSql, queryParams);
|
||||
|
||||
// 3. 에러 유형별 분석 (간단한 방식으로 수정)
|
||||
const errorAnalysisSql = `
|
||||
SELECT
|
||||
et.id as error_type_id,
|
||||
et.name as error_type_name,
|
||||
COUNT(*) as error_count,
|
||||
SUM(dwr.work_hours) as error_hours,
|
||||
ROUND((COUNT(*) / (SELECT COUNT(*) FROM daily_work_reports WHERE error_type_id IS NOT NULL)) * 100, 2) as error_percentage
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
WHERE ${whereClause} AND dwr.error_type_id IS NOT NULL
|
||||
GROUP BY et.id, et.name
|
||||
ORDER BY error_count DESC
|
||||
`;
|
||||
|
||||
const [errorAnalysis] = await db.query(errorAnalysisSql, queryParams);
|
||||
|
||||
// 4. 작업 유형별 분석
|
||||
const workTypeAnalysisSql = `
|
||||
SELECT
|
||||
wt.id as work_type_id,
|
||||
wt.name as work_type_name,
|
||||
COUNT(*) as work_count,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
AVG(dwr.work_hours) as avg_hours,
|
||||
COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) as error_count,
|
||||
ROUND((COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) / COUNT(*)) * 100, 2) as error_rate
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY wt.id, wt.name
|
||||
ORDER BY total_hours DESC
|
||||
`;
|
||||
|
||||
const [workTypeAnalysis] = await db.query(workTypeAnalysisSql, queryParams);
|
||||
|
||||
// 5. 작업자별 성과 분석
|
||||
const workerAnalysisSql = `
|
||||
SELECT
|
||||
w.worker_id,
|
||||
w.worker_name,
|
||||
COUNT(*) as total_entries,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
AVG(dwr.work_hours) as avg_hours_per_entry,
|
||||
COUNT(DISTINCT dwr.project_id) as projects_worked,
|
||||
COUNT(DISTINCT dwr.report_date) as working_days,
|
||||
COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) as error_count,
|
||||
ROUND((COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) / COUNT(*)) * 100, 2) as error_rate
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY w.worker_id, w.worker_name
|
||||
ORDER BY total_hours DESC
|
||||
`;
|
||||
|
||||
const [workerAnalysis] = await db.query(workerAnalysisSql, queryParams);
|
||||
|
||||
// 6. 프로젝트별 분석
|
||||
const projectAnalysisSql = `
|
||||
SELECT
|
||||
p.project_id,
|
||||
p.project_name,
|
||||
COUNT(*) as total_entries,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
COUNT(DISTINCT dwr.worker_id) as workers_count,
|
||||
COUNT(DISTINCT dwr.report_date) as working_days,
|
||||
AVG(dwr.work_hours) as avg_hours_per_entry,
|
||||
COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) as error_count,
|
||||
ROUND((COUNT(CASE WHEN dwr.error_type_id IS NOT NULL THEN 1 END) / COUNT(*)) * 100, 2) as error_rate
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY p.project_id, p.project_name
|
||||
ORDER BY total_hours DESC
|
||||
`;
|
||||
|
||||
const [projectAnalysis] = await db.query(projectAnalysisSql, queryParams);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
summary: overallStats[0],
|
||||
dailyStats,
|
||||
dailyErrorStats,
|
||||
errorAnalysis,
|
||||
workTypeAnalysis,
|
||||
workerAnalysis,
|
||||
projectAnalysis,
|
||||
period: { start_date, end_date },
|
||||
filters: { project_id, worker_id }
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('기간별 분석 데이터 조회 오류:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: '기간별 분석 데이터 조회 중 오류가 발생했습니다.',
|
||||
detail: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 📈 프로젝트별 상세 분석
|
||||
*/
|
||||
const getProjectAnalysis = async (req, res) => {
|
||||
try {
|
||||
const { start_date, end_date, project_id } = req.query;
|
||||
|
||||
if (!start_date || !end_date) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'start_date와 end_date가 필요합니다.'
|
||||
});
|
||||
}
|
||||
|
||||
const db = await getDb();
|
||||
|
||||
let whereConditions = ['dwr.report_date BETWEEN ? AND ?'];
|
||||
let queryParams = [start_date, end_date];
|
||||
|
||||
if (project_id) {
|
||||
whereConditions.push('dwr.project_id = ?');
|
||||
queryParams.push(project_id);
|
||||
}
|
||||
|
||||
const whereClause = whereConditions.join(' AND ');
|
||||
|
||||
// 프로젝트별 통계
|
||||
const projectStatsSql = `
|
||||
SELECT
|
||||
dwr.project_id,
|
||||
p.project_name,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
COUNT(*) as total_entries,
|
||||
COUNT(DISTINCT dwr.worker_id) as workers_count,
|
||||
COUNT(DISTINCT dwr.report_date) as working_days,
|
||||
AVG(dwr.work_hours) as avg_hours_per_entry
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY dwr.project_id
|
||||
ORDER BY total_hours DESC
|
||||
`;
|
||||
|
||||
const [projectStats] = await db.query(projectStatsSql, queryParams);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
projectStats,
|
||||
period: { start_date, end_date }
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('프로젝트별 분석 데이터 조회 오류:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: '프로젝트별 분석 데이터 조회 중 오류가 발생했습니다.',
|
||||
detail: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* 👤 작업자별 상세 분석
|
||||
*/
|
||||
const getWorkerAnalysis = async (req, res) => {
|
||||
try {
|
||||
const { start_date, end_date, worker_id } = req.query;
|
||||
|
||||
if (!start_date || !end_date) {
|
||||
return res.status(400).json({
|
||||
success: false,
|
||||
error: 'start_date와 end_date가 필요합니다.'
|
||||
});
|
||||
}
|
||||
|
||||
const db = await getDb();
|
||||
|
||||
let whereConditions = ['dwr.report_date BETWEEN ? AND ?'];
|
||||
let queryParams = [start_date, end_date];
|
||||
|
||||
if (worker_id) {
|
||||
whereConditions.push('dwr.worker_id = ?');
|
||||
queryParams.push(worker_id);
|
||||
}
|
||||
|
||||
const whereClause = whereConditions.join(' AND ');
|
||||
|
||||
// 작업자별 통계
|
||||
const workerStatsSql = `
|
||||
SELECT
|
||||
dwr.worker_id,
|
||||
w.worker_name,
|
||||
SUM(dwr.work_hours) as total_hours,
|
||||
COUNT(*) as total_entries,
|
||||
COUNT(DISTINCT dwr.project_id) as projects_worked,
|
||||
COUNT(DISTINCT dwr.report_date) as working_days,
|
||||
AVG(dwr.work_hours) as avg_hours_per_entry
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE ${whereClause}
|
||||
GROUP BY dwr.worker_id
|
||||
ORDER BY total_hours DESC
|
||||
`;
|
||||
|
||||
const [workerStats] = await db.query(workerStatsSql, queryParams);
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: {
|
||||
workerStats,
|
||||
period: { start_date, end_date }
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('작업자별 분석 데이터 조회 오류:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
error: '작업자별 분석 데이터 조회 중 오류가 발생했습니다.',
|
||||
detail: error.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
getAnalysisFilters,
|
||||
getAnalyticsByPeriod,
|
||||
getProjectAnalysis,
|
||||
getWorkerAnalysis
|
||||
};
|
||||
774
api.hyungi.net/daily_work_reports_backup_20250902_081944.sql
Normal file
774
api.hyungi.net/daily_work_reports_backup_20250902_081944.sql
Normal file
@@ -0,0 +1,774 @@
|
||||
-- MariaDB dump 10.19 Distrib 10.9.8-MariaDB, for debian-linux-gnu (aarch64)
|
||||
--
|
||||
-- Host: localhost Database: hyungi_dev
|
||||
-- ------------------------------------------------------
|
||||
-- Server version 10.9.8-MariaDB-1:10.9.8+maria~ubu2204
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8mb4 */;
|
||||
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
|
||||
/*!40103 SET TIME_ZONE='+00:00' */;
|
||||
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
|
||||
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
|
||||
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
|
||||
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
|
||||
|
||||
--
|
||||
-- Table structure for table `daily_work_reports`
|
||||
--
|
||||
|
||||
DROP TABLE IF EXISTS `daily_work_reports`;
|
||||
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||
/*!40101 SET character_set_client = utf8 */;
|
||||
CREATE TABLE `daily_work_reports` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`report_date` date NOT NULL COMMENT '작업 날짜',
|
||||
`worker_id` int(11) NOT NULL COMMENT '작업자 ID',
|
||||
`project_id` int(11) NOT NULL COMMENT '프로젝트 ID',
|
||||
`work_type_id` int(11) NOT NULL COMMENT '작업 유형 ID',
|
||||
`work_status_id` int(11) DEFAULT 1 COMMENT '업무 상태 ID (1:정규, 2:에러)',
|
||||
`error_type_id` int(11) DEFAULT NULL COMMENT '에러 유형 ID (에러일 때만)',
|
||||
`work_hours` decimal(4,2) NOT NULL COMMENT '작업 시간',
|
||||
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
|
||||
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
|
||||
`created_by` int(11) NOT NULL DEFAULT 1 COMMENT '작성자 user_id',
|
||||
`updated_by` int(11) DEFAULT NULL COMMENT '수정자 user_id',
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `idx_report_date` (`report_date`),
|
||||
KEY `idx_worker_date` (`worker_id`,`report_date`),
|
||||
KEY `idx_project_date` (`project_id`,`report_date`),
|
||||
KEY `idx_work_type` (`work_type_id`),
|
||||
KEY `idx_work_status` (`work_status_id`),
|
||||
KEY `idx_error_type` (`error_type_id`),
|
||||
KEY `idx_created_by` (`created_by`),
|
||||
KEY `idx_date_worker_creator` (`report_date`,`worker_id`,`created_by`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=741 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||
|
||||
--
|
||||
-- Dumping data for table `daily_work_reports`
|
||||
--
|
||||
|
||||
LOCK TABLES `daily_work_reports` WRITE;
|
||||
/*!40000 ALTER TABLE `daily_work_reports` DISABLE KEYS */;
|
||||
INSERT INTO `daily_work_reports` VALUES
|
||||
(14,'2025-06-02',1,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(15,'2025-06-02',3,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(16,'2025-06-02',4,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(17,'2025-06-02',6,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(18,'2025-06-02',7,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(19,'2025-06-02',9,4,3,1,NULL,8.00,'2025-06-16 05:10:23','2025-06-16 05:10:23',1,NULL),
|
||||
(20,'2025-06-02',2,3,2,1,NULL,8.00,'2025-06-16 05:10:47','2025-06-16 05:10:47',1,NULL),
|
||||
(21,'2025-06-04',1,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(22,'2025-06-04',3,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(23,'2025-06-04',5,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(24,'2025-06-04',7,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(25,'2025-06-04',9,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(26,'2025-06-04',10,4,3,1,NULL,8.00,'2025-06-16 05:11:37','2025-06-16 05:11:37',1,NULL),
|
||||
(27,'2025-06-04',2,3,2,1,NULL,8.00,'2025-06-16 05:12:07','2025-06-16 05:12:07',1,NULL),
|
||||
(28,'2025-06-04',6,3,2,1,NULL,8.00,'2025-06-16 05:12:07','2025-06-16 05:12:07',1,NULL),
|
||||
(29,'2025-06-04',8,3,2,1,NULL,8.00,'2025-06-16 05:12:07','2025-06-16 05:12:07',1,NULL),
|
||||
(30,'2025-06-05',1,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(31,'2025-06-05',3,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(32,'2025-06-05',4,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(33,'2025-06-05',7,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(34,'2025-06-05',10,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(35,'2025-06-05',9,4,3,2,1,8.00,'2025-06-16 05:12:57','2025-06-16 05:12:57',1,NULL),
|
||||
(36,'2025-06-05',2,3,2,1,NULL,8.00,'2025-06-16 05:13:56','2025-06-16 05:13:56',1,NULL),
|
||||
(37,'2025-06-05',5,3,2,1,NULL,8.00,'2025-06-16 05:13:56','2025-06-16 05:13:56',1,NULL),
|
||||
(38,'2025-06-05',6,3,2,1,NULL,8.00,'2025-06-16 05:13:56','2025-06-16 05:13:56',1,NULL),
|
||||
(39,'2025-06-05',8,3,2,1,NULL,8.00,'2025-06-16 05:13:56','2025-06-16 05:13:56',1,NULL),
|
||||
(40,'2025-06-16',5,3,2,1,NULL,8.00,'2025-06-16 06:12:01','2025-06-16 06:12:01',5,NULL),
|
||||
(43,'2025-06-16',2,3,2,1,NULL,8.00,'2025-06-16 06:12:01','2025-06-16 06:12:01',5,NULL),
|
||||
(44,'2025-06-16',6,3,2,2,4,4.00,'2025-06-16 06:13:02','2025-06-16 06:13:02',5,NULL),
|
||||
(45,'2025-06-16',6,3,2,1,NULL,4.00,'2025-06-16 06:13:50','2025-06-16 06:13:50',5,NULL),
|
||||
(46,'2025-06-16',8,3,2,2,4,4.00,'2025-06-16 06:15:22','2025-06-16 06:15:22',5,NULL),
|
||||
(47,'2025-06-16',8,3,2,1,NULL,4.00,'2025-06-16 06:15:22','2025-06-16 06:15:22',5,NULL),
|
||||
(48,'2025-06-16',4,4,3,2,1,8.00,'2025-06-16 06:46:44','2025-06-16 06:46:44',3,NULL),
|
||||
(50,'2025-06-16',1,4,3,2,1,8.00,'2025-06-16 06:46:44','2025-06-16 06:46:44',3,NULL),
|
||||
(51,'2025-06-16',9,4,3,1,NULL,8.00,'2025-06-16 06:48:29','2025-06-16 06:48:29',3,NULL),
|
||||
(52,'2025-06-16',10,4,3,1,NULL,6.00,'2025-06-16 06:50:09','2025-06-16 06:50:09',6,NULL),
|
||||
(53,'2025-06-16',10,4,3,2,1,2.00,'2025-06-16 06:50:09','2025-06-16 06:50:09',6,NULL),
|
||||
(54,'2025-06-16',3,4,3,1,NULL,6.00,'2025-06-16 06:50:09','2025-06-16 06:50:09',6,NULL),
|
||||
(55,'2025-06-16',3,4,3,2,1,2.00,'2025-06-16 06:50:09','2025-06-16 06:50:09',6,NULL),
|
||||
(56,'2025-06-17',2,3,2,1,NULL,8.00,'2025-06-17 08:23:41','2025-06-17 08:23:41',5,NULL),
|
||||
(57,'2025-06-17',2,3,2,1,NULL,2.00,'2025-06-17 08:23:41','2025-06-17 08:23:41',5,NULL),
|
||||
(58,'2025-06-17',5,3,2,1,NULL,8.00,'2025-06-17 08:23:41','2025-06-17 08:23:41',5,NULL),
|
||||
(59,'2025-06-17',5,3,2,1,NULL,2.00,'2025-06-17 08:23:41','2025-06-17 08:23:41',5,NULL),
|
||||
(60,'2025-06-17',6,3,2,1,NULL,8.00,'2025-06-17 08:24:33','2025-06-17 08:24:33',5,NULL),
|
||||
(61,'2025-06-17',6,3,2,2,4,2.00,'2025-06-17 08:24:33','2025-06-17 08:24:33',5,NULL),
|
||||
(62,'2025-06-17',8,3,2,1,NULL,8.00,'2025-06-17 08:24:33','2025-06-17 08:24:33',5,NULL),
|
||||
(63,'2025-06-17',8,3,2,2,4,2.00,'2025-06-17 08:24:33','2025-06-17 08:24:33',5,NULL),
|
||||
(65,'2025-06-17',9,4,3,2,1,4.00,'2025-06-17 08:25:24','2025-06-17 08:25:24',3,NULL),
|
||||
(66,'2025-06-17',1,4,3,2,1,4.00,'2025-06-17 08:27:06','2025-06-17 08:27:06',3,NULL),
|
||||
(67,'2025-06-17',4,4,3,2,1,4.00,'2025-06-17 08:27:06','2025-06-17 08:27:06',3,NULL),
|
||||
(68,'2025-06-17',1,4,3,1,NULL,4.00,'2025-06-17 08:31:06','2025-06-17 08:31:06',3,NULL),
|
||||
(69,'2025-06-17',9,4,3,1,NULL,4.00,'2025-06-17 08:31:06','2025-06-17 08:31:06',3,NULL),
|
||||
(70,'2025-06-17',4,4,3,1,NULL,4.00,'2025-06-17 08:31:06','2025-06-17 08:31:06',3,NULL),
|
||||
(71,'2025-06-17',9,4,3,1,NULL,2.00,'2025-06-17 08:33:06','2025-06-17 08:33:06',3,NULL),
|
||||
(72,'2025-06-17',4,4,3,1,NULL,2.00,'2025-06-17 08:33:06','2025-06-17 08:33:06',3,NULL),
|
||||
(73,'2025-06-17',1,4,3,1,NULL,2.00,'2025-06-17 08:33:06','2025-06-17 08:33:06',3,NULL),
|
||||
(74,'2025-06-17',10,4,3,1,NULL,8.00,'2025-06-17 08:34:11','2025-06-17 08:34:11',6,NULL),
|
||||
(75,'2025-06-17',10,4,3,2,1,2.00,'2025-06-17 08:34:11','2025-06-17 08:34:11',6,NULL),
|
||||
(76,'2025-06-17',3,4,3,1,NULL,8.00,'2025-06-17 08:34:11','2025-06-17 08:34:11',6,NULL),
|
||||
(77,'2025-06-17',3,4,3,2,1,2.00,'2025-06-17 08:34:11','2025-06-17 08:34:11',6,NULL),
|
||||
(78,'2025-06-18',6,3,2,1,NULL,8.00,'2025-06-18 08:40:27','2025-06-18 08:40:27',5,NULL),
|
||||
(79,'2025-06-18',2,3,2,1,NULL,8.00,'2025-06-18 08:40:27','2025-06-18 08:40:27',5,NULL),
|
||||
(80,'2025-06-18',8,3,2,1,NULL,8.00,'2025-06-18 08:40:27','2025-06-18 08:40:27',5,NULL),
|
||||
(81,'2025-06-18',2,3,2,1,NULL,2.00,'2025-06-18 08:41:02','2025-06-18 08:41:02',5,NULL),
|
||||
(82,'2025-06-18',6,3,2,1,NULL,2.00,'2025-06-18 08:41:03','2025-06-18 08:41:03',5,NULL),
|
||||
(83,'2025-06-18',8,3,2,1,NULL,2.00,'2025-06-18 08:41:03','2025-06-18 08:41:03',5,NULL),
|
||||
(84,'2025-06-18',5,4,3,1,NULL,8.00,'2025-06-18 08:41:45','2025-06-18 08:41:45',5,NULL),
|
||||
(85,'2025-06-18',5,4,3,1,NULL,2.00,'2025-06-18 08:41:45','2025-06-18 08:41:45',5,NULL),
|
||||
(86,'2025-06-18',10,4,3,1,NULL,9.00,'2025-06-18 08:47:55','2025-06-18 08:47:55',6,NULL),
|
||||
(87,'2025-06-18',10,4,3,2,1,1.00,'2025-06-18 08:47:55','2025-06-18 08:47:55',6,NULL),
|
||||
(88,'2025-06-18',3,4,3,1,NULL,9.00,'2025-06-18 08:47:55','2025-06-18 08:47:55',6,NULL),
|
||||
(89,'2025-06-18',3,4,3,2,1,1.00,'2025-06-18 08:47:55','2025-06-18 08:47:55',6,NULL),
|
||||
(90,'2025-06-18',4,4,3,2,1,4.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(91,'2025-06-18',4,4,3,1,NULL,6.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(92,'2025-06-18',9,4,3,2,1,4.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(93,'2025-06-18',9,4,3,1,NULL,6.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(94,'2025-06-18',1,4,3,2,1,4.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(95,'2025-06-18',1,4,3,1,NULL,6.00,'2025-06-18 08:50:19','2025-06-18 08:50:19',3,NULL),
|
||||
(96,'2025-06-18',7,4,3,2,1,4.00,'2025-06-18 09:00:17','2025-06-18 09:00:17',3,NULL),
|
||||
(97,'2025-06-18',7,4,3,1,NULL,6.00,'2025-06-18 09:00:17','2025-06-18 09:00:17',3,NULL),
|
||||
(98,'2025-06-19',8,3,2,1,NULL,8.00,'2025-06-19 06:37:59','2025-06-19 06:37:59',5,NULL),
|
||||
(99,'2025-06-19',2,3,2,1,NULL,8.00,'2025-06-19 06:37:59','2025-06-19 06:37:59',5,NULL),
|
||||
(100,'2025-06-19',10,4,3,1,NULL,8.00,'2025-06-19 06:59:36','2025-06-19 06:59:36',6,NULL),
|
||||
(101,'2025-06-19',3,4,3,1,NULL,8.00,'2025-06-19 06:59:36','2025-06-19 06:59:36',6,NULL),
|
||||
(102,'2025-06-19',5,4,3,1,NULL,8.00,'2025-06-19 06:59:36','2025-06-19 06:59:36',6,NULL),
|
||||
(103,'2025-06-19',9,4,3,1,NULL,6.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(104,'2025-06-19',9,4,3,2,1,2.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(105,'2025-06-19',4,4,3,1,NULL,6.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(106,'2025-06-19',4,4,3,2,1,2.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(107,'2025-06-19',1,4,3,1,NULL,6.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(108,'2025-06-19',1,4,3,2,1,2.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(109,'2025-06-19',7,4,3,1,NULL,6.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(110,'2025-06-19',7,4,3,2,1,2.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(111,'2025-06-19',6,4,3,1,NULL,6.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(112,'2025-06-19',6,4,3,2,1,2.00,'2025-06-19 07:01:02','2025-06-19 07:01:02',3,NULL),
|
||||
(113,'2025-06-20',9,4,3,2,1,2.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(114,'2025-06-20',9,4,3,1,NULL,6.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(115,'2025-06-20',4,4,3,2,1,2.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(116,'2025-06-20',4,4,3,1,NULL,6.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(117,'2025-06-20',7,4,3,2,1,2.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(118,'2025-06-20',7,4,3,1,NULL,6.00,'2025-06-20 06:44:01','2025-06-20 06:44:01',3,NULL),
|
||||
(119,'2025-06-20',6,4,3,2,1,2.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(120,'2025-06-20',6,4,3,1,NULL,6.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(121,'2025-06-20',1,4,3,2,1,2.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(122,'2025-06-20',1,4,3,1,NULL,6.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(123,'2025-06-20',5,4,3,2,1,2.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(124,'2025-06-20',5,4,3,1,NULL,6.00,'2025-06-20 06:44:02','2025-06-20 06:44:02',3,NULL),
|
||||
(125,'2025-06-20',10,4,3,1,NULL,8.00,'2025-06-20 06:45:30','2025-06-20 06:45:30',6,NULL),
|
||||
(126,'2025-06-20',3,4,3,1,NULL,8.00,'2025-06-20 06:45:31','2025-06-20 06:45:31',6,NULL),
|
||||
(127,'2025-06-23',10,4,3,1,NULL,8.00,'2025-06-23 06:42:58','2025-06-23 06:42:58',6,NULL),
|
||||
(128,'2025-06-23',3,4,3,1,NULL,8.00,'2025-06-23 06:42:58','2025-06-23 06:42:58',6,NULL),
|
||||
(129,'2025-06-23',5,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(130,'2025-06-23',5,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(131,'2025-06-23',1,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(132,'2025-06-23',1,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(133,'2025-06-23',9,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(134,'2025-06-23',9,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(135,'2025-06-23',4,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(136,'2025-06-23',4,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(137,'2025-06-23',7,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(138,'2025-06-23',7,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(139,'2025-06-23',6,4,3,2,1,2.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(140,'2025-06-23',6,4,3,1,NULL,6.00,'2025-06-23 06:51:28','2025-06-23 06:51:28',3,NULL),
|
||||
(141,'2025-06-24',10,4,3,1,NULL,12.00,'2025-06-24 11:10:32','2025-06-24 11:10:32',6,NULL),
|
||||
(142,'2025-06-24',3,4,3,1,NULL,12.00,'2025-06-24 11:10:32','2025-06-24 11:10:32',6,NULL),
|
||||
(143,'2025-06-24',9,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(144,'2025-06-24',9,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(145,'2025-06-24',5,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(146,'2025-06-24',5,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(147,'2025-06-24',4,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(148,'2025-06-24',4,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(149,'2025-06-24',7,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(150,'2025-06-24',7,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(151,'2025-06-24',6,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(152,'2025-06-24',6,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(153,'2025-06-24',1,4,3,2,1,2.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(154,'2025-06-24',1,4,3,1,NULL,10.00,'2025-06-24 11:11:00','2025-06-24 11:11:00',3,NULL),
|
||||
(155,'2025-06-24',8,3,2,1,NULL,8.00,'2025-06-24 11:11:05','2025-06-24 11:11:05',5,NULL),
|
||||
(156,'2025-06-24',8,3,2,1,NULL,4.00,'2025-06-24 11:11:05','2025-06-24 11:11:05',5,NULL),
|
||||
(157,'2025-06-24',2,3,2,1,NULL,8.00,'2025-06-24 11:11:05','2025-06-24 11:11:05',5,NULL),
|
||||
(158,'2025-06-24',2,3,2,1,NULL,4.00,'2025-06-24 11:11:05','2025-06-24 11:11:05',5,NULL),
|
||||
(159,'2025-06-25',2,3,2,1,NULL,8.00,'2025-06-25 11:08:04','2025-06-25 11:08:04',5,NULL),
|
||||
(160,'2025-06-25',2,3,2,1,NULL,4.00,'2025-06-25 11:08:04','2025-06-25 11:08:04',5,NULL),
|
||||
(161,'2025-06-25',8,3,2,1,NULL,8.00,'2025-06-25 11:08:05','2025-06-25 11:08:05',5,NULL),
|
||||
(162,'2025-06-25',8,3,2,1,NULL,4.00,'2025-06-25 11:08:05','2025-06-25 11:08:05',5,NULL),
|
||||
(163,'2025-06-25',10,4,3,1,NULL,12.00,'2025-06-25 11:11:30','2025-06-25 11:11:30',6,NULL),
|
||||
(164,'2025-06-25',9,4,3,1,NULL,12.00,'2025-06-25 11:11:30','2025-06-25 11:11:30',6,NULL),
|
||||
(165,'2025-06-25',3,4,3,1,NULL,12.00,'2025-06-25 11:11:30','2025-06-25 11:11:30',6,NULL),
|
||||
(166,'2025-06-25',6,4,3,1,NULL,12.00,'2025-06-25 11:11:30','2025-06-25 11:11:30',6,NULL),
|
||||
(167,'2025-06-26',10,4,3,1,NULL,12.00,'2025-06-26 10:29:38','2025-06-26 10:29:38',3,NULL),
|
||||
(168,'2025-06-26',5,4,3,1,NULL,12.00,'2025-06-26 10:29:38','2025-06-26 10:29:38',3,NULL),
|
||||
(169,'2025-06-26',7,4,3,1,NULL,12.00,'2025-06-26 10:29:38','2025-06-26 10:29:38',3,NULL),
|
||||
(170,'2025-06-26',1,4,3,1,NULL,12.00,'2025-06-26 10:29:38','2025-06-26 10:29:38',3,NULL),
|
||||
(171,'2025-06-26',4,4,3,1,NULL,12.00,'2025-06-26 10:29:38','2025-06-26 10:29:38',3,NULL),
|
||||
(172,'2025-06-26',8,3,2,1,NULL,8.00,'2025-06-26 11:11:31','2025-06-26 11:11:31',5,NULL),
|
||||
(173,'2025-06-26',8,3,2,1,NULL,4.00,'2025-06-26 11:11:31','2025-06-26 11:11:31',5,NULL),
|
||||
(174,'2025-06-26',2,3,2,1,NULL,8.00,'2025-06-26 11:11:32','2025-06-26 11:11:32',5,NULL),
|
||||
(175,'2025-06-26',2,3,2,1,NULL,4.00,'2025-06-26 11:11:32','2025-06-26 11:11:32',5,NULL),
|
||||
(176,'2025-06-26',9,3,2,1,NULL,8.00,'2025-06-26 11:11:32','2025-06-26 11:11:32',5,NULL),
|
||||
(177,'2025-06-26',9,3,2,1,NULL,4.00,'2025-06-26 11:11:32','2025-06-26 11:11:32',5,NULL),
|
||||
(178,'2025-06-26',3,3,2,1,NULL,12.00,'2025-06-26 11:19:34','2025-06-26 11:19:34',6,NULL),
|
||||
(179,'2025-06-26',6,3,2,1,NULL,12.00,'2025-06-26 11:19:34','2025-06-26 11:19:34',6,NULL),
|
||||
(182,'2025-06-27',2,3,2,1,NULL,4.00,'2025-06-27 01:54:40','2025-06-27 01:54:40',5,NULL),
|
||||
(183,'2025-06-27',9,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(184,'2025-06-27',10,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(185,'2025-06-27',7,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(186,'2025-06-27',5,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(187,'2025-06-27',4,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(188,'2025-06-27',1,4,3,1,NULL,8.00,'2025-06-27 06:47:43','2025-06-27 06:47:43',3,NULL),
|
||||
(189,'2025-06-27',3,3,2,1,NULL,8.00,'2025-06-27 06:49:08','2025-06-27 06:49:08',6,NULL),
|
||||
(191,'2025-06-27',6,3,2,1,NULL,4.00,'2025-06-27 06:58:46','2025-06-27 06:58:46',6,NULL),
|
||||
(192,'2025-06-27',8,3,2,1,NULL,6.00,'2025-06-27 07:00:10','2025-06-27 07:00:10',5,NULL),
|
||||
(193,'2025-06-30',6,3,2,2,4,2.00,'2025-07-05 01:37:29','2025-07-05 01:37:29',3,NULL),
|
||||
(194,'2025-06-30',6,3,2,1,NULL,2.00,'2025-07-05 01:37:29','2025-07-07 04:15:25',3,3),
|
||||
(195,'2025-06-30',2,3,2,1,NULL,4.00,'2025-07-05 01:38:19','2025-07-07 04:15:40',3,3),
|
||||
(196,'2025-06-30',3,3,2,1,NULL,8.00,'2025-07-05 01:38:19','2025-07-05 01:38:19',3,NULL),
|
||||
(197,'2025-06-30',8,3,2,1,NULL,6.00,'2025-07-05 01:38:19','2025-07-07 04:15:02',3,3),
|
||||
(198,'2025-07-01',3,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(199,'2025-07-01',2,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(200,'2025-07-01',6,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(201,'2025-07-01',8,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(202,'2025-07-01',10,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(203,'2025-07-01',9,3,2,1,NULL,10.00,'2025-07-05 01:39:21','2025-07-05 01:39:21',3,NULL),
|
||||
(204,'2025-07-01',2,3,2,1,NULL,2.00,'2025-07-05 01:39:48','2025-07-05 01:42:08',3,3),
|
||||
(205,'2025-07-01',3,3,2,1,NULL,2.00,'2025-07-05 01:39:48','2025-07-05 01:42:02',3,3),
|
||||
(206,'2025-07-01',6,3,2,1,NULL,2.00,'2025-07-05 01:39:48','2025-07-05 01:41:56',3,3),
|
||||
(207,'2025-07-01',8,3,2,1,NULL,2.00,'2025-07-05 01:39:48','2025-07-05 01:41:48',3,3),
|
||||
(208,'2025-07-01',9,3,2,2,4,2.00,'2025-07-05 01:40:10','2025-07-05 01:40:10',3,NULL),
|
||||
(209,'2025-07-01',10,3,2,2,4,2.00,'2025-07-05 01:40:10','2025-07-05 01:40:10',3,NULL),
|
||||
(210,'2025-07-01',7,4,3,1,NULL,5.00,'2025-07-05 01:42:57','2025-07-05 01:42:57',3,NULL),
|
||||
(211,'2025-07-01',7,4,3,2,2,3.00,'2025-07-05 01:42:57','2025-07-05 01:42:57',3,NULL),
|
||||
(212,'2025-07-01',5,4,3,1,NULL,8.00,'2025-07-05 01:42:57','2025-07-07 04:21:24',3,3),
|
||||
(213,'2025-07-01',5,4,3,2,2,4.00,'2025-07-05 01:42:57','2025-07-07 04:21:10',3,3),
|
||||
(214,'2025-07-01',4,4,3,1,NULL,8.00,'2025-07-05 01:42:57','2025-07-07 04:21:41',3,3),
|
||||
(215,'2025-07-01',4,4,3,2,2,4.00,'2025-07-05 01:42:57','2025-07-07 04:21:32',3,3),
|
||||
(216,'2025-07-01',1,4,3,1,NULL,5.00,'2025-07-05 01:42:57','2025-07-05 01:42:57',3,NULL),
|
||||
(217,'2025-07-01',1,4,3,2,2,3.00,'2025-07-05 01:42:57','2025-07-05 01:42:57',3,NULL),
|
||||
(218,'2025-07-02',2,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(219,'2025-07-02',3,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(220,'2025-07-02',10,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(221,'2025-07-02',9,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(222,'2025-07-02',8,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(223,'2025-07-02',6,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(224,'2025-07-02',7,3,2,1,NULL,10.00,'2025-07-05 01:43:36','2025-07-05 01:43:36',3,NULL),
|
||||
(225,'2025-07-02',5,4,3,2,2,4.00,'2025-07-05 01:44:11','2025-07-05 01:44:11',3,NULL),
|
||||
(226,'2025-07-02',5,4,3,1,NULL,6.00,'2025-07-05 01:44:11','2025-07-05 01:44:54',3,3),
|
||||
(227,'2025-07-02',4,4,3,2,2,4.00,'2025-07-05 01:44:11','2025-07-05 01:44:11',3,NULL),
|
||||
(228,'2025-07-02',4,4,3,1,NULL,6.00,'2025-07-05 01:44:11','2025-07-05 01:44:59',3,3),
|
||||
(229,'2025-07-02',1,4,3,2,2,4.00,'2025-07-05 01:44:11','2025-07-05 01:44:11',3,NULL),
|
||||
(230,'2025-07-02',1,4,3,1,NULL,6.00,'2025-07-05 01:44:11','2025-07-05 01:45:05',3,3),
|
||||
(231,'2025-07-03',2,3,2,1,NULL,10.00,'2025-07-05 01:45:44','2025-07-05 01:45:44',3,NULL),
|
||||
(232,'2025-07-03',6,3,2,1,NULL,10.00,'2025-07-05 01:45:45','2025-07-05 01:45:45',3,NULL),
|
||||
(233,'2025-07-03',9,3,2,1,NULL,10.00,'2025-07-05 01:45:45','2025-07-05 01:45:45',3,NULL),
|
||||
(234,'2025-07-03',8,3,2,1,NULL,10.00,'2025-07-05 01:45:45','2025-07-05 01:45:45',3,NULL),
|
||||
(235,'2025-07-03',7,4,3,1,NULL,10.00,'2025-07-05 01:46:07','2025-07-05 01:46:07',3,NULL),
|
||||
(236,'2025-07-03',1,4,3,1,NULL,10.00,'2025-07-05 01:46:07','2025-07-05 01:46:07',3,NULL),
|
||||
(237,'2025-07-03',3,4,3,1,NULL,10.00,'2025-07-05 01:46:08','2025-07-05 01:46:08',3,NULL),
|
||||
(238,'2025-07-03',4,4,3,1,NULL,10.00,'2025-07-05 01:46:08','2025-07-05 01:46:08',3,NULL),
|
||||
(239,'2025-07-03',5,4,3,1,NULL,10.00,'2025-07-05 01:46:08','2025-07-05 01:46:08',3,NULL),
|
||||
(240,'2025-07-03',10,4,3,1,NULL,10.00,'2025-07-05 01:46:08','2025-07-05 01:46:08',3,NULL),
|
||||
(241,'2025-07-04',10,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(242,'2025-07-04',10,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(243,'2025-07-04',5,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(244,'2025-07-04',5,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(245,'2025-07-04',4,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(246,'2025-07-04',4,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(247,'2025-07-04',9,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(248,'2025-07-04',9,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(249,'2025-07-04',8,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(250,'2025-07-04',8,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(251,'2025-07-04',3,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(252,'2025-07-04',3,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(253,'2025-07-04',2,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(254,'2025-07-04',2,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(255,'2025-07-04',7,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(256,'2025-07-04',7,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(257,'2025-07-04',6,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(258,'2025-07-04',6,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(259,'2025-07-04',1,4,3,2,2,2.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(260,'2025-07-04',1,4,3,1,NULL,6.00,'2025-07-05 01:51:47','2025-07-05 01:51:47',3,NULL),
|
||||
(261,'2025-07-05',8,4,2,1,NULL,8.00,'2025-07-05 05:36:38','2025-07-05 05:36:38',5,NULL),
|
||||
(262,'2025-07-05',5,4,2,1,NULL,8.00,'2025-07-05 05:36:38','2025-07-05 05:36:38',5,NULL),
|
||||
(263,'2025-07-05',4,4,2,1,NULL,8.00,'2025-07-05 05:36:39','2025-07-05 05:36:39',5,NULL),
|
||||
(264,'2025-07-05',3,4,2,1,NULL,8.00,'2025-07-05 05:36:39','2025-07-05 05:36:39',5,NULL),
|
||||
(265,'2025-07-05',2,4,2,1,NULL,8.00,'2025-07-05 05:36:39','2025-07-05 05:36:39',5,NULL),
|
||||
(266,'2025-07-05',1,4,2,1,NULL,8.00,'2025-07-05 05:36:39','2025-07-05 05:36:39',5,NULL),
|
||||
(267,'2025-07-06',10,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:08',5,3),
|
||||
(268,'2025-07-06',9,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:16',5,3),
|
||||
(269,'2025-07-06',7,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:22',5,3),
|
||||
(270,'2025-07-06',6,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:27',5,3),
|
||||
(271,'2025-07-06',4,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:33',5,3),
|
||||
(272,'2025-07-06',3,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:39',5,3),
|
||||
(273,'2025-07-06',2,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:44',5,3),
|
||||
(274,'2025-07-06',1,4,3,1,NULL,8.00,'2025-07-06 05:34:32','2025-07-06 05:46:49',5,3),
|
||||
(275,'2025-07-07',10,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(276,'2025-07-07',9,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(277,'2025-07-07',8,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(278,'2025-07-07',7,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(279,'2025-07-07',3,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(280,'2025-07-07',4,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(281,'2025-07-07',5,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(282,'2025-07-07',6,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(283,'2025-07-07',2,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(284,'2025-07-07',1,4,3,1,NULL,8.00,'2025-07-07 06:49:31','2025-07-07 06:49:31',6,NULL),
|
||||
(285,'2025-07-08',10,4,3,1,NULL,8.00,'2025-07-08 06:36:57','2025-07-08 06:36:57',3,NULL),
|
||||
(286,'2025-07-08',9,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(287,'2025-07-08',8,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(288,'2025-07-08',7,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(289,'2025-07-08',6,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(290,'2025-07-08',1,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(291,'2025-07-08',2,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(292,'2025-07-08',3,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(293,'2025-07-08',5,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(294,'2025-07-08',4,4,3,1,NULL,8.00,'2025-07-08 06:36:58','2025-07-08 06:36:58',3,NULL),
|
||||
(295,'2025-07-09',10,4,3,1,NULL,8.00,'2025-07-09 22:08:40','2025-07-09 22:08:40',5,NULL),
|
||||
(296,'2025-07-09',9,4,3,1,NULL,8.00,'2025-07-09 22:08:40','2025-07-09 22:08:40',5,NULL),
|
||||
(297,'2025-07-09',8,4,3,1,NULL,8.00,'2025-07-09 22:08:40','2025-07-09 22:08:40',5,NULL),
|
||||
(298,'2025-07-09',7,4,3,1,NULL,8.00,'2025-07-09 22:08:41','2025-07-09 22:08:41',5,NULL),
|
||||
(299,'2025-07-09',6,4,3,1,NULL,8.00,'2025-07-09 22:08:41','2025-07-09 22:08:41',5,NULL),
|
||||
(300,'2025-07-09',2,4,3,1,NULL,8.00,'2025-07-09 22:08:41','2025-07-09 22:08:41',5,NULL),
|
||||
(301,'2025-07-09',3,4,3,1,NULL,8.00,'2025-07-09 22:08:42','2025-07-09 22:08:42',5,NULL),
|
||||
(302,'2025-07-09',4,4,3,1,NULL,8.00,'2025-07-09 22:08:42','2025-07-09 22:08:42',5,NULL),
|
||||
(303,'2025-07-09',5,4,3,1,NULL,8.00,'2025-07-09 22:08:42','2025-07-09 22:08:42',5,NULL),
|
||||
(304,'2025-07-09',1,4,3,1,NULL,4.00,'2025-07-09 22:09:10','2025-07-09 22:09:10',5,NULL),
|
||||
(305,'2025-07-10',9,4,3,1,NULL,8.00,'2025-07-10 06:33:58','2025-07-10 06:33:58',3,NULL),
|
||||
(306,'2025-07-10',8,4,3,1,NULL,8.00,'2025-07-10 06:33:58','2025-07-10 06:33:58',3,NULL),
|
||||
(307,'2025-07-10',5,4,3,1,NULL,8.00,'2025-07-10 06:33:58','2025-07-10 06:33:58',3,NULL),
|
||||
(308,'2025-07-10',6,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(309,'2025-07-10',2,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(310,'2025-07-10',3,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(311,'2025-07-10',4,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(312,'2025-07-10',1,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(313,'2025-07-10',7,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(314,'2025-07-10',10,4,3,1,NULL,8.00,'2025-07-10 06:33:59','2025-07-10 06:33:59',3,NULL),
|
||||
(315,'2025-07-12',9,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(316,'2025-07-12',8,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(317,'2025-07-12',6,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(318,'2025-07-12',5,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(319,'2025-07-12',4,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(320,'2025-07-12',2,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(321,'2025-07-12',1,4,3,1,NULL,8.00,'2025-07-12 05:41:30','2025-07-12 05:41:30',3,NULL),
|
||||
(322,'2025-07-14',8,4,3,1,NULL,6.00,'2025-07-14 06:46:30','2025-07-14 06:46:30',3,NULL),
|
||||
(323,'2025-07-14',10,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(324,'2025-07-14',9,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(325,'2025-07-14',7,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(326,'2025-07-14',6,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(327,'2025-07-14',1,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(328,'2025-07-14',2,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(329,'2025-07-14',3,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(330,'2025-07-14',4,4,3,1,NULL,8.00,'2025-07-14 06:46:57','2025-07-14 06:46:57',3,NULL),
|
||||
(331,'2025-07-15',3,3,2,1,NULL,8.00,'2025-07-15 05:57:06','2025-07-15 05:57:06',5,NULL),
|
||||
(332,'2025-07-15',9,3,2,1,NULL,8.00,'2025-07-15 05:57:06','2025-07-15 05:57:06',5,NULL),
|
||||
(333,'2025-07-15',5,3,2,2,4,4.00,'2025-07-15 05:57:47','2025-07-15 05:57:47',5,NULL),
|
||||
(334,'2025-07-15',5,4,3,1,NULL,4.00,'2025-07-15 05:57:47','2025-07-15 05:57:47',5,NULL),
|
||||
(335,'2025-07-15',10,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(336,'2025-07-15',8,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(337,'2025-07-15',7,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(338,'2025-07-15',6,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(339,'2025-07-15',2,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(340,'2025-07-15',1,4,3,1,NULL,8.00,'2025-07-15 05:58:19','2025-07-15 05:58:19',5,NULL),
|
||||
(341,'2025-07-14',5,4,3,1,NULL,8.00,'2025-07-15 06:57:26','2025-07-15 06:57:26',3,NULL),
|
||||
(342,'2025-07-16',4,4,3,1,NULL,2.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(343,'2025-07-16',4,3,2,1,NULL,4.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(344,'2025-07-16',4,3,2,1,NULL,2.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(345,'2025-07-16',5,4,3,1,NULL,2.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(346,'2025-07-16',5,3,2,1,NULL,4.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(347,'2025-07-16',5,3,2,1,NULL,2.00,'2025-07-16 06:46:46','2025-07-16 06:46:46',5,NULL),
|
||||
(348,'2025-07-16',10,4,3,1,NULL,2.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(349,'2025-07-16',10,3,2,1,NULL,4.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(350,'2025-07-16',10,3,2,1,NULL,2.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(351,'2025-07-16',6,4,3,1,NULL,2.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(352,'2025-07-16',6,3,2,1,NULL,4.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(353,'2025-07-16',6,3,2,1,NULL,2.00,'2025-07-16 06:47:53','2025-07-16 06:47:53',5,NULL),
|
||||
(354,'2025-07-16',9,3,2,1,NULL,8.00,'2025-07-16 06:48:32','2025-07-16 06:48:32',5,NULL),
|
||||
(355,'2025-07-16',8,3,2,1,NULL,8.00,'2025-07-16 06:48:32','2025-07-16 06:48:32',5,NULL),
|
||||
(356,'2025-07-16',3,3,2,1,NULL,8.00,'2025-07-16 06:48:32','2025-07-16 06:48:32',5,NULL),
|
||||
(357,'2025-07-16',2,3,2,1,NULL,8.00,'2025-07-16 06:48:32','2025-07-16 06:48:32',5,NULL),
|
||||
(358,'2025-07-16',1,4,3,1,NULL,8.00,'2025-07-16 06:51:31','2025-07-16 06:51:31',3,NULL),
|
||||
(359,'2025-07-16',7,4,3,1,NULL,8.00,'2025-07-16 06:51:31','2025-07-16 06:51:31',3,NULL),
|
||||
(360,'2025-07-17',1,3,3,1,NULL,8.00,'2025-07-17 06:45:22','2025-07-17 06:45:22',3,NULL),
|
||||
(361,'2025-07-17',5,3,2,1,NULL,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(362,'2025-07-17',5,3,2,2,4,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(363,'2025-07-17',4,3,2,1,NULL,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(364,'2025-07-17',4,3,2,2,4,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(365,'2025-07-17',2,3,2,1,NULL,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(366,'2025-07-17',2,3,2,2,4,4.00,'2025-07-17 06:46:48','2025-07-17 06:46:48',5,NULL),
|
||||
(367,'2025-07-17',10,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(368,'2025-07-17',9,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(369,'2025-07-17',8,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(370,'2025-07-17',7,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(371,'2025-07-17',6,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(372,'2025-07-17',3,3,2,1,NULL,8.00,'2025-07-17 06:47:19','2025-07-17 06:47:19',5,NULL),
|
||||
(373,'2025-07-18',7,4,3,2,1,2.00,'2025-07-18 05:54:47','2025-07-18 05:54:47',3,NULL),
|
||||
(374,'2025-07-18',1,4,3,2,1,2.00,'2025-07-18 05:54:48','2025-07-18 05:54:48',3,NULL),
|
||||
(376,'2025-07-18',5,4,3,1,NULL,2.00,'2025-07-18 05:58:33','2025-07-18 05:58:33',3,NULL),
|
||||
(377,'2025-07-18',5,3,2,1,NULL,6.00,'2025-07-18 05:58:33','2025-07-18 05:58:33',3,NULL),
|
||||
(378,'2025-07-18',7,3,2,1,NULL,6.00,'2025-07-18 05:59:42','2025-07-18 05:59:42',3,NULL),
|
||||
(379,'2025-07-18',1,3,3,1,NULL,6.00,'2025-07-18 06:00:15','2025-07-18 06:00:15',3,NULL),
|
||||
(380,'2025-07-18',10,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(381,'2025-07-18',9,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(382,'2025-07-18',8,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(383,'2025-07-18',6,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(384,'2025-07-18',4,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(385,'2025-07-18',3,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(386,'2025-07-18',2,3,2,1,NULL,8.00,'2025-07-18 06:36:13','2025-07-18 06:36:13',5,NULL),
|
||||
(387,'2025-07-21',5,4,3,2,1,4.00,'2025-07-21 06:40:08','2025-07-21 06:40:08',5,NULL),
|
||||
(388,'2025-07-21',5,3,2,1,NULL,4.00,'2025-07-21 06:40:08','2025-07-21 06:40:08',5,NULL),
|
||||
(389,'2025-07-21',4,4,3,2,1,4.00,'2025-07-21 06:40:08','2025-07-21 06:40:08',5,NULL),
|
||||
(390,'2025-07-21',4,3,2,1,NULL,4.00,'2025-07-21 06:40:08','2025-07-21 06:40:08',5,NULL),
|
||||
(391,'2025-07-21',10,3,2,1,NULL,6.00,'2025-07-21 06:40:32','2025-07-22 06:58:42',5,3),
|
||||
(392,'2025-07-21',9,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(393,'2025-07-21',8,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(394,'2025-07-21',7,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(395,'2025-07-21',6,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(396,'2025-07-21',3,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(397,'2025-07-21',2,3,2,1,NULL,8.00,'2025-07-21 06:40:32','2025-07-21 06:40:32',5,NULL),
|
||||
(398,'2025-07-21',1,3,3,1,NULL,8.00,'2025-07-21 06:53:37','2025-07-21 06:53:37',3,NULL),
|
||||
(399,'2025-07-22',10,3,2,1,NULL,8.00,'2025-07-22 06:45:47','2025-07-22 06:45:47',5,NULL),
|
||||
(400,'2025-07-22',9,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(401,'2025-07-22',8,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(402,'2025-07-22',7,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(403,'2025-07-22',6,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(404,'2025-07-22',4,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(405,'2025-07-22',3,3,2,1,NULL,8.00,'2025-07-22 06:45:48','2025-07-22 06:45:48',5,NULL),
|
||||
(406,'2025-07-22',2,4,3,2,1,8.00,'2025-07-22 06:46:11','2025-07-22 06:46:11',5,NULL),
|
||||
(407,'2025-07-22',5,3,3,1,NULL,8.00,'2025-07-22 06:46:11','2025-07-22 06:46:11',3,NULL),
|
||||
(408,'2025-07-22',1,3,3,1,NULL,8.00,'2025-07-22 06:46:11','2025-07-22 06:46:11',3,NULL),
|
||||
(409,'2025-07-23',4,3,3,1,NULL,8.00,'2025-07-23 06:45:06','2025-07-23 06:45:06',5,NULL),
|
||||
(410,'2025-07-23',5,3,3,1,NULL,8.00,'2025-07-23 06:45:28','2025-07-23 06:45:28',3,NULL),
|
||||
(411,'2025-07-23',1,3,3,1,NULL,8.00,'2025-07-23 06:45:28','2025-07-23 06:45:28',3,NULL),
|
||||
(412,'2025-07-23',10,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(413,'2025-07-23',9,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(414,'2025-07-23',7,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(415,'2025-07-23',6,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(416,'2025-07-23',3,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(417,'2025-07-23',2,3,2,1,NULL,8.00,'2025-07-23 06:45:30','2025-07-23 06:45:30',5,NULL),
|
||||
(418,'2025-07-24',4,3,3,1,NULL,8.00,'2025-07-24 06:36:55','2025-07-24 06:36:55',5,NULL),
|
||||
(419,'2025-07-24',10,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(420,'2025-07-24',9,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(421,'2025-07-24',7,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(422,'2025-07-24',6,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(423,'2025-07-24',3,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(424,'2025-07-24',2,3,2,1,NULL,8.00,'2025-07-24 06:37:18','2025-07-24 06:37:18',5,NULL),
|
||||
(425,'2025-07-24',5,3,3,1,NULL,8.00,'2025-07-24 06:47:04','2025-07-24 06:47:04',3,NULL),
|
||||
(426,'2025-07-24',1,3,3,1,NULL,8.00,'2025-07-24 06:47:04','2025-07-24 06:47:04',3,NULL),
|
||||
(427,'2025-07-25',4,3,3,1,NULL,8.00,'2025-07-25 06:44:23','2025-07-25 06:44:23',5,NULL),
|
||||
(428,'2025-07-25',10,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(429,'2025-07-25',9,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(430,'2025-07-25',8,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(431,'2025-07-25',6,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(432,'2025-07-25',3,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(433,'2025-07-25',2,3,2,1,NULL,8.00,'2025-07-25 06:45:15','2025-07-25 06:45:15',5,NULL),
|
||||
(434,'2025-07-25',5,4,3,1,NULL,8.00,'2025-07-25 06:45:18','2025-07-25 06:45:18',3,NULL),
|
||||
(435,'2025-07-25',7,4,3,1,NULL,8.00,'2025-07-25 06:45:19','2025-07-25 06:45:19',3,NULL),
|
||||
(436,'2025-07-25',1,4,3,1,NULL,8.00,'2025-07-25 06:45:19','2025-07-25 06:45:19',3,NULL),
|
||||
(437,'2025-07-28',5,3,3,1,NULL,8.00,'2025-07-28 06:30:39','2025-07-28 06:30:39',3,NULL),
|
||||
(438,'2025-07-28',4,3,3,1,NULL,8.00,'2025-07-28 06:30:39','2025-07-28 06:30:39',3,NULL),
|
||||
(439,'2025-07-28',1,3,3,1,NULL,8.00,'2025-07-28 06:30:39','2025-07-28 06:30:39',3,NULL),
|
||||
(440,'2025-07-28',2,5,2,1,NULL,4.00,'2025-07-28 06:33:08','2025-07-28 06:33:08',5,NULL),
|
||||
(441,'2025-07-28',2,3,2,1,NULL,4.00,'2025-07-28 06:33:08','2025-07-28 06:33:08',5,NULL),
|
||||
(442,'2025-07-28',10,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(443,'2025-07-28',9,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(444,'2025-07-28',8,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(445,'2025-07-28',7,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(446,'2025-07-28',6,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(447,'2025-07-28',3,3,2,1,NULL,8.00,'2025-07-28 06:33:34','2025-07-28 06:33:34',5,NULL),
|
||||
(448,'2025-07-29',5,3,3,1,NULL,8.00,'2025-07-29 06:39:13','2025-07-29 06:39:13',3,NULL),
|
||||
(449,'2025-07-29',4,3,3,1,NULL,8.00,'2025-07-29 06:39:13','2025-07-29 06:39:13',3,NULL),
|
||||
(450,'2025-07-29',1,3,3,1,NULL,8.00,'2025-07-29 06:39:13','2025-07-29 06:39:13',3,NULL),
|
||||
(451,'2025-07-30',5,3,3,1,NULL,8.00,'2025-07-30 06:50:30','2025-07-30 06:50:30',3,NULL),
|
||||
(452,'2025-07-30',4,3,3,1,NULL,8.00,'2025-07-30 06:50:30','2025-07-30 06:50:30',3,NULL),
|
||||
(453,'2025-07-30',1,3,3,1,NULL,8.00,'2025-07-30 06:50:30','2025-07-30 06:50:30',3,NULL),
|
||||
(454,'2025-07-30',10,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(455,'2025-07-30',9,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(456,'2025-07-30',8,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(457,'2025-07-30',7,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(458,'2025-07-30',6,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(459,'2025-07-30',3,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(460,'2025-07-30',2,3,2,1,NULL,8.00,'2025-07-30 06:52:16','2025-07-30 06:52:16',5,NULL),
|
||||
(461,'2025-07-31',1,3,3,1,NULL,4.00,'2025-07-31 06:42:56','2025-07-31 06:42:56',5,NULL),
|
||||
(462,'2025-07-31',4,3,3,1,NULL,4.00,'2025-07-31 06:43:32','2025-07-31 06:43:32',5,NULL),
|
||||
(463,'2025-07-31',4,3,2,1,NULL,4.00,'2025-07-31 06:43:32','2025-07-31 06:43:32',5,NULL),
|
||||
(464,'2025-07-31',5,3,3,1,NULL,4.00,'2025-07-31 06:43:32','2025-07-31 06:43:32',5,NULL),
|
||||
(465,'2025-07-31',5,3,2,1,NULL,4.00,'2025-07-31 06:43:32','2025-07-31 06:43:32',5,NULL),
|
||||
(466,'2025-07-31',10,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(467,'2025-07-31',9,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(468,'2025-07-31',8,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(469,'2025-07-31',7,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(470,'2025-07-31',6,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(471,'2025-07-31',3,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(472,'2025-07-31',2,3,2,1,NULL,8.00,'2025-07-31 06:44:00','2025-07-31 06:44:00',5,NULL),
|
||||
(473,'2025-07-11',10,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(474,'2025-07-11',5,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(475,'2025-07-11',4,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(476,'2025-07-11',9,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(477,'2025-07-11',8,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(478,'2025-07-11',3,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(479,'2025-07-11',2,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(480,'2025-07-11',7,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(481,'2025-07-11',6,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(482,'2025-07-11',1,3,2,1,NULL,8.00,'2025-07-31 22:24:47','2025-07-31 22:24:47',3,NULL),
|
||||
(483,'2025-08-01',10,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(484,'2025-08-01',9,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(485,'2025-08-01',8,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(486,'2025-08-01',7,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(487,'2025-08-01',6,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(488,'2025-08-01',3,3,2,1,NULL,8.00,'2025-08-01 04:57:47','2025-08-01 04:57:47',5,NULL),
|
||||
(489,'2025-08-01',2,3,2,1,NULL,8.00,'2025-08-01 04:57:48','2025-08-01 04:57:48',5,NULL),
|
||||
(490,'2025-08-01',4,3,3,1,NULL,4.00,'2025-08-01 05:02:28','2025-08-01 05:02:28',3,NULL),
|
||||
(491,'2025-08-01',4,5,1,1,NULL,4.00,'2025-08-01 05:02:28','2025-08-01 05:02:28',3,NULL),
|
||||
(492,'2025-08-01',5,3,3,1,NULL,4.00,'2025-08-01 05:02:28','2025-08-01 05:02:28',3,NULL),
|
||||
(493,'2025-08-01',5,5,1,1,NULL,4.00,'2025-08-01 05:02:28','2025-08-01 05:02:28',3,NULL),
|
||||
(494,'2025-08-07',9,3,2,2,4,4.00,'2025-08-07 06:42:39','2025-08-07 06:42:39',5,NULL),
|
||||
(495,'2025-08-07',9,3,2,1,NULL,4.00,'2025-08-07 06:42:39','2025-08-07 06:42:39',5,NULL),
|
||||
(496,'2025-08-07',7,3,2,2,4,4.00,'2025-08-07 06:42:39','2025-08-07 06:42:39',5,NULL),
|
||||
(497,'2025-08-07',7,3,2,1,NULL,4.00,'2025-08-07 06:42:39','2025-08-07 06:42:39',5,NULL),
|
||||
(498,'2025-08-07',10,5,2,1,NULL,8.00,'2025-08-07 06:43:14','2025-08-07 06:43:14',5,NULL),
|
||||
(499,'2025-08-07',4,5,2,1,NULL,8.00,'2025-08-07 06:43:15','2025-08-07 06:43:15',5,NULL),
|
||||
(500,'2025-08-07',2,5,2,1,NULL,8.00,'2025-08-07 06:43:15','2025-08-07 06:43:15',5,NULL),
|
||||
(501,'2025-08-07',6,3,2,1,NULL,8.00,'2025-08-07 06:43:39','2025-08-07 06:43:39',5,NULL),
|
||||
(502,'2025-08-07',3,3,2,1,NULL,8.00,'2025-08-07 06:43:39','2025-08-07 06:43:39',5,NULL),
|
||||
(503,'2025-08-07',8,3,2,1,NULL,8.00,'2025-08-07 06:43:39','2025-08-07 06:43:39',5,NULL),
|
||||
(504,'2025-08-07',1,3,3,1,NULL,8.00,'2025-08-07 06:43:52','2025-08-07 06:43:52',3,NULL),
|
||||
(505,'2025-08-08',1,3,3,1,NULL,8.00,'2025-08-08 06:45:20','2025-08-08 06:45:20',3,NULL),
|
||||
(506,'2025-08-08',10,5,2,1,NULL,8.00,'2025-08-08 06:58:42','2025-08-08 06:58:42',5,NULL),
|
||||
(507,'2025-08-08',2,5,2,1,NULL,8.00,'2025-08-08 06:58:42','2025-08-08 06:58:42',5,NULL),
|
||||
(508,'2025-08-08',9,3,2,1,NULL,8.00,'2025-08-08 06:59:18','2025-08-08 06:59:18',5,NULL),
|
||||
(509,'2025-08-08',8,3,2,1,NULL,8.00,'2025-08-08 06:59:19','2025-08-08 06:59:19',5,NULL),
|
||||
(510,'2025-08-08',3,3,2,1,NULL,8.00,'2025-08-08 06:59:19','2025-08-08 06:59:19',5,NULL),
|
||||
(511,'2025-08-08',4,3,2,1,NULL,8.00,'2025-08-08 06:59:19','2025-08-08 06:59:19',5,NULL),
|
||||
(512,'2025-08-08',6,3,2,1,NULL,8.00,'2025-08-08 06:59:19','2025-08-08 06:59:19',5,NULL),
|
||||
(513,'2025-08-11',1,3,3,1,NULL,8.00,'2025-08-11 06:27:37','2025-08-11 06:27:37',3,NULL),
|
||||
(514,'2025-08-11',1,3,3,1,NULL,8.00,'2025-08-11 06:27:37','2025-08-11 06:27:37',3,NULL),
|
||||
(515,'2025-08-11',10,5,2,1,NULL,8.00,'2025-08-11 06:46:23','2025-08-11 06:46:23',5,NULL),
|
||||
(516,'2025-08-11',2,5,2,1,NULL,8.00,'2025-08-11 06:46:23','2025-08-11 06:46:23',5,NULL),
|
||||
(517,'2025-08-11',8,3,2,1,NULL,8.00,'2025-08-11 06:46:49','2025-08-11 06:46:49',5,NULL),
|
||||
(518,'2025-08-11',7,3,2,1,NULL,8.00,'2025-08-11 06:46:49','2025-08-11 06:46:49',5,NULL),
|
||||
(519,'2025-08-11',6,3,2,1,NULL,8.00,'2025-08-11 06:46:50','2025-08-11 06:46:50',5,NULL),
|
||||
(520,'2025-08-11',5,3,2,1,NULL,8.00,'2025-08-11 06:46:50','2025-08-11 06:46:50',5,NULL),
|
||||
(521,'2025-08-11',4,3,2,1,NULL,8.00,'2025-08-11 06:46:50','2025-08-11 06:46:50',5,NULL),
|
||||
(522,'2025-08-11',3,3,2,1,NULL,8.00,'2025-08-11 06:46:50','2025-08-11 06:46:50',5,NULL),
|
||||
(523,'2025-08-12',10,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(524,'2025-08-12',9,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(525,'2025-08-12',8,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(526,'2025-08-12',7,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(527,'2025-08-12',5,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(528,'2025-08-12',4,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(529,'2025-08-12',3,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(530,'2025-08-12',1,3,2,1,NULL,8.00,'2025-08-12 06:47:24','2025-08-12 06:47:24',3,NULL),
|
||||
(531,'2025-08-13',1,3,3,1,NULL,8.00,'2025-08-13 06:31:32','2025-08-13 06:31:32',3,NULL),
|
||||
(532,'2025-08-13',2,3,2,1,NULL,4.00,'2025-08-13 06:36:13','2025-08-13 06:36:13',5,NULL),
|
||||
(533,'2025-08-13',2,5,2,1,NULL,4.00,'2025-08-13 06:36:13','2025-08-13 06:36:13',5,NULL),
|
||||
(534,'2025-08-13',9,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(535,'2025-08-13',8,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(536,'2025-08-13',7,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(537,'2025-08-13',6,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(538,'2025-08-13',5,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(539,'2025-08-13',4,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(540,'2025-08-13',3,3,2,1,NULL,8.00,'2025-08-13 06:36:48','2025-08-13 06:36:48',5,NULL),
|
||||
(541,'2025-08-13',10,5,2,1,NULL,8.00,'2025-08-13 06:37:19','2025-08-13 06:37:19',5,NULL),
|
||||
(542,'2025-08-14',1,3,3,2,1,4.00,'2025-08-14 06:35:27','2025-08-14 06:35:27',3,NULL),
|
||||
(543,'2025-08-14',1,3,3,1,NULL,4.00,'2025-08-14 06:35:27','2025-08-14 06:35:27',3,NULL),
|
||||
(544,'2025-08-14',10,5,2,1,NULL,4.00,'2025-08-14 06:39:03','2025-08-14 06:39:03',5,NULL),
|
||||
(545,'2025-08-14',10,5,3,1,NULL,4.00,'2025-08-14 06:39:03','2025-08-14 06:39:03',5,NULL),
|
||||
(546,'2025-08-14',2,5,2,1,NULL,2.00,'2025-08-14 06:39:44','2025-08-14 06:39:44',5,NULL),
|
||||
(547,'2025-08-14',2,3,2,1,NULL,6.00,'2025-08-14 06:39:44','2025-08-14 06:39:44',5,NULL),
|
||||
(548,'2025-08-14',9,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(549,'2025-08-14',8,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(550,'2025-08-14',7,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(551,'2025-08-14',6,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(552,'2025-08-14',5,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(553,'2025-08-14',4,3,2,1,NULL,8.00,'2025-08-14 06:40:10','2025-08-14 06:40:10',5,NULL),
|
||||
(554,'2025-08-18',2,3,2,1,NULL,8.00,'2025-08-18 06:21:36','2025-08-18 06:21:36',5,NULL),
|
||||
(555,'2025-08-18',8,3,2,1,NULL,8.00,'2025-08-18 06:21:36','2025-08-18 06:21:36',5,NULL),
|
||||
(556,'2025-08-18',4,3,2,1,NULL,8.00,'2025-08-18 06:22:01','2025-08-18 06:22:01',5,NULL),
|
||||
(557,'2025-08-18',10,5,3,1,NULL,6.00,'2025-08-18 06:22:53','2025-08-18 06:22:53',5,NULL),
|
||||
(558,'2025-08-18',10,3,2,1,NULL,2.00,'2025-08-18 06:22:53','2025-08-18 06:22:53',5,NULL),
|
||||
(559,'2025-08-18',9,3,2,1,NULL,4.00,'2025-08-18 06:23:34','2025-08-18 06:23:34',5,NULL),
|
||||
(560,'2025-08-18',9,3,3,1,NULL,4.00,'2025-08-18 06:23:34','2025-08-18 06:23:34',5,NULL),
|
||||
(561,'2025-08-18',5,3,3,2,1,4.00,'2025-08-18 06:41:24','2025-08-18 06:41:24',3,NULL),
|
||||
(562,'2025-08-18',1,3,3,2,1,4.00,'2025-08-18 06:41:24','2025-08-18 06:41:24',3,NULL),
|
||||
(563,'2025-08-18',7,3,3,2,1,4.00,'2025-08-18 06:41:24','2025-08-18 06:41:24',3,NULL),
|
||||
(564,'2025-08-18',7,3,3,1,NULL,4.00,'2025-08-18 06:43:10','2025-08-18 06:43:10',3,NULL),
|
||||
(565,'2025-08-18',5,3,3,1,NULL,4.00,'2025-08-18 06:43:10','2025-08-18 06:43:10',3,NULL),
|
||||
(566,'2025-08-18',1,3,3,1,NULL,4.00,'2025-08-18 06:43:10','2025-08-18 06:43:10',3,NULL),
|
||||
(567,'2025-08-18',6,3,3,1,NULL,8.00,'2025-08-18 06:43:35','2025-08-18 06:43:35',6,NULL),
|
||||
(568,'2025-08-18',3,3,3,1,NULL,8.00,'2025-08-18 06:43:35','2025-08-18 06:43:35',6,NULL),
|
||||
(569,'2025-08-19',1,3,3,1,NULL,6.00,'2025-08-19 08:02:49','2025-08-19 08:02:49',5,NULL),
|
||||
(570,'2025-08-19',3,3,3,1,NULL,10.00,'2025-08-19 08:03:30','2025-08-19 08:03:30',5,NULL),
|
||||
(571,'2025-08-19',6,3,3,1,NULL,10.00,'2025-08-19 08:03:30','2025-08-19 08:03:30',5,NULL),
|
||||
(572,'2025-08-19',7,3,3,1,NULL,10.00,'2025-08-19 08:03:30','2025-08-19 08:03:30',5,NULL),
|
||||
(573,'2025-08-19',9,3,3,1,NULL,10.00,'2025-08-19 08:03:30','2025-08-19 08:03:30',5,NULL),
|
||||
(574,'2025-08-19',10,3,2,1,NULL,10.00,'2025-08-19 08:04:05','2025-08-19 08:04:05',5,NULL),
|
||||
(575,'2025-08-19',8,3,2,1,NULL,10.00,'2025-08-19 08:04:05','2025-08-19 08:04:05',5,NULL),
|
||||
(576,'2025-08-19',5,3,2,1,NULL,10.00,'2025-08-19 08:04:05','2025-08-19 08:04:05',5,NULL),
|
||||
(577,'2025-08-19',4,3,2,1,NULL,10.00,'2025-08-19 08:04:05','2025-08-19 08:04:05',5,NULL),
|
||||
(578,'2025-08-19',2,3,2,1,NULL,10.00,'2025-08-19 08:04:05','2025-08-19 08:04:05',5,NULL),
|
||||
(579,'2025-08-19',3,3,3,1,NULL,10.00,'2025-08-19 08:36:51','2025-08-19 08:36:51',6,NULL),
|
||||
(580,'2025-08-19',7,3,3,1,NULL,10.00,'2025-08-19 08:36:51','2025-08-19 08:36:51',6,NULL),
|
||||
(581,'2025-08-19',6,3,3,1,NULL,10.00,'2025-08-19 08:36:51','2025-08-19 08:36:51',6,NULL),
|
||||
(582,'2025-08-20',2,3,2,1,NULL,8.00,'2025-08-20 06:19:36','2025-08-20 06:19:36',5,NULL),
|
||||
(583,'2025-08-20',5,3,1,1,NULL,2.00,'2025-08-20 06:21:28','2025-08-20 06:21:28',5,NULL),
|
||||
(584,'2025-08-20',5,3,2,1,NULL,6.00,'2025-08-20 06:21:28','2025-08-20 06:21:28',5,NULL),
|
||||
(585,'2025-08-20',4,3,1,1,NULL,2.00,'2025-08-20 06:21:28','2025-08-20 06:21:28',5,NULL),
|
||||
(586,'2025-08-20',4,3,2,1,NULL,6.00,'2025-08-20 06:21:28','2025-08-20 06:21:28',5,NULL),
|
||||
(587,'2025-08-20',6,3,3,1,NULL,4.00,'2025-08-20 06:43:46','2025-08-20 06:43:46',3,NULL),
|
||||
(588,'2025-08-20',10,3,3,1,NULL,8.00,'2025-08-20 06:44:23','2025-08-20 06:44:23',3,NULL),
|
||||
(589,'2025-08-20',9,3,3,1,NULL,8.00,'2025-08-20 06:44:23','2025-08-20 06:44:23',3,NULL),
|
||||
(590,'2025-08-20',8,3,3,1,NULL,8.00,'2025-08-20 06:44:23','2025-08-20 06:44:23',3,NULL),
|
||||
(591,'2025-08-20',7,3,3,1,NULL,8.00,'2025-08-20 06:44:24','2025-08-20 06:44:24',3,NULL),
|
||||
(592,'2025-08-20',3,3,3,1,NULL,8.00,'2025-08-20 06:44:24','2025-08-20 06:44:24',3,NULL),
|
||||
(593,'2025-08-20',1,3,3,1,NULL,8.00,'2025-08-20 06:44:24','2025-08-20 06:44:24',3,NULL),
|
||||
(594,'2025-08-20',10,3,3,1,NULL,8.00,'2025-08-20 06:44:26','2025-08-20 06:44:26',6,NULL),
|
||||
(595,'2025-08-20',3,3,3,1,NULL,8.00,'2025-08-20 06:44:26','2025-08-20 06:44:26',6,NULL),
|
||||
(596,'2025-08-21',7,3,3,1,NULL,8.00,'2025-08-21 06:30:36','2025-08-21 06:30:36',3,NULL),
|
||||
(597,'2025-08-21',1,3,3,1,NULL,8.00,'2025-08-21 06:30:36','2025-08-21 06:30:36',3,NULL),
|
||||
(598,'2025-08-21',1,3,3,1,NULL,8.00,'2025-08-21 07:50:38','2025-08-21 07:50:38',5,NULL),
|
||||
(599,'2025-08-21',7,3,3,1,NULL,8.00,'2025-08-21 07:50:38','2025-08-21 07:50:38',5,NULL),
|
||||
(600,'2025-08-21',10,3,3,1,NULL,8.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(601,'2025-08-21',10,3,3,1,NULL,2.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(602,'2025-08-21',9,3,3,1,NULL,8.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(603,'2025-08-21',9,3,3,1,NULL,2.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(604,'2025-08-21',6,3,3,1,NULL,8.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(605,'2025-08-21',6,3,3,1,NULL,2.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(606,'2025-08-21',3,3,3,1,NULL,8.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(607,'2025-08-21',3,3,3,1,NULL,2.00,'2025-08-21 07:51:23','2025-08-21 07:51:23',5,NULL),
|
||||
(608,'2025-08-21',2,3,2,1,NULL,8.00,'2025-08-21 07:54:46','2025-08-21 07:54:46',5,NULL),
|
||||
(609,'2025-08-21',2,5,2,1,NULL,2.00,'2025-08-21 07:54:46','2025-08-21 07:54:46',5,NULL),
|
||||
(610,'2025-08-21',8,3,3,1,NULL,4.00,'2025-08-21 07:55:25','2025-08-21 07:55:25',5,NULL),
|
||||
(611,'2025-08-21',8,3,2,1,NULL,6.00,'2025-08-21 07:55:25','2025-08-21 07:55:25',5,NULL),
|
||||
(612,'2025-08-21',6,3,3,1,NULL,10.00,'2025-08-21 08:24:50','2025-08-21 08:24:50',6,NULL),
|
||||
(613,'2025-08-21',3,3,3,1,NULL,10.00,'2025-08-21 08:24:50','2025-08-21 08:24:50',6,NULL),
|
||||
(614,'2025-08-22',2,3,2,1,NULL,8.00,'2025-08-22 06:21:15','2025-08-22 06:21:15',5,NULL),
|
||||
(615,'2025-08-22',8,3,2,1,NULL,4.00,'2025-08-22 06:23:12','2025-08-22 06:23:12',5,NULL),
|
||||
(616,'2025-08-22',8,3,3,1,NULL,4.00,'2025-08-22 06:23:12','2025-08-22 06:23:12',5,NULL),
|
||||
(617,'2025-08-22',5,3,3,1,NULL,8.00,'2025-08-22 06:23:55','2025-08-22 06:23:55',5,NULL),
|
||||
(618,'2025-08-22',6,3,2,1,NULL,4.00,'2025-08-22 06:27:43','2025-08-22 06:27:43',3,NULL),
|
||||
(619,'2025-08-22',10,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(620,'2025-08-22',9,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(621,'2025-08-22',7,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(622,'2025-08-22',4,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(623,'2025-08-22',3,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(624,'2025-08-22',1,3,3,1,NULL,8.00,'2025-08-22 06:28:15','2025-08-22 06:28:15',3,NULL),
|
||||
(625,'2025-08-23',4,3,2,1,NULL,2.00,'2025-08-23 04:57:02','2025-08-23 04:57:02',5,NULL),
|
||||
(626,'2025-08-23',4,3,3,1,NULL,6.00,'2025-08-23 04:57:02','2025-08-23 04:57:02',5,NULL),
|
||||
(627,'2025-08-23',2,3,2,1,NULL,8.00,'2025-08-23 04:57:25','2025-08-23 04:57:25',5,NULL),
|
||||
(628,'2025-08-23',10,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(629,'2025-08-23',9,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(630,'2025-08-23',8,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(631,'2025-08-23',6,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(632,'2025-08-23',5,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(633,'2025-08-23',3,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(634,'2025-08-23',1,3,3,1,NULL,8.00,'2025-08-23 04:57:54','2025-08-23 04:57:54',5,NULL),
|
||||
(635,'2025-08-25',10,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(636,'2025-08-25',9,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(637,'2025-08-25',8,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(638,'2025-08-25',7,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(639,'2025-08-25',6,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(640,'2025-08-25',5,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(641,'2025-08-25',4,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(642,'2025-08-25',3,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(643,'2025-08-25',2,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(644,'2025-08-25',1,3,3,1,NULL,8.00,'2025-08-25 06:48:34','2025-08-25 06:48:34',3,NULL),
|
||||
(645,'2025-08-25',6,3,3,1,NULL,8.00,'2025-08-25 06:49:16','2025-08-25 06:49:16',6,NULL),
|
||||
(646,'2025-08-25',3,3,3,1,NULL,8.00,'2025-08-25 06:49:17','2025-08-25 06:49:17',6,NULL),
|
||||
(647,'2025-08-26',4,8,3,1,NULL,8.00,'2025-08-26 07:28:03','2025-08-26 07:28:03',5,NULL),
|
||||
(648,'2025-08-26',4,3,3,1,NULL,2.00,'2025-08-26 07:28:03','2025-08-26 07:28:03',5,NULL),
|
||||
(649,'2025-08-26',2,8,3,1,NULL,10.00,'2025-08-26 07:28:35','2025-08-26 07:28:35',5,NULL),
|
||||
(650,'2025-08-26',10,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(651,'2025-08-26',9,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(652,'2025-08-26',8,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(653,'2025-08-26',7,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(654,'2025-08-26',6,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(655,'2025-08-26',5,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(656,'2025-08-26',3,3,3,1,NULL,10.00,'2025-08-26 07:29:02','2025-08-26 07:29:02',5,NULL),
|
||||
(657,'2025-08-26',1,3,3,1,NULL,10.00,'2025-08-26 07:29:03','2025-08-26 07:29:03',5,NULL),
|
||||
(658,'2025-08-26',6,3,3,1,NULL,10.00,'2025-08-26 08:22:12','2025-08-26 08:22:12',6,NULL),
|
||||
(659,'2025-08-26',10,3,3,1,NULL,10.00,'2025-08-26 08:22:12','2025-08-26 08:22:12',6,NULL),
|
||||
(660,'2025-08-26',3,3,3,1,NULL,10.00,'2025-08-26 08:22:12','2025-08-26 08:22:12',6,NULL),
|
||||
(661,'2025-08-27',10,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(662,'2025-08-27',9,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(663,'2025-08-27',7,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(664,'2025-08-27',6,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(665,'2025-08-27',5,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(666,'2025-08-27',4,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(667,'2025-08-27',3,3,3,2,5,8.00,'2025-08-27 06:44:47','2025-08-27 06:44:47',3,NULL),
|
||||
(668,'2025-08-27',1,3,3,2,5,8.00,'2025-08-27 06:44:48','2025-08-27 06:44:48',3,NULL),
|
||||
(669,'2025-08-27',2,3,3,2,1,2.00,'2025-08-27 06:45:32','2025-08-27 06:45:32',5,NULL),
|
||||
(670,'2025-08-27',2,8,2,1,NULL,6.00,'2025-08-27 06:45:32','2025-08-27 06:45:32',5,NULL),
|
||||
(671,'2025-08-27',8,3,3,2,1,2.00,'2025-08-27 06:45:32','2025-08-27 06:45:32',5,NULL),
|
||||
(672,'2025-08-27',8,8,2,1,NULL,6.00,'2025-08-27 06:45:32','2025-08-27 06:45:32',5,NULL),
|
||||
(673,'2025-08-28',10,3,3,1,NULL,6.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(674,'2025-08-28',10,3,3,2,1,4.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(675,'2025-08-28',5,3,3,1,NULL,6.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(676,'2025-08-28',5,3,3,2,1,4.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(677,'2025-08-28',6,3,3,1,NULL,6.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(678,'2025-08-28',6,3,3,2,1,4.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(679,'2025-08-28',3,3,3,1,NULL,6.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(680,'2025-08-28',3,3,3,2,1,4.00,'2025-08-28 08:31:42','2025-08-28 08:31:42',6,NULL),
|
||||
(681,'2025-08-28',4,3,3,1,NULL,4.00,'2025-08-28 08:37:46','2025-08-28 08:37:46',5,NULL),
|
||||
(682,'2025-08-28',4,5,3,1,NULL,4.00,'2025-08-28 08:37:46','2025-08-28 08:37:46',5,NULL),
|
||||
(683,'2025-08-28',8,8,2,1,NULL,4.00,'2025-08-28 08:38:15','2025-08-28 08:38:15',5,NULL),
|
||||
(684,'2025-08-28',8,5,3,1,NULL,4.00,'2025-08-28 08:38:15','2025-08-28 08:38:15',5,NULL),
|
||||
(685,'2025-08-28',2,3,3,2,1,2.00,'2025-08-28 08:38:50','2025-08-28 08:38:50',5,NULL),
|
||||
(686,'2025-08-28',2,5,3,1,NULL,6.00,'2025-08-28 08:38:50','2025-08-28 08:38:50',5,NULL),
|
||||
(687,'2025-08-28',1,3,3,2,1,8.00,'2025-08-28 08:39:24','2025-08-28 08:39:24',5,NULL),
|
||||
(689,'2025-08-28',9,3,3,2,4,8.00,'2025-08-28 08:40:00','2025-08-28 08:40:00',5,NULL),
|
||||
(690,'2025-08-28',7,3,3,2,4,8.00,'2025-08-28 08:40:00','2025-08-28 08:40:00',5,NULL),
|
||||
(694,'2025-08-28',4,5,3,1,NULL,2.00,'2025-08-28 08:44:56','2025-08-28 08:44:56',5,NULL),
|
||||
(695,'2025-08-28',8,5,3,1,NULL,2.00,'2025-08-28 08:44:56','2025-08-28 08:44:56',5,NULL),
|
||||
(696,'2025-08-28',2,5,3,1,NULL,2.00,'2025-08-28 08:44:56','2025-08-28 08:44:56',5,NULL),
|
||||
(698,'2025-08-28',9,3,3,1,NULL,2.00,'2025-08-28 08:45:19','2025-08-28 08:45:19',5,NULL),
|
||||
(699,'2025-08-28',7,3,3,1,NULL,2.00,'2025-08-28 08:45:19','2025-08-28 08:45:19',5,NULL),
|
||||
(703,'2025-08-29',10,3,3,2,5,8.00,'2025-08-29 06:47:02','2025-08-29 06:47:02',3,NULL),
|
||||
(704,'2025-08-29',9,3,3,2,5,8.00,'2025-08-29 06:47:02','2025-08-29 06:47:02',3,NULL),
|
||||
(706,'2025-08-29',7,3,3,2,5,8.00,'2025-08-29 06:47:02','2025-08-29 06:47:02',3,NULL),
|
||||
(710,'2025-08-29',1,3,3,2,5,8.00,'2025-08-29 06:47:02','2025-08-29 06:47:02',3,NULL),
|
||||
(713,'2025-08-29',5,3,3,1,NULL,6.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(714,'2025-08-29',5,3,3,2,1,2.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(715,'2025-08-29',3,3,3,1,NULL,6.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(716,'2025-08-29',3,3,3,2,1,2.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(717,'2025-08-29',6,3,3,1,NULL,6.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(718,'2025-08-29',6,3,3,2,1,2.00,'2025-08-29 06:47:35','2025-08-29 06:47:35',6,NULL),
|
||||
(719,'2025-08-29',8,5,3,1,NULL,8.00,'2025-08-29 21:55:56','2025-08-29 21:55:56',5,NULL),
|
||||
(720,'2025-08-29',4,5,3,1,NULL,8.00,'2025-08-29 21:55:56','2025-08-29 21:55:56',5,NULL),
|
||||
(721,'2025-08-29',2,5,3,1,NULL,8.00,'2025-08-29 21:55:56','2025-08-29 21:55:56',5,NULL),
|
||||
(722,'2025-08-30',2,5,3,1,NULL,8.00,'2025-08-30 05:12:03','2025-08-30 05:12:03',5,NULL),
|
||||
(723,'2025-08-30',8,5,3,1,NULL,8.00,'2025-08-30 05:12:03','2025-08-30 05:12:03',5,NULL),
|
||||
(724,'2025-08-30',4,5,3,1,NULL,8.00,'2025-08-30 05:12:03','2025-08-30 05:12:03',5,NULL),
|
||||
(725,'2025-08-30',10,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(726,'2025-08-30',9,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(727,'2025-08-30',7,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(728,'2025-08-30',6,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(729,'2025-08-30',5,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(730,'2025-08-30',3,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(731,'2025-08-30',1,3,3,2,1,8.00,'2025-08-30 05:36:49','2025-08-30 05:36:49',3,NULL),
|
||||
(732,'2025-09-01',7,3,3,1,NULL,8.00,'2025-09-01 06:18:28','2025-09-01 06:18:28',3,NULL),
|
||||
(733,'2025-09-01',9,3,3,1,NULL,8.00,'2025-09-01 06:18:28','2025-09-01 06:18:28',3,NULL),
|
||||
(734,'2025-09-01',10,3,3,2,5,4.00,'2025-09-01 06:19:11','2025-09-01 06:19:11',3,NULL),
|
||||
(735,'2025-09-01',3,3,3,2,5,4.00,'2025-09-01 06:19:11','2025-09-01 06:19:11',3,NULL),
|
||||
(736,'2025-09-01',1,3,3,2,5,4.00,'2025-09-01 06:19:11','2025-09-01 06:19:11',3,NULL),
|
||||
(737,'2025-09-01',10,3,3,1,NULL,4.00,'2025-09-01 06:19:35','2025-09-01 06:19:35',3,NULL),
|
||||
(738,'2025-09-01',3,3,3,1,NULL,4.00,'2025-09-01 06:19:35','2025-09-01 06:19:35',3,NULL),
|
||||
(739,'2025-09-01',1,3,3,1,NULL,4.00,'2025-09-01 06:19:35','2025-09-01 06:19:35',3,NULL),
|
||||
(740,'2025-09-01',5,3,3,2,1,8.00,'2025-09-01 06:20:03','2025-09-01 06:20:03',3,NULL);
|
||||
/*!40000 ALTER TABLE `daily_work_reports` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||
|
||||
-- Dump completed on 2025-09-01 23:19:44
|
||||
@@ -1,4 +1,4 @@
|
||||
-- phpMyAdmin SQL Dump
|
||||
작-- phpMyAdmin SQL Dump
|
||||
-- version 5.2.2
|
||||
-- https://www.phpmyadmin.net/
|
||||
--
|
||||
|
||||
2563
api.hyungi.net/hyungi_fixed.sql
Normal file
2563
api.hyungi.net/hyungi_fixed.sql
Normal file
File diff suppressed because it is too large
Load Diff
@@ -178,18 +178,13 @@ const authRoutes = require('./routes/authRoutes');
|
||||
const projectRoutes = require('./routes/projectRoutes');
|
||||
const workerRoutes = require('./routes/workerRoutes');
|
||||
const taskRoutes = require('./routes/taskRoutes');
|
||||
const processRoutes = require('./routes/processRoutes');
|
||||
const workReportRoutes = require('./routes/workReportRoutes');
|
||||
const cuttingPlanRoutes = require('./routes/cuttingPlanRoutes');
|
||||
const factoryInfoRoutes = require('./routes/factoryInfoRoutes');
|
||||
const equipmentListRoutes = require('./routes/equipmentListRoutes');
|
||||
const toolsRoute = require('./routes/toolsRoute');
|
||||
const uploadRoutes = require('./routes/uploadRoutes');
|
||||
const uploadBgRoutes = require('./routes/uploadBgRoutes');
|
||||
const dailyIssueReportRoutes = require('./routes/dailyIssueReportRoutes');
|
||||
const issueTypeRoutes = require('./routes/issueTypeRoutes');
|
||||
const healthRoutes = require('./routes/healthRoutes');
|
||||
const pipeSpecRoutes = require('./routes/pipeSpecRoutes');
|
||||
const dailyWorkReportRoutes = require('./routes/dailyWorkReportRoutes');
|
||||
const workAnalysisRoutes = require('./routes/workAnalysisRoutes');
|
||||
const analysisRoutes = require('./routes/analysisRoutes');
|
||||
@@ -305,6 +300,7 @@ app.use('/api/workers', workerRoutes);
|
||||
app.use('/api/daily-work-reports', dailyWorkReportRoutes);
|
||||
app.use('/api/work-analysis', workAnalysisRoutes);
|
||||
app.use('/api/analysis', analysisRoutes); // 새로운 분석 라우트 등록
|
||||
app.use('/api/daily-work-reports-analysis', require('./routes/workReportAnalysisRoutes')); // 데일리 워크 레포트 분석 라우트
|
||||
|
||||
// 📊 리포트 및 분석
|
||||
app.use('/api/workreports', workReportRoutes);
|
||||
@@ -316,12 +312,7 @@ app.use('/api/uploads', uploadRoutes);
|
||||
// ⚙️ 시스템 데이터들 (모든 인증된 사용자)
|
||||
app.use('/api/projects', projectRoutes);
|
||||
app.use('/api/tasks', taskRoutes);
|
||||
app.use('/api/processes', processRoutes);
|
||||
app.use('/api/cuttingplans', cuttingPlanRoutes);
|
||||
app.use('/api/factoryinfo', factoryInfoRoutes);
|
||||
app.use('/api/equipment', equipmentListRoutes);
|
||||
app.use('/api/tools', toolsRoute);
|
||||
app.use('/api/pipespecs', pipeSpecRoutes);
|
||||
|
||||
// 📤 파일 업로드
|
||||
app.use('/api', uploadBgRoutes);
|
||||
|
||||
@@ -19,4 +19,71 @@ exports.verifyToken = (req, res, next) => {
|
||||
console.error('[verifyToken 오류]', err.message);
|
||||
return res.status(403).json({ error: '토큰 검증 실패', detail: err.message });
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Admin 등급 이상 권한 체크 미들웨어
|
||||
*/
|
||||
exports.requireAdmin = (req, res, next) => {
|
||||
try {
|
||||
if (!req.user) {
|
||||
return res.status(401).json({
|
||||
error: '인증 필요',
|
||||
message: '먼저 로그인해주세요.'
|
||||
});
|
||||
}
|
||||
|
||||
const userRole = req.user.role;
|
||||
const adminRoles = ['admin', 'system'];
|
||||
|
||||
if (!adminRoles.includes(userRole)) {
|
||||
return res.status(403).json({
|
||||
error: '권한 부족',
|
||||
message: '관리자 권한이 필요합니다.',
|
||||
required: 'admin 또는 system',
|
||||
current: userRole
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`✅ Admin 권한 확인: ${req.user.username} (${userRole})`);
|
||||
next();
|
||||
} catch (err) {
|
||||
console.error('[requireAdmin 오류]', err.message);
|
||||
return res.status(500).json({
|
||||
error: '권한 확인 중 오류 발생',
|
||||
detail: err.message
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* System 등급 권한 체크 미들웨어
|
||||
*/
|
||||
exports.requireSystem = (req, res, next) => {
|
||||
try {
|
||||
if (!req.user) {
|
||||
return res.status(401).json({
|
||||
error: '인증 필요',
|
||||
message: '먼저 로그인해주세요.'
|
||||
});
|
||||
}
|
||||
|
||||
if (req.user.role !== 'system') {
|
||||
return res.status(403).json({
|
||||
error: '권한 부족',
|
||||
message: '시스템 관리자 권한이 필요합니다.',
|
||||
required: 'system',
|
||||
current: req.user.role
|
||||
});
|
||||
}
|
||||
|
||||
console.log(`✅ System 권한 확인: ${req.user.username}`);
|
||||
next();
|
||||
} catch (err) {
|
||||
console.error('[requireSystem 오류]', err.message);
|
||||
return res.status(500).json({
|
||||
error: '권한 확인 중 오류 발생',
|
||||
detail: err.message
|
||||
});
|
||||
}
|
||||
};
|
||||
@@ -201,12 +201,12 @@ class WorkAnalysis {
|
||||
u.name as created_by_name,
|
||||
dwr.created_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
ORDER BY dwr.created_at DESC
|
||||
LIMIT ?
|
||||
|
||||
@@ -1,89 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
const create = async (plan, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
project_id, drawing_name,
|
||||
pipe_spec, area_number,
|
||||
spool_number, length
|
||||
} = plan;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO CuttingPlan
|
||||
(project_id, drawing_name, pipe_spec, area_number, spool_number, length)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[project_id, drawing_name, pipe_spec, area_number, spool_number, length]
|
||||
);
|
||||
|
||||
callback(null, result.insertId);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM CuttingPlan ORDER BY cutting_plan_id DESC`
|
||||
);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(new Error(err.message || String(err)));
|
||||
}
|
||||
};
|
||||
|
||||
const getById = async (cutting_plan_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM CuttingPlan WHERE cutting_plan_id = ?`,
|
||||
[cutting_plan_id]
|
||||
);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (plan, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
cutting_plan_id, project_id, drawing_name,
|
||||
pipe_spec, area_number, spool_number, length
|
||||
} = plan;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE CuttingPlan
|
||||
SET project_id = ?,
|
||||
drawing_name = ?,
|
||||
pipe_spec = ?,
|
||||
area_number = ?,
|
||||
spool_number = ?,
|
||||
length = ?
|
||||
WHERE cutting_plan_id = ?`,
|
||||
[project_id, drawing_name, pipe_spec, area_number, spool_number, length, cutting_plan_id]
|
||||
);
|
||||
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (cutting_plan_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM CuttingPlan WHERE cutting_plan_id = ?`,
|
||||
[cutting_plan_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = { create, getAll, getById, update, remove };
|
||||
@@ -54,7 +54,7 @@ const createDailyReport = async (reportData, callback) => {
|
||||
const [existingReports] = await conn.query(
|
||||
`SELECT dwr.created_by, u.name as created_by_name, COUNT(*) as count, SUM(dwr.work_hours) as total_hours
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by`,
|
||||
[report_date, worker_id]
|
||||
@@ -82,7 +82,7 @@ const [existingReports] = await conn.query(
|
||||
const [finalReports] = await conn.query(
|
||||
`SELECT dwr.created_by, u.name as created_by_name, COUNT(*) as count, SUM(dwr.work_hours) as total_hours
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by`,
|
||||
[report_date, worker_id]
|
||||
@@ -164,7 +164,7 @@ const getMyAccumulatedHours = async (date, worker_id, created_by, callback) => {
|
||||
ORDER BY created_at
|
||||
) as my_entries
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ? AND dwr.created_by = ?
|
||||
`;
|
||||
|
||||
@@ -216,8 +216,8 @@ const getContributorsByDate = async (date, worker_id, callback) => {
|
||||
ORDER BY dwr.created_at SEPARATOR ', '
|
||||
) as entry_details
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
WHERE dwr.report_date = ? AND dwr.worker_id = ?
|
||||
GROUP BY dwr.created_by
|
||||
ORDER BY total_hours DESC, first_entry ASC
|
||||
@@ -245,9 +245,9 @@ const removeSpecificEntry = async (entry_id, deleted_by, callback) => {
|
||||
const [entryInfo] = await conn.query(
|
||||
`SELECT dwr.*, w.worker_name, p.project_name, u.name as created_by_name
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
WHERE dwr.id = ?`,
|
||||
[entry_id]
|
||||
);
|
||||
@@ -333,12 +333,12 @@ const getSelectQuery = () => `
|
||||
dwr.created_at,
|
||||
dwr.updated_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
LEFT JOIN Users u ON dwr.created_by = u.user_id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
`;
|
||||
|
||||
/**
|
||||
@@ -524,7 +524,7 @@ const getSummaryByDate = async (date, callback) => {
|
||||
COUNT(*) as work_entries_count,
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN 1 ELSE 0 END) as error_count
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE dwr.report_date = ?
|
||||
GROUP BY dwr.worker_id, dwr.report_date
|
||||
ORDER BY w.worker_name ASC
|
||||
@@ -553,7 +553,7 @@ const getSummaryByWorker = async (worker_id, callback) => {
|
||||
COUNT(*) as work_entries_count,
|
||||
SUM(CASE WHEN dwr.work_status_id = 2 THEN 1 ELSE 0 END) as error_count
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
WHERE dwr.worker_id = ?
|
||||
GROUP BY dwr.report_date, dwr.worker_id
|
||||
ORDER BY dwr.report_date DESC
|
||||
@@ -587,8 +587,8 @@ const getMonthlySummary = async (year, month, callback) => {
|
||||
GROUP_CONCAT(DISTINCT p.project_name ORDER BY p.project_name) as projects,
|
||||
GROUP_CONCAT(DISTINCT wt.name ORDER BY wt.name) as work_types
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN Workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN Projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
WHERE dwr.report_date BETWEEN ? AND ?
|
||||
GROUP BY dwr.report_date, dwr.worker_id
|
||||
@@ -798,21 +798,21 @@ const createReportEntries = async ({ report_date, worker_id, entries }) => {
|
||||
const insertedIds = [];
|
||||
const sql = `
|
||||
INSERT INTO daily_work_reports
|
||||
(report_date, worker_id, project_id, task_id, work_hours, is_error, error_type_code_id, created_by_user_id)
|
||||
(report_date, worker_id, project_id, work_type_id, work_hours, work_status_id, error_type_id, created_by)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`;
|
||||
|
||||
for (const entry of entries) {
|
||||
const { project_id, task_id, work_hours, is_error, error_type_code_id, created_by_user_id } = entry;
|
||||
const { project_id, work_type_id, work_hours, work_status_id, error_type_id, created_by } = entry;
|
||||
const [result] = await conn.query(sql, [
|
||||
report_date,
|
||||
worker_id,
|
||||
project_id,
|
||||
task_id,
|
||||
work_type_id,
|
||||
work_hours,
|
||||
is_error,
|
||||
error_type_code_id,
|
||||
created_by_user_id
|
||||
work_status_id || 1,
|
||||
error_type_id,
|
||||
created_by
|
||||
]);
|
||||
insertedIds.push(result.insertId);
|
||||
}
|
||||
@@ -840,27 +840,29 @@ const createReportEntries = async ({ report_date, worker_id, entries }) => {
|
||||
*/
|
||||
const getSelectQueryV2 = () => `
|
||||
SELECT
|
||||
dwr.report_id,
|
||||
dwr.id,
|
||||
dwr.report_date,
|
||||
dwr.worker_id,
|
||||
dwr.project_id,
|
||||
dwr.task_id,
|
||||
dwr.work_type_id,
|
||||
dwr.work_status_id,
|
||||
dwr.error_type_id,
|
||||
dwr.work_hours,
|
||||
dwr.is_error,
|
||||
dwr.error_type_code_id,
|
||||
dwr.created_by_user_id,
|
||||
dwr.created_by,
|
||||
w.worker_name,
|
||||
p.project_name,
|
||||
t.task_name,
|
||||
c.code_name as error_type_name,
|
||||
wt.name as work_type_name,
|
||||
wst.name as work_status_name,
|
||||
et.name as error_type_name,
|
||||
u.name as created_by_name,
|
||||
dwr.created_at
|
||||
FROM daily_work_reports dwr
|
||||
LEFT JOIN workers w ON dwr.worker_id = w.worker_id
|
||||
LEFT JOIN projects p ON dwr.project_id = p.project_id
|
||||
LEFT JOIN tasks t ON dwr.task_id = t.task_id
|
||||
LEFT JOIN users u ON dwr.created_by_user_id = u.user_id
|
||||
LEFT JOIN codes c ON dwr.error_type_code_id = c.code_id AND c.code_type_id = 'ERROR_TYPE'
|
||||
LEFT JOIN work_types wt ON dwr.work_type_id = wt.id
|
||||
LEFT JOIN work_status_types wst ON dwr.work_status_id = wst.id
|
||||
LEFT JOIN error_types et ON dwr.error_type_id = et.id
|
||||
LEFT JOIN users u ON dwr.created_by = u.user_id
|
||||
`;
|
||||
|
||||
/**
|
||||
@@ -881,9 +883,9 @@ const getReportsWithOptions = async (options) => {
|
||||
whereConditions.push('dwr.worker_id = ?');
|
||||
queryParams.push(options.worker_id);
|
||||
}
|
||||
if (options.created_by_user_id) {
|
||||
whereConditions.push('dwr.created_by_user_id = ?');
|
||||
queryParams.push(options.created_by_user_id);
|
||||
if (options.created_by) {
|
||||
whereConditions.push('dwr.created_by = ?');
|
||||
queryParams.push(options.created_by);
|
||||
}
|
||||
// 필요에 따라 다른 조건 추가 가능 (project_id 등)
|
||||
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
const create = async (equipment, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
factory_id, equipment_name,
|
||||
model, status, purchase_date, description
|
||||
} = equipment;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO EquipmentList
|
||||
(factory_id, equipment_name, model, status, purchase_date, description)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[factory_id, equipment_name, model, status, purchase_date, description]
|
||||
);
|
||||
|
||||
callback(null, result.insertId);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM EquipmentList ORDER BY equipment_id DESC`
|
||||
);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getById = async (equipment_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM EquipmentList WHERE equipment_id = ?`,
|
||||
[equipment_id]
|
||||
);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (equipment, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
equipment_id, factory_id, equipment_name,
|
||||
model, status, purchase_date, description
|
||||
} = equipment;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE EquipmentList
|
||||
SET factory_id = ?,
|
||||
equipment_name = ?,
|
||||
model = ?,
|
||||
status = ?,
|
||||
purchase_date = ?,
|
||||
description = ?
|
||||
WHERE equipment_id = ?`,
|
||||
[factory_id, equipment_name, model, status, purchase_date, description, equipment_id]
|
||||
);
|
||||
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(new Error(err.message || String(err)));
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (equipment_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM EquipmentList WHERE equipment_id = ?`,
|
||||
[equipment_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
create,
|
||||
getAll,
|
||||
getById,
|
||||
update,
|
||||
remove
|
||||
};
|
||||
@@ -1,86 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
const create = async (factory, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const { factory_name, address, description, map_image_url } = factory;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO FactoryInfo
|
||||
(factory_name, address, description, map_image_url)
|
||||
VALUES (?, ?, ?, ?)`,
|
||||
[factory_name, address, description, map_image_url]
|
||||
);
|
||||
|
||||
callback(null, result.insertId);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM FactoryInfo ORDER BY factory_id DESC`
|
||||
);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getById = async (factory_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM FactoryInfo WHERE factory_id = ?`,
|
||||
[factory_id]
|
||||
);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (factory, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const { factory_id, factory_name, address, description, map_image_url } = factory;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE FactoryInfo
|
||||
SET factory_name = ?,
|
||||
address = ?,
|
||||
description = ?,
|
||||
map_image_url = ?
|
||||
WHERE factory_id = ?`,
|
||||
[factory_name, address, description, map_image_url, factory_id]
|
||||
);
|
||||
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(new Error(err.message || String(err)));
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (factory_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM FactoryInfo WHERE factory_id = ?`,
|
||||
[factory_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
create,
|
||||
getAll,
|
||||
getById,
|
||||
update,
|
||||
remove
|
||||
};
|
||||
@@ -1,12 +0,0 @@
|
||||
// models/pingModel.js
|
||||
|
||||
/**
|
||||
* 단순 ping 비즈니스 로직 레이어
|
||||
* 필요하다면 여기서 더 복잡한 처리나 다른 서비스 호출 등을 관리
|
||||
*/
|
||||
exports.ping = () => {
|
||||
return {
|
||||
message: 'pong',
|
||||
timestamp: new Date().toISOString()
|
||||
};
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
// 전체 조회
|
||||
const getAll = async () => {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM PipeSpecs ORDER BY material, diameter_in`);
|
||||
return rows;
|
||||
};
|
||||
|
||||
// 등록
|
||||
const create = async ({ material, diameter_in, schedule }) => {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO PipeSpecs (material, diameter_in, schedule)
|
||||
VALUES (?, ?, ?)`,
|
||||
[material, diameter_in, schedule]
|
||||
);
|
||||
return result.insertId;
|
||||
};
|
||||
|
||||
// 삭제
|
||||
const remove = async (spec_id) => {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM PipeSpecs WHERE spec_id = ?`,
|
||||
[spec_id]
|
||||
);
|
||||
return result.affectedRows;
|
||||
};
|
||||
|
||||
module.exports = { getAll, create, remove };
|
||||
@@ -1,100 +0,0 @@
|
||||
const { getDb } = require('../dbPool');
|
||||
|
||||
const create = async (processData, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
project_id, process_name,
|
||||
process_start, process_end,
|
||||
planned_worker_count, process_description, note
|
||||
} = processData;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO Processes
|
||||
(project_id, process_name, process_start, process_end,
|
||||
planned_worker_count, process_description, note)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
||||
[project_id, process_name, process_start, process_end,
|
||||
planned_worker_count, process_description, note]
|
||||
);
|
||||
|
||||
callback(null, result.insertId);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM Processes ORDER BY process_id DESC`
|
||||
);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const getById = async (process_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(
|
||||
`SELECT * FROM Processes WHERE process_id = ?`,
|
||||
[process_id]
|
||||
);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
const update = async (processData, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const {
|
||||
process_id, project_id,
|
||||
process_name, process_start, process_end,
|
||||
planned_worker_count, process_description, note
|
||||
} = processData;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE Processes
|
||||
SET project_id = ?,
|
||||
process_name = ?,
|
||||
process_start = ?,
|
||||
process_end = ?,
|
||||
planned_worker_count = ?,
|
||||
process_description = ?,
|
||||
note = ?
|
||||
WHERE process_id = ?`,
|
||||
[project_id, process_name, process_start, process_end,
|
||||
planned_worker_count, process_description, note, process_id]
|
||||
);
|
||||
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(new Error(err.message || String(err)));
|
||||
}
|
||||
};
|
||||
|
||||
const remove = async (process_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM Processes WHERE process_id = ?`,
|
||||
[process_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
create,
|
||||
getAll,
|
||||
getById,
|
||||
update,
|
||||
remove
|
||||
};
|
||||
@@ -7,7 +7,7 @@ const create = async (worker, callback) => {
|
||||
const { worker_name, join_date, job_type, salary, annual_leave, status } = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`INSERT INTO Workers
|
||||
`INSERT INTO workers
|
||||
(worker_name, join_date, job_type, salary, annual_leave, status)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[worker_name, join_date, job_type, salary, annual_leave, status]
|
||||
@@ -23,7 +23,7 @@ const create = async (worker, callback) => {
|
||||
const getAll = async (callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM Workers ORDER BY worker_id DESC`);
|
||||
const [rows] = await db.query(`SELECT * FROM workers ORDER BY worker_id DESC`);
|
||||
callback(null, rows);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -34,7 +34,7 @@ const getAll = async (callback) => {
|
||||
const getById = async (worker_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [rows] = await db.query(`SELECT * FROM Workers WHERE worker_id = ?`, [worker_id]);
|
||||
const [rows] = await db.query(`SELECT * FROM workers WHERE worker_id = ?`, [worker_id]);
|
||||
callback(null, rows[0]);
|
||||
} catch (err) {
|
||||
callback(err);
|
||||
@@ -48,7 +48,7 @@ const update = async (worker, callback) => {
|
||||
const { worker_id, worker_name, join_date, job_type, salary, annual_leave, status } = worker;
|
||||
|
||||
const [result] = await db.query(
|
||||
`UPDATE Workers
|
||||
`UPDATE workers
|
||||
SET worker_name = ?,
|
||||
join_date = ?,
|
||||
job_type = ?,
|
||||
@@ -70,7 +70,7 @@ const remove = async (worker_id, callback) => {
|
||||
try {
|
||||
const db = await getDb();
|
||||
const [result] = await db.query(
|
||||
`DELETE FROM Workers WHERE worker_id = ?`,
|
||||
`DELETE FROM workers WHERE worker_id = ?`,
|
||||
[worker_id]
|
||||
);
|
||||
callback(null, result.affectedRows);
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
// routes/cuttingPlanRoutes.js
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const cuttingPlanController = require('../controllers/cuttingPlanController');
|
||||
|
||||
// CREATE
|
||||
router.post('/', cuttingPlanController.createCuttingPlan);
|
||||
|
||||
// READ ALL
|
||||
router.get('/', cuttingPlanController.getAllCuttingPlans);
|
||||
|
||||
// READ ONE
|
||||
router.get('/:cutting_plan_id', cuttingPlanController.getCuttingPlanById);
|
||||
|
||||
// UPDATE
|
||||
router.put('/:cutting_plan_id', cuttingPlanController.updateCuttingPlan);
|
||||
|
||||
// DELETE
|
||||
router.delete('/:cutting_plan_id', cuttingPlanController.removeCuttingPlan);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,21 +0,0 @@
|
||||
// routes/equipmentListRoutes.js
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const equipmentListController = require('../controllers/equipmentListController');
|
||||
|
||||
// CREATE
|
||||
router.post('/', equipmentListController.createEquipment);
|
||||
|
||||
// READ ALL
|
||||
router.get('/', equipmentListController.getAllEquipment);
|
||||
|
||||
// READ ONE
|
||||
router.get('/:equipment_id', equipmentListController.getEquipmentById);
|
||||
|
||||
// UPDATE
|
||||
router.put('/:equipment_id', equipmentListController.updateEquipment);
|
||||
|
||||
// DELETE
|
||||
router.delete('/:equipment_id', equipmentListController.removeEquipment);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,42 +0,0 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const multer = require('multer');
|
||||
const path = require('path');
|
||||
|
||||
const factoryInfoController = require('../controllers/factoryInfoController');
|
||||
const { verifyToken } = require('../middlewares/authMiddleware'); // ← 수정
|
||||
const { requireAccess } = require('../middlewares/accessMiddleware'); // ← 수정
|
||||
|
||||
// 📦 파일 저장 설정
|
||||
const storage = multer.diskStorage({
|
||||
destination: (req, file, cb) => {
|
||||
cb(null, 'public/uploads/');
|
||||
},
|
||||
filename: (req, file, cb) => {
|
||||
const uniqueName = `map_image-${Date.now()}${path.extname(file.originalname)}`;
|
||||
cb(null, uniqueName);
|
||||
}
|
||||
});
|
||||
const upload = multer({ storage });
|
||||
|
||||
// CREATE
|
||||
router.post(
|
||||
'/',
|
||||
verifyToken, // ← 수정
|
||||
upload.single('map_image'),
|
||||
factoryInfoController.createFactoryInfo
|
||||
);
|
||||
|
||||
// READ ALL
|
||||
router.get('/', verifyToken, factoryInfoController.getAllFactoryInfo); // ← 수정
|
||||
|
||||
// READ ONE
|
||||
router.get('/:factory_id', verifyToken, factoryInfoController.getFactoryInfoById); // ← 수정
|
||||
|
||||
// UPDATE
|
||||
router.put('/:factory_id', verifyToken, factoryInfoController.updateFactoryInfo); // ← 수정
|
||||
|
||||
// DELETE
|
||||
router.delete('/:factory_id', verifyToken, factoryInfoController.removeFactoryInfo); // ← 수정
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,8 +0,0 @@
|
||||
// routes/pingRoutes.js
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const pingController = require('../controllers/pingController');
|
||||
|
||||
router.get('/', pingController.ping);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,55 +0,0 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const pipeSpecController = require('../controllers/pipeSpecController');
|
||||
const auth = require('../middlewares/auth');
|
||||
const { requireAccess } = require('../middlewares/access');
|
||||
|
||||
// ✅ 전체 조회 (모든 사용자 가능)
|
||||
router.get(
|
||||
'/',
|
||||
auth,
|
||||
requireAccess('worker', 'group_leader', 'support_team', 'admin', 'system'),
|
||||
pipeSpecController.getAll
|
||||
);
|
||||
|
||||
// ✅ 재질 목록
|
||||
router.get(
|
||||
'/materials',
|
||||
auth,
|
||||
requireAccess('worker', 'group_leader', 'support_team', 'admin', 'system'),
|
||||
pipeSpecController.getMaterials
|
||||
);
|
||||
|
||||
// ✅ 직경 목록
|
||||
router.get(
|
||||
'/diameters',
|
||||
auth,
|
||||
requireAccess('worker', 'group_leader', 'support_team', 'admin', 'system'),
|
||||
pipeSpecController.getDiameters
|
||||
);
|
||||
|
||||
// ✅ 스케줄 목록
|
||||
router.get(
|
||||
'/schedules',
|
||||
auth,
|
||||
requireAccess('worker', 'group_leader', 'support_team', 'admin', 'system'),
|
||||
pipeSpecController.getSchedules
|
||||
);
|
||||
|
||||
// ✅ 등록 (시스템 또는 관리자만)
|
||||
router.post(
|
||||
'/',
|
||||
auth,
|
||||
requireAccess('system', 'admin'),
|
||||
pipeSpecController.create
|
||||
);
|
||||
|
||||
// ✅ 삭제 (시스템 또는 관리자만)
|
||||
router.delete(
|
||||
'/:spec_id',
|
||||
auth,
|
||||
requireAccess('system', 'admin'),
|
||||
pipeSpecController.remove
|
||||
);
|
||||
|
||||
module.exports = router;
|
||||
@@ -1,21 +0,0 @@
|
||||
// routes/processRoutes.js
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const processController = require('../controllers/processController');
|
||||
|
||||
// CREATE
|
||||
router.post('/', processController.createProcess);
|
||||
|
||||
// READ ALL
|
||||
router.get('/', processController.getAllProcesses);
|
||||
|
||||
// READ ONE
|
||||
router.get('/:process_id', processController.getProcessById);
|
||||
|
||||
// UPDATE
|
||||
router.put('/:process_id', processController.updateProcess);
|
||||
|
||||
// DELETE
|
||||
router.delete('/:process_id', processController.removeProcess);
|
||||
|
||||
module.exports = router;
|
||||
@@ -36,6 +36,9 @@ router.get('/monthly-comparison', workAnalysisController.getMonthlyComparison);
|
||||
// 🎯 작업자별 전문분야 분석
|
||||
router.get('/worker-specialization', workAnalysisController.getWorkerSpecialization);
|
||||
|
||||
// 🏗️ 프로젝트별-작업별 시간 분석 (총시간, 정규시간, 에러시간)
|
||||
router.get('/project-worktype-analysis', workAnalysisController.getProjectWorkTypeAnalysis);
|
||||
|
||||
// 📋 헬스체크 및 API 정보
|
||||
router.get('/health', (req, res) => {
|
||||
res.json({
|
||||
@@ -52,7 +55,8 @@ router.get('/health', (req, res) => {
|
||||
'GET /work-analysis/weekday-pattern - 요일별 패턴',
|
||||
'GET /work-analysis/error-analysis - 에러 분석',
|
||||
'GET /work-analysis/monthly-comparison - 월별 비교',
|
||||
'GET /work-analysis/worker-specialization - 작업자 전문분야'
|
||||
'GET /work-analysis/worker-specialization - 작업자 전문분야',
|
||||
'GET /work-analysis/project-worktype-analysis - 프로젝트별-작업별 시간 분석'
|
||||
],
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
|
||||
23
api.hyungi.net/routes/workReportAnalysisRoutes.js
Normal file
23
api.hyungi.net/routes/workReportAnalysisRoutes.js
Normal file
@@ -0,0 +1,23 @@
|
||||
// routes/workReportAnalysisRoutes.js - 데일리 워크 레포트 분석 라우트
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const workReportAnalysisController = require('../controllers/workReportAnalysisController');
|
||||
const { verifyToken, requireAdmin } = require('../middlewares/authMiddleware');
|
||||
|
||||
// 🔒 모든 분석 라우트에 인증 + Admin 권한 필요
|
||||
router.use(verifyToken);
|
||||
router.use(requireAdmin);
|
||||
|
||||
// 📋 분석용 필터 데이터 조회 (프로젝트, 작업자, 작업유형 목록)
|
||||
router.get('/filters', workReportAnalysisController.getAnalysisFilters);
|
||||
|
||||
// 📊 기간별 종합 분석
|
||||
router.get('/period', workReportAnalysisController.getAnalyticsByPeriod);
|
||||
|
||||
// 📈 프로젝트별 상세 분석
|
||||
router.get('/project', workReportAnalysisController.getProjectAnalysis);
|
||||
|
||||
// 👤 작업자별 상세 분석
|
||||
router.get('/worker', workReportAnalysisController.getWorkerAnalysis);
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user