feat: [bending] 절곡품 관리 API 완성 + 데이터 마이그레이션

- GuiderailModelController/Service/Resource: 가이드레일/케이스/하단마감재 통합 CRUD
- item_category 필터 (GUIDERAIL_MODEL/SHUTTERBOX_MODEL/BOTTOMBAR_MODEL)
- BendingItemResource: legacy_bending_num 노출 추가
- ApiKeyMiddleware: guiderail-models, files 화이트리스트 추가
- Swagger: BendingItemApi, GuiderailModelApi 문서 (케이스/하단마감재 필드 포함)
- 마이그레이션 커맨드 5개: GuiderailImportLegacy, BendingProductImportLegacy, BendingImportImages, BendingModelImportImages, BendingModelImportAssemblyImages
- 데이터: GR 20건 + SB 30건 + BB 10건 + 이미지 473건 R2 업로드
This commit is contained in:
2026-03-17 12:50:26 +09:00
parent 13d91b7ab4
commit 7083057d59
15 changed files with 2236 additions and 6 deletions

View File

@@ -11,7 +11,7 @@
"servers": [
{
"url": "https://api.sam.kr/",
"description": "SAM관리시스템 API 서버"
"description": "SAM API 서버"
}
],
"paths": {
@@ -9436,6 +9436,256 @@
]
}
},
"/api/v1/bending-items": {
"get": {
"tags": [
"BendingItem"
],
"summary": "절곡품 목록 조회",
"operationId": "c497d5bfebed3fb08cd4d5be9224c795",
"parameters": [
{
"name": "item_sep",
"in": "query",
"required": false,
"schema": {
"type": "string",
"enum": [
"스크린",
"철재"
]
}
},
{
"name": "item_bending",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "material",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "model_UA",
"in": "query",
"required": false,
"schema": {
"type": "string",
"enum": [
"인정",
"비인정"
]
}
},
{
"name": "search",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "page",
"in": "query",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "size",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 50
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
},
"post": {
"tags": [
"BendingItem"
],
"summary": "절곡품 등록",
"operationId": "8c9e50c74611ec24e621ceb665031059",
"requestBody": {
"content": {
"application/json": {
"schema": {
"required": [
"code",
"name",
"item_name",
"item_sep",
"item_bending",
"material"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"item_name": {
"type": "string"
},
"item_sep": {
"type": "string",
"enum": [
"스크린",
"철재"
]
},
"item_bending": {
"type": "string"
},
"material": {
"type": "string"
},
"bendingData": {
"type": "array",
"items": {
"type": "object"
},
"nullable": true
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/bending-items/filters": {
"get": {
"tags": [
"BendingItem"
],
"summary": "절곡품 필터 옵션 조회",
"operationId": "f5dd325adc791e1b8cab40b9fa2fb77d",
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/bending-items/{id}": {
"get": {
"tags": [
"BendingItem"
],
"summary": "절곡품 상세 조회",
"operationId": "d364f4d4cf76bcce7167561b73216382",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
},
"put": {
"tags": [
"BendingItem"
],
"summary": "절곡품 수정",
"operationId": "9ce1223d6528c5f926f6726c2b1f65f2",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"memo": {
"type": "string"
},
"bendingData": {
"type": "array",
"items": {
"type": "object"
},
"nullable": true
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "성공"
}
}
},
"delete": {
"tags": [
"BendingItem"
],
"summary": "절곡품 삭제",
"operationId": "46dcd93439505ae5ffb1dd2c8c1e5685",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/biddings": {
"get": {
"tags": [
@@ -26052,6 +26302,243 @@
]
}
},
"/api/v1/guiderail-models": {
"get": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 목록 (가이드레일/케이스/하단마감재 통합)",
"operationId": "f06bc491c0801ca7ec8676381ac5dc53",
"parameters": [
{
"name": "item_category",
"in": "query",
"description": "필수: 카테고리 구분 (없으면 60건 전부 반환)",
"required": true,
"schema": {
"type": "string",
"enum": [
"GUIDERAIL_MODEL",
"SHUTTERBOX_MODEL",
"BOTTOMBAR_MODEL"
]
}
},
{
"name": "item_sep",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "model_UA",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "check_type",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "model_name",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "search",
"in": "query",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "page",
"in": "query",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "size",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"default": 50
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
},
"post": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 등록",
"operationId": "6b4f759362fa6db48357bab171175f4f",
"requestBody": {
"content": {
"application/json": {
"schema": {
"required": [
"code",
"name"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
},
"model_name": {
"type": "string"
},
"check_type": {
"type": "string"
},
"components": {
"type": "array",
"items": {
"type": "object"
}
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/guiderail-models/filters": {
"get": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 필터 옵션",
"operationId": "85422fba3619fcb7fac3db2a1dc20bb1",
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/guiderail-models/{id}": {
"get": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 상세 (부품 조합 포함)",
"operationId": "6c24a276c41bef2fb211b4d6d5a3c45a",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
},
"put": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 수정",
"operationId": "0284e070bc05779f643d8579c584de23",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"requestBody": {
"content": {
"application/json": {
"schema": {
"properties": {
"model_name": {
"type": "string"
},
"components": {
"type": "array",
"items": {
"type": "object"
}
},
"material_summary": {
"type": "object"
}
},
"type": "object"
}
}
}
},
"responses": {
"200": {
"description": "성공"
}
}
},
"delete": {
"tags": [
"GuiderailModel"
],
"summary": "절곡품 모델 삭제",
"operationId": "3468308d63c19adb4325812d9636bf5a",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "성공"
}
}
}
},
"/api/v1/internal/exchange-token": {
"post": {
"tags": [
@@ -64189,6 +64676,177 @@
},
"type": "object"
},
"BendingItem": {
"properties": {
"id": {
"type": "integer",
"example": 15862
},
"code": {
"type": "string",
"example": "BD-BE-30"
},
"name": {
"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
},
"item_name": {
"type": "string",
"example": "하단마감재"
},
"item_sep": {
"type": "string",
"enum": [
"스크린",
"철재"
]
},
"item_bending": {
"type": "string",
"example": "하단마감재"
},
"item_spec": {
"type": "string",
"example": "60*40",
"nullable": true
},
"material": {
"type": "string",
"example": "EGI 1.55T"
},
"model_name": {
"type": "string",
"example": "KSS01",
"nullable": true
},
"model_UA": {
"type": "string",
"enum": [
"인정",
"비인정"
],
"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
},
"memo": {
"type": "string",
"nullable": true
},
"exit_direction": {
"type": "string",
"nullable": true
},
"front_bottom_width": {
"type": "integer",
"nullable": true
},
"box_width": {
"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 (운영 전 삭제 예정)",
"type": "integer",
"nullable": true
},
"width_sum": {
"type": "integer",
"example": 193,
"nullable": true
},
"bend_count": {
"type": "integer",
"example": 5
},
"created_at": {
"type": "string",
"format": "date-time"
},
"updated_at": {
"type": "string",
"format": "date-time"
}
},
"type": "object"
},
"Bidding": {
"properties": {
"id": {
@@ -73925,6 +74583,152 @@
},
"type": "object"
},
"GuiderailModel": {
"properties": {
"id": {
"type": "integer"
},
"code": {
"type": "string",
"example": "GR-KSS01-벽면형-SUS"
},
"name": {
"type": "string",
"example": "KSS01 벽면형 SUS마감"
},
"item_category": {
"type": "string",
"enum": [
"GUIDERAIL_MODEL",
"SHUTTERBOX_MODEL",
"BOTTOMBAR_MODEL"
]
},
"model_name": {
"type": "string",
"example": "KSS01",
"nullable": true
},
"check_type": {
"type": "string",
"enum": [
"벽면형",
"측면형"
],
"nullable": true
},
"rail_width": {
"type": "integer",
"example": 70,
"nullable": true
},
"rail_length": {
"type": "integer",
"example": 120,
"nullable": true
},
"finishing_type": {
"type": "string",
"enum": [
"SUS마감",
"EGI마감"
],
"nullable": true
},
"item_sep": {
"type": "string",
"enum": [
"스크린",
"철재"
],
"nullable": true
},
"model_UA": {
"type": "string",
"enum": [
"인정",
"비인정"
],
"nullable": true
},
"exit_direction": {
"description": "케이스 점검구 방향",
"type": "string",
"nullable": true
},
"front_bottom_width": {
"description": "케이스 전면밑",
"type": "integer",
"nullable": true
},
"box_width": {
"description": "케이스 너비",
"type": "integer",
"nullable": true
},
"box_height": {
"description": "케이스 높이",
"type": "integer",
"nullable": true
},
"bar_width": {
"description": "하단마감재 폭",
"type": "integer",
"nullable": true
},
"bar_height": {
"description": "하단마감재 높이",
"type": "integer",
"nullable": true
},
"components": {
"type": "array",
"items": {
"properties": {
"orderNumber": {
"type": "integer"
},
"itemName": {
"type": "string"
},
"material": {
"type": "string"
},
"quantity": {
"type": "integer"
},
"width_sum": {
"type": "number"
},
"image_file_id": {
"description": "부품 이미지 → /api/v1/files/{id}/view",
"type": "integer",
"nullable": true
},
"bendingData": {
"type": "array",
"items": {
"type": "object"
}
}
},
"type": "object"
}
},
"material_summary": {
"type": "object",
"example": {
"SUS 1.2T": 406,
"EGI 1.55T": 398
}
},
"component_count": {
"type": "integer",
"example": 4
}
},
"type": "object"
},
"ExchangeTokenRequest": {
"required": [
"user_id",
@@ -93801,6 +94605,10 @@
"name": "BarobillSettings",
"description": "바로빌 설정 관리"
},
{
"name": "BendingItem",
"description": "절곡품 기초관리"
},
{
"name": "Bidding",
"description": "입찰관리 API"
@@ -93905,6 +94713,10 @@
"name": "Folder",
"description": "폴더 관리"
},
{
"name": "GuiderailModel",
"description": "절곡품 모델 관리 (가이드레일/케이스/하단마감재)"
},
{
"name": "ItemMaster",
"description": "품목기준관리 API"