diff options
| author | joonhoekim <26rote@gmail.com> | 2025-12-08 19:48:13 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-12-08 19:48:13 +0900 |
| commit | aa89ba2ab47e3ad1ce3277fd11bc61546d20bbac (patch) | |
| tree | 2f72e6e8efcdc8b79aa730c64a41d0c40fa3700a /lib/evaluation/vendor-submission-service.ts | |
| parent | 3ef36fc20e10391619be0a57de1b2184dece606a (diff) | |
| parent | b5ef49dce92c8994530f6ff670c81693c8716daf (diff) | |
Merge branch 'dujinkim' of https://github.com/DTS-Development/SHI_EVCP into dujinkim
Diffstat (limited to 'lib/evaluation/vendor-submission-service.ts')
| -rw-r--r-- | lib/evaluation/vendor-submission-service.ts | 99 |
1 files changed, 69 insertions, 30 deletions
diff --git a/lib/evaluation/vendor-submission-service.ts b/lib/evaluation/vendor-submission-service.ts index c06a9d2a..e7d236ad 100644 --- a/lib/evaluation/vendor-submission-service.ts +++ b/lib/evaluation/vendor-submission-service.ts @@ -107,36 +107,44 @@ export interface VendorSubmissionDetail { export async function getVendorSubmissionDetails(periodicEvaluationId: number): Promise<VendorSubmissionDetail | null> { try { // 1. 제출 정보 조회 - const submissionResult = await db - .select({ - // 제출 기본 정보 - id: evaluationSubmissions.id, - submissionId: evaluationSubmissions.submissionId, - evaluationYear: evaluationSubmissions.evaluationYear, - evaluationRound: evaluationSubmissions.evaluationRound, - submissionStatus: evaluationSubmissions.submissionStatus, - submittedAt: evaluationSubmissions.submittedAt, - reviewedAt: evaluationSubmissions.reviewedAt, - reviewedBy: evaluationSubmissions.reviewedBy, - reviewComments: evaluationSubmissions.reviewComments, - averageEsgScore: evaluationSubmissions.averageEsgScore, - - // 진행률 통계 - totalGeneralItems: evaluationSubmissions.totalGeneralItems, - completedGeneralItems: evaluationSubmissions.completedGeneralItems, - totalEsgItems: evaluationSubmissions.totalEsgItems, - completedEsgItems: evaluationSubmissions.completedEsgItems, - - // 협력업체 정보 - vendorId: vendors.id, - companyId: evaluationSubmissions.companyId, - vendorCode: vendors.vendorCode, - vendorName: vendors.vendorName, - vendorEmail: vendors.email, - vendorCountry: vendors.country, - }) - .from(evaluationSubmissions) - .innerJoin(vendors, eq(evaluationSubmissions.companyId, vendors.id)) + // - 우선 현재 periodicEvaluationId 로 검색 + // - 없으면 같은 업체/년도/라운드의 다른 division 제출 건을 검색해 표시(조선/해양 동시 제출 지원) + const submissionSelect = { + // 제출 기본 정보 + id: evaluationSubmissions.id, + submissionId: evaluationSubmissions.submissionId, + evaluationYear: evaluationSubmissions.evaluationYear, + evaluationRound: evaluationSubmissions.evaluationRound, + submissionStatus: evaluationSubmissions.submissionStatus, + submittedAt: evaluationSubmissions.submittedAt, + reviewedAt: evaluationSubmissions.reviewedAt, + reviewedBy: evaluationSubmissions.reviewedBy, + reviewComments: evaluationSubmissions.reviewComments, + averageEsgScore: evaluationSubmissions.averageEsgScore, + + // 진행률 통계 + totalGeneralItems: evaluationSubmissions.totalGeneralItems, + completedGeneralItems: evaluationSubmissions.completedGeneralItems, + totalEsgItems: evaluationSubmissions.totalEsgItems, + completedEsgItems: evaluationSubmissions.completedEsgItems, + + // 협력업체 정보 + vendorId: vendors.id, + companyId: evaluationSubmissions.companyId, + vendorCode: vendors.vendorCode, + vendorName: vendors.vendorName, + vendorEmail: vendors.email, + vendorCountry: vendors.country, + } + + const buildSubmissionQuery = () => + db + .select(submissionSelect) + .from(evaluationSubmissions) + .innerJoin(vendors, eq(evaluationSubmissions.companyId, vendors.id)) + + // 1-1. 현재 periodicEvaluationId 로 우선 조회 + let submissionResult = await buildSubmissionQuery() .where( and( eq(evaluationSubmissions.periodicEvaluationId, periodicEvaluationId), @@ -145,6 +153,37 @@ export async function getVendorSubmissionDetails(periodicEvaluationId: number): ) .limit(1) + // 1-2. 없으면 같은 업체/년도의 다른 division 제출을 fallback + if (submissionResult.length === 0) { + const evaluationContext = await db + .select({ + vendorId: evaluationTargets.vendorId, + evaluationYear: evaluationTargets.evaluationYear, + }) + .from(periodicEvaluations) + .innerJoin(evaluationTargets, eq(periodicEvaluations.evaluationTargetId, evaluationTargets.id)) + .where(eq(periodicEvaluations.id, periodicEvaluationId)) + .limit(1) + + const context = evaluationContext[0] + + if (!context || !context.vendorId || !context.evaluationYear) { + return null + } + + // 같은 업체/년도의 다른 division 제출 찾기 (가장 최근 제출 우선) + submissionResult = await buildSubmissionQuery() + .where( + and( + eq(evaluationSubmissions.companyId, context.vendorId), + eq(evaluationSubmissions.evaluationYear, context.evaluationYear), + eq(evaluationSubmissions.isActive, true) + ) + ) + .orderBy(desc(evaluationSubmissions.submittedAt), desc(evaluationSubmissions.createdAt)) + .limit(1) + } + if (submissionResult.length === 0) { return null // 제출 내용이 없음 } |
