diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/evaluation-submit/service.ts | 26 | ||||
| -rw-r--r-- | lib/evaluation-target-list/service.ts | 5 | ||||
| -rw-r--r-- | lib/evaluation-target-list/table/evaluation-targets-columns.tsx | 18 |
3 files changed, 32 insertions, 17 deletions
diff --git a/lib/evaluation-submit/service.ts b/lib/evaluation-submit/service.ts index 023961de..a16a365a 100644 --- a/lib/evaluation-submit/service.ts +++ b/lib/evaluation-submit/service.ts @@ -1,14 +1,11 @@ 'use server' import db from "@/db/db"; -import { +import { reviewerEvaluations, reviewerEvaluationsView, reviewerEvaluationDetails, regEvalCriteriaDetails, - regEvalCriteriaView, - NewReviewerEvaluationDetail, - ReviewerEvaluationDetail, evaluationTargetReviewers, evaluationTargets, regEvalCriteria, @@ -16,7 +13,7 @@ import { reviewerEvaluationAttachments, users } from "@/db/schema"; -import { and, inArray, asc, desc, eq, ilike, or, SQL, count , sql, avg, isNotNull} from "drizzle-orm"; +import { and, inArray, asc, desc, eq, ilike, or, SQL, count , sql} from "drizzle-orm"; import { filterColumns } from "@/lib/filter-columns"; import { DEPARTMENT_CATEGORY_MAPPING, EvaluationFormData, GetSHIEvaluationsSubmitSchema, REVIEWER_TYPES, ReviewerType } from "./validation"; import { AttachmentInfo, EvaluationQuestionItem } from "@/types/evaluation-form"; @@ -52,7 +49,12 @@ function calculateReviewerType(division: string, materialType: string): Reviewer * reviewerType에 따라 해당하는 점수 필드를 가져옵니다 */ function getScoreByReviewerType( - detailRecord: any, + detailRecord: { + scoreEquipShip: string | null; + scoreEquipMarine: string | null; + scoreBulkShip: string | null; + scoreBulkMarine: string | null; + }, reviewerType: ReviewerType ): number | null { let score: string | null = null; @@ -267,7 +269,7 @@ export async function getEvaluationFormData(reviewerEvaluationId: number): Promi category: regEvalCriteria.category, }) .from(reviewerEvaluationAttachments) - .innerJoin( + .leftJoin( reviewerEvaluationDetails, eq(reviewerEvaluationAttachments.reviewerEvaluationDetailId, reviewerEvaluationDetails.id) ) @@ -358,7 +360,7 @@ export async function getEvaluationFormData(reviewerEvaluationId: number): Promi // 📎 첨부파일 정보 추가 attachments: questionAttachments, attachmentCount: questionAttachments.length, - attachmentTotalSize: questionAttachments.reduce((sum, att) => sum + att.fileSize, 0), + attachmentTotalSize: questionAttachments.reduce((sum, att) => sum + (att.fileSize || 0), 0), }); } @@ -414,7 +416,7 @@ export async function getEvaluationFormData(reviewerEvaluationId: number): Promi const questions: EvaluationQuestionItem[] = []; questionsMap.forEach(question => { // 현재 선택된 답변 찾기 (실제 응답이 있는 경우에만) - let selectedResponse = null; + let selectedResponse: any = null; for (const option of question.availableOptions) { const response = existingResponsesMap.get(option.detailId); if (response) { @@ -426,7 +428,7 @@ export async function getEvaluationFormData(reviewerEvaluationId: number): Promi if (selectedResponse) { question.responseId = selectedResponse.id; - question.currentScore = selectedResponse.score ? Number(selectedResponse.score) : null; + question.currentScore = selectedResponse.score; question.currentComment = selectedResponse.comment; } // ✅ else 케이스: 아직 답변하지 않은 상태 (모든 값이 null) @@ -437,7 +439,7 @@ export async function getEvaluationFormData(reviewerEvaluationId: number): Promi // 📎 11. 전체 첨부파일 통계 계산 const attachmentStats = { totalFiles: attachmentsData.length, - totalSize: attachmentsData.reduce((sum, att) => sum + att.fileSize, 0), + totalSize: attachmentsData.reduce((sum, att) => sum + (att.fileSize || 0), 0), questionsWithAttachments: attachmentsByQuestion.size + variableTypeAttachments.size, filesByCategory: Object.fromEntries(attachmentsByCategory), }; @@ -598,7 +600,7 @@ export async function updateEvaluationResponse( await db.transaction(async (tx) => { // 1. 선택된 답변 옵션의 정보 조회 (variable 타입이 아닌 경우) - let selectedDetail = null; + let selectedDetail: any = null; let score: number; if (selectedDetailId !== -1) { diff --git a/lib/evaluation-target-list/service.ts b/lib/evaluation-target-list/service.ts index 572a9006..00d0d294 100644 --- a/lib/evaluation-target-list/service.ts +++ b/lib/evaluation-target-list/service.ts @@ -13,6 +13,7 @@ import { isNotNull, lte, or, + ne, sql, type SQL, } from 'drizzle-orm'; @@ -686,8 +687,10 @@ export async function getAvailableReviewers(departmentCode?: string) { // departmentName: "API로 추후", // ✅ 부서명도 반환 }) .from(users) + .where(ne(users.domain, "partners")) .orderBy(users.name) // .limit(100); + //partners가 아닌 domain에 따라서 필터링 return reviewers; } catch (error) { @@ -1857,7 +1860,7 @@ export async function importEvalTargetExcel(file: File): Promise<{ const { userList } = await db.transaction(async (tx) => { const selectRes = await selectUsers(tx, { - where: and(eq(users.email, managerEmail), eq(users.isActive, true), isNotNull(users.userCode)), + where: and(eq(users.email, managerEmail), eq(users.isActive, true), ne(users.domain, "partners")), orderBy: [asc(users.name)], }); diff --git a/lib/evaluation-target-list/table/evaluation-targets-columns.tsx b/lib/evaluation-target-list/table/evaluation-targets-columns.tsx index f00738c7..63b7cb7a 100644 --- a/lib/evaluation-target-list/table/evaluation-targets-columns.tsx +++ b/lib/evaluation-target-list/table/evaluation-targets-columns.tsx @@ -130,8 +130,18 @@ const renderIsApproved = (fieldName: string) => ({ row }: any) => { return getEvaluationTargetBadge(isApproved); }; -const renderComment = (maxWidth: string) => ({ row }: any) => { - const comment = row.getValue<string>("adminComment") || row.getValue<string>("consolidatedComment"); +const renderAdminComment = (maxWidth: string) => ({ row }: any) => { + const comment = row.getValue<string>("adminComment") ; + return comment ? ( + <div className={`truncate ${maxWidth}`} title={comment}> + {comment} + </div> + ) : ( + <span className="text-muted-foreground">-</span> + ); +}; +const renderConsolidatedComment = (maxWidth: string) => ({ row }: any) => { + const comment = row.getValue<string>("consolidatedComment"); return comment ? ( <div className={`truncate ${maxWidth}`} title={comment}> {comment} @@ -453,7 +463,7 @@ function createStaticColumns(setRowAction: GetColumnsProps['setRowAction']): Col { accessorKey: "adminComment", header: createHeaderRenderer("관리자 의견"), - cell: renderComment("max-w-[150px]"), + cell: renderAdminComment("max-w-[150px]"), size: 150, meta: { excelHeader: "관리자 의견", @@ -462,7 +472,7 @@ function createStaticColumns(setRowAction: GetColumnsProps['setRowAction']): Col { accessorKey: "consolidatedComment", header: createHeaderRenderer("종합 의견"), - cell: renderComment("max-w-[150px]"), + cell: renderConsolidatedComment("max-w-[150px]"), size: 150, meta: { excelHeader: "종합 의견", |
