diff options
| author | joonhoekim <26rote@gmail.com> | 2025-08-11 09:34:40 +0000 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-08-11 09:34:40 +0000 |
| commit | bcd462d6e60871b86008e072f4b914138fc5c328 (patch) | |
| tree | c22876fd6c6e7e48254587848b9dff50cdb8b032 /lib/knox-api | |
| parent | cbb4c7fe0b94459162ad5e998bc05cd293e0ff96 (diff) | |
(김준회) 리치텍스트에디터 (결재템플릿을 위한 공통컴포넌트), command-menu 에러 수정, 결재 템플릿 관리, 결재선 관리, ECC RFQ+PR Item 수신시 비즈니스테이블(ProcurementRFQ) 데이터 적재, WSDL 오류 수정
Diffstat (limited to 'lib/knox-api')
| -rw-r--r-- | lib/knox-api/approval/service.ts | 30 | ||||
| -rw-r--r-- | lib/knox-api/organization-service.ts | 95 |
2 files changed, 110 insertions, 15 deletions
diff --git a/lib/knox-api/approval/service.ts b/lib/knox-api/approval/service.ts index 6ef1b1f6..0bd817a6 100644 --- a/lib/knox-api/approval/service.ts +++ b/lib/knox-api/approval/service.ts @@ -1,7 +1,7 @@ "use server" import db from '@/db/db'; import { ApprovalLine } from "./approval"; -import { approval } from '@/db/schema/knox/approvals'; +import { approvalLogs } from '@/db/schema/knox/approvals'; import { eq, and } from 'drizzle-orm'; // ========== 데이터베이스 서비스 함수들 ========== @@ -21,7 +21,7 @@ export async function saveApprovalToDatabase( aplns: ApprovalLine[] ): Promise<void> { try { - await db.insert(approval).values({ + await db.insert(approvalLogs).values({ apInfId, userId, epId, @@ -51,12 +51,12 @@ export async function updateApprovalStatus( ): Promise<void> { try { await db - .update(approval) + .update(approvalLogs) .set({ status, updatedAt: new Date(), }) - .where(eq(approval.apInfId, apInfId)); + .where(eq(approvalLogs.apInfId, apInfId)); } catch (error) { console.error('결재 상태 업데이트 실패:', error); throw new Error('결재 상태를 업데이트하는 중 오류가 발생했습니다.'); @@ -69,15 +69,15 @@ export async function updateApprovalStatus( export async function getApprovalFromDatabase( apInfId: string, includeDeleted: boolean = false -): Promise<typeof approval.$inferSelect | null> { +): Promise<typeof approvalLogs.$inferSelect | null> { try { const whereCondition = includeDeleted - ? eq(approval.apInfId, apInfId) - : and(eq(approval.apInfId, apInfId), eq(approval.isDeleted, false)); + ? eq(approvalLogs.apInfId, apInfId) + : and(eq(approvalLogs.apInfId, apInfId), eq(approvalLogs.isDeleted, false)); const result = await db .select() - .from(approval) + .from(approvalLogs) .where(whereCondition) .limit(1); @@ -96,17 +96,17 @@ export async function getApprovalsByUser( limit: number = 50, offset: number = 0, includeDeleted: boolean = false -): Promise<typeof approval.$inferSelect[]> { +): Promise<typeof approvalLogs.$inferSelect[]> { try { const whereCondition = includeDeleted - ? eq(approval.userId, userId) - : and(eq(approval.userId, userId), eq(approval.isDeleted, false)); + ? eq(approvalLogs.userId, userId) + : and(eq(approvalLogs.userId, userId), eq(approvalLogs.isDeleted, false)); const result = await db .select() - .from(approval) + .from(approvalLogs) .where(whereCondition) - .orderBy(approval.createdAt) + .orderBy(approvalLogs.createdAt) .limit(limit) .offset(offset); @@ -125,12 +125,12 @@ export async function deleteApprovalFromDatabase( ): Promise<void> { try { await db - .update(approval) + .update(approvalLogs) .set({ isDeleted: true, updatedAt: new Date(), }) - .where(eq(approval.apInfId, apInfId)); + .where(eq(approvalLogs.apInfId, apInfId)); } catch (error) { console.error('결재 데이터 삭제 실패:', error); throw new Error('결재 데이터를 삭제하는 중 오류가 발생했습니다.'); diff --git a/lib/knox-api/organization-service.ts b/lib/knox-api/organization-service.ts new file mode 100644 index 00000000..c90b00f7 --- /dev/null +++ b/lib/knox-api/organization-service.ts @@ -0,0 +1,95 @@ +'use server'; + +import db from '@/db/db'; +import { organization as organizationTable } from '@/db/schema/knox/organization'; +import { count, ilike, isNotNull } from 'drizzle-orm'; + + +// ---------------------------------------------------- +// 조직 관리자 검색 함수 +// ---------------------------------------------------- + +interface SearchOrganizationsForManagerInput { + search: string; + page: number; + perPage: number; +} + +interface SearchOrganizationsForManagerResult { + data: Array<{ + id: string; + departmentCode: string; + departmentName: string; + managerId: string; + managerName: string; + managerTitle: string; + companyCode: string; + companyName: string; + }>; + total: number; + pageCount: number; +} + +export async function searchOrganizationsForManager( + input: SearchOrganizationsForManagerInput +): Promise<SearchOrganizationsForManagerResult> { + const offset = (input.page - 1) * input.perPage; + + // 검색 조건 구성 + const searchTerm = `%${input.search}%`; + + const results = await db + .select({ + id: organizationTable.departmentCode, + departmentCode: organizationTable.departmentCode, + departmentName: organizationTable.departmentName, + managerId: organizationTable.managerId, + managerName: organizationTable.managerName, + managerTitle: organizationTable.managerTitle, + companyCode: organizationTable.companyCode, + companyName: organizationTable.companyName, + }) + .from(organizationTable) + .where( + // 관리자가 있고, 부서명 또는 관리자명으로 검색 + isNotNull(organizationTable.managerId) + ) + .having( + // 부서명 또는 관리자명으로 검색 + ilike(organizationTable.departmentName, searchTerm) || + ilike(organizationTable.managerName, searchTerm) + ) + .orderBy(organizationTable.departmentName) + .limit(input.perPage) + .offset(offset); + + // 전체 개수 조회 + const totalResult = await db + .select({ count: count() }) + .from(organizationTable) + .where( + isNotNull(organizationTable.managerId) + ) + .having( + ilike(organizationTable.departmentName, searchTerm) || + ilike(organizationTable.managerName, searchTerm) + ); + + const total = totalResult[0]?.count ?? 0; + const pageCount = Math.ceil(total / input.perPage); + + return { + data: results as Array<{ + id: string; + departmentCode: string; + departmentName: string; + managerId: string; + managerName: string; + managerTitle: string; + companyCode: string; + companyName: string; + }>, + total, + pageCount, + }; +}
\ No newline at end of file |
