feat: [bending] 절곡품 전용 테이블 분리 API

- bending_items 전용 테이블 생성 (items.options → 정규 컬럼 승격)
- bending_models 전용 테이블 생성 (가이드레일/케이스/하단마감재 통합)
- bending_data JSON 통합 (별도 테이블 → bending_items.bending_data 컬럼)
- bending_item_mappings 테이블 DROP (bending_items.code에 흡수)
- BendingItemService/BendingCodeService → BendingItem 모델 전환
- GuiderailModelService component 이미지 자동 복사
- ItemsFileController bending_items/bending_models 폴백 지원
- Swagger 스키마 업데이트
This commit is contained in:
강영보
2026-03-19 19:54:23 +09:00
parent 623298dd82
commit c29090a0b8
32 changed files with 3114 additions and 490 deletions

463
storage/api-docs/api-docs-v1.json Executable file → Normal file
View File

@@ -9442,6 +9442,7 @@
"BendingItem"
],
"summary": "절곡품 목록 조회",
"description": "bending_items 테이블에서 검색. 정규 컬럼 인덱스로 빠른 검색 지원.",
"operationId": "c497d5bfebed3fb08cd4d5be9224c795",
"parameters": [
{
@@ -9484,9 +9485,27 @@
]
}
},
{
"name": "model_name",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "legacy_bending_num",
"in": "query",
"description": "chandj.bending.num으로 검색",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "search",
"in": "query",
"description": "item_name, code, item_spec, legacy_code 통합 검색",
"required": false,
"schema": {
"type": "string"
@@ -9512,7 +9531,30 @@
],
"responses": {
"200": {
"description": "성공"
"description": "성공",
"content": {
"application/json": {
"schema": {
"properties": {
"data": {
"properties": {
"data": {
"type": "array",
"items": {
"$ref": "#/components/schemas/BendingItem"
}
},
"total": {
"type": "integer"
}
},
"type": "object"
}
},
"type": "object"
}
}
}
}
}
},
@@ -9528,7 +9570,6 @@
"schema": {
"required": [
"code",
"name",
"item_name",
"item_sep",
"item_bending",
@@ -9536,13 +9577,13 @@
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
"description": "LOT 코드",
"type": "string",
"example": "RM260319"
},
"item_name": {
"type": "string"
"type": "string",
"example": "본체"
},
"item_sep": {
"type": "string",
@@ -9552,17 +9593,99 @@
]
},
"item_bending": {
"type": "string"
"type": "string",
"example": "가이드레일"
},
"material": {
"type": "string"
"type": "string",
"example": "EGI 1.55T"
},
"item_spec": {
"type": "string",
"example": "120*70",
"nullable": true
},
"model_name": {
"type": "string",
"example": "KSS01",
"nullable": true
},
"model_UA": {
"type": "string",
"enum": [
"인정",
"비인정"
],
"nullable": true
},
"rail_width": {
"type": "number",
"nullable": true
},
"exit_direction": {
"type": "string",
"nullable": true
},
"front_bottom": {
"type": "number",
"nullable": true
},
"box_width": {
"type": "number",
"nullable": true
},
"box_height": {
"type": "number",
"nullable": true
},
"inspection_door": {
"type": "string",
"nullable": true
},
"length_code": {
"type": "string",
"example": "30",
"nullable": true
},
"length_mm": {
"type": "integer",
"example": 3000,
"nullable": true
},
"bendingData": {
"type": "array",
"items": {
"properties": {
"no": {
"type": "integer"
},
"input": {
"type": "number"
},
"rate": {
"type": "string"
},
"sum": {
"type": "number"
},
"color": {
"type": "boolean"
},
"aAngle": {
"type": "boolean"
}
},
"type": "object"
},
"nullable": true
},
"memo": {
"type": "string",
"nullable": true
},
"author": {
"type": "string",
"nullable": true
}
},
"type": "object"
@@ -9583,10 +9706,55 @@
"BendingItem"
],
"summary": "절곡품 필터 옵션 조회",
"description": "item_sep, item_bending, material, model_UA, model_name 고유값 목록",
"operationId": "f5dd325adc791e1b8cab40b9fa2fb77d",
"responses": {
"200": {
"description": "성공"
"description": "성공",
"content": {
"application/json": {
"schema": {
"properties": {
"data": {
"properties": {
"item_sep": {
"type": "array",
"items": {
"type": "string"
}
},
"item_bending": {
"type": "array",
"items": {
"type": "string"
}
},
"material": {
"type": "array",
"items": {
"type": "string"
}
},
"model_UA": {
"type": "array",
"items": {
"type": "string"
}
},
"model_name": {
"type": "array",
"items": {
"type": "string"
}
}
},
"type": "object"
}
},
"type": "object"
}
}
}
}
}
}
@@ -9597,6 +9765,7 @@
"BendingItem"
],
"summary": "절곡품 상세 조회",
"description": "전개도 데이터(bendingData) 포함",
"operationId": "d364f4d4cf76bcce7167561b73216382",
"parameters": [
{
@@ -9610,7 +9779,19 @@
],
"responses": {
"200": {
"description": "성공"
"description": "성공",
"content": {
"application/json": {
"schema": {
"properties": {
"data": {
"$ref": "#/components/schemas/BendingItem"
}
},
"type": "object"
}
}
}
}
}
},
@@ -9638,18 +9819,57 @@
"code": {
"type": "string"
},
"name": {
"item_name": {
"type": "string"
},
"memo": {
"item_sep": {
"type": "string",
"enum": [
"스크린",
"철재"
]
},
"item_bending": {
"type": "string"
},
"material": {
"type": "string"
},
"item_spec": {
"type": "string",
"nullable": true
},
"model_name": {
"type": "string",
"nullable": true
},
"model_UA": {
"type": "string",
"nullable": true
},
"rail_width": {
"type": "number",
"nullable": true
},
"length_code": {
"type": "string",
"nullable": true
},
"length_mm": {
"type": "integer",
"nullable": true
},
"bendingData": {
"description": "전체 교체",
"type": "array",
"items": {
"type": "object"
},
"nullable": true
},
"memo": {
"type": "string",
"nullable": true
}
},
"type": "object"
@@ -9668,6 +9888,7 @@
"BendingItem"
],
"summary": "절곡품 삭제",
"description": "bending_data(전개도)도 함께 삭제",
"operationId": "46dcd93439505ae5ffb1dd2c8c1e5685",
"parameters": [
{
@@ -64680,35 +64901,22 @@
"properties": {
"id": {
"type": "integer",
"example": 15862
"example": 431
},
"code": {
"description": "LOT 코드: {제품Code}{종류Code}{YYMMDD}",
"type": "string",
"example": "BD-BE-30"
"example": "RS260319"
},
"name": {
"legacy_code": {
"description": "이전 코드 (items 기반)",
"type": "string",
"example": "하단마감재(스크린) EGI 3000mm"
},
"item_type": {
"type": "string",
"example": "PT"
},
"item_category": {
"type": "string",
"example": "BENDING"
},
"unit": {
"type": "string",
"example": "EA"
},
"is_active": {
"type": "boolean",
"example": true
"example": "BD-RS-30",
"nullable": true
},
"item_name": {
"type": "string",
"example": "하단마감재"
"example": "SUS마감재"
},
"item_sep": {
"type": "string",
@@ -64719,16 +64927,16 @@
},
"item_bending": {
"type": "string",
"example": "하단마감재"
"example": "가이드레일"
},
"item_spec": {
"type": "string",
"example": "60*40",
"example": "120*70",
"nullable": true
},
"material": {
"type": "string",
"example": "EGI 1.55T"
"example": "SUS 1.2T"
},
"model_name": {
"type": "string",
@@ -64743,19 +64951,85 @@
],
"nullable": true
},
"rail_width": {
"type": "number",
"nullable": true
},
"exit_direction": {
"description": "출구방향 (케이스 전용)",
"type": "string",
"nullable": true
},
"front_bottom": {
"description": "전면밑 (케이스 전용)",
"type": "number",
"nullable": true
},
"box_width": {
"description": "박스폭 (케이스 전용)",
"type": "number",
"nullable": true
},
"box_height": {
"description": "박스높이 (케이스 전용)",
"type": "number",
"nullable": true
},
"inspection_door": {
"description": "점검구 (케이스 전용)",
"type": "string",
"nullable": true
},
"length_code": {
"description": "원자재 길이코드",
"type": "string",
"example": "30",
"nullable": true
},
"length_mm": {
"description": "원자재 길이(mm)",
"type": "integer",
"example": 3000,
"nullable": true
},
"bendingData": {
"description": "전개도 데이터 (bending_data 테이블)",
"type": "array",
"items": {
"properties": {
"no": {
"description": "열 순서",
"type": "integer"
},
"input": {
"description": "입력 치수",
"type": "number"
},
"rate": {
"description": "연신율: 빈값/'-1'(하향)/'1'(상향)",
"type": "string"
},
"sum": {
"description": "누적 합계",
"type": "number"
},
"color": {
"description": "음영 마킹",
"type": "boolean"
},
"aAngle": {
"description": "A각 표시",
"type": "boolean"
}
},
"type": "object"
},
"nullable": true
},
"search_keyword": {
"type": "string",
"nullable": true
},
"rail_width": {
"type": "integer",
"nullable": true
},
"registration_date": {
"type": "string",
"format": "date",
"nullable": true
},
"author": {
"type": "string",
"nullable": true
@@ -64764,78 +65038,69 @@
"type": "string",
"nullable": true
},
"exit_direction": {
"registration_date": {
"type": "string",
"format": "date",
"nullable": true
},
"front_bottom_width": {
"image_file_id": {
"description": "절곡 도면 이미지 파일 ID",
"type": "integer",
"nullable": true
},
"box_width": {
"legacy_bending_id": {
"description": "chandj.bending.num 참조",
"type": "integer",
"nullable": true
},
"box_height": {
"type": "integer",
"nullable": true
},
"bendingData": {
"type": "array",
"items": {
"properties": {
"no": {
"type": "integer"
},
"input": {
"type": "number"
},
"rate": {
"type": "string"
},
"sum": {
"type": "number"
},
"color": {
"type": "boolean"
},
"aAngle": {
"type": "boolean"
}
},
"type": "object"
},
"nullable": true
},
"prefix": {
"type": "string",
"example": "BE",
"nullable": true
},
"length_code": {
"type": "string",
"example": "30",
"nullable": true
},
"length_mm": {
"type": "integer",
"example": 3000,
"nullable": true
},
"legacy_bending_num": {
"description": "레거시 chandj bending.num (운영 전 삭제 예정)",
"description": "MNG2 호환 (=legacy_bending_id)",
"type": "integer",
"nullable": true
},
"modified_by": {
"type": "string",
"nullable": true
},
"width_sum": {
"type": "integer",
"example": 193,
"description": "폭합계 (전개도 마지막 sum)",
"type": "number",
"example": 203,
"nullable": true
},
"bend_count": {
"description": "절곡 횟수",
"type": "integer",
"example": 5
},
"is_active": {
"type": "boolean",
"example": true
},
"name": {
"description": "MNG2 호환 (=item_name)",
"type": "string"
},
"front_bottom_width": {
"description": "MNG2 호환 (=front_bottom)",
"type": "number",
"nullable": true
},
"item_type": {
"description": "MNG2 호환 (고정값)",
"type": "string",
"example": "PT"
},
"item_category": {
"description": "MNG2 호환 (고정값)",
"type": "string",
"example": "BENDING"
},
"unit": {
"description": "MNG2 호환 (고정값)",
"type": "string",
"example": "EA"
},
"created_at": {
"type": "string",
"format": "date-time"
@@ -94607,7 +94872,7 @@
},
{
"name": "BendingItem",
"description": "절곡품 기초관리"
"description": "절곡품 기초관리 (bending_items 전용 테이블)"
},
{
"name": "Bidding",