summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/code-groups
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-08-11 00:19:38 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-08-11 00:19:38 +0000
commita383fd2a30f60360ebc0c1b897b3d43cbae178fa (patch)
tree98adaae908465697ad627391e66113dc0694abb3 /lib/docu-list-rule/code-groups
parent71f4e15800b0cf771d1dddab6cc46fc7c2a17c51 (diff)
parentf30678aa2956620177e61cbcc0fb57e9ce6872f1 (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.ts53
-rw-r--r--lib/docu-list-rule/code-groups/table/code-groups-add-dialog.tsx12
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()