diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-11 00:19:38 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-11 00:19:38 +0000 |
| commit | a383fd2a30f60360ebc0c1b897b3d43cbae178fa (patch) | |
| tree | 98adaae908465697ad627391e66113dc0694abb3 /lib/docu-list-rule/code-groups | |
| parent | 71f4e15800b0cf771d1dddab6cc46fc7c2a17c51 (diff) | |
| parent | f30678aa2956620177e61cbcc0fb57e9ce6872f1 (diff) | |
Merge branch 'dujinkim' of https://github.com/DTS-Development/SHI_EVCP into dujinkim
Diffstat (limited to 'lib/docu-list-rule/code-groups')
| -rw-r--r-- | lib/docu-list-rule/code-groups/service.ts | 53 | ||||
| -rw-r--r-- | lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx | 12 |
2 files changed, 49 insertions, 16 deletions
diff --git a/lib/docu-list-rule/code-groups/service.ts b/lib/docu-list-rule/code-groups/service.ts index 843bafa2..c854f6c9 100644 --- a/lib/docu-list-rule/code-groups/service.ts +++ b/lib/docu-list-rule/code-groups/service.ts @@ -2,26 +2,33 @@ import { revalidatePath } from "next/cache" import db from "@/db/db" -import { codeGroups, comboBoxSettings } from "@/db/schema/docu-list-rule" +import { codeGroups, comboBoxSettings, documentNumberTypeConfigs, documentNumberTypes } from "@/db/schema/docu-list-rule" import { projects } from "@/db/schema/projects" -import { eq, sql, count, and } from "drizzle-orm" +import { eq, sql } from "drizzle-orm" import { unstable_noStore } from "next/cache" // Code Groups 목록 조회 -export async function getCodeGroups(input: any) { +export async function getCodeGroups(input: { + page: number + perPage: number + search: string + filters: Array<{ id: string; value: string | string[] }> + joinOperator: "and" | "or" + sort: Array<{ id: string; desc: boolean }> +}) { unstable_noStore() try { const { page, perPage, search, filters, joinOperator } = input const offset = (page - 1) * perPage - // 검색 조건 (Document Class 제외) - let whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS'` + // 검색 조건 (plant 타입 프로젝트만) + let whereConditions = sql`${projects.type} = 'plant'` // 검색어 필터링 if (search) { const searchTerm = `%${search}%` - whereConditions = sql`${codeGroups.groupId} != 'DOC_CLASS' AND ( + whereConditions = sql`${projects.type} = 'plant' AND ( ${codeGroups.groupId} ILIKE ${searchTerm} OR ${codeGroups.description} ILIKE ${searchTerm} OR ${codeGroups.codeFormat} ILIKE ${searchTerm} OR @@ -32,7 +39,7 @@ export async function getCodeGroups(input: any) { // 고급 필터링 (단순화) if (filters && filters.length > 0) { - const filterConditions = filters.map(filter => { + const filterConditions = filters.map((filter: { id: string; value: string | string[] }) => { const { id, value } = filter if (!value || Array.isArray(value)) return null @@ -56,7 +63,7 @@ export async function getCodeGroups(input: any) { if (filterConditions.length > 0) { const operator = joinOperator === "or" ? sql` OR ` : sql` AND ` - const combinedFilters = filterConditions.reduce((acc, condition, index) => { + const combinedFilters = filterConditions.reduce((acc: ReturnType<typeof sql> | null, condition: ReturnType<typeof sql> | null, index: number) => { if (index === 0) return condition return sql`${acc}${operator}${condition}` }) @@ -98,6 +105,7 @@ export async function getCodeGroups(input: any) { projectId: codeGroups.projectId, projectCode: projects.code, projectName: projects.name, + projectType: projects.type, }) .from(codeGroups) .leftJoin(projects, eq(codeGroups.projectId, projects.id)) @@ -140,14 +148,11 @@ export async function createCodeGroup(input: { isActive?: boolean }) { try { - // 해당 프로젝트의 마지막 Code Group의 groupId를 찾아서 다음 번호 생성 (DOC_CLASS 제외) + // 해당 프로젝트의 마지막 Code Group의 groupId를 찾아서 다음 번호 생성 const lastCodeGroup = await db .select({ groupId: codeGroups.groupId }) .from(codeGroups) - .where(and( - eq(codeGroups.projectId, input.projectId), // projectId로 변경 - sql`${codeGroups.groupId} != 'DOC_CLASS'` - )) + .where(eq(codeGroups.projectId, input.projectId)) // projectId로 변경 .orderBy(sql`CAST(SUBSTRING(${codeGroups.groupId}, 6) AS INTEGER) DESC`) .limit(1) @@ -251,6 +256,28 @@ export async function deleteCodeGroup(id: number) { } } + // Number Type Config에서 사용 중인지 확인 (Number Type 정보 포함) + const numberTypeConfigs = await db + .select({ + id: documentNumberTypeConfigs.id, + numberTypeName: documentNumberTypes.name, + numberTypeDescription: documentNumberTypes.description + }) + .from(documentNumberTypeConfigs) + .leftJoin(documentNumberTypes, eq(documentNumberTypeConfigs.documentNumberTypeId, documentNumberTypes.id)) + .where(eq(documentNumberTypeConfigs.codeGroupId, id)) + + if (numberTypeConfigs.length > 0) { + const numberTypeNames = numberTypeConfigs.map(config => + `${config.numberTypeName}${config.numberTypeDescription ? ` (${config.numberTypeDescription})` : ''}` + ).join(', ') + + return { + success: false, + error: `Code Group "${codeGroup[0].description}"은(는) ${numberTypeNames}에서 사용 중이므로 삭제할 수 없습니다. Number Type별 설정에서 먼저 제거해주세요.` + } + } + // Control Type이 combobox인 경우 관련 Combo Box 옵션들도 삭제 if (codeGroup[0].controlType === 'combobox') { // Combo Box 옵션들 삭제 diff --git a/lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx b/lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx index a0143239..33dfdd03 100644 --- a/lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx +++ b/lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx @@ -56,7 +56,7 @@ interface CodeGroupsAddDialogProps { export function CodeGroupsAddDialog({ onSuccess }: CodeGroupsAddDialogProps) { const [open, setOpen] = React.useState(false) const [isLoading, setIsLoading] = React.useState(false) - const [projects, setProjects] = React.useState<Array<{ id: number; code: string; name: string }>>([]) + const [projects, setProjects] = React.useState<Array<{ id: number; code: string; name: string; type: string }>>([]) const form = useForm<CreateCodeGroupFormValues>({ resolver: zodResolver(createCodeGroupSchema), @@ -80,14 +80,20 @@ export function CodeGroupsAddDialog({ onSuccess }: CodeGroupsAddDialogProps) { sort: [], filters: [], joinOperator: "and", - flags: [] + flags: [], + code: "", + name: "", + type: "" }) if (result.data) { - setProjects(result.data) + // plant 타입의 프로젝트만 필터링 + const plantProjects = result.data.filter(project => project.type === 'plant') + setProjects(plantProjects) } } catch (error) { console.error("Failed to load projects:", error) toast.error("프로젝트 목록을 불러오는데 실패했습니다.") + } } loadProjects() |
