224 lines
5.9 KiB
TypeScript
224 lines
5.9 KiB
TypeScript
/**
|
|
* 스케줄 자동 생성 컨트롤러
|
|
*
|
|
* 스케줄 미리보기, 적용, 조회 API를 제공합니다.
|
|
*/
|
|
|
|
import { Request, Response } from "express";
|
|
import { ScheduleService } from "../services/scheduleService";
|
|
|
|
export class ScheduleController {
|
|
private scheduleService: ScheduleService;
|
|
|
|
constructor() {
|
|
this.scheduleService = new ScheduleService();
|
|
}
|
|
|
|
/**
|
|
* 스케줄 미리보기
|
|
* POST /api/schedule/preview
|
|
*
|
|
* 선택한 소스 데이터를 기반으로 생성될 스케줄을 미리보기합니다.
|
|
* 실제 저장은 하지 않습니다.
|
|
*/
|
|
preview = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { config, sourceData, period } = req.body;
|
|
const userId = (req as any).user?.userId || "system";
|
|
const companyCode = (req as any).user?.companyCode || "*";
|
|
|
|
console.log("[ScheduleController] preview 호출:", {
|
|
scheduleType: config?.scheduleType,
|
|
sourceDataCount: sourceData?.length,
|
|
period,
|
|
userId,
|
|
companyCode,
|
|
});
|
|
|
|
// 필수 파라미터 검증
|
|
if (!config || !config.scheduleType) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: "스케줄 설정(config)이 필요합니다.",
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (!sourceData || sourceData.length === 0) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: "소스 데이터가 필요합니다.",
|
|
});
|
|
return;
|
|
}
|
|
|
|
// 미리보기 생성
|
|
const preview = await this.scheduleService.generatePreview(
|
|
config,
|
|
sourceData,
|
|
period,
|
|
companyCode
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
preview,
|
|
});
|
|
} catch (error: any) {
|
|
console.error("[ScheduleController] preview 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "스케줄 미리보기 중 오류가 발생했습니다.",
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 스케줄 적용
|
|
* POST /api/schedule/apply
|
|
*
|
|
* 미리보기 결과를 실제로 저장합니다.
|
|
*/
|
|
apply = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { config, preview, options } = req.body;
|
|
const userId = (req as any).user?.userId || "system";
|
|
const companyCode = (req as any).user?.companyCode || "*";
|
|
|
|
console.log("[ScheduleController] apply 호출:", {
|
|
scheduleType: config?.scheduleType,
|
|
createCount: preview?.summary?.createCount,
|
|
deleteCount: preview?.summary?.deleteCount,
|
|
options,
|
|
userId,
|
|
companyCode,
|
|
});
|
|
|
|
// 필수 파라미터 검증
|
|
if (!config || !preview) {
|
|
res.status(400).json({
|
|
success: false,
|
|
message: "설정(config)과 미리보기(preview)가 필요합니다.",
|
|
});
|
|
return;
|
|
}
|
|
|
|
// 적용
|
|
const applied = await this.scheduleService.applySchedules(
|
|
config,
|
|
preview,
|
|
options || { deleteExisting: true, updateMode: "replace" },
|
|
companyCode,
|
|
userId
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
applied,
|
|
message: `${applied.created}건 생성, ${applied.deleted}건 삭제, ${applied.updated}건 수정되었습니다.`,
|
|
});
|
|
} catch (error: any) {
|
|
console.error("[ScheduleController] apply 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "스케줄 적용 중 오류가 발생했습니다.",
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 스케줄 목록 조회
|
|
* GET /api/schedule/list
|
|
*
|
|
* 타임라인 표시용 스케줄 목록을 조회합니다.
|
|
*/
|
|
list = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const {
|
|
scheduleType,
|
|
resourceType,
|
|
resourceId,
|
|
startDate,
|
|
endDate,
|
|
status,
|
|
} = req.query;
|
|
const companyCode = (req as any).user?.companyCode || "*";
|
|
|
|
console.log("[ScheduleController] list 호출:", {
|
|
scheduleType,
|
|
resourceType,
|
|
resourceId,
|
|
startDate,
|
|
endDate,
|
|
status,
|
|
companyCode,
|
|
});
|
|
|
|
const result = await this.scheduleService.getScheduleList({
|
|
scheduleType: scheduleType as string,
|
|
resourceType: resourceType as string,
|
|
resourceId: resourceId as string,
|
|
startDate: startDate as string,
|
|
endDate: endDate as string,
|
|
status: status as string,
|
|
companyCode,
|
|
});
|
|
|
|
res.json({
|
|
success: true,
|
|
data: result.data,
|
|
total: result.total,
|
|
});
|
|
} catch (error: any) {
|
|
console.error("[ScheduleController] list 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "스케줄 조회 중 오류가 발생했습니다.",
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 스케줄 삭제
|
|
* DELETE /api/schedule/:scheduleId
|
|
*/
|
|
delete = async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const { scheduleId } = req.params;
|
|
const userId = (req as any).user?.userId || "system";
|
|
const companyCode = (req as any).user?.companyCode || "*";
|
|
|
|
console.log("[ScheduleController] delete 호출:", {
|
|
scheduleId,
|
|
userId,
|
|
companyCode,
|
|
});
|
|
|
|
const result = await this.scheduleService.deleteSchedule(
|
|
parseInt(scheduleId, 10),
|
|
companyCode,
|
|
userId
|
|
);
|
|
|
|
if (!result.success) {
|
|
res.status(404).json({
|
|
success: false,
|
|
message: result.message || "스케줄을 찾을 수 없습니다.",
|
|
});
|
|
return;
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: "스케줄이 삭제되었습니다.",
|
|
});
|
|
} catch (error: any) {
|
|
console.error("[ScheduleController] delete 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: error.message || "스케줄 삭제 중 오류가 발생했습니다.",
|
|
});
|
|
}
|
|
};
|
|
}
|