diff --git a/.cursorrules b/.cursorrules index 3b0c3833..77180695 100644 --- a/.cursorrules +++ b/.cursorrules @@ -1,5 +1,48 @@ # Cursor Rules for ERP-node Project +## ๐Ÿšจ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ ์–‘์‹ ๊ฒ€์ฆ (ํ•„์ˆ˜) + +**์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด ๊ฐœ๋ฐœ ๋˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์„ ์š”์ฒญํ•  ๋•Œ, ์•„๋ž˜ ์–‘์‹์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‘๋‹ตํ•˜์„ธ์š”:** + +``` +์•ˆ๋…•ํ•˜์„ธ์š”. Oh My Master! ์–‘์‹์„ ๋ชป ์•Œ์•„ ๋“ฃ๊ฒ ์Šต๋‹ˆ๋‹ค. +๋‹ค์‹œ ํ•œ๋ฒˆ ์ž‘์„ฑํ•ด์ฃผ์‹ญ์‡ผ. +=== ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ์„œ === + +ใ€ํ™”๋ฉด ์ •๋ณดใ€‘ +- ํ™”๋ฉด๋ช…: +- ํšŒ์‚ฌ์ฝ”๋“œ: +- ๋ฉ”๋‰ดID (์žˆ์œผ๋ฉด): + +ใ€ํ…Œ์ด๋ธ” ์ •๋ณดใ€‘ +- ๋ฉ”์ธ ํ…Œ์ด๋ธ”: +- ๋””ํ…Œ์ผ ํ…Œ์ด๋ธ” (์žˆ์œผ๋ฉด): +- ๊ด€๊ณ„ FK (์žˆ์œผ๋ฉด): + +ใ€๋ฒ„ํŠผ ๋ชฉ๋กใ€‘ +๋ฒ„ํŠผ1: + - ๋ฒ„ํŠผ๋ช…: + - ๋™์ž‘ ์œ ํ˜•: (์ €์žฅ/์‚ญ์ œ/์ˆ˜์ •/์กฐํšŒ/๊ธฐํƒ€) + - ์กฐ๊ฑด (์žˆ์œผ๋ฉด): + - ๋Œ€์ƒ ํ…Œ์ด๋ธ”: + - ์ถ”๊ฐ€ ๋™์ž‘ (์žˆ์œผ๋ฉด): + +ใ€์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญใ€‘ +- +``` + +**์–‘์‹ ๋ฏธ์ค€์ˆ˜ ํŒ๋‹จ ๊ธฐ์ค€:** +1. "ํ™”๋ฉด ๋งŒ๋“ค์–ด์ค˜" ๊ฐ™์ด ํ…Œ์ด๋ธ”๋ช…/๋ฒ„ํŠผ ์ •๋ณด ์—†์ด ์š”์ฒญ +2. "์ €์žฅํ•˜๋ฉด ์ €์žฅํ•ด์ค˜" ๊ฐ™์ด ๊ตฌ์ฒด์ ์ธ ํ…Œ์ด๋ธ”/๋กœ์ง ์„ค๋ช… ์—†์Œ +3. "์ด์ „์ด๋ž‘ ๋น„์Šทํ•˜๊ฒŒ" ๊ฐ™์ด ๋ชจํ˜ธํ•œ ์ฐธ์กฐ +4. ๋ฒ„ํŠผ๋ณ„ ์กฐ๊ฑด/๋™์ž‘์ด ๋ช…์‹œ๋˜์ง€ ์•Š์Œ + +**์–‘์‹ ๋ฏธ์ค€์ˆ˜ ์‹œ ์ ˆ๋Œ€ ์ž‘์—… ์ง„ํ–‰ํ•˜์ง€ ๋ง๊ณ , ์œ„ ์–‘์‹์„ ๋ณด์—ฌ์ฃผ๋ฉฐ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.** + +**์ƒ์„ธ ๊ฐ€์ด๋“œ**: [ํ™”๋ฉด๊ฐœ๋ฐœ_ํ‘œ์ค€_๊ฐ€์ด๋“œ.md](docs/screen-implementation-guide/ํ™”๋ฉด๊ฐœ๋ฐœ_ํ‘œ์ค€_๊ฐ€์ด๋“œ.md) + +--- + ## ๐Ÿšจ ์ตœ์šฐ์„  ๋ณด์•ˆ ๊ทœ์น™: ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ **๋ชจ๋“  ์ฝ”๋“œ ์ž‘์„ฑ/์ˆ˜์ • ์™„๋ฃŒ ํ›„ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ ํŒŒ์ผ์„ ํ™•์ธํ•˜์„ธ์š”:** diff --git a/db/migrations/so_main_layout.json b/db/migrations/so_main_layout.json new file mode 100644 index 00000000..f00aac5a --- /dev/null +++ b/db/migrations/so_main_layout.json @@ -0,0 +1,179 @@ +{ + "version": "2.0", + "components": [ + { + "id": "comp_search", + "url": "@/lib/registry/components/v2-table-search-widget", + "size": { "width": 1920, "height": 80 }, + "position": { "x": 0, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-table-search-widget", + "label": "Search Filter", + "webTypeConfig": {} + }, + "displayOrder": 0 + }, + { + "id": "comp_table", + "url": "@/lib/registry/components/v2-table-list", + "size": { "width": 1920, "height": 800 }, + "position": { "x": 0, "y": 150, "z": 1 }, + "overrides": { + "type": "v2-table-list", + "label": "Sales Order List", + "filter": { "enabled": true, "filters": [] }, + "height": "auto", + "actions": { "actions": [], "bulkActions": false, "showActions": false }, + "columns": [ + { "align": "left", "order": 0, "format": "text", "visible": true, "sortable": true, "columnName": "order_no", "searchable": true, "displayName": "Order No" }, + { "align": "left", "order": 1, "format": "text", "visible": true, "sortable": true, "columnName": "partner_id", "searchable": true, "displayName": "Customer" }, + { "align": "left", "order": 2, "format": "text", "visible": true, "sortable": true, "columnName": "part_code", "searchable": true, "displayName": "Part Code" }, + { "align": "left", "order": 3, "format": "text", "visible": true, "sortable": true, "columnName": "part_name", "searchable": true, "displayName": "Part Name" }, + { "align": "left", "order": 4, "format": "text", "visible": true, "sortable": true, "columnName": "spec", "searchable": true, "displayName": "Spec" }, + { "align": "left", "order": 5, "format": "text", "visible": true, "sortable": true, "columnName": "material", "searchable": true, "displayName": "Material" }, + { "align": "right", "order": 6, "format": "number", "visible": true, "sortable": true, "columnName": "order_qty", "searchable": false, "displayName": "Order Qty" }, + { "align": "right", "order": 7, "format": "number", "visible": true, "sortable": true, "columnName": "ship_qty", "searchable": false, "displayName": "Ship Qty" }, + { "align": "right", "order": 8, "format": "number", "visible": true, "sortable": true, "columnName": "balance_qty", "searchable": false, "displayName": "Balance" }, + { "align": "right", "order": 9, "format": "number", "visible": true, "sortable": true, "columnName": "inventory_qty", "searchable": false, "displayName": "Stock" }, + { "align": "right", "order": 10, "format": "number", "visible": true, "sortable": true, "columnName": "plan_ship_qty", "searchable": false, "displayName": "Plan Ship Qty" }, + { "align": "right", "order": 11, "format": "number", "visible": true, "sortable": true, "columnName": "unit_price", "searchable": false, "displayName": "Unit Price" }, + { "align": "right", "order": 12, "format": "number", "visible": true, "sortable": true, "columnName": "total_amount", "searchable": false, "displayName": "Amount" }, + { "align": "left", "order": 13, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_partner_id", "searchable": true, "displayName": "Delivery Partner" }, + { "align": "left", "order": 14, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_address", "searchable": true, "displayName": "Delivery Address" }, + { "align": "center", "order": 15, "format": "text", "visible": true, "sortable": true, "columnName": "shipping_method", "searchable": true, "displayName": "Shipping Method" }, + { "align": "center", "order": 16, "format": "date", "visible": true, "sortable": true, "columnName": "due_date", "searchable": false, "displayName": "Due Date" }, + { "align": "center", "order": 17, "format": "date", "visible": true, "sortable": true, "columnName": "order_date", "searchable": false, "displayName": "Order Date" }, + { "align": "center", "order": 18, "format": "text", "visible": true, "sortable": true, "columnName": "status", "searchable": true, "displayName": "Status" }, + { "align": "left", "order": 19, "format": "text", "visible": true, "sortable": true, "columnName": "manager_name", "searchable": true, "displayName": "Manager" }, + { "align": "left", "order": 20, "format": "text", "visible": true, "sortable": true, "columnName": "memo", "searchable": true, "displayName": "Memo" } + ], + "autoLoad": true, + "checkbox": { "enabled": true, "multiple": true, "position": "left", "selectAll": true }, + "pagination": { "enabled": true, "pageSize": 20, "showPageInfo": true, "pageSizeOptions": [10, 20, 50, 100], "showSizeSelector": true }, + "showFooter": true, + "showHeader": true, + "tableStyle": { "theme": "default", "rowHeight": "normal", "borderStyle": "light", "headerStyle": "default", "hoverEffect": true, "alternateRows": true }, + "displayMode": "table", + "stickyHeader": false, + "selectedTable": "sales_order_mng", + "webTypeConfig": {}, + "horizontalScroll": { "enabled": true, "maxColumnWidth": 300, "minColumnWidth": 80, "maxVisibleColumns": 10 } + }, + "displayOrder": 1 + }, + { + "id": "comp_btn_upload", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1610, "y": 30, "z": 1 }, + "overrides": { + "text": "Excel Upload", + "type": "v2-button-primary", + "label": "Excel Upload Button", + "action": { "type": "excel_upload" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 2 + }, + { + "id": "comp_btn_download", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 110, "height": 40 }, + "position": { "x": 1720, "y": 30, "z": 1 }, + "overrides": { + "text": "Excel Download", + "type": "v2-button-primary", + "label": "Excel Download Button", + "action": { "type": "excel_download" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 3 + }, + { + "id": "comp_btn_register", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1500, "y": 100, "z": 1 }, + "overrides": { + "text": "New Order", + "type": "v2-button-primary", + "label": "New Order Button", + "action": { + "type": "modal", + "modalSize": "lg", + "modalTitle": "New Sales Order", + "targetScreenId": 3732, + "successMessage": "Saved successfully.", + "errorMessage": "Error saving." + }, + "variant": "success", + "actionType": "button", + "webTypeConfig": { "variant": "default", "actionType": "custom" } + }, + "displayOrder": 4 + }, + { + "id": "comp_btn_edit", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1610, "y": 100, "z": 1 }, + "overrides": { + "text": "Edit", + "type": "v2-button-primary", + "label": "Edit Button", + "action": { + "type": "edit", + "modalSize": "lg", + "modalTitle": "Edit Sales Order", + "targetScreenId": 3732, + "successMessage": "Updated successfully.", + "errorMessage": "Error updating." + }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 5 + }, + { + "id": "comp_btn_delete", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1700, "y": 100, "z": 1 }, + "overrides": { + "text": "Delete", + "type": "v2-button-primary", + "label": "Delete Button", + "action": { + "type": "delete", + "successMessage": "Deleted successfully.", + "errorMessage": "Error deleting." + }, + "variant": "danger", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 6 + }, + { + "id": "comp_btn_shipment", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1790, "y": 100, "z": 1 }, + "overrides": { + "text": "Shipment Plan", + "type": "v2-button-primary", + "label": "Shipment Plan Button", + "action": { "type": "custom" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 7 + } + ] +} diff --git a/db/migrations/so_main_layout_kr.json b/db/migrations/so_main_layout_kr.json new file mode 100644 index 00000000..16361a23 --- /dev/null +++ b/db/migrations/so_main_layout_kr.json @@ -0,0 +1,179 @@ +{ + "version": "2.0", + "components": [ + { + "id": "comp_search", + "url": "@/lib/registry/components/v2-table-search-widget", + "size": { "width": 1920, "height": 80 }, + "position": { "x": 0, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-table-search-widget", + "label": "๊ฒ€์ƒ‰ ํ•„ํ„ฐ", + "webTypeConfig": {} + }, + "displayOrder": 0 + }, + { + "id": "comp_table", + "url": "@/lib/registry/components/v2-table-list", + "size": { "width": 1920, "height": 800 }, + "position": { "x": 0, "y": 150, "z": 1 }, + "overrides": { + "type": "v2-table-list", + "label": "์ˆ˜์ฃผ ๋ชฉ๋ก", + "filter": { "enabled": true, "filters": [] }, + "height": "auto", + "actions": { "actions": [], "bulkActions": false, "showActions": false }, + "columns": [ + { "align": "left", "order": 0, "format": "text", "visible": true, "sortable": true, "columnName": "order_no", "searchable": true, "displayName": "์ˆ˜์ฃผ๋ฒˆํ˜ธ" }, + { "align": "left", "order": 1, "format": "text", "visible": true, "sortable": true, "columnName": "partner_id", "searchable": true, "displayName": "๊ฑฐ๋ž˜์ฒ˜" }, + { "align": "left", "order": 2, "format": "text", "visible": true, "sortable": true, "columnName": "part_code", "searchable": true, "displayName": "ํ’ˆ๋ชฉ์ฝ”๋“œ" }, + { "align": "left", "order": 3, "format": "text", "visible": true, "sortable": true, "columnName": "part_name", "searchable": true, "displayName": "ํ’ˆ๋ช…" }, + { "align": "left", "order": 4, "format": "text", "visible": true, "sortable": true, "columnName": "spec", "searchable": true, "displayName": "๊ทœ๊ฒฉ" }, + { "align": "left", "order": 5, "format": "text", "visible": true, "sortable": true, "columnName": "material", "searchable": true, "displayName": "์žฌ์งˆ" }, + { "align": "right", "order": 6, "format": "number", "visible": true, "sortable": true, "columnName": "order_qty", "searchable": false, "displayName": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰" }, + { "align": "right", "order": 7, "format": "number", "visible": true, "sortable": true, "columnName": "ship_qty", "searchable": false, "displayName": "์ถœํ•˜์ˆ˜๋Ÿ‰" }, + { "align": "right", "order": 8, "format": "number", "visible": true, "sortable": true, "columnName": "balance_qty", "searchable": false, "displayName": "์ž”๋Ÿ‰" }, + { "align": "right", "order": 9, "format": "number", "visible": true, "sortable": true, "columnName": "inventory_qty", "searchable": false, "displayName": "ํ˜„์žฌ๊ณ " }, + { "align": "right", "order": 10, "format": "number", "visible": true, "sortable": true, "columnName": "plan_ship_qty", "searchable": false, "displayName": "์ถœํ•˜๊ณ„ํš๋Ÿ‰" }, + { "align": "right", "order": 11, "format": "number", "visible": true, "sortable": true, "columnName": "unit_price", "searchable": false, "displayName": "๋‹จ๊ฐ€" }, + { "align": "right", "order": 12, "format": "number", "visible": true, "sortable": true, "columnName": "total_amount", "searchable": false, "displayName": "๊ธˆ์•ก" }, + { "align": "left", "order": 13, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_partner_id", "searchable": true, "displayName": "๋‚ฉํ’ˆ์ฒ˜" }, + { "align": "left", "order": 14, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_address", "searchable": true, "displayName": "๋‚ฉํ’ˆ์žฅ์†Œ" }, + { "align": "center", "order": 15, "format": "text", "visible": true, "sortable": true, "columnName": "shipping_method", "searchable": true, "displayName": "๋ฐฐ์†ก๋ฐฉ๋ฒ•" }, + { "align": "center", "order": 16, "format": "date", "visible": true, "sortable": true, "columnName": "due_date", "searchable": false, "displayName": "๋‚ฉ๊ธฐ์ผ" }, + { "align": "center", "order": 17, "format": "date", "visible": true, "sortable": true, "columnName": "order_date", "searchable": false, "displayName": "์ˆ˜์ฃผ์ผ" }, + { "align": "center", "order": 18, "format": "text", "visible": true, "sortable": true, "columnName": "status", "searchable": true, "displayName": "์ƒํƒœ" }, + { "align": "left", "order": 19, "format": "text", "visible": true, "sortable": true, "columnName": "manager_name", "searchable": true, "displayName": "๋‹ด๋‹น์ž" }, + { "align": "left", "order": 20, "format": "text", "visible": true, "sortable": true, "columnName": "memo", "searchable": true, "displayName": "๋ฉ”๋ชจ" } + ], + "autoLoad": true, + "checkbox": { "enabled": true, "multiple": true, "position": "left", "selectAll": true }, + "pagination": { "enabled": true, "pageSize": 20, "showPageInfo": true, "pageSizeOptions": [10, 20, 50, 100], "showSizeSelector": true }, + "showFooter": true, + "showHeader": true, + "tableStyle": { "theme": "default", "rowHeight": "normal", "borderStyle": "light", "headerStyle": "default", "hoverEffect": true, "alternateRows": true }, + "displayMode": "table", + "stickyHeader": false, + "selectedTable": "sales_order_mng", + "webTypeConfig": {}, + "horizontalScroll": { "enabled": true, "maxColumnWidth": 300, "minColumnWidth": 80, "maxVisibleColumns": 10 } + }, + "displayOrder": 1 + }, + { + "id": "comp_btn_upload", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1610, "y": 30, "z": 1 }, + "overrides": { + "text": "์—‘์…€ ์—…๋กœ๋“œ", + "type": "v2-button-primary", + "label": "์—‘์…€ ์—…๋กœ๋“œ ๋ฒ„ํŠผ", + "action": { "type": "excel_upload" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 2 + }, + { + "id": "comp_btn_download", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 110, "height": 40 }, + "position": { "x": 1720, "y": 30, "z": 1 }, + "overrides": { + "text": "์—‘์…€ ๋‹ค์šด๋กœ๋“œ", + "type": "v2-button-primary", + "label": "์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ", + "action": { "type": "excel_download" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 3 + }, + { + "id": "comp_btn_register", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1500, "y": 100, "z": 1 }, + "overrides": { + "text": "์ˆ˜์ฃผ ๋“ฑ๋ก", + "type": "v2-button-primary", + "label": "์ˆ˜์ฃผ ๋“ฑ๋ก ๋ฒ„ํŠผ", + "action": { + "type": "modal", + "modalSize": "lg", + "modalTitle": "์ˆ˜์ฃผ ๋“ฑ๋ก", + "targetScreenId": 3732, + "successMessage": "์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "success", + "actionType": "button", + "webTypeConfig": { "variant": "default", "actionType": "custom" } + }, + "displayOrder": 4 + }, + { + "id": "comp_btn_edit", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1610, "y": 100, "z": 1 }, + "overrides": { + "text": "์ˆ˜์ •", + "type": "v2-button-primary", + "label": "์ˆ˜์ • ๋ฒ„ํŠผ", + "action": { + "type": "edit", + "modalSize": "lg", + "modalTitle": "์ˆ˜์ฃผ ์ˆ˜์ •", + "targetScreenId": 3732, + "successMessage": "์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ˆ˜์ • ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 5 + }, + { + "id": "comp_btn_delete", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1700, "y": 100, "z": 1 }, + "overrides": { + "text": "์‚ญ์ œ", + "type": "v2-button-primary", + "label": "์‚ญ์ œ ๋ฒ„ํŠผ", + "action": { + "type": "delete", + "successMessage": "์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์‚ญ์ œ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "danger", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 6 + }, + { + "id": "comp_btn_shipment", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1790, "y": 100, "z": 1 }, + "overrides": { + "text": "์ถœํ•˜๊ณ„ํš", + "type": "v2-button-primary", + "label": "์ถœํ•˜๊ณ„ํš ๋ฒ„ํŠผ", + "action": { "type": "custom" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 7 + } + ] +} diff --git a/db/migrations/so_modal_layout.json b/db/migrations/so_modal_layout.json new file mode 100644 index 00000000..4245c052 --- /dev/null +++ b/db/migrations/so_modal_layout.json @@ -0,0 +1,254 @@ +{ + "version": "2.0", + "components": [ + { + "id": "comp_order_no", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Order No", + "fieldName": "order_no", + "placeholder": "Enter order number", + "required": true + }, + "displayOrder": 0 + }, + { + "id": "comp_order_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "Order Date", + "fieldName": "order_date", + "required": true + }, + "displayOrder": 1 + }, + { + "id": "comp_partner_id", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "Customer", + "fieldName": "partner_id", + "required": true, + "config": { + "mode": "dropdown", + "source": "table", + "sourceTable": "customer_mng", + "valueField": "id", + "labelField": "name" + } + }, + "displayOrder": 2 + }, + { + "id": "comp_part_code", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Part Code", + "fieldName": "part_code", + "placeholder": "Enter part code", + "required": true + }, + "displayOrder": 3 + }, + { + "id": "comp_part_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Part Name", + "fieldName": "part_name", + "placeholder": "Enter part name" + }, + "displayOrder": 4 + }, + { + "id": "comp_spec", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Spec", + "fieldName": "spec", + "placeholder": "Enter spec" + }, + "displayOrder": 5 + }, + { + "id": "comp_material", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Material", + "fieldName": "material", + "placeholder": "Enter material" + }, + "displayOrder": 6 + }, + { + "id": "comp_order_qty", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "Order Qty", + "fieldName": "order_qty", + "placeholder": "Enter order quantity", + "required": true + }, + "displayOrder": 7 + }, + { + "id": "comp_unit_price", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "Unit Price", + "fieldName": "unit_price", + "placeholder": "Enter unit price", + "required": true + }, + "displayOrder": 8 + }, + { + "id": "comp_due_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "Due Date", + "fieldName": "due_date" + }, + "displayOrder": 9 + }, + { + "id": "comp_status", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "Status", + "fieldName": "status", + "required": true, + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "์ˆ˜์ฃผ", "label": "์ˆ˜์ฃผ" }, + { "value": "์ง„ํ–‰์ค‘", "label": "์ง„ํ–‰์ค‘" }, + { "value": "์™„๋ฃŒ", "label": "์™„๋ฃŒ" }, + { "value": "์ทจ์†Œ", "label": "์ทจ์†Œ" } + ] + } + }, + "displayOrder": 10 + }, + { + "id": "comp_shipping_method", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "Shipping Method", + "fieldName": "shipping_method", + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "ํƒ๋ฐฐ", "label": "ํƒ๋ฐฐ" }, + { "value": "ํ™”๋ฌผ", "label": "ํ™”๋ฌผ" }, + { "value": "์ง์†ก", "label": "์ง์†ก" }, + { "value": "ํ€ต์„œ๋น„์Šค", "label": "ํ€ต์„œ๋น„์Šค" }, + { "value": "ํ•ด์ƒ์šด์†ก", "label": "ํ•ด์ƒ์šด์†ก" } + ] + } + }, + "displayOrder": 11 + }, + { + "id": "comp_delivery_address", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 60 }, + "position": { "x": 20, "y": 500, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Delivery Address", + "fieldName": "delivery_address", + "placeholder": "Enter delivery address" + }, + "displayOrder": 12 + }, + { + "id": "comp_manager_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 580, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "Manager", + "fieldName": "manager_name", + "placeholder": "Enter manager name" + }, + "displayOrder": 13 + }, + { + "id": "comp_memo", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 80 }, + "position": { "x": 20, "y": 660, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "textarea", + "label": "Memo", + "fieldName": "memo", + "placeholder": "Enter memo" + }, + "displayOrder": 14 + }, + { + "id": "comp_btn_save", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 540, "y": 760, "z": 1 }, + "overrides": { + "text": "Save", + "type": "v2-button-primary", + "label": "Save Button", + "action": { + "type": "save", + "closeModalAfterSave": true, + "refreshParentTable": true, + "successMessage": "Saved successfully.", + "errorMessage": "Error saving." + }, + "variant": "primary", + "actionType": "button" + }, + "displayOrder": 15 + } + ] +} diff --git a/db/migrations/so_modal_layout_kr.json b/db/migrations/so_modal_layout_kr.json new file mode 100644 index 00000000..f07e3ae6 --- /dev/null +++ b/db/migrations/so_modal_layout_kr.json @@ -0,0 +1,254 @@ +{ + "version": "2.0", + "components": [ + { + "id": "comp_order_no", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "์ˆ˜์ฃผ๋ฒˆํ˜ธ", + "fieldName": "order_no", + "placeholder": "์ˆ˜์ฃผ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 0 + }, + { + "id": "comp_order_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "์ˆ˜์ฃผ์ผ", + "fieldName": "order_date", + "required": true + }, + "displayOrder": 1 + }, + { + "id": "comp_partner_id", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "๊ฑฐ๋ž˜์ฒ˜", + "fieldName": "partner_id", + "required": true, + "config": { + "mode": "dropdown", + "source": "table", + "sourceTable": "customer_mng", + "valueField": "id", + "labelField": "name" + } + }, + "displayOrder": 2 + }, + { + "id": "comp_part_code", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "ํ’ˆ๋ชฉ์ฝ”๋“œ", + "fieldName": "part_code", + "placeholder": "ํ’ˆ๋ชฉ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 3 + }, + { + "id": "comp_part_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "ํ’ˆ๋ช…", + "fieldName": "part_name", + "placeholder": "ํ’ˆ๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 4 + }, + { + "id": "comp_spec", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๊ทœ๊ฒฉ", + "fieldName": "spec", + "placeholder": "๊ทœ๊ฒฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 5 + }, + { + "id": "comp_material", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "์žฌ์งˆ", + "fieldName": "material", + "placeholder": "์žฌ์งˆ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 6 + }, + { + "id": "comp_order_qty", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰", + "fieldName": "order_qty", + "placeholder": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 7 + }, + { + "id": "comp_unit_price", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "๋‹จ๊ฐ€", + "fieldName": "unit_price", + "placeholder": "๋‹จ๊ฐ€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 8 + }, + { + "id": "comp_due_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "๋‚ฉ๊ธฐ์ผ", + "fieldName": "due_date" + }, + "displayOrder": 9 + }, + { + "id": "comp_status", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "์ƒํƒœ", + "fieldName": "status", + "required": true, + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "์ˆ˜์ฃผ", "label": "์ˆ˜์ฃผ" }, + { "value": "์ง„ํ–‰์ค‘", "label": "์ง„ํ–‰์ค‘" }, + { "value": "์™„๋ฃŒ", "label": "์™„๋ฃŒ" }, + { "value": "์ทจ์†Œ", "label": "์ทจ์†Œ" } + ] + } + }, + "displayOrder": 10 + }, + { + "id": "comp_shipping_method", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "๋ฐฐ์†ก๋ฐฉ๋ฒ•", + "fieldName": "shipping_method", + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "ํƒ๋ฐฐ", "label": "ํƒ๋ฐฐ" }, + { "value": "ํ™”๋ฌผ", "label": "ํ™”๋ฌผ" }, + { "value": "์ง์†ก", "label": "์ง์†ก" }, + { "value": "ํ€ต์„œ๋น„์Šค", "label": "ํ€ต์„œ๋น„์Šค" }, + { "value": "ํ•ด์ƒ์šด์†ก", "label": "ํ•ด์ƒ์šด์†ก" } + ] + } + }, + "displayOrder": 11 + }, + { + "id": "comp_delivery_address", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 60 }, + "position": { "x": 20, "y": 500, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๋‚ฉํ’ˆ์žฅ์†Œ", + "fieldName": "delivery_address", + "placeholder": "๋‚ฉํ’ˆ์žฅ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 12 + }, + { + "id": "comp_manager_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 580, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๋‹ด๋‹น์ž", + "fieldName": "manager_name", + "placeholder": "๋‹ด๋‹น์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 13 + }, + { + "id": "comp_memo", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 80 }, + "position": { "x": 20, "y": 660, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "textarea", + "label": "๋ฉ”๋ชจ", + "fieldName": "memo", + "placeholder": "๋ฉ”๋ชจ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 14 + }, + { + "id": "comp_btn_save", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 540, "y": 760, "z": 1 }, + "overrides": { + "text": "์ €์žฅ", + "type": "v2-button-primary", + "label": "์ €์žฅ ๋ฒ„ํŠผ", + "action": { + "type": "save", + "closeModalAfterSave": true, + "refreshParentTable": true, + "successMessage": "์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "primary", + "actionType": "button" + }, + "displayOrder": 15 + } + ] +} diff --git a/docs/screen-implementation-guide/00_analysis/full-screen-analysis.md b/docs/screen-implementation-guide/00_analysis/full-screen-analysis.md new file mode 100644 index 00000000..9b4a9908 --- /dev/null +++ b/docs/screen-implementation-guide/00_analysis/full-screen-analysis.md @@ -0,0 +1,331 @@ +# ํ™”๋ฉด ์ „์ฒด ๋ถ„์„ ๋ณด๊ณ ์„œ + +> **๋ถ„์„ ๋Œ€์ƒ**: `/Users/kimjuseok/Downloads/ํ™”๋ฉด๊ฐœ๋ฐœ 8` ํด๋” ๋‚ด ํ•ต์‹ฌ ์—…๋ฌด ํ™”๋ฉด +> **๋ถ„์„ ๊ธฐ์ค€**: ๋ฉ”๋‰ด๋ณ„ ๋ถ„๋ฅ˜, 3๊ฐœ ์ด์ƒ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ์‹๋ณ„ +> **๋ถ„์„ ์ผ์ž**: 2026-01-30 + +--- + +## 1. ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ V2 ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก + +> **์ค‘์š”**: v2- ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +### ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-input` | V2 ์ž…๋ ฅ | ํ…์ŠคํŠธ, ์ˆซ์ž, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ ์ž…๋ ฅ | +| `v2-select` | V2 ์„ ํƒ | ๋“œ๋กญ๋‹ค์šด, ์ฝค๋ณด๋ฐ•์Šค, ๋ผ๋””์˜ค, ์ฒดํฌ๋ฐ•์Šค | +| `v2-date` | V2 ๋‚ ์งœ | ๋‚ ์งœ, ์‹œ๊ฐ„, ๋‚ ์งœ๋ฒ”์œ„ ์ž…๋ ฅ | + +### ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-text-display` | ํ…์ŠคํŠธ ํ‘œ์‹œ | ๋ผ๋ฒจ, ํ…์ŠคํŠธ ํ‘œ์‹œ | +| `v2-card-display` | ์นด๋“œ ๋””์Šคํ”Œ๋ ˆ์ด | ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ | +| `v2-aggregation-widget` | ์ง‘๊ณ„ ์œ„์ ฏ | ํ•ฉ๊ณ„, ํ‰๊ท , ๊ฐœ์ˆ˜ ๋“ฑ ์ง‘๊ณ„ ํ‘œ์‹œ | + +### ํ…Œ์ด๋ธ”/๋ฐ์ดํ„ฐ ์ปดํฌ๋„ŒํŠธ +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-table-list` | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ํ‘œ์‹œ, ํŽ˜์ด์ง€๋„ค์ด์…˜, ์ •๋ ฌ, ํ•„ํ„ฐ | +| `v2-table-search-widget` | ๊ฒ€์ƒ‰ ํ•„ํ„ฐ | ํ™”๋ฉด ๋‚ด ํ…Œ์ด๋ธ” ๊ฒ€์ƒ‰/ํ•„ํ„ฐ/๊ทธ๋ฃน ๊ธฐ๋Šฅ | +| `v2-pivot-grid` | ํ”ผ๋ฒ— ๊ทธ๋ฆฌ๋“œ | ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ ๋ถ„์„ (ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”) | + +### ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-split-panel-layout` | ๋ถ„ํ•  ํŒจ๋„ | ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ์ขŒ์šฐ ๋ถ„ํ•  ๋ ˆ์ด์•„์›ƒ | +| `v2-tabs-widget` | ํƒญ ์œ„์ ฏ | ํƒญ ์ „ํ™˜, ํƒญ ๋‚ด ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ | +| `v2-section-card` | Section Card | ์ œ๋ชฉ/ํ…Œ๋‘๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ทธ๋ฃนํ™” ์ปจํ…Œ์ด๋„ˆ | +| `v2-section-paper` | Section Paper | ๋ฐฐ๊ฒฝ์ƒ‰ ๊ธฐ๋ฐ˜ ๋ฏธ๋‹ˆ๋ฉ€ ๊ทธ๋ฃนํ™” ์ปจํ…Œ์ด๋„ˆ | +| `v2-divider-line` | ๊ตฌ๋ถ„์„  | ์˜์—ญ ๊ตฌ๋ถ„ | +| `v2-repeat-container` | ๋ฆฌํ”ผํ„ฐ ์ปจํ…Œ์ด๋„ˆ | ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ ๋ฐ˜๋ณต ๋ Œ๋”๋ง | +| `v2-repeater` | ๋ฆฌํ”ผํ„ฐ | ๋ฐ˜๋ณต ์ปจํŠธ๋กค | + +### ์•ก์…˜/๊ธฐํƒ€ ์ปดํฌ๋„ŒํŠธ +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-button-primary` | ๊ธฐ๋ณธ ๋ฒ„ํŠผ | ์ €์žฅ, ์‚ญ์ œ ๋“ฑ ์•ก์…˜ ๋ฒ„ํŠผ | +| `v2-numbering-rule` | ์ฑ„๋ฒˆ๊ทœ์น™ | ์ž๋™ ์ฝ”๋“œ/๋ฒˆํ˜ธ ์ƒ์„ฑ | +| `v2-category-manager` | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ์ž | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ | +| `v2-location-swap-selector` | ์œ„์น˜ ๊ตํ™˜ ์„ ํƒ๊ธฐ | ์œ„์น˜ ๊ตํ™˜ ๊ธฐ๋Šฅ | +| `v2-rack-structure` | ๋ž™ ๊ตฌ์กฐ | ์ฐฝ๊ณ  ๋ž™ ์‹œ๊ฐํ™” | +| `v2-media` | ๋ฏธ๋””์–ด | ๋ฏธ๋””์–ด ํ‘œ์‹œ | + +**์ด 23๊ฐœ V2 ์ปดํฌ๋„ŒํŠธ** + +--- + +## 2. ํ™”๋ฉด ๋ถ„๋ฅ˜ (๋ฉ”๋‰ด๋ณ„) + +### 01. ๊ธฐ์ค€์ •๋ณด (master-data) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ํšŒ์‚ฌ์ •๋ณด | ํšŒ์‚ฌ์ •๋ณด.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๋ถ€์„œ์ •๋ณด | ๋ถ€์„œ์ •๋ณด.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ํ’ˆ๋ชฉ์ •๋ณด | ํ’ˆ๋ชฉ์ •๋ณด.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ”+๊ทธ๋ฃนํ™” | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| BOM๊ด€๋ฆฌ | BOM๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํŠธ๋ฆฌ | โš ๏ธ ํŠธ๋ฆฌ๋ทฐ ๋ฏธ์ง€์› | +| ๊ณต์ •์ •๋ณด๊ด€๋ฆฌ | ๊ณต์ •์ •๋ณด๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ณต์ •์ž‘์—…๊ธฐ์ค€ | ๊ณต์ •์ž‘์—…๊ธฐ์ค€๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ํ’ˆ๋ชฉ๋ผ์šฐํŒ… | ํ’ˆ๋ชฉ๋ผ์šฐํŒ…๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +### 02. ์˜์—…๊ด€๋ฆฌ (sales) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ์ˆ˜์ฃผ๊ด€๋ฆฌ | ์ˆ˜์ฃผ๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ฒฌ์ ๊ด€๋ฆฌ | ๊ฒฌ์ ๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ | ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํƒญ+๊ทธ๋ฃนํ™” | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| ํŒ๋งคํ’ˆ๋ชฉ์ •๋ณด | ํŒ๋งคํ’ˆ๋ชฉ์ •๋ณด.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ์ถœํ•˜๊ณ„ํš๊ด€๋ฆฌ | ์ถœํ•˜๊ณ„ํš๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +### 03. ์ƒ์‚ฐ๊ด€๋ฆฌ (production) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ | ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํƒญ+ํƒ€์ž„๋ผ์ธ | โŒ ํƒ€์ž„๋ผ์ธ ๋ฏธ์ง€์› | +| ์ƒ์‚ฐ๊ด€๋ฆฌ | ์ƒ์‚ฐ๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ์ƒ์‚ฐ์‹ค์ ๊ด€๋ฆฌ | ์ƒ์‚ฐ์‹ค์ ๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ์ž‘์—…์ง€์‹œ | ์ž‘์—…์ง€์‹œ.html | ํƒญ+๊ทธ๋ฃนํ™”ํ…Œ์ด๋ธ”+๋ถ„ํ• ํŒจ๋„ | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| ๊ณต์ •๊ด€๋ฆฌ | ๊ณต์ •๊ด€๋ฆฌ.html | ๋ถ„ํ• ํŒจ๋„+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +### 04. ๊ตฌ๋งค๊ด€๋ฆฌ (purchase) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ๋ฐœ์ฃผ๊ด€๋ฆฌ | ๋ฐœ์ฃผ๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ณต๊ธ‰์—…์ฒด๊ด€๋ฆฌ | ๊ณต๊ธ‰์—…์ฒด๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ตฌ๋งค์ž…๊ณ  | pages/๊ตฌ๋งค์ž…๊ณ .html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +### 05. ์„ค๋น„๊ด€๋ฆฌ (equipment) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ์„ค๋น„์ •๋ณด | ์„ค๋น„์ •๋ณด.html | ๋ถ„ํ• ํŒจ๋„+์นด๋“œ+ํƒญ | โœ… v2-card-display ํ™œ์šฉ | + +### 06. ๋ฌผ๋ฅ˜๊ด€๋ฆฌ (logistics) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ์ฐฝ๊ณ ๊ด€๋ฆฌ | ์ฐฝ๊ณ ๊ด€๋ฆฌ.html | ๋ชจ๋ฐ”์ผ์•ฑ์Šคํƒ€์ผ+iframe | โŒ ๋ณ„๋„๊ฐœ๋ฐœ ํ•„์š” | +| ์ฐฝ๊ณ ์ •๋ณด๊ด€๋ฆฌ | ์ฐฝ๊ณ ์ •๋ณด๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ์ž…์ถœ๊ณ ๊ด€๋ฆฌ | ์ž…์ถœ๊ณ ๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ”+๊ทธ๋ฃนํ™” | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| ์žฌ๊ณ ํ˜„ํ™ฉ | ์žฌ๊ณ ํ˜„ํ™ฉ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +### 07. ํ’ˆ์งˆ๊ด€๋ฆฌ (quality) +| ํ™”๋ฉด๋ช… | ํŒŒ์ผ๋ช… | ํŒจํ„ด | ๊ตฌํ˜„ ๊ฐ€๋Šฅ | +|--------|--------|------|----------| +| ๊ฒ€์‚ฌ๊ธฐ์ค€ | ๊ฒ€์‚ฌ๊ธฐ์ค€.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ | ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ.html | ํƒญ+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๊ฒ€์‚ฌ์žฅ๋น„๊ด€๋ฆฌ | ๊ฒ€์‚ฌ์žฅ๋น„๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ๋ถˆ๋Ÿ‰๊ด€๋ฆฌ | ๋ถˆ๋Ÿ‰๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | +| ํด๋ ˆ์ž„๊ด€๋ฆฌ | ํด๋ ˆ์ž„๊ด€๋ฆฌ.html | ๊ฒ€์ƒ‰+ํ…Œ์ด๋ธ” | โœ… ์™„์ „ | + +--- + +## 3. ํ™”๋ฉด UI ํŒจํ„ด ๋ถ„์„ + +### ํŒจํ„ด A: ๊ฒ€์ƒ‰ + ํ…Œ์ด๋ธ” (๊ฐ€์žฅ ๊ธฐ๋ณธ) +**ํ•ด๋‹น ํ™”๋ฉด**: ์•ฝ 60% (15๊ฐœ ์ด์ƒ) + +**์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ**: +- `v2-table-search-widget`: ๊ฒ€์ƒ‰ ํ•„ํ„ฐ +- `v2-table-list`: ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ฒ€์ƒ‰ํ•„๋“œ๋“ค...] [์กฐํšŒ] [์—‘์…€] โ”‚ โ† v2-table-search-widget +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ํ…Œ์ด๋ธ” ์ œ๋ชฉ [์‹ ๊ทœ๋“ฑ๋ก] [์‚ญ์ œ] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ–ก | ์ฝ”๋“œ | ์ด๋ฆ„ | ์ƒํƒœ | ๋“ฑ๋ก์ผ | โ”‚ โ† v2-table-list +โ”‚ โ–ก | A001 | ํ…Œ์ŠคํŠธ| ์‚ฌ์šฉ | 2026-01-30 | โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### ํŒจํ„ด B: ๋ถ„ํ•  ํŒจ๋„ (๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ) +**ํ•ด๋‹น ํ™”๋ฉด**: ์•ฝ 25% (8๊ฐœ) + +**์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ**: +- `v2-split-panel-layout`: ์ขŒ์šฐ ๋ถ„ํ•  +- `v2-table-list`: ๋งˆ์Šคํ„ฐ/๋””ํ…Œ์ผ ํ…Œ์ด๋ธ” +- `v2-tabs-widget`: ์ƒ์„ธ ํƒญ (์„ ํƒ) + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๋งˆ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ โ”‚ ์ƒ์„ธ ์ •๋ณด / ํƒญ โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ–ก A001 ์ œํ’ˆA โ”‚ โ”‚๊ธฐ๋ณธโ”‚์ด๋ ฅโ”‚์ฒจ๋ถ€โ”‚ โ”‚ +โ”‚ โ–ก A002 ์ œํ’ˆB โ† โ”‚ โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ–ก A003 ์ œํ’ˆC โ”‚ [ํ…Œ์ด๋ธ” or ํผ] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### ํŒจํ„ด C: ํƒญ + ํ…Œ์ด๋ธ” +**ํ•ด๋‹น ํ™”๋ฉด**: ์•ฝ 10% (3๊ฐœ) + +**์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ**: +- `v2-tabs-widget`: ํƒญ ์ „ํ™˜ +- `v2-table-list`: ํƒญ๋ณ„ ํ…Œ์ด๋ธ” + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [ํƒญ1] [ํƒญ2] [ํƒญ3] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [ํ…Œ์ด๋ธ” ์˜์—ญ] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### ํŒจํ„ด D: ํŠน์ˆ˜ UI +**ํ•ด๋‹น ํ™”๋ฉด**: ์•ฝ 5% (2๊ฐœ) + +- ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ: ํƒ€์ž„๋ผ์ธ/๊ฐ„ํŠธ ์ฐจํŠธ โ†’ **v2-timeline ๋ฏธ์กด์žฌ** +- ์ฐฝ๊ณ ๊ด€๋ฆฌ: ๋ชจ๋ฐ”์ผ ์•ฑ ์Šคํƒ€์ผ โ†’ **๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š”** + +--- + +## 4. ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ๋ถ„์„ (3๊ฐœ ์ด์ƒ ์žฌํ™œ์šฉ ๊ธฐ์ค€) + +### 4.1 v2-grouped-table (๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ”) +**์žฌํ™œ์šฉ ํ™”๋ฉด ์ˆ˜**: 5๊ฐœ ์ด์ƒ โœ… + +| ํ™”๋ฉด | ๊ทธ๋ฃนํ™” ๊ธฐ์ค€ | +|------|------------| +| ํ’ˆ๋ชฉ์ •๋ณด | ํ’ˆ๋ชฉ๊ตฌ๋ถ„, ์นดํ…Œ๊ณ ๋ฆฌ | +| ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ | ๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•, ์ง€์—ญ | +| ์ž‘์—…์ง€์‹œ | ์ž‘์—…์ผ์ž, ๊ณต์ • | +| ์ž…์ถœ๊ณ ๊ด€๋ฆฌ | ์ž…์ถœ๊ณ ๊ตฌ๋ถ„, ์ฐฝ๊ณ  | +| ๊ฒฌ์ ๊ด€๋ฆฌ | ์ƒํƒœ, ๊ฑฐ๋ž˜์ฒ˜ | + +**๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ**: +- ํŠน์ • ์ปฌ๋Ÿผ ๊ธฐ์ค€ ๊ทธ๋ฃนํ•‘ +- ๊ทธ๋ฃน ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ +- ๊ทธ๋ฃน ํ—ค๋”์— ์ง‘๊ณ„ ํ‘œ์‹œ +- ๋‹ค์ค‘ ๊ทธ๋ฃนํ•‘ ์ง€์› + +**๊ตฌํ˜„ ๋ณต์žก๋„**: ์ค‘ + +### 4.2 v2-tree-view (ํŠธ๋ฆฌ ๋ทฐ) +**์žฌํ™œ์šฉ ํ™”๋ฉด ์ˆ˜**: 3๊ฐœ โœ… + +| ํ™”๋ฉด | ํŠธ๋ฆฌ ์šฉ๋„ | +|------|----------| +| BOM๊ด€๋ฆฌ | BOM ๊ตฌ์กฐ (์ •์ „๊ฐœ/์—ญ์ „๊ฐœ) | +| ๋ถ€์„œ์ •๋ณด | ์กฐ์ง๋„ | +| ๋ฉ”๋‰ด๊ด€๋ฆฌ | ๋ฉ”๋‰ด ๊ณ„์ธต | + +**๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ**: +- ๋…ธ๋“œ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ +- ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ (์„ ํƒ) +- ์ •์ „๊ฐœ/์—ญ์ „๊ฐœ ์ „ํ™˜ +- ๋…ธ๋“œ ์„ ํƒ ์ด๋ฒคํŠธ + +**๊ตฌํ˜„ ๋ณต์žก๋„**: ์ค‘์ƒ + +### 4.3 v2-timeline-scheduler (ํƒ€์ž„๋ผ์ธ) +**์žฌํ™œ์šฉ ํ™”๋ฉด ์ˆ˜**: 1~2๊ฐœ (๊ธฐ์ค€ ๋ฏธ๋‹ฌ) + +| ํ™”๋ฉด | ์šฉ๋„ | +|------|------| +| ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ | ๊ฐ„ํŠธ ์ฐจํŠธ | +| ์„ค๋น„ ๊ฐ€๋™ ํ˜„ํ™ฉ | ํƒ€์ž„๋ผ์ธ | + +**๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ**: +- ์‹œ๊ฐ„์ถ• ๊ธฐ๋ฐ˜ ๋ฐฐ์น˜ +- ๋“œ๋ž˜๊ทธ๋กœ ์ผ์ • ๋ณ€๊ฒฝ +- ๊ณต์ •๋ณ„ ์ƒ‰์ƒ ๊ตฌ๋ถ„ +- ์คŒ ์ธ/์•„์›ƒ + +**๊ตฌํ˜„ ๋ณต์žก๋„**: ์ƒ + +> **์ฐธ๊ณ **: 3๊ฐœ ๋ฏธ๋งŒ์ด๋ฏ€๋กœ ์šฐ์„ ์ˆœ์œ„ ํ•˜ํ–ฅ + +--- + +## 5. ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ + +### ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ 17๊ฐœ ํ™”๋ฉด (65%) โ”‚ +โ”‚ - ๊ธฐ๋ณธ ๊ฒ€์ƒ‰ + ํ…Œ์ด๋ธ” ํŒจํ„ด โ”‚ +โ”‚ - ๋ถ„ํ•  ํŒจ๋„ โ”‚ +โ”‚ - ํƒญ ์ „ํ™˜ โ”‚ +โ”‚ - ์นด๋“œ ๋””์Šคํ”Œ๋ ˆ์ด โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### v2-grouped-table ๊ฐœ๋ฐœ ํ›„ +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ +5๊ฐœ ํ™”๋ฉด (22๊ฐœ, 85%) โ”‚ +โ”‚ - ํ’ˆ๋ชฉ์ •๋ณด, ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ, ์ž‘์—…์ง€์‹œ โ”‚ +โ”‚ - ์ž…์ถœ๊ณ ๊ด€๋ฆฌ, ๊ฒฌ์ ๊ด€๋ฆฌ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### v2-tree-view ๊ฐœ๋ฐœ ํ›„ +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ +2๊ฐœ ํ™”๋ฉด (24๊ฐœ, 92%) โ”‚ +โ”‚ - BOM๊ด€๋ฆฌ, ๋ถ€์„œ์ •๋ณด(๊ณ„์ธต) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### ๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š” +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ 2๊ฐœ ํ™”๋ฉด (8%) โ”‚ +โ”‚ - ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ (ํƒ€์ž„๋ผ์ธ) โ”‚ +โ”‚ - ์ฐฝ๊ณ ๊ด€๋ฆฌ (๋ชจ๋ฐ”์ผ ์•ฑ ์Šคํƒ€์ผ) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 6. ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์šฐ์„ ์ˆœ์œ„ + +| ์ˆœ์œ„ | ์ปดํฌ๋„ŒํŠธ | ์žฌํ™œ์šฉ ํ™”๋ฉด ์ˆ˜ | ๋ณต์žก๋„ | ROI | +|------|----------|--------------|--------|-----| +| 1 | v2-grouped-table | 5+ | ์ค‘ | โญโญโญโญโญ | +| 2 | v2-tree-view | 3 | ์ค‘์ƒ | โญโญโญโญ | +| 3 | v2-timeline-scheduler | 1~2 | ์ƒ | โญโญ | + +--- + +## 7. ๊ถŒ์žฅ ๊ตฌํ˜„ ์ „๋žต + +### Phase 1: ์ฆ‰์‹œ ๊ตฌํ˜„ (ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ) +- ํšŒ์‚ฌ์ •๋ณด, ๋ถ€์„œ์ •๋ณด +- ๋ฐœ์ฃผ๊ด€๋ฆฌ, ๊ณต๊ธ‰์—…์ฒด๊ด€๋ฆฌ +- ๊ฒ€์‚ฌ๊ธฐ์ค€, ๊ฒ€์‚ฌ์žฅ๋น„๊ด€๋ฆฌ, ๋ถˆ๋Ÿ‰๊ด€๋ฆฌ +- ์ฐฝ๊ณ ์ •๋ณด๊ด€๋ฆฌ, ์žฌ๊ณ ํ˜„ํ™ฉ +- ๊ณต์ •์ž‘์—…๊ธฐ์ค€๊ด€๋ฆฌ +- ์ˆ˜์ฃผ๊ด€๋ฆฌ, ๊ฒฌ์ ๊ด€๋ฆฌ, ๊ณต์ •๊ด€๋ฆฌ +- ์„ค๋น„์ •๋ณด (v2-card-display ํ™œ์šฉ) +- ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ + +### Phase 2: v2-grouped-table ๊ฐœ๋ฐœ ํ›„ +- ํ’ˆ๋ชฉ์ •๋ณด, ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ, ์ž…์ถœ๊ณ ๊ด€๋ฆฌ +- ์ž‘์—…์ง€์‹œ + +### Phase 3: v2-tree-view ๊ฐœ๋ฐœ ํ›„ +- BOM๊ด€๋ฆฌ +- ๋ถ€์„œ์ •๋ณด (๊ณ„์ธต ๋ทฐ) + +### Phase 4: ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ +- ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ (ํƒ€์ž„๋ผ์ธ) +- ์ฐฝ๊ณ ๊ด€๋ฆฌ (๋ชจ๋ฐ”์ผ ์Šคํƒ€์ผ) + +--- + +## 8. ์š”์•ฝ + +| ํ•ญ๋ชฉ | ์ˆ˜์น˜ | +|------|------| +| ์ „์ฒด ๋ถ„์„ ํ™”๋ฉด ์ˆ˜ | 26๊ฐœ | +| ํ˜„์žฌ ์ฆ‰์‹œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ | 17๊ฐœ (65%) | +| v2-grouped-table ์ถ”๊ฐ€ ์‹œ | 22๊ฐœ (85%) | +| v2-tree-view ์ถ”๊ฐ€ ์‹œ | 24๊ฐœ (92%) | +| ๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š” | 2๊ฐœ (8%) | + +**ํ•ต์‹ฌ ๊ฒฐ๋ก **: +1. **ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ**๋กœ 65% ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€๋Šฅ +2. **v2-grouped-table** 1๊ฐœ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ๋กœ 85%๊นŒ์ง€ ํ™•๋Œ€ +3. **v2-tree-view** ์ถ”๊ฐ€๋กœ 92% ๋„๋‹ฌ +4. ๋‚˜๋จธ์ง€ 8%๋Š” ํ™”๋ฉด๋ณ„ ํŠน์ˆ˜ UI (ํƒ€์ž„๋ผ์ธ, ๋ชจ๋ฐ”์ผ ์Šคํƒ€์ผ)๋กœ ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ ํ•„์š” diff --git a/docs/screen-implementation-guide/00_analysis/v2-component-usage-guide.md b/docs/screen-implementation-guide/00_analysis/v2-component-usage-guide.md new file mode 100644 index 00000000..1f18e804 --- /dev/null +++ b/docs/screen-implementation-guide/00_analysis/v2-component-usage-guide.md @@ -0,0 +1,541 @@ +# V2 ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ + +> **๋ชฉ์ **: ๋‹ค์–‘ํ•œ ํšŒ์‚ฌ์—์„œ V2 ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ฐธ๊ณ ํ•˜๋Š” ๋ฒ”์šฉ ๊ฐ€์ด๋“œ +> **๋Œ€์ƒ**: ํ™”๋ฉด ์„ค๊ณ„์ž, ๊ฐœ๋ฐœ์ž +> **๋ฒ„์ „**: 1.0.0 +> **์ž‘์„ฑ์ผ**: 2026-01-30 + +--- + +## 1. V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ / ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ + +### 1.1 ๊ฐ€๋Šฅํ•œ ํ™”๋ฉด ์œ ํ˜• + +| ํ™”๋ฉด ์œ ํ˜• | ์„ค๋ช… | ๋Œ€ํ‘œ ์˜ˆ์‹œ | +|-----------|------|----------| +| ๋งˆ์Šคํ„ฐ ๊ด€๋ฆฌ | ๋‹จ์ผ ํ…Œ์ด๋ธ” CRUD | ํšŒ์‚ฌ์ •๋ณด, ๋ถ€์„œ์ •๋ณด, ์ฝ”๋“œ๊ด€๋ฆฌ | +| ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ | ์ขŒ์ธก ์„ ํƒ โ†’ ์šฐ์ธก ์ƒ์„ธ | ๊ณต์ •๊ด€๋ฆฌ, ํ’ˆ๋ชฉ๋ผ์šฐํŒ…, ๊ฒฌ์ ๊ด€๋ฆฌ | +| ํƒญ ๊ธฐ๋ฐ˜ ํ™”๋ฉด | ํƒญ๋ณ„ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”/๋ทฐ | ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ, ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ | +| ์นด๋“œ ๋ทฐ | ์ด๋ฏธ์ง€+์ •๋ณด ์นด๋“œ ํ˜•ํƒœ | ์„ค๋น„์ •๋ณด, ๋Œ€์‹œ๋ณด๋“œ | +| ํ”ผ๋ฒ— ๋ถ„์„ | ๋‹ค์ฐจ์› ์ง‘๊ณ„ | ๋งค์ถœ๋ถ„์„, ์žฌ๊ณ ํ˜„ํ™ฉ | +| ๋ฐ˜๋ณต ์ปจํ…Œ์ด๋„ˆ | ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ UI ๋ฐ˜๋ณต | ์ฃผ๋ฌธ ์ƒ์„ธ, ํ•ญ๋ชฉ ๋ฆฌ์ŠคํŠธ | + +### 1.2 ๋ถˆ๊ฐ€๋Šฅํ•œ ํ™”๋ฉด ์œ ํ˜• (๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š”) + +| ํ™”๋ฉด ์œ ํ˜• | ์ด์œ  | ํ•ด๊ฒฐ ๋ฐฉ์•ˆ | +|-----------|------|----------| +| ๊ฐ„ํŠธ ์ฐจํŠธ / ํƒ€์ž„๋ผ์ธ | ์‹œ๊ฐ„์ถ• ๊ธฐ๋ฐ˜ UI ์—†์Œ | ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ or ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | +| ํŠธ๋ฆฌ ๋ทฐ (๊ณ„์ธต ๊ตฌ์กฐ) | ํŠธ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ๋ฏธ์กด์žฌ | `v2-tree-view` ๊ฐœ๋ฐœ ํ•„์š” | +| ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” | ๊ทธ๋ฃนํ•‘ ๊ธฐ๋Šฅ ๋ฏธ์ง€์› | `v2-grouped-table` ๊ฐœ๋ฐœ ํ•„์š” | +| ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ ๋ณด๋“œ | ์นธ๋ฐ˜ ์Šคํƒ€์ผ UI ์—†์Œ | ๋ณ„๋„ ๊ฐœ๋ฐœ | +| ๋ชจ๋ฐ”์ผ ์•ฑ ์Šคํƒ€์ผ | ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ UI | ๋ณ„๋„ ๊ฐœ๋ฐœ | +| ๋ณต์žกํ•œ ์ฐจํŠธ | ๊ธฐ๋ณธ ์ง‘๊ณ„ ์™ธ ์‹œ๊ฐํ™” | ์ฐจํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ๋™ | + +--- + +## 2. V2 ์ปดํฌ๋„ŒํŠธ ์ „์ฒด ๋ชฉ๋ก (23๊ฐœ) + +### 2.1 ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ (3๊ฐœ) + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | ์ฃผ์š” ์˜ต์…˜ | +|----|------|------|----------| +| `v2-input` | ์ž…๋ ฅ | ํ…์ŠคํŠธ, ์ˆซ์ž, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ, ์ „ํ™”๋ฒˆํ˜ธ, URL, ์—ฌ๋Ÿฌ ์ค„ | inputType, required, readonly, maxLength | +| `v2-select` | ์„ ํƒ | ๋“œ๋กญ๋‹ค์šด, ์ฝค๋ณด๋ฐ•์Šค, ๋ผ๋””์˜ค, ์ฒดํฌ๋ฐ•์Šค | mode, source(distinct/static/code/entity), multiple | +| `v2-date` | ๋‚ ์งœ | ๋‚ ์งœ, ์‹œ๊ฐ„, ๋‚ ์งœ์‹œ๊ฐ„, ๋‚ ์งœ๋ฒ”์œ„, ์›”, ์—ฐ๋„ | dateType, format, showTime | + +### 2.2 ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ (3๊ฐœ) + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | ์ฃผ์š” ์˜ต์…˜ | +|----|------|------|----------| +| `v2-text-display` | ํ…์ŠคํŠธ ํ‘œ์‹œ | ๋ผ๋ฒจ, ์ œ๋ชฉ, ์„ค๋ช… ํ…์ŠคํŠธ | fontSize, fontWeight, color, textAlign | +| `v2-card-display` | ์นด๋“œ ๋””์Šคํ”Œ๋ ˆ์ด | ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ | cardsPerRow, showImage, columnMapping | +| `v2-aggregation-widget` | ์ง‘๊ณ„ ์œ„์ ฏ | ํ•ฉ๊ณ„, ํ‰๊ท , ๊ฐœ์ˆ˜, ์ตœ๋Œ€, ์ตœ์†Œ | items, filters, layout | + +### 2.3 ํ…Œ์ด๋ธ”/๋ฐ์ดํ„ฐ ์ปดํฌ๋„ŒํŠธ (3๊ฐœ) + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | ์ฃผ์š” ์˜ต์…˜ | +|----|------|------|----------| +| `v2-table-list` | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | ๋ฐ์ดํ„ฐ ์กฐํšŒ/ํŽธ์ง‘ ํ…Œ์ด๋ธ” | selectedTable, columns, pagination, filter | +| `v2-table-search-widget` | ๊ฒ€์ƒ‰ ํ•„ํ„ฐ | ํ…Œ์ด๋ธ” ๊ฒ€์ƒ‰/ํ•„ํ„ฐ/๊ทธ๋ฃน | autoSelectFirstTable, showTableSelector | +| `v2-pivot-grid` | ํ”ผ๋ฒ— ๊ทธ๋ฆฌ๋“œ | ๋‹ค์ฐจ์› ๋ถ„์„ (ํ–‰/์—ด/๋ฐ์ดํ„ฐ ์˜์—ญ) | fields, totals, aggregation | + +### 2.4 ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ (8๊ฐœ) + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | ์ฃผ์š” ์˜ต์…˜ | +|----|------|------|----------| +| `v2-split-panel-layout` | ๋ถ„ํ•  ํŒจ๋„ | ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ์ขŒ์šฐ ๋ถ„ํ•  | splitRatio, resizable, relation | +| `v2-tabs-widget` | ํƒญ ์œ„์ ฏ | ํƒญ ์ „ํ™˜, ํƒญ ๋‚ด ์ปดํฌ๋„ŒํŠธ | tabs, activeTabId | +| `v2-section-card` | ์„น์…˜ ์นด๋“œ | ์ œ๋ชฉ+ํ…Œ๋‘๋ฆฌ ๊ทธ๋ฃนํ™” | title, collapsible, padding | +| `v2-section-paper` | ์„น์…˜ ํŽ˜์ดํผ | ๋ฐฐ๊ฒฝ์ƒ‰ ๊ทธ๋ฃนํ™” | backgroundColor, padding, shadow | +| `v2-divider-line` | ๊ตฌ๋ถ„์„  | ์˜์—ญ ๊ตฌ๋ถ„ | orientation, thickness | +| `v2-repeat-container` | ๋ฆฌํ”ผํ„ฐ ์ปจํ…Œ์ด๋„ˆ | ๋ฐ์ดํ„ฐ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณต ๋ Œ๋”๋ง | dataSourceType, layout, gridColumns | +| `v2-repeater` | ๋ฆฌํ”ผํ„ฐ | ๋ฐ˜๋ณต ์ปจํŠธ๋กค | - | +| `v2-repeat-screen-modal` | ๋ฐ˜๋ณต ํ™”๋ฉด ๋ชจ๋‹ฌ | ๋ชจ๋‹ฌ ๋ฐ˜๋ณต | - | + +### 2.5 ์•ก์…˜/ํŠน์ˆ˜ ์ปดํฌ๋„ŒํŠธ (6๊ฐœ) + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | ์ฃผ์š” ์˜ต์…˜ | +|----|------|------|----------| +| `v2-button-primary` | ๊ธฐ๋ณธ ๋ฒ„ํŠผ | ์ €์žฅ, ์‚ญ์ œ ๋“ฑ ์•ก์…˜ | text, actionType, variant | +| `v2-numbering-rule` | ์ฑ„๋ฒˆ๊ทœ์น™ | ์ž๋™ ์ฝ”๋“œ/๋ฒˆํ˜ธ ์ƒ์„ฑ | rule, prefix, format | +| `v2-category-manager` | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ์ž | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ UI | - | +| `v2-location-swap-selector` | ์œ„์น˜ ๊ตํ™˜ | ์œ„์น˜ ์„ ํƒ/๊ตํ™˜ | - | +| `v2-rack-structure` | ๋ž™ ๊ตฌ์กฐ | ์ฐฝ๊ณ  ๋ž™ ์‹œ๊ฐํ™” | - | +| `v2-media` | ๋ฏธ๋””์–ด | ์ด๋ฏธ์ง€/๋™์˜์ƒ ํ‘œ์‹œ | - | + +--- + +## 3. ํ™”๋ฉด ํŒจํ„ด๋ณ„ ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ + +### 3.1 ํŒจํ„ด A: ๊ธฐ๋ณธ ๋งˆ์Šคํ„ฐ ํ™”๋ฉด (๊ฐ€์žฅ ํ”ํ•จ) + +**์ ์šฉ ํ™”๋ฉด**: ์ฝ”๋“œ๊ด€๋ฆฌ, ์‚ฌ์šฉ์ž๊ด€๋ฆฌ, ๋ถ€์„œ์ •๋ณด, ์ฐฝ๊ณ ์ •๋ณด ๋“ฑ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ v2-table-search-widget โ”‚ +โ”‚ [๊ฒ€์ƒ‰ํ•„๋“œ1] [๊ฒ€์ƒ‰ํ•„๋“œ2] [์กฐํšŒ] [์—‘์…€] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ v2-table-list โ”‚ +โ”‚ ์ œ๋ชฉ [์‹ ๊ทœ] [์‚ญ์ œ] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ–ก | ์ฝ”๋“œ | ์ด๋ฆ„ | ์ƒํƒœ | ๋“ฑ๋ก์ผ | โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ**: +- `v2-table-search-widget` (1๊ฐœ) +- `v2-table-list` (1๊ฐœ) + +**์„ค์ • ํฌ์ธํŠธ**: +- ํ…Œ์ด๋ธ”๋ช… ์ง€์ • +- ๊ฒ€์ƒ‰ ๋Œ€์ƒ ์ปฌ๋Ÿผ ์„ค์ • +- ์ปฌ๋Ÿผ ํ‘œ์‹œ/์ˆจ๊น€ ์„ค์ • + +--- + +### 3.2 ํŒจํ„ด B: ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ํ™”๋ฉด + +**์ ์šฉ ํ™”๋ฉด**: ๊ณต์ •๊ด€๋ฆฌ, ๊ฒฌ์ ๊ด€๋ฆฌ, ์ˆ˜์ฃผ๊ด€๋ฆฌ, ํ’ˆ๋ชฉ๋ผ์šฐํŒ… ๋“ฑ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ v2-table-list โ”‚ v2-table-list ๋˜๋Š” ํผ โ”‚ +โ”‚ (๋งˆ์Šคํ„ฐ) โ”‚ (๋””ํ…Œ์ผ) โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”‚ +โ”‚ โ–ก A001 ํ•ญ๋ชฉ1 โ”‚ [์ƒ์„ธ ์ •๋ณด] โ”‚ +โ”‚ โ–ก A002 ํ•ญ๋ชฉ2 โ† โ”‚ โ”‚ +โ”‚ โ–ก A003 ํ•ญ๋ชฉ3 โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + v2-split-panel-layout +``` + +**ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ**: +- `v2-split-panel-layout` (1๊ฐœ) +- `v2-table-list` (2๊ฐœ: ๋งˆ์Šคํ„ฐ, ๋””ํ…Œ์ผ) + +**์„ค์ • ํฌ์ธํŠธ**: +- `splitRatio`: ์ขŒ์šฐ ๋น„์œจ (๊ธฐ๋ณธ 30:70) +- `relation.type`: join / detail / custom +- `relation.foreignKey`: ์—ฐ๊ฒฐ ํ‚ค ์ปฌ๋Ÿผ + +--- + +### 3.3 ํŒจํ„ด C: ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ + ํƒญ + +**์ ์šฉ ํ™”๋ฉด**: ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ, ํ’ˆ๋ชฉ์ •๋ณด, ์„ค๋น„์ •๋ณด ๋“ฑ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ v2-table-list โ”‚ v2-tabs-widget โ”‚ +โ”‚ (๋งˆ์Šคํ„ฐ) โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ โ”‚๊ธฐ๋ณธโ”‚์ด๋ ฅโ”‚์ฒจ๋ถ€โ”‚ โ”‚ +โ”‚ โ–ก A001 ๊ฑฐ๋ž˜์ฒ˜1 โ”‚ โ””โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ–ก A002 ๊ฑฐ๋ž˜์ฒ˜2 โ† โ”‚ [ํƒญ๋ณ„ ์ปจํ…์ธ ] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ**: +- `v2-split-panel-layout` (1๊ฐœ) +- `v2-table-list` (1๊ฐœ: ๋งˆ์Šคํ„ฐ) +- `v2-tabs-widget` (1๊ฐœ) + +**์„ค์ • ํฌ์ธํŠธ**: +- ํƒญ๋ณ„ ํ‘œ์‹œํ•  ํ…Œ์ด๋ธ”/ํผ ์„ค์ • +- ๋งˆ์Šคํ„ฐ ์„ ํƒ ์‹œ ํƒญ ์ปจํ…์ธ  ์—ฐ๋™ + +--- + +### 3.4 ํŒจํ„ด D: ์นด๋“œ ๋ทฐ + +**์ ์šฉ ํ™”๋ฉด**: ์„ค๋น„์ •๋ณด, ๋Œ€์‹œ๋ณด๋“œ, ์ƒํ’ˆ ์นดํƒˆ๋กœ๊ทธ ๋“ฑ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ v2-table-search-widget โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ v2-card-display โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ [์ด๋ฏธ์ง€]โ”‚ โ”‚ [์ด๋ฏธ์ง€]โ”‚ โ”‚ [์ด๋ฏธ์ง€]โ”‚ โ”‚ +โ”‚ โ”‚ ์ œ๋ชฉ โ”‚ โ”‚ ์ œ๋ชฉ โ”‚ โ”‚ ์ œ๋ชฉ โ”‚ โ”‚ +โ”‚ โ”‚ ์„ค๋ช… โ”‚ โ”‚ ์„ค๋ช… โ”‚ โ”‚ ์„ค๋ช… โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ**: +- `v2-table-search-widget` (1๊ฐœ) +- `v2-card-display` (1๊ฐœ) + +**์„ค์ • ํฌ์ธํŠธ**: +- `cardsPerRow`: ํ•œ ํ–‰๋‹น ์นด๋“œ ์ˆ˜ +- `columnMapping`: ์ œ๋ชฉ, ๋ถ€์ œ๋ชฉ, ์ด๋ฏธ์ง€, ์ƒํƒœ ํ•„๋“œ ๋งคํ•‘ +- `cardStyle`: ์ด๋ฏธ์ง€ ์œ„์น˜, ํฌ๊ธฐ + +--- + +### 3.5 ํŒจํ„ด E: ํ”ผ๋ฒ— ๋ถ„์„ + +**์ ์šฉ ํ™”๋ฉด**: ๋งค์ถœ๋ถ„์„, ์žฌ๊ณ ํ˜„ํ™ฉ, ์ƒ์‚ฐ์‹ค์  ๋ถ„์„ ๋“ฑ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ v2-pivot-grid โ”‚ +โ”‚ โ”‚ 2024๋…„ โ”‚ 2025๋…„ โ”‚ 2026๋…„ โ”‚ ํ•ฉ๊ณ„ โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ ์ง€์—ญA โ”‚ 1,000 โ”‚ 1,200 โ”‚ 1,500 โ”‚ 3,700 โ”‚ +โ”‚ ์ง€์—ญB โ”‚ 2,000 โ”‚ 2,500 โ”‚ 3,000 โ”‚ 7,500 โ”‚ +โ”‚ ํ•ฉ๊ณ„ โ”‚ 3,000 โ”‚ 3,700 โ”‚ 4,500 โ”‚ 11,200 โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**ํ•„์ˆ˜ ์ปดํฌ๋„ŒํŠธ**: +- `v2-pivot-grid` (1๊ฐœ) + +**์„ค์ • ํฌ์ธํŠธ**: +- `fields[].area`: row / column / data / filter +- `fields[].summaryType`: sum / avg / count / min / max +- `fields[].groupInterval`: ๋‚ ์งœ ๊ทธ๋ฃนํ™” (year/quarter/month) + +--- + +## 4. ํšŒ์‚ฌ๋ณ„ ๊ฐœ๋ฐœ ์‹œ ํ•ต์‹ฌ ์ฒดํฌํฌ์ธํŠธ + +### 4.1 ํ…Œ์ด๋ธ” ์„ค๊ณ„ ํ™•์ธ + +**๊ฐ€์žฅ ๋จผ์ € ํ™•์ธ**: +1. ํšŒ์‚ฌ์—์„œ ์‚ฌ์šฉํ•  ํ…Œ์ด๋ธ” ๋ชฉ๋ก +2. ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„ (FK) +3. ์กฐํšŒ ์กฐ๊ฑด์œผ๋กœ ์“ธ ์ปฌ๋Ÿผ + +``` +โœ… ์ฒดํฌ๋ฆฌ์ŠคํŠธ: +โ–ก ํ…Œ์ด๋ธ”๋ช…์ด DB์— ์กด์žฌํ•˜๋Š”๊ฐ€? +โ–ก company_code ์ปฌ๋Ÿผ์ด ์žˆ๋Š”๊ฐ€? (๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ) +โ–ก ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ๊ด€๊ณ„์˜ FK๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”๊ฐ€? +โ–ก ๊ฒ€์ƒ‰ ๋Œ€์ƒ ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๊ฐ€ ์žˆ๋Š”๊ฐ€? +``` + +### 4.2 ํ™”๋ฉด ํŒจํ„ด ํŒ๋‹จ + +**์งˆ๋ฌธ์„ ํ†ตํ•œ ํŒ๋‹จ**: + +| ์งˆ๋ฌธ | ์˜ˆ โ†’ ํŒจํ„ด | +|------|----------| +| ๋‹จ์ผ ํ…Œ์ด๋ธ”๋งŒ ์กฐํšŒ/ํŽธ์ง‘? | ํŒจํ„ด A (๊ธฐ๋ณธ ๋งˆ์Šคํ„ฐ) | +| ๋งˆ์Šคํ„ฐ ์„ ํƒ ์‹œ ๋””ํ…Œ์ผ ํ‘œ์‹œ? | ํŒจํ„ด B (๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ) | +| ์ƒ์„ธ์— ํƒญ์ด ํ•„์š”? | ํŒจํ„ด C (๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ+ํƒญ) | +| ์ด๋ฏธ์ง€+์ •๋ณด ์นด๋“œ ํ˜•ํƒœ? | ํŒจํ„ด D (์นด๋“œ ๋ทฐ) | +| ๋‹ค์ฐจ์› ์ง‘๊ณ„/๋ถ„์„? | ํŒจํ„ด E (ํ”ผ๋ฒ—) | + +### 4.3 ์ปดํฌ๋„ŒํŠธ ์„ค์ • ํ•„์ˆ˜ ํ•ญ๋ชฉ + +#### v2-table-list ํ•„์ˆ˜ ์„ค์ • + +```typescript +{ + selectedTable: "ํ…Œ์ด๋ธ”๋ช…", // ํ•„์ˆ˜ + columns: [ // ํ‘œ์‹œํ•  ์ปฌ๋Ÿผ + { columnName: "id", displayName: "ID", visible: true, sortable: true }, + // ... + ], + pagination: { + enabled: true, + pageSize: 20 + } +} +``` + +#### v2-split-panel-layout ํ•„์ˆ˜ ์„ค์ • + +```typescript +{ + leftPanel: { + tableName: "๋งˆ์Šคํ„ฐ_ํ…Œ์ด๋ธ”๋ช…" + }, + rightPanel: { + tableName: "๋””ํ…Œ์ผ_ํ…Œ์ด๋ธ”๋ช…", + relation: { + type: "detail", // join | detail | custom + foreignKey: "master_id" // ์—ฐ๊ฒฐ ํ‚ค + } + }, + splitRatio: 30 // ์ขŒ์ธก ๋น„์œจ +} +``` + +#### v2-card-display ํ•„์ˆ˜ ์„ค์ • + +```typescript +{ + dataSource: "table", + columnMapping: { + title: "name", // ์ œ๋ชฉ ํ•„๋“œ + subtitle: "code", // ๋ถ€์ œ๋ชฉ ํ•„๋“œ + image: "image_url", // ์ด๋ฏธ์ง€ ํ•„๋“œ (์„ ํƒ) + status: "status" // ์ƒํƒœ ํ•„๋“œ (์„ ํƒ) + }, + cardsPerRow: 3 +} +``` + +--- + +## 5. ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ํ•œ๊ณ„์  + +### 5.1 ํ˜„์žฌ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ + +| ๊ธฐ๋Šฅ | ์ƒํƒœ | ๋Œ€์•ˆ | +|------|------|------| +| ํŠธ๋ฆฌ ๋ทฐ (BOM, ์กฐ์ง๋„) | โŒ ๋ฏธ์ง€์› | ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด or ๋ณ„๋„ ๊ฐœ๋ฐœ | +| ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” | โŒ ๋ฏธ์ง€์› | ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด or ๋ณ„๋„ ๊ฐœ๋ฐœ | +| ๊ฐ„ํŠธ ์ฐจํŠธ | โŒ ๋ฏธ์ง€์› | ๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š” | +| ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ ์ •๋ ฌ | โŒ ๋ฏธ์ง€์› | ์ˆœ์„œ ์ปฌ๋Ÿผ์œผ๋กœ ๋Œ€์ฒด | +| ์ธ๋ผ์ธ ํŽธ์ง‘ | โš ๏ธ ์ œํ•œ์  | ๋ชจ๋‹ฌ ํŽธ์ง‘์œผ๋กœ ๋Œ€์ฒด | +| ๋ณต์žกํ•œ ์ฐจํŠธ | โŒ ๋ฏธ์ง€์› | ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ๋™ | + +### 5.2 ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ์กฐํ•ฉ + +| ์กฐํ•ฉ | ์ด์œ  | +|------|------| +| 3๋‹จ๊ณ„ ์ด์ƒ ์ค‘์ฒฉ ๋ถ„ํ•  | ํ™”๋ฉด ๋ณต์žก๋„ ์ฆ๊ฐ€, ์„ฑ๋Šฅ ์ €ํ•˜ | +| ํƒญ ์•ˆ์— ํƒญ | ์‚ฌ์šฉ์„ฑ ์ €ํ•˜ | +| ํ•œ ํ™”๋ฉด์— 3๊ฐœ ์ด์ƒ ํ…Œ์ด๋ธ” | ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ | +| ํ”ผ๋ฒ— + ์ƒ์„ธ ํ…Œ์ด๋ธ” ๋™์‹œ | ๋ฐ์ดํ„ฐ ๊ณผ๋ถ€ํ•˜ | + +--- + +## 6. ์ œ์–ด๊ด€๋ฆฌ (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง) - ๋ณ„๋„ ์„ค์ • ํ•„์ˆ˜ + +> **ํ•ต์‹ฌ**: V2 ์ปดํฌ๋„ŒํŠธ๋Š” **UI๋งŒ ๋‹ด๋‹น**ํ•ฉ๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ **์ œ์–ด๊ด€๋ฆฌ**์—์„œ ๋ณ„๋„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### 6.1 UI vs ์ œ์–ด ๋ถ„๋ฆฌ ๊ตฌ์กฐ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ํ™”๋ฉด ๊ตฌ์„ฑ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ UI ๋ ˆ์ด์•„์›ƒ โ”‚ ์ œ์–ด๊ด€๋ฆฌ โ”‚ +โ”‚ (screen_layouts_v2) โ”‚ (dataflow_diagrams) โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ€ข ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ โ”‚ โ€ข ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์•ก์…˜ โ”‚ +โ”‚ โ€ข ๊ฒ€์ƒ‰ ํ•„๋“œ ๊ตฌ์„ฑ โ”‚ โ€ข INSERT/UPDATE/DELETE ์„ค์ • โ”‚ +โ”‚ โ€ข ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ํ‘œ์‹œ โ”‚ โ€ข ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ โ”‚ +โ”‚ โ€ข ์นด๋“œ/ํƒญ ๋ ˆ์ด์•„์›ƒ โ”‚ โ€ข ๋‹ค์ค‘ ํ–‰ ์ฒ˜๋ฆฌ โ”‚ +โ”‚ โ”‚ โ€ข ํ…Œ์ด๋ธ” ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### 6.2 HTML์—์„œ ํŒŒ์•… ๊ฐ€๋Šฅ/๋ถˆ๊ฐ€๋Šฅ + +| ๊ตฌ๋ถ„ | HTML์—์„œ ํŒŒ์•… | ์ด์œ  | +|------|--------------|------| +| ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ | โœ… ๊ฐ€๋Šฅ | HTML ๊ตฌ์กฐ์—์„œ ๋ณด์ž„ | +| ๊ฒ€์ƒ‰ ํ•„๋“œ | โœ… ๊ฐ€๋Šฅ | input ํƒœ๊ทธ๋กœ ํ™•์ธ | +| ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ | โœ… ๊ฐ€๋Šฅ | thead์—์„œ ํ™•์ธ | +| **์ €์žฅ ํ…Œ์ด๋ธ”** | โŒ ๋ถˆ๊ฐ€๋Šฅ | JS/๋ฐฑ์—”๋“œ์—์„œ ์ฒ˜๋ฆฌ | +| **๋ฒ„ํŠผ ์•ก์…˜** | โŒ ๋ถˆ๊ฐ€๋Šฅ | ์ œ์–ด๊ด€๋ฆฌ์—์„œ ์„ค์ • | +| **์ „/ํ›„ ์ฒ˜๋ฆฌ** | โŒ ๋ถˆ๊ฐ€๋Šฅ | ์ œ์–ด๊ด€๋ฆฌ์—์„œ ์„ค์ • | +| **๋‹ค์ค‘ ํ–‰ ์ฒ˜๋ฆฌ** | โŒ ๋ถˆ๊ฐ€๋Šฅ | ์ œ์–ด๊ด€๋ฆฌ์—์„œ ์„ค์ • | +| **ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„** | โŒ ๋ถˆ๊ฐ€๋Šฅ | DB/์ œ์–ด๊ด€๋ฆฌ์—์„œ ์„ค์ • | + +### 6.3 ์ œ์–ด๊ด€๋ฆฌ ์„ค์ • ํ•ญ๋ชฉ + +#### ํŠธ๋ฆฌ๊ฑฐ ํƒ€์ž… +- **๋ฒ„ํŠผ ํด๋ฆญ ์ „ (before)**: ํด๋ฆญ ์ง์ „ ์‹คํ–‰ +- **๋ฒ„ํŠผ ํด๋ฆญ ํ›„ (after)**: ํด๋ฆญ ์™„๋ฃŒ ํ›„ ์‹คํ–‰ + +#### ์•ก์…˜ ํƒ€์ž… +- **INSERT**: ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์‚ฝ์ž… +- **UPDATE**: ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ˆ˜์ • +- **DELETE**: ๋ฐ์ดํ„ฐ ์‚ญ์ œ + +#### ์กฐ๊ฑด ์„ค์ • +```typescript +// ์˜ˆ: ์„ ํƒ๋œ ํ–‰์˜ ์ƒํƒœ๊ฐ€ '๋Œ€๊ธฐ'์ธ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰ +{ + field: "status", + operator: "=", + value: "๋Œ€๊ธฐ", + dataType: "string" +} +``` + +#### ํ•„๋“œ ๋งคํ•‘ +```typescript +// ์˜ˆ: ์†Œ์Šค ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ํƒ€๊ฒŸ ํ…Œ์ด๋ธ”๋กœ ์ด๋™ +{ + sourceTable: "order_master", + sourceField: "order_no", + targetTable: "order_history", + targetField: "order_no" +} +``` + +### 6.4 ์ œ์–ด๊ด€๋ฆฌ ์˜ˆ์‹œ: ์ˆ˜์ฃผ ํ™•์ • ๋ฒ„ํŠผ + +**์‹œ๋‚˜๋ฆฌ์˜ค**: ์ˆ˜์ฃผ ๋ชฉ๋ก์—์„œ 3๊ฑด ์„ ํƒ ํ›„ [ํ™•์ •] ๋ฒ„ํŠผ ํด๋ฆญ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [ํ™•์ •] ๋ฒ„ํŠผ ํด๋ฆญ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ 1. ์กฐ๊ฑด ์ฒดํฌ: status = '๋Œ€๊ธฐ' ์ธ ํ–‰๋งŒ โ”‚ +โ”‚ 2. UPDATE order_master SET status = 'ํ™•์ •' WHERE id IN (์„ ํƒ) โ”‚ +โ”‚ 3. INSERT order_history (์ˆ˜์ฃผ์ด๋ ฅ ํ…Œ์ด๋ธ”์— ๊ธฐ๋ก) โ”‚ +โ”‚ 4. ์™ธ๋ถ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ (ERP ์—ฐ๋™) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**์ œ์–ด๊ด€๋ฆฌ ์„ค์ •**: +```json +{ + "triggerType": "after", + "actions": [ + { + "actionType": "update", + "targetTable": "order_master", + "conditions": [{ "field": "status", "operator": "=", "value": "๋Œ€๊ธฐ" }], + "fieldMappings": [{ "targetField": "status", "defaultValue": "ํ™•์ •" }] + }, + { + "actionType": "insert", + "targetTable": "order_history", + "fieldMappings": [ + { "sourceField": "order_no", "targetField": "order_no" }, + { "sourceField": "customer_name", "targetField": "customer_name" } + ] + } + ] +} +``` + +### 6.5 ํšŒ์‚ฌ๋ณ„ ๊ฐœ๋ฐœ ์‹œ ์ œ์–ด๊ด€๋ฆฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +``` +โ–ก ๋ฒ„ํŠผ๋ณ„ ์•ก์…˜ ์ •์˜ + - ์–ด๋–ค ๋ฒ„ํŠผ์ด ์žˆ๋Š”๊ฐ€? + - ๊ฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ฌด์Šจ ๋™์ž‘? + +โ–ก ์ €์žฅ/์ˆ˜์ •/์‚ญ์ œ ๋Œ€์ƒ ํ…Œ์ด๋ธ” + - ๋ฉ”์ธ ํ…Œ์ด๋ธ”์€? + - ์ด๋ ฅ ํ…Œ์ด๋ธ”์€? + - ์—ฐ๊ด€ ํ…Œ์ด๋ธ”์€? + +โ–ก ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ + - ํŠน์ • ์ƒํƒœ์ผ ๋•Œ๋งŒ ์‹คํ–‰? + - ํŠน์ • ๊ฐ’ ์ฒดํฌ ํ•„์š”? + +โ–ก ๋‹ค์ค‘ ํ–‰ ์ฒ˜๋ฆฌ + - ์—ฌ๋Ÿฌ ํ–‰ ์„ ํƒ ํ›„ ์ผ๊ด„ ์ฒ˜๋ฆฌ? + - ๊ฐ ํ–‰๋ณ„ ๊ฐœ๋ณ„ ์ฒ˜๋ฆฌ? + +โ–ก ์™ธ๋ถ€ ์—ฐ๋™ + - ERP/MES ๋“ฑ ์™ธ๋ถ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ? + - API ์—ฐ๋™ ํ•„์š”? +``` + +--- + +## 7. ํšŒ์‚ฌ๋ณ„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ์˜์—ญ + +### 7.1 ์ปดํฌ๋„ŒํŠธ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ์˜์—ญ (ํ‘œ์ค€ํ™”) + +| ์˜์—ญ | ์„ค๋ช… | +|------|------| +| UI ๋ ˆ์ด์•„์›ƒ | ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜, ํฌ๊ธฐ, ์œ„์น˜ | +| ๊ฒ€์ƒ‰ ์กฐ๊ฑด | ํ™”๋ฉด ๋””์ž์ด๋„ˆ์—์„œ ์„ค์ • | +| ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ | ํ‘œ์‹œ/์ˆจ๊น€, ์ˆœ์„œ, ๋„ˆ๋น„ | +| ๊ธฐ๋ณธ CRUD | ์กฐํšŒ, ์ €์žฅ, ์‚ญ์ œ ์ž๋™ ์ฒ˜๋ฆฌ | +| ํŽ˜์ด์ง€๋„ค์ด์…˜ | ์ž๋™ ์ฒ˜๋ฆฌ | +| ์ •๋ ฌ/ํ•„ํ„ฐ | ์ž๋™ ์ฒ˜๋ฆฌ | + +### 7.2 ํšŒ์‚ฌ๋ณ„ ๊ฐœ๋ฐœ ํ•„์š” ์˜์—ญ + +| ์˜์—ญ | ์„ค๋ช… | ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ• | +|------|------|----------| +| ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง | ์ €์žฅ ์ „/ํ›„ ๊ฒ€์ฆ, ๊ณ„์‚ฐ | ๋ฐ์ดํ„ฐํ”Œ๋กœ์šฐ ๋˜๋Š” ๋ฐฑ์—”๋“œ API | +| ํŠน์ˆ˜ UI | ๊ฐ„ํŠธ, ํŠธ๋ฆฌ, ์ฐจํŠธ ๋“ฑ | ๋ณ„๋„ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ | +| ์™ธ๋ถ€ ์—ฐ๋™ | ERP, MES ๋“ฑ ์—ฐ๊ณ„ | ์™ธ๋ถ€ ํ˜ธ์ถœ ์„ค์ • | +| ๋ฆฌํฌํŠธ/์ธ์‡„ | ์ „ํ‘œ, ๋ผ๋ฒจ ์ถœ๋ ฅ | ๋ฆฌํฌํŠธ ์ปดํฌ๋„ŒํŠธ | +| ๊ฒฐ์žฌ ํ”„๋กœ์„ธ์Šค | ์Šน์ธ/๋ฐ˜๋ ค ํ๋ฆ„ | ์›Œํฌํ”Œ๋กœ์šฐ ์„ค์ • | + +--- + +## 8. ๋น ๋ฅธ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ + +### Step 1: ํ™”๋ฉด ๋ถ„์„ +1. ์–ด๋–ค ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? +2. ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋Š”? +3. ์–ด๋–ค ํŒจํ„ด์ธ๊ฐ€? (A/B/C/D/E) + +### Step 2: ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ +1. ํ™”๋ฉด ๋””์ž์ด๋„ˆ์—์„œ ํŒจํ„ด์— ๋งž๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ +2. ๊ฐ ์ปดํฌ๋„ŒํŠธ์— ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ ์„ค์ • + +### Step 3: ์—ฐ๋™ ์„ค์ • +1. ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ๊ด€๊ณ„ ์„ค์ • (FK) +2. ๊ฒ€์ƒ‰ ์กฐ๊ฑด ์„ค์ • +3. ๋ฒ„ํŠผ ์•ก์…˜ ์„ค์ • + +### Step 4: ํ…Œ์ŠคํŠธ +1. ๋ฐ์ดํ„ฐ ์กฐํšŒ ํ™•์ธ +2. ๋งˆ์Šคํ„ฐ ์„ ํƒ ์‹œ ๋””ํ…Œ์ผ ์—ฐ๋™ ํ™•์ธ +3. ์ €์žฅ/์‚ญ์ œ ๋™์ž‘ ํ™•์ธ + +--- + +## 9. ์š”์•ฝ + +### V2 ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ + +| ํ™”๋ฉด ์œ ํ˜• | ์ง€์› ์—ฌ๋ถ€ | ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ | +|-----------|----------|--------------| +| ๊ธฐ๋ณธ CRUD | โœ… ์™„์ „ | v2-table-list, v2-table-search-widget | +| ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ | โœ… ์™„์ „ | v2-split-panel-layout | +| ํƒญ ํ™”๋ฉด | โœ… ์™„์ „ | v2-tabs-widget | +| ์นด๋“œ ๋ทฐ | โœ… ์™„์ „ | v2-card-display | +| ํ”ผ๋ฒ— ๋ถ„์„ | โœ… ์™„์ „ | v2-pivot-grid | +| ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” | โŒ ๋ฏธ์ง€์› | ๊ฐœ๋ฐœ ํ•„์š” | +| ํŠธ๋ฆฌ ๋ทฐ | โŒ ๋ฏธ์ง€์› | ๊ฐœ๋ฐœ ํ•„์š” | +| ๊ฐ„ํŠธ ์ฐจํŠธ | โŒ ๋ฏธ์ง€์› | ๊ฐœ๋ฐœ ํ•„์š” | + +### ๊ฐœ๋ฐœ ์‹œ ํ•ต์‹ฌ ์›์น™ + +1. **ํ…Œ์ด๋ธ” ๋จผ์ €**: DB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ™•์ธ์ด ์ตœ์šฐ์„  +2. **ํŒจํ„ด ํŒ๋‹จ**: 5๊ฐ€์ง€ ํŒจํ„ด ์ค‘ ์–ด๋””์— ํ•ด๋‹นํ•˜๋Š”์ง€ ํŒ๋‹จ +3. **ํ‘œ์ค€ ์กฐํ•ฉ**: ๊ฒ€์ฆ๋œ ์ปดํฌ๋„ŒํŠธ ์กฐํ•ฉ ์‚ฌ์šฉ +4. **ํ•œ๊ณ„ ์ธ์‹**: ๋ถˆ๊ฐ€๋Šฅํ•œ UI๋Š” ์กฐ๊ธฐ์— ์‹๋ณ„ํ•˜์—ฌ ๋ณ„๋„ ๊ฐœ๋ฐœ ๊ณ„ํš +5. **๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ**: ๋ชจ๋“  ํ…Œ์ด๋ธ”์— company_code ํ•„ํ„ฐ๋ง ํ•„์ˆ˜ +6. **์ œ์–ด๊ด€๋ฆฌ ํ•„์ˆ˜**: UI ์™„์„ฑ ํ›„ ๋ฒ„ํŠผ๋ณ„ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„ค์ • ํ•„์ˆ˜ + +### UI vs ์ œ์–ด ๊ตฌ๋ถ„ + +| ์˜์—ญ | ๋‹ด๋‹น | ์„ค์ • ์œ„์น˜ | +|------|------|----------| +| ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ | V2 ์ปดํฌ๋„ŒํŠธ | ํ™”๋ฉด ๋””์ž์ด๋„ˆ | +| ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง | ์ œ์–ด๊ด€๋ฆฌ | dataflow_diagrams | +| ์™ธ๋ถ€ ์—ฐ๋™ | ์™ธ๋ถ€ํ˜ธ์ถœ ์„ค์ • | external_call_configs | + +**HTML์—์„œ ๋ฐฐ๋‚„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ**: UI ๊ตฌ์กฐ๋งŒ +**๋ณ„๋„ ์„ค์ • ํ•„์š”ํ•œ ๊ฒƒ**: ์ €์žฅ ํ…Œ์ด๋ธ”, ๋ฒ„ํŠผ ์•ก์…˜, ์กฐ๊ฑด ์ฒ˜๋ฆฌ, ๋‹ค์ค‘ ํ–‰ ์ฒ˜๋ฆฌ diff --git a/docs/screen-implementation-guide/01_master-data/bom.md b/docs/screen-implementation-guide/01_master-data/bom.md new file mode 100644 index 00000000..6e626289 --- /dev/null +++ b/docs/screen-implementation-guide/01_master-data/bom.md @@ -0,0 +1,255 @@ +# BOM๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: BOM๊ด€๋ฆฌ +> **ํŒŒ์ผ**: BOM๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ๊ธฐ์ค€์ •๋ณด +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โš ๏ธ ๋ถ€๋ถ„ (ํŠธ๋ฆฌ ๋ทฐ ์ปดํฌ๋„ŒํŠธ ํ•„์š”) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +BOM(Bill of Materials) ๊ด€๋ฆฌ ํ™”๋ฉด์œผ๋กœ, ์ œํ’ˆ์˜ ๋ถ€ํ’ˆ ๊ตฌ์„ฑ์„ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- BOM ๋ชฉ๋ก ์กฐํšŒ/๊ฒ€์ƒ‰ +- BOM ๊ตฌ์กฐ ํŠธ๋ฆฌ ํ‘œ์‹œ (์ •์ „๊ฐœ/์—ญ์ „๊ฐœ) +- BOM ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ +- ๋ฒ„์ „/์ฐจ์ˆ˜ ๊ด€๋ฆฌ +- ์—‘์…€ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [ํ’ˆ๋ชฉ์ฝ”๋“œ] [ํ’ˆ๋ชฉ๋ช…] [ํ’ˆ๋ชฉ๊ตฌ๋ถ„โ–ผ] [๋ฒ„์ „โ–ผ] [์‚ฌ์šฉ์—ฌ๋ถ€โ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ]โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][์—…๋กœ๋“œ][๋‹ค์šด๋กœ๋“œ]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“ฆ BOM ๋ชฉ๋ก โ”‚ ๐Ÿ“‹ BOM ์ƒ์„ธ์ •๋ณด โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ [์ด๋ ฅ] [๋ฒ„์ „] [์ˆ˜์ •] [์‚ญ์ œ] โ”‚ +โ”‚ [์‹ ๊ทœ๋“ฑ๋ก] โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ํ’ˆ๋ชฉ์ฝ”๋“œ: PRD-001 โ”‚ +โ”‚ โ”‚โ–ก|์ฝ”๋“œ|ํ’ˆ๋ชฉ๋ช…|๊ตฌ๋ถ„..โ”‚ โ”‚ ํ’ˆ๋ชฉ๋ช…: ์ œํ’ˆA โ”‚ +โ”‚ โ”‚โ–ก|P01|์ œํ’ˆA |์ œํ’ˆ โ”‚ โ”‚ ๊ธฐ์ค€์ˆ˜๋Ÿ‰: 1 โ”‚ +โ”‚ โ”‚โ–ก|P02|์ œํ’ˆB |์ œํ’ˆ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ ๐ŸŒณ BOM ๊ตฌ์กฐ โ”‚ +โ”‚ โ”‚ ๊ธฐ์ค€์ˆ˜๋Ÿ‰:[1] [ํŠธ๋ฆฌ|๋ ˆ๋ฒจ] [์ •์ „๊ฐœ|์—ญ์ „๊ฐœ] โ”‚ +โ”‚ ๋ฆฌ์‚ฌ์ด์ € โ†” โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”‚ โ–ผ PRD-001 ์ œํ’ˆA (1.00 EA) โ”‚ +โ”‚ โ”‚ โ”œโ”€ MAT-001 ์›์ž์žฌA (2.00 KG) โ”‚ +โ”‚ โ”‚ โ””โ”€ SEM-001 ๋ฐ˜์ œํ’ˆA (1.00 EA) โ”‚ +โ”‚ โ”‚ โ””โ”€ MAT-002 ์›์ž์žฌB (0.50 KG) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +### 3.1 ๊ตฌํ˜„ ๊ฐ€๋Šฅ ์˜์—ญ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| BOM ๋ชฉ๋ก ํ…Œ์ด๋ธ” | `v2-table-list` | โœ… ๊ฐ€๋Šฅ | +| ๋ถ„ํ•  ํŒจ๋„ | `v2-split-panel-layout` | โš ๏ธ ๋ถ€๋ถ„ | + +### 3.2 ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ํ•„์š” + +| HTML ์˜์—ญ | ํ•„์š” ์ปดํฌ๋„ŒํŠธ | ์žฌํ™œ์šฉ ๊ฐ€๋Šฅ์„ฑ | +|-----------|---------------|--------------| +| BOM ํŠธ๋ฆฌ ๊ตฌ์กฐ | `v2-tree-view` | 3๊ฐœ ํ™”๋ฉด (๋ถ€์„œ์ •๋ณด, ๋ฉ”๋‰ด๊ด€๋ฆฌ) | +| BOM ๋“ฑ๋ก ๋ชจ๋‹ฌ | `v2-modal-form` | ๋ชจ๋“  ํ™”๋ฉด | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +### 4.1 BOM ๋ชฉ๋ก ํ…Œ์ด๋ธ” (์ขŒ์ธก) + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 100 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 150 }, + { id: 'item_type', label: 'ํ’ˆ๋ชฉ๊ตฌ๋ถ„', width: 80 }, + { id: 'version', label: '๋ฒ„์ „', width: 70 }, + { id: 'revision', label: '์ฐจ์ˆ˜', width: 70 }, + { id: 'status', label: '์‚ฌ์šฉ์—ฌ๋ถ€', width: 80 }, + { id: 'reg_date', label: '๋“ฑ๋ก์ผ', width: 100 } +] +``` + +### 4.2 BOM ์ƒ์„ธ ํ•„๋“œ + +```typescript +detailFields: [ + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ' }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…' }, + { id: 'item_type', label: 'ํ’ˆ๋ชฉ๊ตฌ๋ถ„' }, + { id: 'unit', label: '๋‹จ์œ„' }, + { id: 'base_qty', label: '๊ธฐ์ค€์ˆ˜๋Ÿ‰' }, + { id: 'version', label: '๋ฒ„์ „' }, + { id: 'revision', label: '์ฐจ์ˆ˜' }, + { id: 'status', label: '์‚ฌ์šฉ์—ฌ๋ถ€' }, + { id: 'remark', label: '๋น„๊ณ ' } +] +``` + +--- + +## 5. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์˜ต์…˜ | +|--------|----------|------| +| ํ’ˆ๋ชฉ์ฝ”๋“œ | `v2-input` | placeholder: "ํ’ˆ๋ชฉ์ฝ”๋“œ" | +| ํ’ˆ๋ชฉ๋ช… | `v2-input` | placeholder: "ํ’ˆ๋ชฉ๋ช…" | +| ํ’ˆ๋ชฉ๊ตฌ๋ถ„ | `v2-select` | ์ œํ’ˆ, ๋ฐ˜์ œํ’ˆ, ์›์ž์žฌ | +| ๋ฒ„์ „ | `v2-select` | 1.0, 2.0, 3.0 | +| ์‚ฌ์šฉ์—ฌ๋ถ€ | `v2-select` | ์‚ฌ์šฉ, ๋ฏธ์‚ฌ์šฉ | + +--- + +## 6. ํŠน์ˆ˜ ๊ธฐ๋Šฅ: BOM ํŠธ๋ฆฌ (์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ํ•„์š”) + +### 6.1 ํŠธ๋ฆฌ ๋…ธ๋“œ ๊ตฌ์กฐ + +```typescript +interface BomTreeNode { + id: string; + itemCode: string; + itemName: string; + itemType: string; + quantity: number; + unit: string; + level: number; + children: BomTreeNode[]; + expanded: boolean; +} +``` + +### 6.2 ์ •์ „๊ฐœ vs ์—ญ์ „๊ฐœ + +| ๋ชจ๋“œ | ์„ค๋ช… | +|------|------| +| ์ •์ „๊ฐœ (Forward) | ์„ ํƒ ํ’ˆ๋ชฉ โ†’ ํ•˜์œ„ ๊ตฌ์„ฑํ’ˆ๋ชฉ ํ‘œ์‹œ | +| ์—ญ์ „๊ฐœ (Reverse) | ์„ ํƒ ํ’ˆ๋ชฉ โ†’ ์ƒ์œ„ ์‚ฌ์šฉ์ฒ˜ ํ‘œ์‹œ | + +### 6.3 ํ•„์š” ์ธํ„ฐ๋ž™์…˜ + +- ๋…ธ๋“œ ํด๋ฆญ: ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ +- ์ „์ฒด ํŽผ์น˜๊ธฐ/์ ‘๊ธฐ ๋ฒ„ํŠผ +- ๋ ˆ๋ฒจ ๋ทฐ/ํŠธ๋ฆฌ ๋ทฐ ์ „ํ™˜ +- ๊ธฐ์ค€์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ ์‹œ ์ˆ˜๋Ÿ‰ ์žฌ๊ณ„์‚ฐ + +--- + +## 7. ๋ชจ๋‹ฌ ํผ ์ •์˜ + +### 7.1 BOM ๋“ฑ๋ก ๋ชจ๋‹ฌ + +```typescript +modalFields: [ + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', type: 'autocomplete', required: true }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', type: 'autocomplete', required: true }, + { id: 'item_type', label: 'ํ’ˆ๋ชฉ๊ตฌ๋ถ„', type: 'select', required: true }, + { id: 'unit', label: '๋‹จ์œ„', type: 'select', required: true }, + { id: 'base_qty', label: '๊ธฐ์ค€์ˆ˜๋Ÿ‰', type: 'number', required: true }, + { id: 'version', label: '๋ฒ„์ „', type: 'text', readonly: true }, + { id: 'revision', label: '์ฐจ์ˆ˜', type: 'text', readonly: true }, + { id: 'status', label: '์‚ฌ์šฉ์—ฌ๋ถ€', type: 'radio', options: ['์‚ฌ์šฉ', '๋ฏธ์‚ฌ์šฉ'] }, + { id: 'remark', label: '๋น„๊ณ ', type: 'textarea' } +] + +// ํ•˜์œ„ ํ’ˆ๋ชฉ ์„น์…˜ +childItemsSection: { + title: 'ํ•˜์œ„ ํ’ˆ๋ชฉ ๊ตฌ์„ฑ', + addButton: 'ํ’ˆ๋ชฉ์ถ”๊ฐ€', + columns: [ + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ' }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…' }, + { id: 'quantity', label: '์†Œ์š”๋Ÿ‰' }, + { id: 'unit', label: '๋‹จ์œ„' }, + { id: 'loss_rate', label: '๋กœ์Šค์œจ(%)' }, + { id: 'actions', label: '' } + ] +} +``` + +--- + +## 8. ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„ + +### โœ… ๊ฐ€๋Šฅ +- ๊ฒ€์ƒ‰ ์˜์—ญ (v2-table-search-widget) +- BOM ๋ชฉ๋ก ํ…Œ์ด๋ธ” (v2-table-list) +- ๋ถ„ํ•  ํŒจ๋„ ๋ ˆ์ด์•„์›ƒ (v2-split-panel-layout) +- ๊ธฐ๋ณธ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ + +### โš ๏ธ ๋ถ€๋ถ„ ๊ฐ€๋Šฅ (๋Œ€์ฒด ๊ตฌํ˜„) +- BOM ๊ตฌ์กฐ: ํŠธ๋ฆฌ ๋Œ€์‹  ๋ ˆ๋ฒจ ํ…Œ์ด๋ธ”๋กœ ํ‘œ์‹œ ๊ฐ€๋Šฅ + +### โŒ ๋ถˆ๊ฐ€๋Šฅ (์‹ ๊ทœ ๊ฐœ๋ฐœ ํ•„์š”) +- ์ง„์ •ํ•œ ํŠธ๋ฆฌ ๋ทฐ (์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) +- ์ •์ „๊ฐœ/์—ญ์ „๊ฐœ ์ „ํ™˜ +- ํ•˜์œ„ ํ’ˆ๋ชฉ ๋™์  ์ถ”๊ฐ€ ๋ชจ๋‹ฌ + +--- + +## 9. ๊ฐ„์†Œํ™” ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "BOM_MAIN", + "screen_name": "BOM๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "config": { + "searchFields": [ + { "type": "input", "id": "item_code", "placeholder": "ํ’ˆ๋ชฉ์ฝ”๋“œ" }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ๋ช…" }, + { "type": "select", "id": "item_type", "placeholder": "ํ’ˆ๋ชฉ๊ตฌ๋ถ„" }, + { "type": "select", "id": "status", "placeholder": "์‚ฌ์šฉ์—ฌ๋ถ€" } + ], + "buttons": [ + { "label": "์ดˆ๊ธฐํ™”", "action": "reset" }, + { "label": "์กฐํšŒ", "action": "search", "variant": "primary" } + ] + } + }, + { + "type": "v2-split-panel-layout", + "config": { + "masterPanel": { + "title": "BOM ๋ชฉ๋ก", + "entityId": "bom_header", + "columns": [ + { "id": "item_code", "label": "ํ’ˆ๋ชฉ์ฝ”๋“œ", "width": 100 }, + { "id": "item_name", "label": "ํ’ˆ๋ชฉ๋ช…", "width": 150 }, + { "id": "item_type", "label": "ํ’ˆ๋ชฉ๊ตฌ๋ถ„", "width": 80 }, + { "id": "version", "label": "๋ฒ„์ „", "width": 70 } + ] + }, + "detailPanel": { + "title": "BOM ์ƒ์„ธ์ •๋ณด", + "entityId": "bom_detail", + "relationType": "one-to-many" + } + } + } + ] +} +``` + +--- + +## 10. ๊ฐœ๋ฐœ ๊ถŒ์žฅ์‚ฌํ•ญ + +1. **1๋‹จ๊ณ„**: ํ˜„์žฌ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ธฐ๋ณธ CRUD ๊ตฌํ˜„ +2. **2๋‹จ๊ณ„**: `v2-tree-view` ๊ฐœ๋ฐœ ํ›„ BOM ๊ตฌ์กฐ ํ†ตํ•ฉ +3. **3๋‹จ๊ณ„**: ๋ฒ„์ „/์ฐจ์ˆ˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ + +**์˜ˆ์ƒ ์žฌํ™œ์šฉ**: `v2-tree-view`๋Š” ๋ถ€์„œ์ •๋ณด, ๋ฉ”๋‰ด๊ด€๋ฆฌ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (3๊ฐœ ํ™”๋ฉด) diff --git a/docs/screen-implementation-guide/02_sales/customer.md b/docs/screen-implementation-guide/02_sales/customer.md new file mode 100644 index 00000000..7699f798 --- /dev/null +++ b/docs/screen-implementation-guide/02_sales/customer.md @@ -0,0 +1,256 @@ +# ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ +> **ํŒŒ์ผ**: ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ์˜์—…๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โš ๏ธ ๋ถ€๋ถ„ (๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” ํ•„์š”) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +๊ณ ๊ฐ์‚ฌ ๋ฐ ๊ณต๊ธ‰์—…์ฒด ์ •๋ณด๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก ์กฐํšŒ/๊ฒ€์ƒ‰ +- ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•, ์ง€์—ญ๋ณ„) +- ๊ฑฐ๋ž˜์ฒ˜ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ +- ๊ฑฐ๋ž˜์ฒ˜๋ณ„ ํ’ˆ๋ชฉ์ฝ”๋“œ/๋‹จ๊ฐ€ ๊ด€๋ฆฌ +- ๋‹ด๋‹น์ž ์ •๋ณด ๊ด€๋ฆฌ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ] [๊ฑฐ๋ž˜์ฒ˜๋ช…] [๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•โ–ผ] [์‚ฌ์šฉ์—ฌ๋ถ€โ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][์—…๋กœ๋“œ][๋‹ค์šด๋กœ๋“œ]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก โ”‚ [๊ธฐ๋ณธ์ •๋ณด][ํ’ˆ๋ชฉ์ฝ”๋“œ][๋‹จ๊ฐ€์ •๋ณด][๋‹ด๋‹น์ž] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ Group by: [๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•โ–ผ] โ”‚ ๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ: C-001 โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๊ฑฐ๋ž˜์ฒ˜๋ช…: (์ฃผ)ํ…Œ์ŠคํŠธ โ”‚ +โ”‚ โ”‚โ–ผ ๊ณ ๊ฐ์‚ฌ (15) โ”‚ โ”‚ ์‚ฌ์—…์ž๋ฒˆํ˜ธ: 123-45-67890 โ”‚ +โ”‚ โ”‚ C-001 | A์‚ฌ โ”‚ โ”‚ ๋Œ€ํ‘œ์ž: ํ™๊ธธ๋™ โ”‚ +โ”‚ โ”‚ C-002 | B์‚ฌ โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚โ–ผ ๊ณต๊ธ‰์—…์ฒด (8) โ”‚ โ”‚ [ํ’ˆ๋ชฉ์ฝ”๋“œ ํƒญ ๋‚ด์šฉ] โ”‚ +โ”‚ โ”‚ S-001 | ์›์ž์žฌ์‚ฌ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚๊ฑฐ๋ž˜์ฒ˜ํ’ˆ๋ชฉ์ฝ”๋“œ|ํ’ˆ๋ชฉ๋ช…|์ž์‚ฌํ’ˆ๋ชฉ์ฝ”๋“œโ”‚ โ”‚ +โ”‚ โ”‚ โ”‚CP-001 |์›๋ฃŒA |M-001 โ”‚ โ”‚ +โ”‚ ๋ฆฌ์‚ฌ์ด์ € โ†” โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก (๊ทธ๋ฃนํ™”) | `v2-table-list` | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| ๋ถ„ํ•  ํŒจ๋„ | `v2-split-panel-layout` | โœ… ๊ฐ€๋Šฅ | +| ์ƒ์„ธ ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +### 4.1 ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'customer_code', label: '๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ', width: 100 }, + { id: 'customer_name', label: '๊ฑฐ๋ž˜์ฒ˜๋ช…', width: 200 }, + { id: 'customer_type', label: '๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•', width: 100 }, + { id: 'business_no', label: '์‚ฌ์—…์ž๋ฒˆํ˜ธ', width: 120 }, + { id: 'ceo_name', label: '๋Œ€ํ‘œ์ž', width: 100 }, + { id: 'tel', label: '์ „ํ™”๋ฒˆํ˜ธ', width: 120 }, + { id: 'status', label: '์‚ฌ์šฉ์—ฌ๋ถ€', width: 80 } +] +``` + +### 4.2 ํ’ˆ๋ชฉ์ฝ”๋“œ ํƒญ + +```typescript +itemCodeColumns: [ + { id: 'customer_item_code', label: '๊ฑฐ๋ž˜์ฒ˜ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 150 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'our_item_code', label: '์ž์‚ฌํ’ˆ๋ชฉ์ฝ”๋“œ', width: 150 }, + { id: 'spec', label: '๊ทœ๊ฒฉ', width: 150 } +] +``` + +### 4.3 ๋‹จ๊ฐ€์ •๋ณด ํƒญ + +```typescript +priceColumns: [ + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 120 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'unit_price', label: '๋‹จ๊ฐ€', width: 100, format: 'currency' }, + { id: 'currency', label: 'ํ†ตํ™”', width: 60 }, + { id: 'apply_date', label: '์ ์šฉ์ผ', width: 100 }, + { id: 'remark', label: '๋น„๊ณ ', width: 150 } +] +``` + +--- + +## 5. ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ํ•„์š”) + +### 5.1 ๊ทธ๋ฃนํ™” ์˜ต์…˜ + +```typescript +groupByOptions: [ + { id: 'customer_type', label: '๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•' }, + { id: 'region', label: '์ง€์—ญ' }, + { id: 'status', label: '์‚ฌ์šฉ์—ฌ๋ถ€' } +] +``` + +### 5.2 ๊ทธ๋ฃน ํ—ค๋” ํ‘œ์‹œ + +``` +โ–ผ ๊ณ ๊ฐ์‚ฌ (15) โ† ๊ทธ๋ฃน๋ช… + ๊ฑด์ˆ˜ + โ”‚ C-001 โ”‚ (์ฃผ)A์‚ฌ โ”‚ ... + โ”‚ C-002 โ”‚ (์ฃผ)B์‚ฌ โ”‚ ... +โ–ผ ๊ณต๊ธ‰์—…์ฒด (8) + โ”‚ S-001 โ”‚ ์›์ž์žฌ์‚ฌ โ”‚ ... +``` + +### 5.3 ํ•„์š” ์ธํ„ฐ๋ž™์…˜ + +- ๊ทธ๋ฃน ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ +- ๊ทธ๋ฃน ์ „์ฒด ์„ ํƒ ์ฒดํฌ๋ฐ•์Šค +- ๋‹ค์ค‘ ๊ทธ๋ฃนํ•‘ (์„ ํƒ) + +--- + +## 6. ํƒญ ๊ตฌ์„ฑ + +```typescript +tabs: [ + { + id: 'basic', + label: '๊ธฐ๋ณธ์ •๋ณด', + fields: [ + { id: 'customer_code', label: '๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ' }, + { id: 'customer_name', label: '๊ฑฐ๋ž˜์ฒ˜๋ช…' }, + { id: 'customer_type', label: '๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•' }, + { id: 'business_no', label: '์‚ฌ์—…์ž๋ฒˆํ˜ธ' }, + { id: 'ceo_name', label: '๋Œ€ํ‘œ์ž' }, + { id: 'address', label: '์ฃผ์†Œ' }, + { id: 'tel', label: '์ „ํ™”๋ฒˆํ˜ธ' }, + { id: 'fax', label: 'ํŒฉ์Šค' }, + { id: 'email', label: '์ด๋ฉ”์ผ' } + ] + }, + { + id: 'item_codes', + label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', + type: 'table', + entityId: 'customer_item_mapping' + }, + { + id: 'prices', + label: '๋‹จ๊ฐ€์ •๋ณด', + type: 'table', + entityId: 'customer_prices' + }, + { + id: 'contacts', + label: '๋‹ด๋‹น์ž', + type: 'table', + entityId: 'customer_contacts' + } +] +``` + +--- + +## 7. ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„ + +### โœ… ๊ฐ€๋Šฅ +- ๊ฒ€์ƒ‰ ์˜์—ญ +- ๋ถ„ํ•  ํŒจ๋„ ๋ ˆ์ด์•„์›ƒ +- ์ƒ์„ธ ํƒญ +- ํ’ˆ๋ชฉ์ฝ”๋“œ/๋‹จ๊ฐ€/๋‹ด๋‹น์ž ํ…Œ์ด๋ธ” + +### โš ๏ธ ๋ถ€๋ถ„ ๊ฐ€๋Šฅ +- ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก: ๊ทธ๋ฃนํ™” ์—†์ด ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„ + +### โŒ ๋ถˆ๊ฐ€๋Šฅ +- ๋™์  ๊ทธ๋ฃนํ™” (๊ทธ๋ฃน ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) + +--- + +## 8. ๊ฐ„์†Œํ™” ๊ตฌํ˜„ JSON (๊ทธ๋ฃนํ™” ์ œ์™ธ) + +```json +{ + "screen_code": "CUSTOMER_MAIN", + "screen_name": "๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "config": { + "searchFields": [ + { "type": "input", "id": "customer_code", "placeholder": "๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ" }, + { "type": "input", "id": "customer_name", "placeholder": "๊ฑฐ๋ž˜์ฒ˜๋ช…" }, + { "type": "select", "id": "customer_type", "placeholder": "๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•", + "options": [ + { "value": "customer", "label": "๊ณ ๊ฐ์‚ฌ" }, + { "value": "supplier", "label": "๊ณต๊ธ‰์—…์ฒด" }, + { "value": "both", "label": "๊ณ ๊ฐ์‚ฌ/๊ณต๊ธ‰์—…์ฒด" } + ] + }, + { "type": "select", "id": "status", "placeholder": "์‚ฌ์šฉ์—ฌ๋ถ€" } + ] + } + }, + { + "type": "v2-split-panel-layout", + "config": { + "masterPanel": { + "title": "๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก", + "entityId": "customer_master", + "columns": [ + { "id": "customer_code", "label": "๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ", "width": 100 }, + { "id": "customer_name", "label": "๊ฑฐ๋ž˜์ฒ˜๋ช…", "width": 200 }, + { "id": "customer_type", "label": "๊ฑฐ๋ž˜์ฒ˜์œ ํ˜•", "width": 100 }, + { "id": "ceo_name", "label": "๋Œ€ํ‘œ์ž", "width": 100 } + ] + }, + "detailPanel": { + "tabs": [ + { "id": "basic", "label": "๊ธฐ๋ณธ์ •๋ณด", "type": "form" }, + { "id": "items", "label": "ํ’ˆ๋ชฉ์ฝ”๋“œ", "type": "table", "entityId": "customer_items" }, + { "id": "prices", "label": "๋‹จ๊ฐ€์ •๋ณด", "type": "table", "entityId": "customer_prices" }, + { "id": "contacts", "label": "๋‹ด๋‹น์ž", "type": "table", "entityId": "customer_contacts" } + ] + } + } + } + ] +} +``` + +--- + +## 9. v2-grouped-table ๊ฐœ๋ฐœ ์‹œ ์ถ”๊ฐ€ ๊ตฌํ˜„ + +```typescript +// ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” ์„ค์ • +groupedTableConfig: { + groupBy: 'customer_type', + groupByOptions: ['customer_type', 'region', 'status'], + showGroupCount: true, + expandAll: false, + groupCheckbox: true +} +``` + +**์˜ˆ์ƒ ์žฌํ™œ์šฉ**: `v2-grouped-table`์€ 5๊ฐœ ์ด์ƒ ํ™”๋ฉด์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ +- ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ, ํ’ˆ๋ชฉ์ •๋ณด, ์ž‘์—…์ง€์‹œ, ์ž…์ถœ๊ณ ๊ด€๋ฆฌ, ๊ฒฌ์ ๊ด€๋ฆฌ diff --git a/docs/screen-implementation-guide/02_sales/order.md b/docs/screen-implementation-guide/02_sales/order.md new file mode 100644 index 00000000..ff302b67 --- /dev/null +++ b/docs/screen-implementation-guide/02_sales/order.md @@ -0,0 +1,1276 @@ +# ์ˆ˜์ฃผ๊ด€๋ฆฌ (Sales Order Management) + +> Screen ID: /screens/156 +> ๋ฉ”๋‰ด ๊ฒฝ๋กœ: ์˜์—…๊ด€๋ฆฌ > ์ˆ˜์ฃผ๊ด€๋ฆฌ +> ํ…Œ์ด๋ธ”: `sales_order_mng` + +--- + +## โš ๏ธ ๋ฌธ์„œ ์‚ฌ์šฉ ์•ˆ๋‚ด + +> **์ด ๋ฌธ์„œ๋Š” "์ˆ˜์ฃผ๊ด€๋ฆฌ" ํ™”๋ฉด์˜ ๊ตฌํ˜„ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.** +> +> ### ๐Ÿ“Œ ์ค‘์š”: JSON ๋ฐ์ดํ„ฐ๋Š” ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค! +> +> ์ด ๋ฌธ์„œ์— ํฌํ•จ๋œ JSON ์„ค์ •(๋ ˆ์ด์•„์›ƒ, ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ ๋“ฑ)์€ **์ˆ˜์ฃผ๊ด€๋ฆฌ ํ™”๋ฉด์— ํŠนํ™”๋œ ์˜ˆ์‹œ**์ž…๋‹ˆ๋‹ค. +> +> **๋‹ค๋ฅธ ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ:** +> 1. ์ด JSON์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š” +> 2. ํ•ด๋‹น ํ™”๋ฉด์˜ **ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ๋ถ„์„**ํ•˜์„ธ์š” +> 3. ํ™”๋ฉด์˜ **์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ธฐ๋Šฅ์„ ํŒŒ์•…**ํ•˜์„ธ์š” +> 4. ๋ถ„์„ ๊ฒฐ๊ณผ์— ๋งž๋Š” **์ƒˆ๋กœ์šด JSON ๊ตฌ์กฐ๋ฅผ ์ž‘์„ฑ**ํ•˜์„ธ์š” + +--- + +## 1. ํ…Œ์ด๋ธ” ์„ ํƒ ๋ฐ ํ™”๋ฉด ๊ตฌ์กฐ + +### 1.1 ์‚ฌ์šฉ ํ…Œ์ด๋ธ” + +| ํ…Œ์ด๋ธ”๋ช… | ์šฉ๋„ | ๋น„๊ณ  | +|----------|------|------| +| `sales_order_mng` | ์ˆ˜์ฃผ ๋งˆ์Šคํ„ฐ ๋ฐ์ดํ„ฐ | ์ฃผ ํ…Œ์ด๋ธ” | +| `customer_mng` | ๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด | FK: partner_id | +| `item_info` | ํ’ˆ๋ชฉ ์ •๋ณด | FK: part_code | + +### 1.2 ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ •์˜ (์‹ค์ œ DB ๊ธฐ์ค€) + +| ์ปฌ๋Ÿผ๋ช… | ํ‘œ์‹œ๋ช… | ํƒ€์ž… | ํ•„์ˆ˜ | ์„ค๋ช… | +|--------|--------|------|------|------| +| `id` | ID | integer | PK | ์ž๋™ ์ƒ์„ฑ (์‹œํ€€์Šค) | +| `company_code` | ํšŒ์‚ฌ์ฝ”๋“œ | varchar | โœ… | ๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ | +| `order_no` | ์ˆ˜์ฃผ๋ฒˆํ˜ธ | varchar | โœ… | ์ˆ˜์ฃผ ๊ณ ์œ  ์ฝ”๋“œ | +| `order_date` | ์ˆ˜์ฃผ์ผ | date | | ์ˆ˜์ฃผ ๋“ฑ๋ก์ผ | +| `due_date` | ๋‚ฉ๊ธฐ์ผ | date | | ๋‚ฉํ’ˆ ์˜ˆ์ •์ผ | +| `partner_id` | ๊ฑฐ๋ž˜์ฒ˜ID | varchar | | ๊ฑฐ๋ž˜์ฒ˜ ์ฝ”๋“œ (FK) | +| `delivery_partner_id` | ๋‚ฉํ’ˆ์ฒ˜ID | varchar | | ๋‚ฉํ’ˆ์ฒ˜ ์ฝ”๋“œ | +| `delivery_address` | ๋‚ฉํ’ˆ์žฅ์†Œ | text | | ๋‚ฉํ’ˆ ์ฃผ์†Œ | +| `shipping_method` | ๋ฐฐ์†ก๋ฐฉ๋ฒ• | varchar | | ํƒ๋ฐฐ, ํ™”๋ฌผ, ์ง์†ก ๋“ฑ | +| `part_code` | ํ’ˆ๋ชฉ์ฝ”๋“œ | varchar | | ํ’ˆ๋ชฉ ์ฝ”๋“œ (FK) | +| `part_name` | ํ’ˆ๋ช… | varchar | | ํ’ˆ๋ชฉ๋ช… | +| `spec` | ๊ทœ๊ฒฉ | varchar | | ๊ทœ๊ฒฉ ์ •๋ณด | +| `material` | ์žฌ์งˆ | varchar | | ์žฌ์งˆ ์ •๋ณด | +| `order_qty` | ์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 | +| `ship_qty` | ์ถœํ•˜์ˆ˜๋Ÿ‰ | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 | +| `balance_qty` | ์ž”๋Ÿ‰ | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 (์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ - ์ถœํ•˜์ˆ˜๋Ÿ‰) | +| `inventory_qty` | ํ˜„์žฌ๊ณ  | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 | +| `plan_ship_qty` | ์ถœํ•˜๊ณ„ํš๋Ÿ‰ | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 | +| `unit_price` | ๋‹จ๊ฐ€ | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 | +| `total_amount` | ๊ธˆ์•ก | numeric | | ๊ธฐ๋ณธ๊ฐ’ 0 (์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ ร— ๋‹จ๊ฐ€) | +| `status` | ์ƒํƒœ | varchar | | ์ˆ˜์ฃผ, ์ง„ํ–‰์ค‘, ์™„๋ฃŒ, ์ทจ์†Œ (๊ธฐ๋ณธ๊ฐ’: ์ˆ˜์ฃผ) | +| `manager_id` | ๋‹ด๋‹น์žID | varchar | | ๋‹ด๋‹น์ž ID | +| `manager_name` | ๋‹ด๋‹น์ž๋ช… | varchar | | ๋‹ด๋‹น์ž ์ด๋ฆ„ | +| `memo` | ๋ฉ”๋ชจ | text | | ๋น„๊ณ  | +| `sales_type` | ์˜์—…์œ ํ˜• | varchar | | ๋‚ด์ˆ˜, ์ˆ˜์ถœ ๋“ฑ | +| `part_name_eng` | ํ’ˆ๋ช…(์˜๋ฌธ) | varchar | | ์˜๋ฌธ ํ’ˆ๋ชฉ๋ช… | +| `item_due_date` | ํ’ˆ๋ชฉ๋‚ฉ๊ธฐ์ผ | varchar | | ํ’ˆ๋ชฉ๋ณ„ ๋‚ฉ๊ธฐ์ผ | +| `incoterms` | ์ธ์ฝ”ํ…€์ฆˆ | varchar | | ๋ฌด์—ญ์กฐ๊ฑด (์ˆ˜์ถœ์šฉ) | +| `payment_term` | ๊ฒฐ์ œ์กฐ๊ฑด | varchar | | ๊ฒฐ์ œ ์กฐ๊ฑด | +| `port_of_loading` | ์„ ์ ํ•ญ | varchar | | ์„ ์  ํ•ญ๊ตฌ (์ˆ˜์ถœ์šฉ) | +| `port_of_discharge` | ๋„์ฐฉํ•ญ | varchar | | ๋„์ฐฉ ํ•ญ๊ตฌ (์ˆ˜์ถœ์šฉ) | +| `hs_code` | HS์ฝ”๋“œ | varchar | | ๊ด€์„ธ ์ฝ”๋“œ (์ˆ˜์ถœ์šฉ) | +| `currency` | ํ†ตํ™” | varchar | | ํ†ตํ™” ์ฝ”๋“œ | +| `created_date` | ๋“ฑ๋ก์ผ | timestamp | | ์ž๋™ ์ƒ์„ฑ | +| `created_by` | ๋“ฑ๋ก์ž | varchar | | ๋“ฑ๋ก์ž ID | +| `updated_date` | ์ˆ˜์ •์ผ | timestamp | | ์ž๋™ ๊ฐฑ์‹  | +| `updated_by` | ์ˆ˜์ •์ž | varchar | | ์ˆ˜์ •์ž ID | +| `writer` | ์ž‘์„ฑ์ž | varchar | | ์ž‘์„ฑ์ž ID | + +### 1.3 ํ™”๋ฉด ๊ตฌ์กฐ ๊ฐœ์š” + +- **ํ™”๋ฉด ์œ ํ˜•**: ๋ชฉ๋กํ˜• (๋‹จ์ผ ํ…Œ์ด๋ธ” CRUD) +- **์ฃผ์š” ๊ธฐ๋Šฅ**: + - ์ˆ˜์ฃผ ์กฐํšŒ/๊ฒ€์ƒ‰/ํ•„ํ„ฐ๋ง + - ์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ + - ๊ทธ๋ฃนํ•‘ (Group By) + - ์ถœํ•˜๊ณ„ํš ์—ฐ๋™ + - ์—‘์…€ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ + - ํ†ต๊ณ„ ํ‘œ์‹œ (์ด ๊ธˆ์•ก, ์ด ์ˆ˜๋Ÿ‰) + +--- + +## 2. ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜๋„ + +### 2.1 ์ „์ฒด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ฒ€์ƒ‰ ์˜์—ญ] โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ v2-table-search-widget โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ ์ˆ˜์ฃผ๋ฒˆํ˜ธ โ”‚ โ”‚ ๊ฑฐ๋ž˜์ฒ˜ โ”‚ โ”‚ ํ’ˆ๋ชฉ๋ช… โ”‚ โ”‚ ์ƒํƒœ โ”‚ โ”‚ ์ˆ˜์ฃผ์ผ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ (text) โ”‚ โ”‚ (select) โ”‚ โ”‚ (text) โ”‚ โ”‚ (select) โ”‚ โ”‚ (date) โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ ์‚ฌ์šฉ์ž โ”‚ โ”‚ ์—‘์…€ โ”‚ โ”‚์—‘์…€ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ ์˜ต์…˜ โ”‚ โ”‚ ์—…๋กœ๋“œ โ”‚ โ”‚๋‹ค์šด โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [ํ…Œ์ด๋ธ” ํ—ค๋” + ์•ก์…˜ ๋ฒ„ํŠผ + ํ†ต๊ณ„] โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๐Ÿ“‹ ์ˆ˜์ฃผ ๋ชฉ๋ก (10) ์ด ๊ธˆ์•ก: 1,234,000์› ์ด ์ˆ˜๋Ÿ‰: 5,000๊ฐœ [Group by โ–ผ]โ”‚ โ”‚ +โ”‚ โ”‚ [์ˆ˜์ฃผ๋“ฑ๋ก][์ˆ˜์ •][์‚ญ์ œ][์ถœํ•˜๊ณ„ํš] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”] โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ v2-table-list โ”‚ โ”‚ +โ”‚ โ”‚ โ”Œโ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚โ˜ โ”‚์ˆ˜์ฃผ๋ฒˆํ˜ธโ”‚๊ฑฐ๋ž˜์ฒ˜ โ”‚ํ’ˆ๋ชฉ์ฝ”๋“œโ”‚ํ’ˆ๋ช… โ”‚๊ทœ๊ฒฉ โ”‚์žฌ์งˆ โ”‚๋‹จ์œ„ โ”‚์ˆ˜์ฃผ์ˆ˜๋Ÿ‰โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”œโ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚โ˜ โ”‚ORD-001 โ”‚์‚ผ์„ฑ์ „์žโ”‚ITEM001 โ”‚๋ณผํŠธ M8 โ”‚M8x20 โ”‚SUS304โ”‚EA โ”‚1,000 โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚โ˜ โ”‚ORD-002 โ”‚LG์ „์ž โ”‚ITEM002 โ”‚๋„ˆํŠธ M8 โ”‚M8 โ”‚SUS304โ”‚EA โ”‚2,000 โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ””โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ”‚ โ”‚ (์ˆ˜ํ‰ ์Šคํฌ๋กค: ์ถœํ•˜์ˆ˜๋Ÿ‰, ์ž”๋Ÿ‰, ํ˜„์žฌ๊ณ , ์ถœํ•˜๊ณ„ํš๋Ÿ‰, ๋‹จ๊ฐ€, ๊ธˆ์•ก, ๋‚ฉํ’ˆ์ฒ˜, โ”‚ โ”‚ +โ”‚ โ”‚ ๋‚ฉํ’ˆ์žฅ์†Œ, ๋ฐฐ์†ก๋ฐฉ๋ฒ•, ๋‚ฉ๊ธฐ์ผ, ์ˆ˜์ฃผ์ผ, ์ƒํƒœ, ๋‹ด๋‹น์ž, ๋ฉ”๋ชจ) โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### 2.2 ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ V2 ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก + +> ๐Ÿ“Œ **V2 ์ปดํฌ๋„ŒํŠธ ์ „์ฒด ๋ชฉ๋ก** - ํ™”๋ฉด ๊ตฌ์„ฑ ์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ + +| ์ปดํฌ๋„ŒํŠธ ID | ์„ค๋ช… | ์นดํ…Œ๊ณ ๋ฆฌ | +|-------------|------|----------| +| `v2-input` | ํ…์ŠคํŠธ, ์ˆซ์ž, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ ์ž…๋ ฅ | ์ž…๋ ฅ | +| `v2-select` | ๋“œ๋กญ๋‹ค์šด, ์ฝค๋ณด๋ฐ•์Šค, ๋ผ๋””์˜ค, ์ฒดํฌ๋ฐ•์Šค | ์ž…๋ ฅ | +| `v2-date` | ๋‚ ์งœ/์‹œ๊ฐ„ ์ž…๋ ฅ | ์ž…๋ ฅ | +| `v2-button-primary` | ๋ฒ„ํŠผ | ์•ก์…˜ | +| `v2-table-list` | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ (CRUD) | ํ…Œ์ด๋ธ” | +| `v2-table-search-widget` | ํ…Œ์ด๋ธ” ๊ฒ€์ƒ‰/ํ•„ํ„ฐ ์œ„์ ฏ | ์œ ํ‹ธ๋ฆฌํ‹ฐ | +| `v2-aggregation-widget` | ์ง‘๊ณ„ ์œ„์ ฏ | ์œ„์ ฏ | +| `v2-text-display` | ํ…์ŠคํŠธ ํ‘œ์‹œ (์ฝ๊ธฐ ์ „์šฉ) | ํ‘œ์‹œ | + +### 2.3 ์ด ํ™”๋ฉด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ + +| ์ปดํฌ๋„ŒํŠธ ํƒ€์ž… | ์—ญํ•  | +|---------------|------| +| `v2-table-search-widget` | ๊ฒ€์ƒ‰ ํ•„ํ„ฐ (์ˆ˜์ฃผ๋ฒˆํ˜ธ, ๊ฑฐ๋ž˜์ฒ˜, ํ’ˆ๋ชฉ๋ช…, ์ƒํƒœ, ์ˆ˜์ฃผ์ผ) | +| `v2-table-list` | ์ˆ˜์ฃผ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” | +| `v2-button-primary` | ์‚ฌ์šฉ์ž์˜ต์…˜ | +| `v2-button-primary` | ์—‘์…€ ์—…๋กœ๋“œ | +| `v2-button-primary` | ์—‘์…€ ๋‹ค์šด๋กœ๋“œ | +| `v2-button-primary` | ์ˆ˜์ฃผ๋“ฑ๋ก (๋ชจ๋‹ฌ ์—ด๊ธฐ) | +| `v2-button-primary` | ์ˆ˜์ • (๋ชจ๋‹ฌ ์—ด๊ธฐ) | +| `v2-button-primary` | ์‚ญ์ œ | +| `v2-button-primary` | ์ถœํ•˜๊ณ„ํš | +| `v2-aggregation-widget` | ํ†ต๊ณ„ ํ‘œ์‹œ (์ด ๊ธˆ์•ก, ์ด ์ˆ˜๋Ÿ‰) | +| `v2-input` | ๋ชจ๋‹ฌ - ํ…์ŠคํŠธ ์ž…๋ ฅ ํ•„๋“œ | +| `v2-select` | ๋ชจ๋‹ฌ - ์„ ํƒ ํ•„๋“œ | +| `v2-date` | ๋ชจ๋‹ฌ - ๋‚ ์งœ ์ž…๋ ฅ ํ•„๋“œ | + +--- + +## 3. ํ™”๋ฉด ๋””์ž์ด๋„ˆ ์„ค์ • ๊ฐ€์ด๋“œ + +### 3.1 v2-table-search-widget (๊ฒ€์ƒ‰ ํ•„ํ„ฐ) ์„ค์ • + +1. ์ขŒ์ธก ์ปดํฌ๋„ŒํŠธ ํŒจ๋„์—์„œ `v2-table-search-widget` ๋“œ๋ž˜๊ทธํ•˜์—ฌ ํ™”๋ฉด ์ƒ๋‹จ์— ๋ฐฐ์น˜ +2. ๋Œ€์ƒ ํ…Œ์ด๋ธ”๋กœ ์•„๋ž˜์— ๋ฐฐ์น˜ํ•  ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ ์„ ํƒ + +> ๐Ÿ’ก **์ฐธ๊ณ **: ๊ฒ€์ƒ‰ ํ•„ํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„์—์„œ ์›ํ•˜๋Š” ํ•„๋“œ๋ฅผ ์ง์ ‘ ์ถ”๊ฐ€/์‚ญ์ œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +--- + +### 3.2 v2-table-list (์ˆ˜์ฃผ ํ…Œ์ด๋ธ”) ์„ค์ • + +#### Step 1: ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€ +1. ์ขŒ์ธก ์ปดํฌ๋„ŒํŠธ ํŒจ๋„์—์„œ `v2-table-list` ๋“œ๋ž˜๊ทธํ•˜์—ฌ ๊ฒ€์ƒ‰ ํ•„ํ„ฐ ์•„๋ž˜์— ๋ฐฐ์น˜ + +#### Step 2: ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ • + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ํ…Œ์ด๋ธ” ์„ ํƒ | `sales_order_mng` | +| ์ž๋™ ์ปฌ๋Ÿผ ์ƒ์„ฑ | โœ… ์ฒดํฌ (ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ ์ž๋™ ๋กœ๋“œ) | + +#### Step 3: ์ปฌ๋Ÿผ ์„ค์ • + +**[์ปฌ๋Ÿผ ์„ค์ •]** ํŒจ๋„์—์„œ ํ‘œ์‹œํ•  ์ปฌ๋Ÿผ ์„ ํƒ ๋ฐ ์ˆœ์„œ ์กฐ์ •: + +| ์ˆœ์„œ | ์ปฌ๋Ÿผ | ํ‘œ์‹œ๋ช… | ๋„ˆ๋น„ | ์ •๋ ฌ | ํ‘œ์‹œ | ํŠน์ˆ˜ ์„ค์ • | +|------|------|--------|------|------|------|-----------| +| 1 | `order_no` | ์ˆ˜์ฃผ๋ฒˆํ˜ธ | 130 | ์ขŒ์ธก | โœ… | ๊ตต๊ฒŒ ํ‘œ์‹œ | +| 2 | `partner_id` | ๊ฑฐ๋ž˜์ฒ˜ | 150 | ์ขŒ์ธก | โœ… | ์กฐ์ธ: customer_mng.name | +| 3 | `part_code` | ํ’ˆ๋ชฉ์ฝ”๋“œ | 130 | ์ขŒ์ธก | โœ… | | +| 4 | `part_name` | ํ’ˆ๋ช… | 180 | ์ขŒ์ธก | โœ… | | +| 5 | `spec` | ๊ทœ๊ฒฉ | 120 | ์ขŒ์ธก | โœ… | | +| 6 | `material` | ์žฌ์งˆ | 100 | ์ขŒ์ธก | โœ… | | +| 7 | `unit` | ๋‹จ์œ„ | 80 | ์ค‘์•™ | โœ… | ๊ธฐ๋ณธ๊ฐ’: EA | +| 8 | `order_qty` | ์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ | 100 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท | +| 9 | `ship_qty` | ์ถœํ•˜์ˆ˜๋Ÿ‰ | 100 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท | +| 10 | `balance_qty` | ์ž”๋Ÿ‰ | 100 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท, ๊ตต๊ฒŒ | +| 11 | `inventory_qty` | ํ˜„์žฌ๊ณ  | 100 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท | +| 12 | `plan_ship_qty` | ์ถœํ•˜๊ณ„ํš๋Ÿ‰ | 100 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท | +| 13 | `unit_price` | ๋‹จ๊ฐ€ | 120 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท | +| 14 | `total_amount` | ๊ธˆ์•ก | 140 | ์šฐ์ธก | โœ… | ์ˆซ์ž ํฌ๋งท, ๊ตต๊ฒŒ | +| 15 | `delivery_partner_id` | ๋‚ฉํ’ˆ์ฒ˜ | 150 | ์ขŒ์ธก | โœ… | | +| 16 | `delivery_address` | ๋‚ฉํ’ˆ์žฅ์†Œ | 150 | ์ขŒ์ธก | โœ… | | +| 17 | `shipping_method` | ๋ฐฐ์†ก๋ฐฉ๋ฒ• | 120 | ์ค‘์•™ | โœ… | | +| 18 | `due_date` | ๋‚ฉ๊ธฐ์ผ | 120 | ์ค‘์•™ | โœ… | ๋‚ ์งœ ํฌ๋งท | +| 19 | `order_date` | ์ˆ˜์ฃผ์ผ | 120 | ์ค‘์•™ | โœ… | ๋‚ ์งœ ํฌ๋งท | +| 20 | `status` | ์ƒํƒœ | 100 | ์ค‘์•™ | โœ… | ๋ฑƒ์ง€ ์Šคํƒ€์ผ | +| 21 | `manager_name` | ๋‹ด๋‹น์ž | 100 | ์ขŒ์ธก | โœ… | | +| 22 | `memo` | ๋ฉ”๋ชจ | 200 | ์ขŒ์ธก | โœ… | | + +#### Step 4: ๊ธฐ๋Šฅ ์„ค์ • + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | ์„ค๋ช… | +|-----------|---------|------| +| ์ฒดํฌ๋ฐ•์Šค | โœ… ์‚ฌ์šฉ | ๋‹ค์ค‘ ์„ ํƒ ํ™œ์„ฑํ™” | +| ํŽ˜์ด์ง€๋„ค์ด์…˜ | โœ… ์‚ฌ์šฉ | | +| ํŽ˜์ด์ง€ ํฌ๊ธฐ | 20 | ๊ธฐ๋ณธ ํ‘œ์‹œ ํ–‰ ์ˆ˜ | +| ์ •๋ ฌ | โœ… ์‚ฌ์šฉ | ์ปฌ๋Ÿผ ํ—ค๋” ํด๋ฆญ ์ •๋ ฌ | +| ์ปฌ๋Ÿผ ๋ฆฌ์‚ฌ์ด์ฆˆ | โœ… ์‚ฌ์šฉ | ์ปฌ๋Ÿผ ๋„ˆ๋น„ ์กฐ์ • | +| ๊ทธ๋ฃนํ•‘ | โœ… ์‚ฌ์šฉ | Group By ๊ธฐ๋Šฅ | +| ์ˆ˜ํ‰ ์Šคํฌ๋กค | โœ… ์‚ฌ์šฉ | ์ปฌ๋Ÿผ ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฏ€๋กœ ํ•„์ˆ˜ | + +#### Step 5: ๊ทธ๋ฃนํ•‘ ์˜ต์…˜ ์„ค์ • + +Group By ๋“œ๋กญ๋‹ค์šด์— ํ‘œ์‹œํ•  ์ปฌ๋Ÿผ ์„ ํƒ: +- โœ… `partner_id` (๊ฑฐ๋ž˜์ฒ˜) +- โœ… `status` (์ƒํƒœ) +- โœ… `part_name` (ํ’ˆ๋ชฉ๋ช…) +- โœ… `material` (์žฌ์งˆ) + +--- + +### 3.3 ๋ฒ„ํŠผ ์„ค์ • + +#### ๊ฒ€์ƒ‰ ์˜์—ญ ์šฐ์ธก ๋ฒ„ํŠผ + +##### ์‚ฌ์šฉ์ž์˜ต์…˜ ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์‚ฌ์šฉ์ž์˜ต์…˜` | +| ์•„์ด์ฝ˜ | โš™๏ธ | +| ์•ก์…˜ ํƒ€์ž… | `custom` | +| ์Šคํƒ€์ผ | `secondary` | +| ๋™์ž‘ | ์‚ฌ์šฉ์ž ์˜ต์…˜ ๋ชจ๋‹ฌ ์—ด๊ธฐ | + +##### ์—‘์…€ ์—…๋กœ๋“œ ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์—‘์…€ ์—…๋กœ๋“œ` | +| ์•„์ด์ฝ˜ | ๐Ÿ“ฅ | +| ์•ก์…˜ ํƒ€์ž… | `excel_upload` | +| ์Šคํƒ€์ผ | `secondary` | +| ๋Œ€์ƒ ํ…Œ์ด๋ธ” | `sales_order_mng` | + +##### ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์—‘์…€ ๋‹ค์šด๋กœ๋“œ` | +| ์•„์ด์ฝ˜ | ๐Ÿ“ค | +| ์•ก์…˜ ํƒ€์ž… | `excel_download` | +| ์Šคํƒ€์ผ | `secondary` | +| ๋Œ€์ƒ | ํ˜„์žฌ ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | + +#### ํ…Œ์ด๋ธ” ํ—ค๋” ์šฐ์ธก ๋ฒ„ํŠผ + +##### ์ˆ˜์ฃผ๋“ฑ๋ก ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์ˆ˜์ฃผ ๋“ฑ๋ก` | +| ์•„์ด์ฝ˜ | โž• | +| ์•ก์…˜ ํƒ€์ž… | `modal` | +| ์Šคํƒ€์ผ | `success` | +| ์—ฐ๊ฒฐ ํ™”๋ฉด | ์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ • ํ™”๋ฉด (์•„๋ž˜ 3.4 ์ฐธ์กฐ) | +| ๋ชจ๋‹ฌ ์ œ๋ชฉ | ์ˆ˜์ฃผ ๋“ฑ๋ก | +| ๋ชจ๋‹ฌ ์‚ฌ์ด์ฆˆ | `lg` | + +##### ์ˆ˜์ • ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์ˆ˜์ •` | +| ์•„์ด์ฝ˜ | โœ๏ธ | +| ์•ก์…˜ ํƒ€์ž… | `edit` | +| ์Šคํƒ€์ผ | `secondary` | +| ์„ ํƒ ํ•„์ˆ˜ | โœ… ์ฒดํฌ (1๊ฐœ๋งŒ) | +| ์—ฐ๊ฒฐ ํ™”๋ฉด | ์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ • ํ™”๋ฉด (์•„๋ž˜ 3.4 ์ฐธ์กฐ) | + +##### ์‚ญ์ œ ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์‚ญ์ œ` | +| ์•„์ด์ฝ˜ | ๐Ÿ—‘๏ธ | +| ์•ก์…˜ ํƒ€์ž… | `delete` | +| ์Šคํƒ€์ผ | `secondary` | +| ์„ ํƒ ํ•„์ˆ˜ | โœ… ์ฒดํฌ (๋ณต์ˆ˜ ์„ ํƒ ๊ฐ€๋Šฅ) | +| ํ™•์ธ ๋ฉ”์‹œ์ง€ | ์„ ํƒํ•œ ์ˆ˜์ฃผ๋ฅผ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? | + +##### ์ถœํ•˜๊ณ„ํš ๋ฒ„ํŠผ + +| ์„ค์ • ํ•ญ๋ชฉ | ์„ค์ • ๊ฐ’ | +|-----------|---------| +| ๋ผ๋ฒจ | `์ถœํ•˜๊ณ„ํš` | +| ์•„์ด์ฝ˜ | ๐Ÿšš | +| ์•ก์…˜ ํƒ€์ž… | `custom` | +| ์Šคํƒ€์ผ | `secondary` | +| ์„ ํƒ ํ•„์ˆ˜ | โœ… ์ฒดํฌ (๋ณต์ˆ˜ ์„ ํƒ ๊ฐ€๋Šฅ) | +| ๋™์ž‘ | ์ถœํ•˜๊ณ„ํš ์Šฌ๋ผ์ด๋“œ ํŒจ๋„ ์—ด๊ธฐ | + +--- + +### 3.4 ์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ • ํ™”๋ฉด (๋ชจ๋‹ฌ์šฉ ํ™”๋ฉด) + +> ๐Ÿ“Œ **๋ณ„๋„ ํ™”๋ฉด ์ƒ์„ฑ ํ•„์š”**: ์ˆ˜์ฃผ๋“ฑ๋ก/์ˆ˜์ • ๋ฒ„ํŠผ์— ์—ฐ๊ฒฐํ•  ๋ชจ๋‹ฌ ํ™”๋ฉด์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. + +#### Step 1: ์ƒˆ ํ™”๋ฉด ์ƒ์„ฑ + +1. ํ™”๋ฉด ๊ด€๋ฆฌ์—์„œ **[+ ์ƒˆ ํ™”๋ฉด]** ํด๋ฆญ +2. ํ™”๋ฉด ์ •๋ณด ์ž…๋ ฅ: + - ํ™”๋ฉด๋ช…: `์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ •` + - ํ…Œ์ด๋ธ”: `sales_order_mng` + - ํ™”๋ฉด ์œ ํ˜•: `๋ชจ๋‹ฌ` + +#### Step 2: ํผ ํ•„๋“œ ๋ฐฐ์น˜ + +**๋ชจ๋‹ฌ ๋ ˆ์ด์•„์›ƒ ๋ฐฐ์น˜๋„**: + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ • [โœ•] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ์ˆ˜์ฃผ๋ฒˆํ˜ธ * โ”‚ โ”‚ ์ˆ˜์ฃผ์ผ * โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๊ฑฐ๋ž˜์ฒ˜ * โ”‚ โ”‚ ํ’ˆ๋ชฉ์ฝ”๋“œ * โ”‚ โ”‚ +โ”‚ โ”‚ [์‚ผ์„ฑ์ „์ž โ–ผ] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ํ’ˆ๋ช… โ”‚ โ”‚ ๊ทœ๊ฒฉ โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ์žฌ์งˆ โ”‚ โ”‚ ๋‹จ์œ„ โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [EA โ–ผ] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ * โ”‚ โ”‚ ๋‹จ๊ฐ€ * โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๋‚ฉ๊ธฐ์ผ โ”‚ โ”‚ ์ƒํƒœ * โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [์ˆ˜์ฃผ โ–ผ] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๋‚ฉํ’ˆ์ฒ˜ โ”‚ โ”‚ ๋‚ฉํ’ˆ์žฅ์†Œ โ”‚ โ”‚ +โ”‚ โ”‚ [____________________] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๋ฐฐ์†ก๋ฐฉ๋ฒ• โ”‚ โ”‚ ๋‹ด๋‹น์ž โ”‚ โ”‚ +โ”‚ โ”‚ [ํƒ๋ฐฐ โ–ผ] โ”‚ โ”‚ [____________________] โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ ๋ฉ”๋ชจ โ”‚ โ”‚ +โ”‚ โ”‚ [______________________________________________________]โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [์ทจ์†Œ] [๐Ÿ’พ ์ €์žฅ] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**ํ•„๋“œ ๋ชฉ๋ก**: + +| ์ˆœ์„œ | ํ•„๋“œ (์ปฌ๋Ÿผ๋ช…) | ๋ผ๋ฒจ | ์ž…๋ ฅ ํƒ€์ž… | ํ•„์ˆ˜ | ๋น„๊ณ  | +|------|---------------|------|-----------|------|------| +| 1 | `order_no` | ์ˆ˜์ฃผ๋ฒˆํ˜ธ | text | โœ… | ์ž๋™์ฑ„๋ฒˆ ๋˜๋Š” ์ˆ˜๋™์ž…๋ ฅ | +| 2 | `order_date` | ์ˆ˜์ฃผ์ผ | date | โœ… | ๊ธฐ๋ณธ๊ฐ’: ์˜ค๋Š˜ | +| 3 | `partner_id` | ๊ฑฐ๋ž˜์ฒ˜ | select | โœ… | ๊ฑฐ๋ž˜์ฒ˜ ๋ชฉ๋ก์—์„œ ์„ ํƒ | +| 4 | `part_code` | ํ’ˆ๋ชฉ์ฝ”๋“œ | text | โœ… | ํ’ˆ๋ชฉ ๊ฒ€์ƒ‰ | +| 5 | `part_name` | ํ’ˆ๋ช… | text | | ํ’ˆ๋ชฉ์ฝ”๋“œ ์„ ํƒ ์‹œ ์ž๋™ ์ž…๋ ฅ | +| 6 | `spec` | ๊ทœ๊ฒฉ | text | | ํ’ˆ๋ชฉ์ฝ”๋“œ ์„ ํƒ ์‹œ ์ž๋™ ์ž…๋ ฅ | +| 7 | `material` | ์žฌ์งˆ | text | | | +| 8 | `unit` | ๋‹จ์œ„ | select | | ์˜ต์…˜: EA, kg, L, Box ๋“ฑ | +| 9 | `order_qty` | ์ˆ˜์ฃผ์ˆ˜๋Ÿ‰ | number | โœ… | | +| 10 | `unit_price` | ๋‹จ๊ฐ€ | number | โœ… | | +| 11 | `due_date` | ๋‚ฉ๊ธฐ์ผ | date | | | +| 12 | `status` | ์ƒํƒœ | select | โœ… | ์˜ต์…˜: ์ˆ˜์ฃผ, ์ง„ํ–‰์ค‘, ์™„๋ฃŒ, ์ทจ์†Œ | +| 13 | `delivery_partner_id` | ๋‚ฉํ’ˆ์ฒ˜ | text | | | +| 14 | `delivery_address` | ๋‚ฉํ’ˆ์žฅ์†Œ | text | | | +| 15 | `shipping_method` | ๋ฐฐ์†ก๋ฐฉ๋ฒ• | select | | ์˜ต์…˜: ํƒ๋ฐฐ, ํ™”๋ฌผ, ์ง์†ก, ํ€ต์„œ๋น„์Šค ๋“ฑ | +| 16 | `manager_name` | ๋‹ด๋‹น์ž | text | | | +| 17 | `memo` | ๋ฉ”๋ชจ | textarea | | | + +#### Step 3: ๋ฒ„ํŠผ ๋ฐฐ์น˜ + +| ๋ฒ„ํŠผ | ์•ก์…˜ ํƒ€์ž… | ์Šคํƒ€์ผ | ์„ค์ • | +|------|-----------|--------|------| +| ์ €์žฅ | `์ €์žฅ` | primary | ์ €์žฅ ํ›„ ๋ชจ๋‹ฌ ๋‹ซ๊ธฐ, ๋ถ€๋ชจ ํ™”๋ฉด ํ…Œ์ด๋ธ” ์ƒˆ๋กœ๊ณ ์นจ | +| ์ทจ์†Œ | `๋ชจ๋‹ฌ ๋‹ซ๊ธฐ` | secondary | | + +--- + +## 4. ์ปดํฌ๋„ŒํŠธ ์—ฐ๋™ ์„ค์ • + +### 4.1 ์ด๋ฒคํŠธ ํ๋ฆ„ + +``` +[๊ฒ€์ƒ‰ ์ž…๋ ฅ] + โ”‚ + โ–ผ +v2-table-search-widget + โ”‚ onFilterChange + โ–ผ +v2-table-list (์ž๋™ ์žฌ์กฐํšŒ) + โ”‚ + โ–ผ +[๋ฐ์ดํ„ฐ ํ‘œ์‹œ] + โ”‚ + โ–ผ +v2-aggregation-widget (ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ) + + +[์ˆ˜์ฃผ๋“ฑ๋ก/์ˆ˜์ • ๋ฒ„ํŠผ ํด๋ฆญ] + โ”‚ + โ–ผ +[๋ชจ๋‹ฌ ์—ด๊ธฐ] โ†’ [ํผ ์ž…๋ ฅ] โ†’ [์ €์žฅ] + โ”‚ โ”‚ + โ”‚ โ–ผ + โ”‚ refreshTable ์ด๋ฒคํŠธ + โ”‚ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + โ”‚ + โ–ผ + v2-table-list (์žฌ์กฐํšŒ) + โ”‚ + โ–ผ + v2-aggregation-widget (ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ) +``` + +### 4.2 ์—ฐ๋™ ์„ค์ • + +| ์†Œ์Šค ์ปดํฌ๋„ŒํŠธ | ์ด๋ฒคํŠธ/์•ก์…˜ | ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ | ๋™์ž‘ | +|---------------|-------------|---------------|------| +| ๊ฒ€์ƒ‰ ์œ„์ ฏ | onFilterChange | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | ํ•„ํ„ฐ ์ ์šฉ, ์žฌ์กฐํšŒ | +| ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | onDataChange | ์ง‘๊ณ„ ์œ„์ ฏ | ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ | +| ์ˆ˜์ฃผ๋“ฑ๋ก ๋ฒ„ํŠผ | click | ๋ชจ๋‹ฌ | ๋นˆ ํผ์œผ๋กœ ๋ชจ๋‹ฌ ์—ด๊ธฐ | +| ์ˆ˜์ • ๋ฒ„ํŠผ | click | ๋ชจ๋‹ฌ | ์„ ํƒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฑ„์›Œ์ง„ ํผ ์—ด๊ธฐ (์ˆ˜์ •) | +| ์‚ญ์ œ ๋ฒ„ํŠผ | click | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | ์„ ํƒ ํ•ญ๋ชฉ ์‚ญ์ œ | +| ์ถœํ•˜๊ณ„ํš ๋ฒ„ํŠผ | click | ์Šฌ๋ผ์ด๋“œ ํŒจ๋„ | ์„ ํƒ ํ•ญ๋ชฉ ๊ธฐ๋ฐ˜ ์ถœํ•˜๊ณ„ํš ์ƒ์„ฑ | +| ๋ชจ๋‹ฌ ์ €์žฅ | afterSave | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | refreshTable | + +--- + +## 5. ์‚ฌ์šฉ์ž ์‚ฌ์šฉ ์˜ˆ์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค + +### ์‹œ๋‚˜๋ฆฌ์˜ค 1: ์ˆ˜์ฃผ ์กฐํšŒ + +| ๋‹จ๊ณ„ | ์‚ฌ์šฉ์ž ๋™์ž‘ | ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ | +|------|-------------|-----------| +| 1 | ํ™”๋ฉด ์ง„์ž… | ์ „์ฒด ์ˆ˜์ฃผ ๋ชฉ๋ก ํ‘œ์‹œ, ํ†ต๊ณ„(์ด ๊ธˆ์•ก, ์ด ์ˆ˜๋Ÿ‰) ํ‘œ์‹œ | +| 2 | ๊ฑฐ๋ž˜์ฒ˜ ํ•„ํ„ฐ๋ฅผ "์‚ผ์„ฑ์ „์ž"๋กœ ์„ ํƒ | ์ž๋™ ํ•„ํ„ฐ๋ง, ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ | +| 3 | ์ƒํƒœ๋ฅผ "์ง„ํ–‰์ค‘"์œผ๋กœ ์„ ํƒ | ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ง | +| 4 | Group by์—์„œ "๊ฑฐ๋ž˜์ฒ˜" ์„ ํƒ | ๊ฑฐ๋ž˜์ฒ˜๋ณ„ ๊ทธ๋ฃนํ•‘ ํ‘œ์‹œ | + +### ์‹œ๋‚˜๋ฆฌ์˜ค 2: ์ˆ˜์ฃผ ๋“ฑ๋ก + +| ๋‹จ๊ณ„ | ์‚ฌ์šฉ์ž ๋™์ž‘ | ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ | +|------|-------------|-----------| +| 1 | [์ˆ˜์ฃผ ๋“ฑ๋ก] ๋ฒ„ํŠผ ํด๋ฆญ | ๋นˆ ํผ ๋ชจ๋‹ฌ ํ‘œ์‹œ | +| 2 | ๊ฑฐ๋ž˜์ฒ˜ ์„ ํƒ, ํ’ˆ๋ชฉ์ฝ”๋“œ ์ž…๋ ฅ | ํ’ˆ๋ช…, ๊ทœ๊ฒฉ ์ž๋™ ์ž…๋ ฅ | +| 3 | ์ˆ˜์ฃผ์ˆ˜๋Ÿ‰, ๋‹จ๊ฐ€ ์ž…๋ ฅ | ๊ธˆ์•ก ์ž๋™ ๊ณ„์‚ฐ | +| 4 | [์ €์žฅ] ๋ฒ„ํŠผ ํด๋ฆญ | ์ €์žฅ ์™„๋ฃŒ, ๋ชจ๋‹ฌ ๋‹ซํž˜, ๋ชฉ๋ก ๊ฐฑ์‹ , ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ | + +### ์‹œ๋‚˜๋ฆฌ์˜ค 3: ์ˆ˜์ฃผ ์ˆ˜์ • + +| ๋‹จ๊ณ„ | ์‚ฌ์šฉ์ž ๋™์ž‘ | ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ | +|------|-------------|-----------| +| 1 | ํ…Œ์ด๋ธ”์—์„œ ํ–‰ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ | ํ–‰ ์„ ํƒ ํ‘œ์‹œ | +| 2 | [์ˆ˜์ •] ๋ฒ„ํŠผ ํด๋ฆญ | ์ˆ˜์ • ๋ชจ๋‹ฌ ํ‘œ์‹œ (๊ธฐ์กด ๋ฐ์ดํ„ฐ ๋กœ๋“œ) | +| 3 | ๋ฐ์ดํ„ฐ ์ˆ˜์ • | ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝ | +| 4 | [์ €์žฅ] ๋ฒ„ํŠผ ํด๋ฆญ | ์ €์žฅ ์™„๋ฃŒ, ๋ชฉ๋ก ๊ฐฑ์‹  | + +### ์‹œ๋‚˜๋ฆฌ์˜ค 4: ์ˆ˜์ฃผ ์‚ญ์ œ + +| ๋‹จ๊ณ„ | ์‚ฌ์šฉ์ž ๋™์ž‘ | ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ | +|------|-------------|-----------| +| 1 | ์‚ญ์ œํ•  ํ–‰ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ (๋‹ค์ค‘ ๊ฐ€๋Šฅ) | ํ–‰ ์„ ํƒ ํ‘œ์‹œ | +| 2 | [์‚ญ์ œ] ๋ฒ„ํŠผ ํด๋ฆญ | ์‚ญ์ œ ํ™•์ธ ๋‹ค์ด์–ผ๋กœ๊ทธ ํ‘œ์‹œ | +| 3 | ํ™•์ธ | ์‚ญ์ œ ์™„๋ฃŒ, ๋ชฉ๋ก ๊ฐฑ์‹ , ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ | + +### ์‹œ๋‚˜๋ฆฌ์˜ค 5: ์ถœํ•˜๊ณ„ํš ์ƒ์„ฑ + +| ๋‹จ๊ณ„ | ์‚ฌ์šฉ์ž ๋™์ž‘ | ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ | +|------|-------------|-----------| +| 1 | ์ถœํ•˜ํ•  ์ˆ˜์ฃผ ํ–‰ ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ (๋‹ค์ค‘) | ํ–‰ ์„ ํƒ ํ‘œ์‹œ | +| 2 | [์ถœํ•˜๊ณ„ํš] ๋ฒ„ํŠผ ํด๋ฆญ | ์ถœํ•˜๊ณ„ํš ์Šฌ๋ผ์ด๋“œ ํŒจ๋„ ์—ด๋ฆผ | +| 3 | ์ถœํ•˜ ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ, ์ถœํ•˜์ผ ์„ ํƒ | ์ถœํ•˜๊ณ„ํš ๋ฐ์ดํ„ฐ ์„ค์ • | +| 4 | [์ ์šฉ] ๋ฒ„ํŠผ ํด๋ฆญ | ์ถœํ•˜๊ณ„ํš ์ €์žฅ, ์ˆ˜์ฃผ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ | + +--- + +## 6. ๊ฒ€์ฆ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### ๊ธฐ๋ณธ ๊ธฐ๋Šฅ +- [ ] ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ๊ฒ€์ƒ‰ ํ•„ํ„ฐ (์ˆ˜์ฃผ๋ฒˆํ˜ธ, ๊ฑฐ๋ž˜์ฒ˜, ํ’ˆ๋ชฉ๋ช…, ์ƒํƒœ, ์ˆ˜์ฃผ์ผ)๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์‹ ๊ทœ ๋“ฑ๋ก์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ˆ˜์ •์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์‚ญ์ œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์—‘์…€ ์—…๋กœ๋“œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์—‘์…€ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? + +### ํ…Œ์ด๋ธ” ๊ธฐ๋Šฅ +- [ ] ํŽ˜์ด์ง€๋„ค์ด์…˜์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ •๋ ฌ์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ปฌ๋Ÿผ ๋„ˆ๋น„ ์กฐ์ •์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ˆ˜ํ‰ ์Šคํฌ๋กค์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? + +### ๊ฒ€์ƒ‰ ์œ„์ ฏ ์—ฐ๋™ +- [ ] v2-table-search-widget๊ณผ v2-table-list ์—ฐ๋™์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ํ•„ํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์ž๋™ ์žฌ์กฐํšŒ๊ฐ€ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ์ดˆ๊ธฐํ™” ๋ฒ„ํŠผ์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? + +### ๊ทธ๋ฃนํ•‘ ๊ธฐ๋Šฅ +- [ ] Group by ์„ ํƒ ์‹œ ๊ทธ๋ฃนํ•‘์ด ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? +- [ ] ๊ทธ๋ฃน ํ—ค๋”์— ๊ฑด์ˆ˜, ์ˆ˜๋Ÿ‰, ๊ธˆ์•ก์ด ํ‘œ์‹œ๋˜๋Š”๊ฐ€? +- [ ] ๊ทธ๋ฃน ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”๊ฐ€? + +### ํ†ต๊ณ„ ๊ธฐ๋Šฅ +- [ ] ์ด ๊ธˆ์•ก์ด ์ •ํ™•ํžˆ ๊ณ„์‚ฐ๋˜๋Š”๊ฐ€? +- [ ] ์ด ์ˆ˜๋Ÿ‰์ด ์ •ํ™•ํžˆ ๊ณ„์‚ฐ๋˜๋Š”๊ฐ€? +- [ ] ํ•„ํ„ฐ๋ง ์‹œ ํ†ต๊ณ„๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š”๊ฐ€? + +### ์ถœํ•˜๊ณ„ํš ์—ฐ๋™ +- [ ] ์„ ํƒํ•œ ์ˆ˜์ฃผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ถœํ•˜๊ณ„ํš์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? +- [ ] ์ถœํ•˜๊ณ„ํš ์ ์šฉ ํ›„ ์ˆ˜์ฃผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š”๊ฐ€? + +--- + +## 7. ์ฐธ๊ณ  ์‚ฌํ•ญ + +### ๊ด€๋ จ ํ…Œ์ด๋ธ” +- `customer_mng` - ๊ฑฐ๋ž˜์ฒ˜ ์ •๋ณด (partner_id ์ฐธ์กฐ) +- `item_info` - ํ’ˆ๋ชฉ ์ •๋ณด (part_code ์ฐธ์กฐ) +- `sales_order_detail` - ์ˆ˜์ฃผ ์ƒ์„ธ (๋‹ค์ค‘ ํ’ˆ๋ชฉ ๊ด€๋ฆฌ ์‹œ) +- `shipment_mng` - ์ถœํ•˜ ์ •๋ณด (์ถœํ•˜๊ณ„ํš ์—ฐ๋™) + +### ํŠน์ด ์‚ฌํ•ญ +- `partner_id`๋Š” ๊ฑฐ๋ž˜์ฒ˜ ํ…Œ์ด๋ธ”์˜ ID๋ฅผ ์ฐธ์กฐ (์กฐ์ธ ํ•„์š”) +- `balance_qty` = `order_qty` - `ship_qty` (์ž”๋Ÿ‰ ์ž๋™ ๊ณ„์‚ฐ) +- `total_amount` = `order_qty` ร— `unit_price` (๊ธˆ์•ก ์ž๋™ ๊ณ„์‚ฐ) +- ์ƒํƒœ๋ณ„ ๋ฑƒ์ง€ ์ƒ‰์ƒ: + - ์ˆ˜์ฃผ: ํŒŒ๋ž€์ƒ‰ (#dbeafe, #1e40af) + - ์ง„ํ–‰์ค‘: ๋…ธ๋ž€์ƒ‰ (#fef3c7, #92400e) + - ์™„๋ฃŒ: ์ดˆ๋ก์ƒ‰ (#d1fae5, #065f46) + - ์ทจ์†Œ: ๋นจ๊ฐ„์ƒ‰ (#fee2e2, #991b1b) +- ์ˆ˜์ถœ์šฉ ํ•„๋“œ: incoterms, payment_term, port_of_loading, port_of_discharge, hs_code, currency + +--- + +## 8. DB INSERT์šฉ JSON ์„ค์ • (screen_layouts_v2 ๋ฐฉ์‹) + +> ๐Ÿ“Œ ์‹ค์ œ ํ™”๋ฉด ์ €์žฅ์€ `screen_definitions` + `screen_layouts_v2` ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. + +> โš ๏ธ **์ฃผ์˜: ์•„๋ž˜ JSON์€ "์ˆ˜์ฃผ๊ด€๋ฆฌ" ํ™”๋ฉด ์ „์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค!** + +### 8.1 ํ™”๋ฉด ์ •์˜ (screen_definitions) + +**ํ•„์ˆ˜ ์ž…๋ ฅ ํ•„๋“œ:** + +```json +{ + "screenName": "์ˆ˜์ฃผ๊ด€๋ฆฌ", + "tableName": "sales_order_mng", + "companyCode": "COMPANY_7", + "description": "์ˆ˜์ฃผ ๊ด€๋ฆฌ ํ™”๋ฉด" +} +``` + +### 8.2 ๋ ˆ์ด์•„์›ƒ ๋ฐ์ดํ„ฐ (screen_layouts_v2.layout_data) + +```json +{ + "version": "2.0", + "components": [ + { + "id": "comp_search", + "url": "@/lib/registry/components/v2-table-search-widget", + "size": { "width": 1920, "height": 80 }, + "position": { "x": 0, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-table-search-widget", + "label": "๊ฒ€์ƒ‰ ํ•„ํ„ฐ", + "webTypeConfig": {} + }, + "displayOrder": 0 + }, + { + "id": "comp_table", + "url": "@/lib/registry/components/v2-table-list", + "size": { "width": 1920, "height": 800 }, + "position": { "x": 0, "y": 150, "z": 1 }, + "overrides": { + "type": "v2-table-list", + "label": "์ˆ˜์ฃผ ๋ชฉ๋ก", + "filter": { "enabled": true, "filters": [] }, + "height": "auto", + "actions": { "actions": [], "bulkActions": false, "showActions": false }, + "columns": [ + { "align": "left", "order": 0, "format": "text", "visible": true, "sortable": true, "columnName": "order_no", "searchable": true, "displayName": "์ˆ˜์ฃผ๋ฒˆํ˜ธ" }, + { "align": "left", "order": 1, "format": "text", "visible": true, "sortable": true, "columnName": "partner_id", "searchable": true, "displayName": "๊ฑฐ๋ž˜์ฒ˜" }, + { "align": "left", "order": 2, "format": "text", "visible": true, "sortable": true, "columnName": "part_code", "searchable": true, "displayName": "ํ’ˆ๋ชฉ์ฝ”๋“œ" }, + { "align": "left", "order": 3, "format": "text", "visible": true, "sortable": true, "columnName": "part_name", "searchable": true, "displayName": "ํ’ˆ๋ช…" }, + { "align": "left", "order": 4, "format": "text", "visible": true, "sortable": true, "columnName": "spec", "searchable": true, "displayName": "๊ทœ๊ฒฉ" }, + { "align": "left", "order": 5, "format": "text", "visible": true, "sortable": true, "columnName": "material", "searchable": true, "displayName": "์žฌ์งˆ" }, + { "align": "right", "order": 6, "format": "number", "visible": true, "sortable": true, "columnName": "order_qty", "searchable": false, "displayName": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰" }, + { "align": "right", "order": 7, "format": "number", "visible": true, "sortable": true, "columnName": "ship_qty", "searchable": false, "displayName": "์ถœํ•˜์ˆ˜๋Ÿ‰" }, + { "align": "right", "order": 8, "format": "number", "visible": true, "sortable": true, "columnName": "balance_qty", "searchable": false, "displayName": "์ž”๋Ÿ‰" }, + { "align": "right", "order": 9, "format": "number", "visible": true, "sortable": true, "columnName": "inventory_qty", "searchable": false, "displayName": "ํ˜„์žฌ๊ณ " }, + { "align": "right", "order": 10, "format": "number", "visible": true, "sortable": true, "columnName": "plan_ship_qty", "searchable": false, "displayName": "์ถœํ•˜๊ณ„ํš๋Ÿ‰" }, + { "align": "right", "order": 11, "format": "number", "visible": true, "sortable": true, "columnName": "unit_price", "searchable": false, "displayName": "๋‹จ๊ฐ€" }, + { "align": "right", "order": 12, "format": "number", "visible": true, "sortable": true, "columnName": "total_amount", "searchable": false, "displayName": "๊ธˆ์•ก" }, + { "align": "left", "order": 13, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_partner_id", "searchable": true, "displayName": "๋‚ฉํ’ˆ์ฒ˜" }, + { "align": "left", "order": 14, "format": "text", "visible": true, "sortable": true, "columnName": "delivery_address", "searchable": true, "displayName": "๋‚ฉํ’ˆ์žฅ์†Œ" }, + { "align": "center", "order": 15, "format": "text", "visible": true, "sortable": true, "columnName": "shipping_method", "searchable": true, "displayName": "๋ฐฐ์†ก๋ฐฉ๋ฒ•" }, + { "align": "center", "order": 16, "format": "date", "visible": true, "sortable": true, "columnName": "due_date", "searchable": false, "displayName": "๋‚ฉ๊ธฐ์ผ" }, + { "align": "center", "order": 17, "format": "date", "visible": true, "sortable": true, "columnName": "order_date", "searchable": false, "displayName": "์ˆ˜์ฃผ์ผ" }, + { "align": "center", "order": 18, "format": "text", "visible": true, "sortable": true, "columnName": "status", "searchable": true, "displayName": "์ƒํƒœ" }, + { "align": "left", "order": 19, "format": "text", "visible": true, "sortable": true, "columnName": "manager_name", "searchable": true, "displayName": "๋‹ด๋‹น์ž" }, + { "align": "left", "order": 20, "format": "text", "visible": true, "sortable": true, "columnName": "memo", "searchable": true, "displayName": "๋ฉ”๋ชจ" } + ], + "autoLoad": true, + "checkbox": { "enabled": true, "multiple": true, "position": "left", "selectAll": true }, + "pagination": { "enabled": true, "pageSize": 20, "showPageInfo": true, "pageSizeOptions": [10, 20, 50, 100], "showSizeSelector": true }, + "showFooter": true, + "showHeader": true, + "tableStyle": { "theme": "default", "rowHeight": "normal", "borderStyle": "light", "headerStyle": "default", "hoverEffect": true, "alternateRows": true }, + "displayMode": "table", + "stickyHeader": false, + "selectedTable": "sales_order_mng", + "webTypeConfig": {}, + "horizontalScroll": { "enabled": true, "maxColumnWidth": 300, "minColumnWidth": 80, "maxVisibleColumns": 10 } + }, + "displayOrder": 1 + }, + { + "id": "comp_btn_user_options", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1500, "y": 30, "z": 1 }, + "overrides": { + "text": "์‚ฌ์šฉ์ž์˜ต์…˜", + "type": "v2-button-primary", + "label": "์‚ฌ์šฉ์ž์˜ต์…˜ ๋ฒ„ํŠผ", + "action": { "type": "custom" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 2 + }, + { + "id": "comp_btn_upload", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1610, "y": 30, "z": 1 }, + "overrides": { + "text": "์—‘์…€ ์—…๋กœ๋“œ", + "type": "v2-button-primary", + "label": "์—‘์…€ ์—…๋กœ๋“œ ๋ฒ„ํŠผ", + "action": { "type": "excel_upload" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 3 + }, + { + "id": "comp_btn_download", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1720, "y": 30, "z": 1 }, + "overrides": { + "text": "์—‘์…€ ๋‹ค์šด๋กœ๋“œ", + "type": "v2-button-primary", + "label": "์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ", + "action": { "type": "excel_download" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 4 + }, + { + "id": "comp_btn_register", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1500, "y": 100, "z": 1 }, + "overrides": { + "text": "์ˆ˜์ฃผ ๋“ฑ๋ก", + "type": "v2-button-primary", + "label": "์ˆ˜์ฃผ ๋“ฑ๋ก ๋ฒ„ํŠผ", + "action": { + "type": "modal", + "modalSize": "lg", + "modalTitle": "์ˆ˜์ฃผ ๋“ฑ๋ก", + "targetScreenId": "{{modal_screen_id}}", + "successMessage": "์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "success", + "actionType": "button", + "webTypeConfig": { "variant": "default", "actionType": "custom" } + }, + "displayOrder": 5 + }, + { + "id": "comp_btn_edit", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1610, "y": 100, "z": 1 }, + "overrides": { + "text": "์ˆ˜์ •", + "type": "v2-button-primary", + "label": "์ˆ˜์ • ๋ฒ„ํŠผ", + "action": { + "type": "edit", + "modalSize": "lg", + "modalTitle": "์ˆ˜์ฃผ ์ˆ˜์ •", + "targetScreenId": "{{modal_screen_id}}", + "successMessage": "์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ˆ˜์ • ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 6 + }, + { + "id": "comp_btn_delete", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1700, "y": 100, "z": 1 }, + "overrides": { + "text": "์‚ญ์ œ", + "type": "v2-button-primary", + "label": "์‚ญ์ œ ๋ฒ„ํŠผ", + "action": { + "type": "delete", + "successMessage": "์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์‚ญ์ œ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 7 + }, + { + "id": "comp_btn_shipment", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1790, "y": 100, "z": 1 }, + "overrides": { + "text": "์ถœํ•˜๊ณ„ํš", + "type": "v2-button-primary", + "label": "์ถœํ•˜๊ณ„ํš ๋ฒ„ํŠผ", + "action": { "type": "custom" }, + "variant": "secondary", + "actionType": "button", + "webTypeConfig": { "variant": "secondary", "actionType": "custom" } + }, + "displayOrder": 8 + } + ] +} +``` + +### 8.3 ๋ชจ๋‹ฌ ํ™”๋ฉด (์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ •) + +#### ํ™”๋ฉด ์ •์˜ (ํ•„์ˆ˜ ์ž…๋ ฅ) + +```json +{ + "screenName": "์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ •", + "tableName": "sales_order_mng", + "companyCode": "COMPANY_7", + "description": "์ˆ˜์ฃผ ๋“ฑ๋ก/์ˆ˜์ • ํผ ํ™”๋ฉด" +} +``` + +#### ๋ ˆ์ด์•„์›ƒ ๋ฐ์ดํ„ฐ (screen_layouts_v2.layout_data) + +```json +{ + "version": "2.0", + "components": [ + { + "id": "comp_order_no", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "์ˆ˜์ฃผ๋ฒˆํ˜ธ", + "fieldName": "order_no", + "placeholder": "์ˆ˜์ฃผ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 0 + }, + { + "id": "comp_order_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "์ˆ˜์ฃผ์ผ", + "fieldName": "order_date", + "required": true + }, + "displayOrder": 1 + }, + { + "id": "comp_partner_id", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "๊ฑฐ๋ž˜์ฒ˜", + "fieldName": "partner_id", + "required": true, + "config": { + "mode": "dropdown", + "source": "table", + "sourceTable": "customer_mng", + "valueField": "id", + "labelField": "name" + } + }, + "displayOrder": 2 + }, + { + "id": "comp_part_code", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 100, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "ํ’ˆ๋ชฉ์ฝ”๋“œ", + "fieldName": "part_code", + "placeholder": "ํ’ˆ๋ชฉ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 3 + }, + { + "id": "comp_part_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "ํ’ˆ๋ช…", + "fieldName": "part_name", + "placeholder": "ํ’ˆ๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 4 + }, + { + "id": "comp_spec", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 180, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๊ทœ๊ฒฉ", + "fieldName": "spec", + "placeholder": "๊ทœ๊ฒฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 5 + }, + { + "id": "comp_material", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "์žฌ์งˆ", + "fieldName": "material", + "placeholder": "์žฌ์งˆ์„ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 6 + }, + { + "id": "comp_order_qty", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 260, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰", + "fieldName": "order_qty", + "placeholder": "์ˆ˜์ฃผ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 7 + }, + { + "id": "comp_unit_price", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "number", + "label": "๋‹จ๊ฐ€", + "fieldName": "unit_price", + "placeholder": "๋‹จ๊ฐ€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”", + "required": true + }, + "displayOrder": 8 + }, + { + "id": "comp_due_date", + "url": "@/lib/registry/components/v2-date", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 340, "z": 1 }, + "overrides": { + "type": "v2-date", + "label": "๋‚ฉ๊ธฐ์ผ", + "fieldName": "due_date" + }, + "displayOrder": 9 + }, + { + "id": "comp_status", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "์ƒํƒœ", + "fieldName": "status", + "required": true, + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "์ˆ˜์ฃผ", "label": "์ˆ˜์ฃผ" }, + { "value": "์ง„ํ–‰์ค‘", "label": "์ง„ํ–‰์ค‘" }, + { "value": "์™„๋ฃŒ", "label": "์™„๋ฃŒ" }, + { "value": "์ทจ์†Œ", "label": "์ทจ์†Œ" } + ] + } + }, + "displayOrder": 10 + }, + { + "id": "comp_shipping_method", + "url": "@/lib/registry/components/v2-select", + "size": { "width": 300, "height": 60 }, + "position": { "x": 340, "y": 420, "z": 1 }, + "overrides": { + "type": "v2-select", + "label": "๋ฐฐ์†ก๋ฐฉ๋ฒ•", + "fieldName": "shipping_method", + "config": { + "mode": "dropdown", + "source": "static", + "options": [ + { "value": "ํƒ๋ฐฐ", "label": "ํƒ๋ฐฐ" }, + { "value": "ํ™”๋ฌผ", "label": "ํ™”๋ฌผ" }, + { "value": "์ง์†ก", "label": "์ง์†ก" }, + { "value": "ํ€ต์„œ๋น„์Šค", "label": "ํ€ต์„œ๋น„์Šค" }, + { "value": "ํ•ด์ƒ์šด์†ก", "label": "ํ•ด์ƒ์šด์†ก" } + ] + } + }, + "displayOrder": 11 + }, + { + "id": "comp_delivery_address", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 60 }, + "position": { "x": 20, "y": 500, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๋‚ฉํ’ˆ์žฅ์†Œ", + "fieldName": "delivery_address", + "placeholder": "๋‚ฉํ’ˆ์žฅ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 12 + }, + { + "id": "comp_manager_name", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 300, "height": 60 }, + "position": { "x": 20, "y": 580, "z": 1 }, + "overrides": { + "type": "v2-input", + "label": "๋‹ด๋‹น์ž", + "fieldName": "manager_name", + "placeholder": "๋‹ด๋‹น์ž๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 13 + }, + { + "id": "comp_memo", + "url": "@/lib/registry/components/v2-input", + "size": { "width": 620, "height": 80 }, + "position": { "x": 20, "y": 660, "z": 1 }, + "overrides": { + "type": "v2-input", + "inputType": "textarea", + "label": "๋ฉ”๋ชจ", + "fieldName": "memo", + "placeholder": "๋ฉ”๋ชจ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”" + }, + "displayOrder": 14 + }, + { + "id": "comp_btn_save", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 540, "y": 760, "z": 1 }, + "overrides": { + "text": "์ €์žฅ", + "type": "v2-button-primary", + "label": "์ €์žฅ ๋ฒ„ํŠผ", + "action": { + "type": "save", + "closeModalAfterSave": true, + "refreshParentTable": true, + "successMessage": "์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", + "errorMessage": "์ €์žฅ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค." + }, + "variant": "primary", + "actionType": "button" + }, + "displayOrder": 15 + } + ] +} +``` + +### 8.4 ํ™”๋ฉด ์ƒ์„ฑ ์ˆœ์„œ (์ค‘์š”!) + +``` +1. ๋ชจ๋‹ฌ ํ™”๋ฉด ์ƒ์„ฑ (screen_definitions INSERT) + โ”‚ + โ–ผ +2. ๋ชจ๋‹ฌ ๋ ˆ์ด์•„์›ƒ ์ €์žฅ (screen_layouts_v2 INSERT) + โ”‚ + โ–ผ +3. ๋ฉ”์ธ ํ™”๋ฉด ์ƒ์„ฑ (screen_definitions INSERT) + โ”‚ + โ–ผ +4. ๋ฉ”์ธ ๋ ˆ์ด์•„์›ƒ ์ €์žฅ (screen_layouts_v2 INSERT) + โ””โ”€โ”€ targetScreenId์— ๋ชจ๋‹ฌ screen_id ์‚ฌ์šฉ! + โ”‚ + โ–ผ +5. (์„ ํƒ) ๋ฉ”๋‰ด์— ํ™”๋ฉด ์—ฐ๊ฒฐ +``` + +--- + +## 9. ํ™”๋ฉด ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +> ๐Ÿ“‹ ์ƒˆ๋กœ์šด ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•  ๋•Œ ์•„๋ž˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜์„ธ์š”. + +### 9.1 ๋ถ„์„ ๋‹จ๊ณ„ + +| ์ฒดํฌ | ํ•ญ๋ชฉ | ์„ค๋ช… | +|:----:|------|------| +| โ˜ | **ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ถ„์„** | `sales_order_mng` ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ ํ™•์ธ ์™„๋ฃŒ | +| โ˜ | **ํ™”๋ฉด ๊ธฐ๋Šฅ ํŒŒ์•…** | ์กฐํšŒ/๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ, ๊ฒ€์ƒ‰, ํ•„ํ„ฐ, ๊ทธ๋ฃนํ•‘, ์ถœํ•˜๊ณ„ํš ์—ฐ๋™ | +| โ˜ | **์ปดํฌ๋„ŒํŠธ ๋งคํ•‘** | ํ•„์š” ๊ธฐ๋Šฅ โ†’ V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ ์™„๋ฃŒ | +| โ˜ | **๊ตฌํ˜„ ๋ถˆ๊ฐ€ ํ•ญ๋ชฉ ํ™•์ธ** | ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅ | + +### 9.2 INSERT ํ›„ ๊ฒ€์ฆ + +| ์ฒดํฌ | ํ•ญ๋ชฉ | ์„ค๋ช… | +|:----:|------|------| +| โ˜ | **ํ™”๋ฉด ์ ‘์† ํ…Œ์ŠคํŠธ** | `/screens/{screen_id}` URL๋กœ ์ ‘์† | +| โ˜ | **์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ํ™•์ธ** | ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •์ƒ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธ | +| โ˜ | **๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ** | ๊ฒ€์ƒ‰ ์œ„์ ฏ ๋™์ž‘ ํ™•์ธ | +| โ˜ | **ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๋กœ๋“œ** | ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธ | +| โ˜ | **๋ฒ„ํŠผ ๋™์ž‘ ํ…Œ์ŠคํŠธ** | ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ/์ถœํ•˜๊ณ„ํš ๋ฒ„ํŠผ ๋™์ž‘ ํ™•์ธ | +| โ˜ | **๋ชจ๋‹ฌ ํผ ํ…Œ์ŠคํŠธ** | ๋ชจ๋‹ฌ ์—ด๋ฆผ, ์ž…๋ ฅ ํ•„๋“œ ํ‘œ์‹œ, ์ €์žฅ ๋™์ž‘ ํ™•์ธ | +| โ˜ | **ํ†ต๊ณ„ ์—…๋ฐ์ดํŠธ** | ์ด ๊ธˆ์•ก, ์ด ์ˆ˜๋Ÿ‰์ด ์ •ํ™•ํžˆ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธ | + +--- + +## 10. ๋ฉ”๋‰ด์— ํ™”๋ฉด ์—ฐ๊ฒฐํ•˜๊ธฐ + +> ๐Ÿ“‹ ํ™”๋ฉด ์ƒ์„ฑ ํ›„, ํŠน์ • ๋ฉ”๋‰ด์— ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. + +### 10.1 ๋ฉ”๋‰ด ์—ฐ๊ฒฐ ์ ˆ์ฐจ + +``` +1. ๋Œ€์ƒ ๋ฉ”๋‰ด ์ฐพ๊ธฐ (menu_info ํ…Œ์ด๋ธ”์—์„œ objid ํ™•์ธ) + โ”‚ + โ–ผ +2. screen_menu_assignments ํ…Œ์ด๋ธ”์— ํ• ๋‹น ๋ ˆ์ฝ”๋“œ INSERT + โ”‚ + โ–ผ +3. menu_info ํ…Œ์ด๋ธ”์˜ menu_url, screen_code ์—…๋ฐ์ดํŠธ + โ”‚ + โ–ผ +4. ์—ฐ๊ฒฐ ๊ฒฐ๊ณผ ํ™•์ธ +``` + +### 10.2 ๋ฉ”๋‰ด ์ฐพ๊ธฐ + +```sql +-- ๋ฉ”๋‰ด ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰ +SELECT objid, menu_name_kor, menu_url, screen_code, company_code +FROM menu_info +WHERE menu_name_kor = '55566' -- ๋ฉ”๋‰ด ์ด๋ฆ„ + AND company_code = 'COMPANY_19'; -- ํšŒ์‚ฌ ์ฝ”๋“œ + +-- ๊ฒฐ๊ณผ ์˜ˆ์‹œ: +-- objid: 1769415229091 +``` + +### 10.3 ๊ธฐ์กด ํ• ๋‹น ํ™•์ธ ๋ฐ ์ œ๊ฑฐ (์ค‘๋ณต ๋ฐฉ์ง€) + +> โš ๏ธ **์ค‘์š”**: ์ƒˆ ํ™”๋ฉด์„ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ํ•ด๋‹น ๋ฉ”๋‰ด์— ์ด๋ฏธ ํ• ๋‹น๋œ ํ™”๋ฉด์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ํ• ๋‹น ์‹œ ํ™”๋ฉด์ด ์ •์ƒ์ ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +```sql +-- 1. ํ•ด๋‹น ๋ฉ”๋‰ด์— ์ด๋ฏธ ํ• ๋‹น๋œ ํ™”๋ฉด ํ™•์ธ +SELECT + sma.assignment_id, + sma.screen_id, + sd.screen_name, + sd.screen_code +FROM screen_menu_assignments sma +JOIN screen_definitions sd ON sma.screen_id = sd.screen_id +WHERE sma.menu_objid = '1769415229091'; -- ๋Œ€์ƒ ๋ฉ”๋‰ด objid + +-- 2. ๊ธฐ์กด ํ• ๋‹น์ด ์žˆ๋‹ค๋ฉด ์‚ญ์ œ +DELETE FROM screen_menu_assignments +WHERE menu_objid = '1769415229091'; -- ๋ชจ๋“  ๊ธฐ์กด ํ• ๋‹น ์‚ญ์ œ + +-- ๋˜๋Š” ํŠน์ • ํ™”๋ฉด๋งŒ ๋‚จ๊ธฐ๊ณ  ์‚ญ์ œ +DELETE FROM screen_menu_assignments +WHERE menu_objid = '1769415229091' + AND screen_id != 3733; -- 3733(์ˆ˜์ฃผ๊ด€๋ฆฌ)๋งŒ ๋‚จ๊ธฐ๊ณ  ์‚ญ์ œ +``` + +### 10.4 ํ™”๋ฉด-๋ฉ”๋‰ด ํ• ๋‹น INSERT + +```sql +-- screen_menu_assignments์— ํ• ๋‹น ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ +INSERT INTO screen_menu_assignments ( + screen_id, + menu_objid, + company_code, + display_order, + is_active, + created_date +) VALUES ( + 3733, -- ๋ฉ”์ธ ํ™”๋ฉด์˜ screen_id + '1769415229091', -- menu_info์˜ objid (๋ฌธ์ž์—ด๋กœ ์ €์žฅ) + 'COMPANY_19', -- ํšŒ์‚ฌ ์ฝ”๋“œ + 1, -- ํ‘œ์‹œ ์ˆœ์„œ + 'Y', -- ํ™œ์„ฑํ™” ์—ฌ๋ถ€ + NOW() +) RETURNING assignment_id; +``` + +### 10.6 ๋ฉ”๋‰ด URL ๋ฐ screen_code ์—…๋ฐ์ดํŠธ (ํ•„์ˆ˜!) + +> โš ๏ธ **์ค‘์š”**: `screen_menu_assignments`์— ๋ ˆ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋„ `menu_info`์˜ `menu_url`๊ณผ `screen_code`๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. + +```sql +-- menu_info ํ…Œ์ด๋ธ”์˜ menu_url, screen_code ์—…๋ฐ์ดํŠธ +UPDATE menu_info +SET menu_url = '/screens/3733', -- ํ™”๋ฉด URL + screen_code = 'COMPANY_19_SO_MAIN' -- ํ™”๋ฉด ์ฝ”๋“œ +WHERE objid = 1769415229091; +``` + +### 10.7 ์—ฐ๊ฒฐ ํ™•์ธ + +```sql +-- ๋ฉ”๋‰ด-ํ™”๋ฉด ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ +SELECT + mi.objid, + mi.menu_name_kor, + mi.menu_url, + mi.screen_code, + sd.screen_id, + sd.screen_name +FROM menu_info mi +JOIN screen_definitions sd ON mi.screen_code = sd.screen_code +WHERE mi.objid = 1769415229091; + +-- ์˜ˆ์ƒ ๊ฒฐ๊ณผ: +-- objid: 1769415229091 +-- menu_name_kor: 55566 +-- menu_url: /screens/3733 +-- screen_code: COMPANY_19_SO_MAIN +-- screen_id: 3733 +-- screen_name: ์ˆ˜์ฃผ๊ด€๋ฆฌ +``` + +### 10.8 ์ „์ฒด SQL ์˜ˆ์‹œ (์ˆ˜์ฃผ๊ด€๋ฆฌ ํ™”๋ฉด โ†’ 55566 ๋ฉ”๋‰ด) + +```sql +-- 1. ๋ฉ”๋‰ด ์ฐพ๊ธฐ +SELECT objid, menu_name_kor FROM menu_info +WHERE menu_name_kor = '55566' AND company_code = 'COMPANY_19'; +-- ๊ฒฐ๊ณผ: objid = 1769415229091 + +-- 2. ๊ธฐ์กด ํ• ๋‹น ํ™•์ธ ๋ฐ ์‚ญ์ œ (์ค‘๋ณต ๋ฐฉ์ง€!) +SELECT sma.assignment_id, sma.screen_id, sd.screen_name +FROM screen_menu_assignments sma +JOIN screen_definitions sd ON sma.screen_id = sd.screen_id +WHERE sma.menu_objid = '1769415229091'; + +-- ๊ธฐ์กด ํ• ๋‹น์ด ์žˆ๋‹ค๋ฉด ์‚ญ์ œ +DELETE FROM screen_menu_assignments +WHERE menu_objid = '1769415229091'; + +-- 3. ์ƒˆ ํ™”๋ฉด ํ• ๋‹น +INSERT INTO screen_menu_assignments (screen_id, menu_objid, company_code, display_order, is_active, created_date) +VALUES (3733, '1769415229091', 'COMPANY_19', 1, 'Y', NOW()); + +-- 4. ๋ฉ”๋‰ด URL ์—…๋ฐ์ดํŠธ (ํ•„์ˆ˜!) +UPDATE menu_info +SET menu_url = '/screens/3733', + screen_code = 'COMPANY_19_SO_MAIN' +WHERE objid = 1769415229091; +``` + +### 10.9 ๋ฉ”๋‰ด ์—ฐ๊ฒฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +| ์ฒดํฌ | ํ•ญ๋ชฉ | ์„ค๋ช… | +|:----:|------|------| +| โ˜ | **๋Œ€์ƒ ๋ฉ”๋‰ด ํ™•์ธ** | `menu_info`์—์„œ ๋ฉ”๋‰ด objid ํ™•์ธ | +| โ˜ | **๊ธฐ์กด ํ• ๋‹น ํ™•์ธ** | `screen_menu_assignments`์—์„œ ์ค‘๋ณต ํ• ๋‹น ์—ฌ๋ถ€ ํ™•์ธ | +| โ˜ | **๊ธฐ์กด ํ• ๋‹น ์‚ญ์ œ** | ์ค‘๋ณต ํ• ๋‹น์ด ์žˆ๋‹ค๋ฉด ๊ธฐ์กด ๋ ˆ์ฝ”๋“œ DELETE | +| โ˜ | **์ƒˆ ํ™”๋ฉด ํ• ๋‹น INSERT** | `screen_menu_assignments` ํ…Œ์ด๋ธ”์— ์ƒˆ ๋ ˆ์ฝ”๋“œ ์ถ”๊ฐ€ | +| โ˜ | **menu_url ์—…๋ฐ์ดํŠธ** | `/screens/{screen_id}` ํ˜•์‹์œผ๋กœ ์—…๋ฐ์ดํŠธ | +| โ˜ | **screen_code ์—…๋ฐ์ดํŠธ** | ํ™”๋ฉด์˜ screen_code๋กœ ์—…๋ฐ์ดํŠธ | +| โ˜ | **๋ฉ”๋‰ด ํด๋ฆญ ํ…Œ์ŠคํŠธ** | ํ•ด๋‹น ํšŒ์‚ฌ๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ ํ™”๋ฉด ํ‘œ์‹œ ํ™•์ธ | diff --git a/docs/screen-implementation-guide/02_sales/quote.md b/docs/screen-implementation-guide/02_sales/quote.md new file mode 100644 index 00000000..eac09315 --- /dev/null +++ b/docs/screen-implementation-guide/02_sales/quote.md @@ -0,0 +1,308 @@ +# ๊ฒฌ์ ๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ๊ฒฌ์ ๊ด€๋ฆฌ +> **ํŒŒ์ผ**: ๊ฒฌ์ ๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ์˜์—…๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โœ… ์™„์ „ (ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +๊ฒฌ์ ์„œ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ํ™”๋ฉด์œผ๋กœ, ๊ณ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ๊ฒฌ์ ์„ ์ž‘์„ฑํ•˜๊ณ  ์ˆ˜์ฃผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ๊ฒฌ์  ๋ชฉ๋ก ์กฐํšŒ/๊ฒ€์ƒ‰ +- ๊ฒฌ์  ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ +- ๊ฒฌ์  ์ƒ์„ธ ๋ฐ ํ’ˆ๋ชฉ ๋‚ด์—ญ ๊ด€๋ฆฌ +- ๊ฒฌ์ ์„œ ์ธ์‡„/PDF ์ถœ๋ ฅ +- ์ˆ˜์ฃผ ์ „ํ™˜ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ธฐ๊ฐ„] [๊ฑฐ๋ž˜์ฒ˜] [๊ฒฌ์ ๋ฒˆํ˜ธ] [ํ’ˆ๋ชฉ๋ช…] [์ƒํƒœโ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][์—…๋กœ๋“œ][๋‹ค์šด๋กœ๋“œ]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ๊ฒฌ์  ๋ชฉ๋ก โ”‚ ๐Ÿ“„ ๊ฒฌ์  ์ƒ์„ธ โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ [์ธ์‡„] [๋ณต์‚ฌ] [์ˆ˜์ฃผ์ „ํ™˜] [์ˆ˜์ •] [์‚ญ์ œ] โ”‚ +โ”‚ [์‹ ๊ทœ๋“ฑ๋ก] โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๊ฒฌ์ ๋ฒˆํ˜ธ: QT-2026-0001 โ”‚ +โ”‚ โ”‚๊ฒฌ์ ๋ฒˆํ˜ธ|๊ฑฐ๋ž˜์ฒ˜|๊ธˆ์•ก..โ”‚ โ”‚ ๊ฑฐ๋ž˜์ฒ˜: (์ฃผ)ํ…Œ์ŠคํŠธ โ”‚ +โ”‚ โ”‚QT-001 |A์‚ฌ|1,000..โ”‚ โ”‚ ๊ฒฌ์ ์ผ: 2026-01-30 โ”‚ +โ”‚ โ”‚QT-002 |B์‚ฌ|2,500..โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ [๊ธฐ๋ณธ์ •๋ณด] [ํ’ˆ๋ชฉ๋‚ด์—ญ] [์ฒจ๋ถ€ํŒŒ์ผ] โ”‚ +โ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ ๋ฆฌ์‚ฌ์ด์ € โ†” โ”‚ โ”‚ํ’ˆ๋ชฉ์ฝ”๋“œ|ํ’ˆ๋ชฉ๋ช…|์ˆ˜๋Ÿ‰|๋‹จ๊ฐ€|๊ธˆ์•ก|๋น„๊ณ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚P-001 |์ œํ’ˆA|100|1,000|100,000| โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ๊ฒฌ์  ๋ชฉ๋ก | `v2-table-list` | โœ… ๊ฐ€๋Šฅ | +| ๋ถ„ํ•  ํŒจ๋„ | `v2-split-panel-layout` | โœ… ๊ฐ€๋Šฅ | +| ์ƒ์„ธ ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | +| ํ’ˆ๋ชฉ ๋‚ด์—ญ ํ…Œ์ด๋ธ” | `v2-table-list` | โœ… ๊ฐ€๋Šฅ | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +### 4.1 ๊ฒฌ์  ๋ชฉ๋ก (์ขŒ์ธก) + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'quote_no', label: '๊ฒฌ์ ๋ฒˆํ˜ธ', width: 120 }, + { id: 'quote_date', label: '๊ฒฌ์ ์ผ', width: 100 }, + { id: 'customer_name', label: '๊ฑฐ๋ž˜์ฒ˜', width: 150 }, + { id: 'total_amount', label: '๊ฒฌ์ ๊ธˆ์•ก', width: 120, align: 'right', format: 'currency' }, + { id: 'status', label: '์ƒํƒœ', width: 80 }, + { id: 'valid_date', label: '์œ ํšจ๊ธฐ๊ฐ„', width: 100 }, + { id: 'manager', label: '๋‹ด๋‹น์ž', width: 100 } +] +``` + +### 4.2 ํ’ˆ๋ชฉ ๋‚ด์—ญ (์šฐ์ธก ํƒญ) + +```typescript +detailColumns: [ + { id: 'seq', label: 'No', width: 50 }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 100 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'spec', label: '๊ทœ๊ฒฉ', width: 150 }, + { id: 'quantity', label: '์ˆ˜๋Ÿ‰', width: 80, align: 'right' }, + { id: 'unit', label: '๋‹จ์œ„', width: 60 }, + { id: 'unit_price', label: '๋‹จ๊ฐ€', width: 100, align: 'right', format: 'currency' }, + { id: 'amount', label: '๊ธˆ์•ก', width: 120, align: 'right', format: 'currency' }, + { id: 'remark', label: '๋น„๊ณ ', width: 150 } +] +``` + +--- + +## 5. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์„ค์ • | +|--------|----------|------| +| ๊ธฐ๊ฐ„ | `v2-date` | dateRange: true | +| ๊ฑฐ๋ž˜์ฒ˜ | `v2-input` | placeholder: "๊ฑฐ๋ž˜์ฒ˜" | +| ๊ฒฌ์ ๋ฒˆํ˜ธ | `v2-input` | placeholder: "๊ฒฌ์ ๋ฒˆํ˜ธ" | +| ํ’ˆ๋ชฉ๋ช… | `v2-input` | placeholder: "ํ’ˆ๋ชฉ๋ช…" | +| ์ƒํƒœ | `v2-select` | ์ž‘์„ฑ์ค‘, ์ œ์ถœ, ์Šน์ธ, ๋ฐ˜๋ ค, ์ˆ˜์ฃผ์ „ํ™˜ | + +--- + +## 6. ์ƒ์„ธ ํƒญ ๊ตฌ์„ฑ + +```typescript +tabs: [ + { + id: 'basic', + label: '๊ธฐ๋ณธ์ •๋ณด', + fields: [ + { id: 'quote_no', label: '๊ฒฌ์ ๋ฒˆํ˜ธ' }, + { id: 'quote_date', label: '๊ฒฌ์ ์ผ' }, + { id: 'customer_code', label: '๊ฑฐ๋ž˜์ฒ˜์ฝ”๋“œ' }, + { id: 'customer_name', label: '๊ฑฐ๋ž˜์ฒ˜๋ช…' }, + { id: 'manager', label: '๋‹ด๋‹น์ž' }, + { id: 'valid_date', label: '์œ ํšจ๊ธฐ๊ฐ„' }, + { id: 'delivery_date', label: '๋‚ฉ๊ธฐ์ผ' }, + { id: 'payment_term', label: '๊ฒฐ์ œ์กฐ๊ฑด' }, + { id: 'remark', label: '๋น„๊ณ ' } + ] + }, + { + id: 'items', + label: 'ํ’ˆ๋ชฉ๋‚ด์—ญ', + type: 'table', + entityId: 'quote_items' + }, + { + id: 'files', + label: '์ฒจ๋ถ€ํŒŒ์ผ', + type: 'file-list' + } +] +``` + +--- + +## 7. ๋ฒ„ํŠผ ์•ก์…˜ + +### 7.1 ๋ชฉ๋ก ๋ฒ„ํŠผ +| ๋ฒ„ํŠผ | ์•ก์…˜ | +|------|------| +| ์‹ ๊ทœ๋“ฑ๋ก | ๊ฒฌ์  ๋“ฑ๋ก ๋ชจ๋‹ฌ ์—ด๊ธฐ | + +### 7.2 ์ƒ์„ธ ๋ฒ„ํŠผ +| ๋ฒ„ํŠผ | ์•ก์…˜ | +|------|------| +| ์ธ์‡„ | ๊ฒฌ์ ์„œ PDF ์ถœ๋ ฅ | +| ๋ณต์‚ฌ | ์„ ํƒ ๊ฒฌ์  ๋ณต์‚ฌํ•˜์—ฌ ์‹ ๊ทœ ์ƒ์„ฑ | +| ์ˆ˜์ฃผ์ „ํ™˜ | ๊ฒฌ์  โ†’ ์ˆ˜์ฃผ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ | +| ์ˆ˜์ • | ๊ฒฌ์  ์ˆ˜์ • ๋ชจ๋‹ฌ ์—ด๊ธฐ | +| ์‚ญ์ œ | ๊ฒฌ์  ์‚ญ์ œ (ํ™•์ธ ํ›„) | + +--- + +## 8. ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "QUOTE_MAIN", + "screen_name": "๊ฒฌ์ ๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 2 }, + "config": { + "searchFields": [ + { "type": "date", "id": "date_range", "placeholder": "๊ธฐ๊ฐ„", "dateRange": true }, + { "type": "input", "id": "customer_name", "placeholder": "๊ฑฐ๋ž˜์ฒ˜" }, + { "type": "input", "id": "quote_no", "placeholder": "๊ฒฌ์ ๋ฒˆํ˜ธ" }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ๋ช…" }, + { "type": "select", "id": "status", "placeholder": "์ƒํƒœ", + "options": [ + { "value": "draft", "label": "์ž‘์„ฑ์ค‘" }, + { "value": "submitted", "label": "์ œ์ถœ" }, + { "value": "approved", "label": "์Šน์ธ" }, + { "value": "rejected", "label": "๋ฐ˜๋ ค" }, + { "value": "converted", "label": "์ˆ˜์ฃผ์ „ํ™˜" } + ] + } + ], + "buttons": [ + { "label": "์ดˆ๊ธฐํ™”", "action": "reset", "variant": "outline" }, + { "label": "์กฐํšŒ", "action": "search", "variant": "primary" } + ], + "rightButtons": [ + { "label": "์‚ฌ์šฉ์ž์˜ต์…˜", "action": "userOptions", "variant": "outline" }, + { "label": "์—‘์…€์—…๋กœ๋“œ", "action": "excelUpload", "variant": "outline" }, + { "label": "์—‘์…€๋‹ค์šด๋กœ๋“œ", "action": "excelDownload", "variant": "outline" } + ] + } + }, + { + "type": "v2-split-panel-layout", + "position": { "x": 0, "y": 2, "w": 12, "h": 10 }, + "config": { + "masterPanel": { + "title": "๊ฒฌ์  ๋ชฉ๋ก", + "entityId": "quote_header", + "buttons": [ + { "label": "์‹ ๊ทœ๋“ฑ๋ก", "action": "create", "variant": "primary" } + ], + "columns": [ + { "id": "quote_no", "label": "๊ฒฌ์ ๋ฒˆํ˜ธ", "width": 120 }, + { "id": "quote_date", "label": "๊ฒฌ์ ์ผ", "width": 100 }, + { "id": "customer_name", "label": "๊ฑฐ๋ž˜์ฒ˜", "width": 150 }, + { "id": "total_amount", "label": "๊ฒฌ์ ๊ธˆ์•ก", "width": 120, "align": "right" }, + { "id": "status", "label": "์ƒํƒœ", "width": 80 }, + { "id": "manager", "label": "๋‹ด๋‹น์ž", "width": 100 } + ] + }, + "detailPanel": { + "title": "๊ฒฌ์  ์ƒ์„ธ", + "buttons": [ + { "label": "์ธ์‡„", "action": "print", "variant": "outline" }, + { "label": "๋ณต์‚ฌ", "action": "copy", "variant": "outline" }, + { "label": "์ˆ˜์ฃผ์ „ํ™˜", "action": "convert", "variant": "secondary" }, + { "label": "์ˆ˜์ •", "action": "edit", "variant": "outline" }, + { "label": "์‚ญ์ œ", "action": "delete", "variant": "destructive" } + ], + "tabs": [ + { + "id": "basic", + "label": "๊ธฐ๋ณธ์ •๋ณด", + "type": "form" + }, + { + "id": "items", + "label": "ํ’ˆ๋ชฉ๋‚ด์—ญ", + "type": "table", + "entityId": "quote_items", + "relationType": "one-to-many", + "relationKey": "quote_id" + }, + { + "id": "files", + "label": "์ฒจ๋ถ€ํŒŒ์ผ", + "type": "file" + } + ] + }, + "defaultRatio": 40, + "resizable": true + } + } + ] +} +``` + +--- + +## 9. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” + +### quote_header (๊ฒฌ์  ํ—ค๋”) +```sql +CREATE TABLE quote_header ( + id SERIAL PRIMARY KEY, + company_code VARCHAR(20) NOT NULL, + quote_no VARCHAR(50) NOT NULL, + quote_date DATE NOT NULL, + customer_code VARCHAR(50), + customer_name VARCHAR(200), + total_amount NUMERIC(15,2), + tax_amount NUMERIC(15,2), + status VARCHAR(20) DEFAULT 'draft', + valid_date DATE, + delivery_date DATE, + payment_term VARCHAR(100), + manager VARCHAR(100), + remark TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +### quote_items (๊ฒฌ์  ํ’ˆ๋ชฉ) +```sql +CREATE TABLE quote_items ( + id SERIAL PRIMARY KEY, + company_code VARCHAR(20) NOT NULL, + quote_id INTEGER REFERENCES quote_header(id), + seq INTEGER, + item_code VARCHAR(50), + item_name VARCHAR(200), + spec VARCHAR(200), + quantity NUMERIC(15,3), + unit VARCHAR(20), + unit_price NUMERIC(15,2), + amount NUMERIC(15,2), + remark TEXT +); +``` + +--- + +## 10. ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +- [x] ๊ฒ€์ƒ‰ ์˜์—ญ: v2-table-search-widget +- [x] ๋ถ„ํ•  ํŒจ๋„: v2-split-panel-layout +- [x] ๋ชฉ๋ก ํ…Œ์ด๋ธ”: v2-table-list +- [x] ์ƒ์„ธ ํƒญ: v2-tabs-widget +- [x] ํ’ˆ๋ชฉ ๋‚ด์—ญ ํ…Œ์ด๋ธ”: v2-table-list (nested) +- [ ] ์ธ์‡„ ๊ธฐ๋Šฅ: ๋ณ„๋„ ๊ตฌํ˜„ ํ•„์š” +- [ ] ์ˆ˜์ฃผ ์ „ํ™˜: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„ + +**ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ 100% ๊ตฌํ˜„ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/03_production/.gitkeep b/docs/screen-implementation-guide/03_production/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/screen-implementation-guide/03_production/production-plan.md b/docs/screen-implementation-guide/03_production/production-plan.md new file mode 100644 index 00000000..22ef6a7a --- /dev/null +++ b/docs/screen-implementation-guide/03_production/production-plan.md @@ -0,0 +1,601 @@ +# ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ (Production Plan Management) + +> โš ๏ธ **์ค‘์š” ์•ˆ๋‚ด**: ์ด ํ™”๋ฉด์€ **๋ณตํ•ฉํ˜• ๋ ˆ์ด์•„์›ƒ** (์ขŒ์šฐ ๋ถ„ํ•  ํŒจ๋„ + ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ)์œผ๋กœ, ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋งŒ์œผ๋กœ๋Š” ์™„์ „ํ•œ ๊ตฌํ˜„์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ฌธ์„œ๋Š” ํ™”๋ฉด ๋ถ„์„ ๋ฐ ํ–ฅํ›„ ๊ตฌํ˜„ ๊ณ„ํš์„ ์œ„ํ•œ ์ฐธ์กฐ์šฉ์ž…๋‹ˆ๋‹ค. + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +| ํ•ญ๋ชฉ | ๋‚ด์šฉ | +|------|------| +| **ํ™”๋ฉด๋ช…** | ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ | +| **์˜๋ฌธ๋ช…** | Production Plan Management | +| **ํ™”๋ฉด ์œ ํ˜•** | ๋ณตํ•ฉํ˜• (์ขŒ์šฐ ๋ถ„ํ•  ํŒจ๋„ + ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ) | +| **๋ฉ”์ธ ํ…Œ์ด๋ธ”** | `production_plan_mng` | +| **๊ด€๋ จ ํ…Œ์ด๋ธ”** | `sales_order_mng`, `item_info`, `equipment_info`, `bom_info` | +| **์ฃผ์š” ๊ธฐ๋Šฅ** | ์ˆ˜์ฃผ ๊ธฐ๋ฐ˜ ์ƒ์‚ฐ๊ณ„ํš ์ˆ˜๋ฆฝ, ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ, ์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ, ๋ฐ˜์ œํ’ˆ ๊ณ„ํš ์—ฐ๋™ | + +--- + +## 2. ํ™”๋ฉด ๊ตฌ์กฐ ๋ถ„์„ + +### 2.1 ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๊ฒ€์ƒ‰ ์„น์…˜ โ”‚ +โ”‚ [๊ฒ€์ƒ‰ํ•„๋“œ๋“ค...] [์‚ฌ์šฉ์ž์˜ต์…˜] [์—‘์…€์—…๋กœ๋“œ] [์—‘์…€๋‹ค์šด๋กœ๋“œ] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ์™ผ์ชฝ ํŒจ๋„ (50%, ๋ฆฌ์‚ฌ์ด์ฆˆ) โ”‚ โ”‚ ์˜ค๋ฅธ์ชฝ ํŒจ๋„ (50%) โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚๋ฆฌโ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ [์ˆ˜์ฃผ๋ฐ์ดํ„ฐ] [์•ˆ์ „์žฌ๊ณ ๋ถ€์กฑ] โ”‚ โ”‚์‚ฌโ”‚ โ”‚ [์™„์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš] [๋ฐ˜์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš] โ”‚ โ”‚ +โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚์ดโ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚์ฆˆโ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ ์ˆ˜์ฃผ ๋ชฉ๋ก ํ…Œ์ด๋ธ” โ”‚ โ”‚ํ•ธโ”‚ โ”‚ ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ โ”‚ +โ”‚ โ”‚ (๊ทธ๋ฃนํ™”๋œ ํ’ˆ๋ชฉ๋ณ„ ์ˆ˜์ฃผ) โ”‚ โ”‚๋“คโ”‚ โ”‚ (๊ฐ„ํŠธ์ฐจํŠธ ํ˜•ํƒœ) โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ - ์ฒดํฌ๋ฐ•์Šค โ”‚ โ”‚ โ”‚ โ”‚ - ๋‚ ์งœ๋ณ„ ๊ทธ๋ฆฌ๋“œ โ”‚ +โ”‚ โ”‚ - ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ ํ† ๊ธ€ โ”‚ โ”‚ โ”‚ โ”‚ - ์ƒ์‚ฐ๊ณ„ํš ๋ฐ” (๋“œ๋ž˜๊ทธ ๊ฐ€๋Šฅ) โ”‚ +โ”‚ โ”‚ - ํ’ˆ๋ชฉ๋ณ„ ๊ทธ๋ฃน ํ–‰ โ”‚ โ”‚ โ”‚ โ”‚ - ๋‚ฉ๊ธฐ์ผ ๋งˆ์ปค โ”‚ +โ”‚ โ”‚ - ์ˆ˜์ฃผ ์ƒ์„ธ ํ–‰ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ [๊ณ„ํš์— ์—†๋Š” ํ’ˆ๋ชฉ๋งŒ] [์„ ํƒํ’ˆ๋ชฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ] [์ƒˆ๋กœ๊ณ ์นจ] โ”‚ [์ž๋™์Šค์ผ€์ค„] [์ €์žฅ] [์ดˆ๊ธฐํ™”] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### 2.2 ํƒญ ๊ตฌ์กฐ + +**์™ผ์ชฝ ํŒจ๋„ ํƒญ**: +1. **์ˆ˜์ฃผ๋ฐ์ดํ„ฐ**: ์ˆ˜์ฃผ ๋ชฉ๋ก (ํ’ˆ๋ชฉ๋ณ„ ๊ทธ๋ฃนํ•‘) +2. **์•ˆ์ „์žฌ๊ณ  ๋ถ€์กฑ๋ถ„**: ์•ˆ์ „์žฌ๊ณ  ๋ฏธ๋‹ฌ ํ’ˆ๋ชฉ ๋ชฉ๋ก + +**์˜ค๋ฅธ์ชฝ ํŒจ๋„ ํƒญ**: +1. **์™„์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš**: ์™„์ œํ’ˆ ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ +2. **๋ฐ˜์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš**: ๋ฐ˜์ œํ’ˆ ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ + +--- + +## 3. ํ…Œ์ด๋ธ” ์ •์˜ + +### 3.1 ๋ฉ”์ธ ํ…Œ์ด๋ธ”: `production_plan_mng` + +| ์ปฌ๋Ÿผ๋ช… | ํƒ€์ž… | NULL | ์„ค๋ช… | +|--------|------|------|------| +| id | SERIAL | NO | PK | +| company_code | VARCHAR(20) | NO | ํšŒ์‚ฌ ์ฝ”๋“œ | +| plan_no | VARCHAR(50) | NO | ์ƒ์‚ฐ๊ณ„ํš๋ฒˆํ˜ธ | +| plan_date | DATE | NO | ๊ณ„ํš์ผ์ž | +| item_code | VARCHAR(50) | NO | ํ’ˆ๋ชฉ์ฝ”๋“œ | +| item_name | VARCHAR(200) | YES | ํ’ˆ๋ช… | +| plan_qty | NUMERIC(15,3) | NO | ๊ณ„ํš์ˆ˜๋Ÿ‰ | +| start_date | DATE | NO | ์‹œ์ž‘์ผ | +| end_date | DATE | NO | ์ข…๋ฃŒ์ผ | +| due_date | DATE | YES | ๋‚ฉ๊ธฐ์ผ | +| equipment_id | INTEGER | YES | ์„ค๋น„ ID (FK) | +| equipment_name | VARCHAR(100) | YES | ์„ค๋น„๋ช… | +| status | VARCHAR(20) | YES | ์ƒํƒœ (๊ณ„ํš/์ง€์‹œ/์ง„ํ–‰/์™„๋ฃŒ) | +| priority | VARCHAR(20) | YES | ์šฐ์„ ์ˆœ์œ„ | +| work_shift | VARCHAR(20) | YES | ์ž‘์—…์กฐ (์ฃผ๊ฐ„/์•ผ๊ฐ„/์ฃผ์•ผ) | +| manager_name | VARCHAR(100) | YES | ๋‹ด๋‹น์ž | +| work_order_no | VARCHAR(50) | YES | ์ž‘์—…์ง€์‹œ๋ฒˆํ˜ธ | +| remarks | TEXT | YES | ๋น„๊ณ  | +| order_no | VARCHAR(50) | YES | ๊ด€๋ จ ์ˆ˜์ฃผ๋ฒˆํ˜ธ | +| partner_id | VARCHAR(50) | YES | ๊ฑฐ๋ž˜์ฒ˜ ID | +| hourly_capacity | NUMERIC(15,3) | YES | ์‹œ๊ฐ„๋‹น ์ƒ์‚ฐ๋Šฅ๋ ฅ | +| daily_capacity | NUMERIC(15,3) | YES | ์ผ์ผ ์ƒ์‚ฐ๋Šฅ๋ ฅ | +| lead_time | INTEGER | YES | ๋ฆฌ๋“œํƒ€์ž„ (์ผ) | +| product_type | VARCHAR(20) | YES | ์ œํ’ˆ์œ ํ˜• (์™„์ œํ’ˆ/๋ฐ˜์ œํ’ˆ) | +| parent_plan_id | INTEGER | YES | ๋ชจํ’ˆ๋ชฉ ๊ณ„ํš ID (๋ฐ˜์ œํ’ˆ์šฉ) | +| created_date | TIMESTAMPTZ | YES | ์ƒ์„ฑ์ผ์‹œ | +| created_by | VARCHAR(50) | YES | ์ƒ์„ฑ์ž | +| updated_date | TIMESTAMPTZ | YES | ์ˆ˜์ •์ผ์‹œ | +| updated_by | VARCHAR(50) | YES | ์ˆ˜์ •์ž | + +### 3.2 ๊ด€๋ จ ํ…Œ์ด๋ธ” + +#### `equipment_info` (์„ค๋น„ ์ •๋ณด) + +| ์ปฌ๋Ÿผ๋ช… | ํƒ€์ž… | ์„ค๋ช… | +|--------|------|------| +| id | SERIAL | PK | +| equipment_code | VARCHAR(50) | ์„ค๋น„์ฝ”๋“œ | +| equipment_name | VARCHAR(100) | ์„ค๋น„๋ช… | +| equipment_type | VARCHAR(50) | ์„ค๋น„์œ ํ˜• | +| capacity_per_hour | NUMERIC(15,3) | ์‹œ๊ฐ„๋‹น ์ƒ์‚ฐ๋Šฅ๋ ฅ | +| status | VARCHAR(20) | ์ƒํƒœ | + +--- + +## 4. ๊ตฌํ˜„ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๋ถ„์„ + +### 4.1 ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ + +| ๊ธฐ๋Šฅ | ๊ฐ€๋Šฅ ์—ฌ๋ถ€ | ์‚ฌ์šฉ ์ปดํฌ๋„ŒํŠธ | ๋น„๊ณ  | +|------|:---------:|--------------|------| +| ๊ฒ€์ƒ‰ ํ•„ํ„ฐ | โœ… | `v2-table-search-widget` | | +| ๊ธฐ๋ณธ ๋ฒ„ํŠผ (์—‘์…€, ์‚ฌ์šฉ์ž์˜ต์…˜) | โœ… | `v2-button-primary` | | +| ๋‹จ์ผ ํ…Œ์ด๋ธ” ๋ชฉ๋ก | โœ… | `v2-table-list` | | +| ๊ธฐ๋ณธ ๋ชจ๋‹ฌ ํผ | โœ… | ๋ชจ๋‹ฌ ํ™”๋ฉด | | +| ์ขŒ์šฐ ๋ถ„ํ•  ํŒจ๋„ (๊ธฐ๋ณธ) | โš ๏ธ | `v2-split-panel-layout` | ํ…Œ์ด๋ธ”/๋ฆฌ์ŠคํŠธ๋งŒ ํ‘œ์‹œ ๊ฐ€๋Šฅ | +| ํƒญ ์ปดํฌ๋„ŒํŠธ (๊ธฐ๋ณธ) | โš ๏ธ | `v2-tabs-widget` | ๋””์ž์ธ ๋ชจ๋“œ์—์„œ ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ | + +### 4.2 ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ์˜ ์ œํ•œ ์‚ฌํ•ญ + +#### `v2-split-panel-layout` ์ œํ•œ + +**ํ˜„์žฌ ๊ธฐ๋Šฅ**: +- ์ขŒ์šฐ ๋ถ„ํ•  ํŒจ๋„ (๋ฆฌ์‚ฌ์ด์ฆˆ ๊ฐ€๋Šฅ) +- ๊ฐ ํŒจ๋„์— **ํ…Œ์ด๋ธ”** ๋˜๋Š” **๋ฆฌ์ŠคํŠธ** ํ‘œ์‹œ (`displayMode: "list" | "table"`) +- leftPanel โ†” rightPanel ๊ด€๊ณ„ ์„ค์ • (relation) +- ์šฐ์ธก ํŒจ๋„์— ์ถ”๊ฐ€ ํƒญ (additionalTabs) + +**์ œํ•œ ์‚ฌํ•ญ**: +- โŒ ํŒจ๋„ ์•ˆ์— **์ž„์˜์˜ ์ปดํฌ๋„ŒํŠธ** (ํƒ€์ž„๋ผ์ธ ๋“ฑ)๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†์Œ +- โŒ **๊ทธ๋ฃนํ™”๋œ ํ…Œ์ด๋ธ”** (์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) ๋ฏธ์ง€์› +- โŒ ๋ณต์žกํ•œ ์ปค์Šคํ…€ UI ๋ฐฐ์น˜ ๋ถˆ๊ฐ€ + +#### `v2-tabs-widget` ์ œํ•œ + +**ํ˜„์žฌ ๊ธฐ๋Šฅ**: +- ํƒญ๋ณ„ ์ปดํฌ๋„ŒํŠธ ์ž์œ  ๋ฐฐ์น˜ +- ๋””์ž์ธ ๋ชจ๋“œ์—์„œ ๋“œ๋ž˜๊ทธ&๋“œ๋กญ + +**์ œํ•œ ์‚ฌํ•ญ**: +- โŒ ํƒญ ๋‚ด์— **๋‹ค๋ฅธ V2 ์ปดํฌ๋„ŒํŠธ**๋ฅผ ์™„์ „ํžˆ ์ž์œ ๋กญ๊ฒŒ ๋ฐฐ์น˜ํ•˜๊ธฐ ์–ด๋ ค์›€ +- โŒ ๋Ÿฐํƒ€์ž„์—์„œ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ œํ•œ + +### 4.3 ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ vs ํ˜„์žฌ ์ง€์› + +| ํ•„์š” ๊ธฐ๋Šฅ | ํ˜„์žฌ ์ง€์› | ์„ค๋ช… | +|----------|:---------:|------| +| ์ขŒ์šฐ ๋ถ„ํ•  ํŒจ๋„ | โš ๏ธ ๋ถ€๋ถ„ | `v2-split-panel-layout` - ํ…Œ์ด๋ธ”๋งŒ ๊ฐ€๋Šฅ | +| ์™ผ์ชฝ ํŒจ๋„ ํƒญ (์ˆ˜์ฃผ/์•ˆ์ „์žฌ๊ณ ) | โŒ | ๋ถ„ํ•  ํŒจ๋„ ๋‚ด ํƒญ ์กฐํ•ฉ ๋ฏธ์ง€์› | +| **๊ทธ๋ฃนํ™”๋œ ํ…Œ์ด๋ธ”** (ํ’ˆ๋ชฉ๋ณ„ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) | โŒ | ์‹ ๊ทœ ๊ฐœ๋ฐœ ํ•„์š” | +| ์˜ค๋ฅธ์ชฝ ํŒจ๋„ ํƒญ (์™„์ œํ’ˆ/๋ฐ˜์ œํ’ˆ) | โŒ | ๋ถ„ํ•  ํŒจ๋„ ๋‚ด ํƒญ ์กฐํ•ฉ ๋ฏธ์ง€์› | +| **ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ** (๊ฐ„ํŠธ์ฐจํŠธ) | โŒ | ์‹ ๊ทœ ๊ฐœ๋ฐœ ํ•„์š” | +| ๋“œ๋ž˜๊ทธ&๋“œ๋กญ ์Šค์ผ€์ค„ ์ด๋™ | โŒ | ์‹ ๊ทœ ๊ฐœ๋ฐœ ํ•„์š” | +| ๋ณต์žกํ•œ ์ƒ์„ธ ๋ชจ๋‹ฌ (๋ถ„ํ• , ์„ค๋น„ํ• ๋‹น) | โŒ | ์ปค์Šคํ…€ ๋ชจ๋‹ฌ ๊ฐœ๋ฐœ ํ•„์š” | + +### 4.4 ํ–ฅํ›„ ๊ฐœ๋ฐœ ํ•„์š” ์ปดํฌ๋„ŒํŠธ + +``` +ํ•„์š” ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก: +1. v2-timeline-scheduler - ํƒ€์ž„๋ผ์ธ/๊ฐ„ํŠธ์ฐจํŠธ ์Šค์ผ€์ค„๋Ÿฌ (ํ•ต์‹ฌ!) +2. v2-table-grouped - ๊ทธ๋ฃนํ™”๋œ ํ…Œ์ด๋ธ” (์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) +3. v2-split-panel-enhanced - ํŒจ๋„ ๋‚ด ์ž„์˜ ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ํ™•์žฅํŒ +4. v2-modal-complex - ๋ณต์žกํ•œ ๋ชจ๋‹ฌ (๋ถ„ํ• , ๋‹ค๋‹จ๊ณ„, ์„ค๋น„ํ• ๋‹น) +``` + +### 4.5 ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ฒ”์œ„ + +ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•œ **์ตœ๋Œ€ ๋ฒ”์œ„**: + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๊ฒ€์ƒ‰ ์„น์…˜ (v2-table-search-widget) โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ +โ”‚ ์ƒ์‚ฐ๊ณ„ํš ํ…Œ์ด๋ธ” (v2-table-list) - ๋‹จ์ผ ํ…Œ์ด๋ธ”, ๊ทธ๋ฃนํ™” ์—†์Œ โ”‚ +โ”‚ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [๋“ฑ๋ก] [์ˆ˜์ •] [์‚ญ์ œ] (v2-button-primary) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +**๊ตฌํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•œ ํ•ต์‹ฌ ๊ธฐ๋Šฅ**: +- ํ’ˆ๋ชฉ๋ณ„ ๊ทธ๋ฃนํ•‘ (์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ) +- ๊ฐ„ํŠธ์ฐจํŠธ ํƒ€์ž„๋ผ์ธ +- ์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ +- ๋“œ๋ž˜๊ทธ๋กœ ์Šค์ผ€์ค„ ์ด๋™ + +--- + +## 5. ๋‹จ์ˆœํ™”๋œ ๊ตฌํ˜„ ๋ฐฉ์•ˆ (์ž„์‹œ) + +> ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋งŒ์œผ๋กœ **๊ฐ„์†Œํ™”๋œ ๋ฒ„์ „**์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### 5.1 ๊ฐ„์†Œํ™” ๋ฒ„์ „ ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๊ฒ€์ƒ‰ ์„น์…˜ โ”‚ +โ”‚ [ํ’ˆ๋ชฉ์ฝ”๋“œ] [ํ’ˆ๋ช…] [๊ณ„ํš๊ธฐ๊ฐ„] [์ƒํƒœ] [์‚ฌ์šฉ์ž์˜ต์…˜] [์—‘์…€๋‹ค์šด๋กœ๋“œ] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ +โ”‚ ์ƒ์‚ฐ๊ณ„ํš ๋ชฉ๋ก ํ…Œ์ด๋ธ” โ”‚ +โ”‚ (๋‹จ์ผ ํ…Œ์ด๋ธ”, ๊ทธ๋ฃนํ™” ์—†์Œ) โ”‚ +โ”‚ โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [์‹ ๊ทœ๋“ฑ๋ก] [์ˆ˜์ •] [์‚ญ์ œ] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +### 5.2 ๊ฐ„์†Œํ™” ๋ฒ„์ „ ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ + +| ์ˆœ์„œ | ์ปฌ๋Ÿผ๋ช… | ํ‘œ์‹œ๋ช… | ์ •๋ ฌ | ํ˜•์‹ | +|:----:|--------|--------|:----:|------| +| 1 | plan_no | ๊ณ„ํš๋ฒˆํ˜ธ | left | text | +| 2 | plan_date | ๊ณ„ํš์ผ์ž | center | date | +| 3 | item_code | ํ’ˆ๋ชฉ์ฝ”๋“œ | left | text | +| 4 | item_name | ํ’ˆ๋ช… | left | text | +| 5 | plan_qty | ๊ณ„ํš์ˆ˜๋Ÿ‰ | right | number | +| 6 | start_date | ์‹œ์ž‘์ผ | center | date | +| 7 | end_date | ์ข…๋ฃŒ์ผ | center | date | +| 8 | due_date | ๋‚ฉ๊ธฐ์ผ | center | date | +| 9 | equipment_name | ์„ค๋น„ | left | text | +| 10 | status | ์ƒํƒœ | center | badge | +| 11 | manager_name | ๋‹ด๋‹น์ž | left | text | +| 12 | product_type | ์ œํ’ˆ์œ ํ˜• | center | text | + +### 5.3 ๊ฐ„์†Œํ™” ๋ฒ„์ „ ๋ชจ๋‹ฌ ํ•„๋“œ + +| ํ•„๋“œ๋ช… | ๋ผ๋ฒจ | ํƒ€์ž… | ํ•„์ˆ˜ | +|--------|------|------|:----:| +| plan_no | ๊ณ„ํš๋ฒˆํ˜ธ | text | โœ… | +| plan_date | ๊ณ„ํš์ผ์ž | date | โœ… | +| item_code | ํ’ˆ๋ชฉ์ฝ”๋“œ | select (ํ’ˆ๋ชฉ ๊ฒ€์ƒ‰) | โœ… | +| item_name | ํ’ˆ๋ช… | text (์ž๋™) | | +| plan_qty | ๊ณ„ํš์ˆ˜๋Ÿ‰ | number | โœ… | +| start_date | ์‹œ์ž‘์ผ | date | โœ… | +| end_date | ์ข…๋ฃŒ์ผ | date | โœ… | +| due_date | ๋‚ฉ๊ธฐ์ผ | date | | +| equipment_id | ์„ค๋น„ | select | | +| status | ์ƒํƒœ | select | โœ… | +| priority | ์šฐ์„ ์ˆœ์œ„ | select | | +| work_shift | ์ž‘์—…์กฐ | select | | +| manager_name | ๋‹ด๋‹น์ž | text | | +| remarks | ๋น„๊ณ  | textarea | | +| product_type | ์ œํ’ˆ์œ ํ˜• | select | | + +--- + +## 6. ์›๋ณธ HTML ๊ธฐ๋Šฅ ์ƒ์„ธ ๋ถ„์„ + +### 6.1 ์ˆ˜์ฃผ๋ฐ์ดํ„ฐ ํƒญ (์™ผ์ชฝ ํŒจ๋„) + +**ํ…Œ์ด๋ธ” ๊ตฌ์กฐ**: +- ํ’ˆ๋ชฉ๋ณ„ ๊ทธ๋ฃน ํ–‰ (์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ ๊ฐ€๋Šฅ) +- ์ˆ˜์ฃผ ์ƒ์„ธ ํ–‰ (๊ทธ๋ฃน ํ–‰ ํ•˜์œ„) + +**ํ’ˆ๋ชฉ ๊ทธ๋ฃน ํ–‰ ์ปฌ๋Ÿผ**: +| ์ปฌ๋Ÿผ | ์„ค๋ช… | +|------|------| +| ์ฒดํฌ๋ฐ•์Šค | ํ’ˆ๋ชฉ ๊ทธ๋ฃน ์„ ํƒ | +| ํ† ๊ธ€ | ์ƒ์„ธ ์ ‘๊ธฐ/ํŽผ์น˜๊ธฐ | +| ํ’ˆ๋ชฉ์ฝ”๋“œ | | +| ํ’ˆ๋ชฉ๋ช… | | +| ์ด์ˆ˜์ฃผ๋Ÿ‰ | ํ•ด๋‹น ํ’ˆ๋ชฉ์˜ ๋ชจ๋“  ์ˆ˜์ฃผ ํ•ฉ๊ณ„ | +| ์ถœ๊ณ ๋Ÿ‰ | | +| ์ž”๋Ÿ‰ | ์ด์ˆ˜์ฃผ๋Ÿ‰ - ์ถœ๊ณ ๋Ÿ‰ | +| ํ˜„์žฌ๊ณ  | | +| ์•ˆ์ „์žฌ๊ณ  | | +| ์ถœํ•˜๊ณ„ํš๋Ÿ‰ | | +| ๊ธฐ์ƒ์‚ฐ๊ณ„ํš๋Ÿ‰ | ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ƒ์‚ฐ๊ณ„ํš ์ˆ˜๋Ÿ‰ | +| ์ƒ์‚ฐ์ง„ํ–‰ | ํ˜„์žฌ ์ƒ์‚ฐ ์ค‘์ธ ์ˆ˜๋Ÿ‰ | +| ํ•„์š”์ƒ์‚ฐ๊ณ„ํš | ์ถ”๊ฐ€๋กœ ๊ณ„ํšํ•ด์•ผ ํ•  ์ˆ˜๋Ÿ‰ (๋นจ๊ฐ„์ƒ‰ ๊ฐ•์กฐ) | + +**์ˆ˜์ฃผ ์ƒ์„ธ ํ–‰**: +- ์ˆ˜์ฃผ๋ฒˆํ˜ธ, ๊ฑฐ๋ž˜์ฒ˜, ์ƒํƒœ ๋ฐฐ์ง€ +- ์ˆ˜์ฃผ๋Ÿ‰, ์ถœ๊ณ ๋Ÿ‰, ์ž”๋Ÿ‰ +- ๋‚ฉ๊ธฐ์ผ + +**๋ฒ„ํŠผ**: +- `๊ณ„ํš์— ์—†๋Š” ํ’ˆ๋ชฉ๋งŒ` ์ฒดํฌ๋ฐ•์Šค ํ•„ํ„ฐ +- `์„ ํƒ ํ’ˆ๋ชฉ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ`: ์„ ํƒํ•œ ํ’ˆ๋ชฉ์„ ์ƒ์‚ฐ๊ณ„ํš์œผ๋กœ ๋“ฑ๋ก +- `์ƒˆ๋กœ๊ณ ์นจ` + +### 6.2 ์•ˆ์ „์žฌ๊ณ  ๋ถ€์กฑ๋ถ„ ํƒญ (์™ผ์ชฝ ํŒจ๋„) + +**ํ…Œ์ด๋ธ” ์ปฌ๋Ÿผ**: +| ์ปฌ๋Ÿผ | ์„ค๋ช… | +|------|------| +| ์ฒดํฌ๋ฐ•์Šค | | +| ํ’ˆ๋ชฉ์ฝ”๋“œ | | +| ํ’ˆ๋ชฉ๋ช… | | +| ํ˜„์žฌ๊ณ  | | +| ์•ˆ์ „์žฌ๊ณ  | | +| ๋ถ€์กฑ์ˆ˜๋Ÿ‰ | ๋นจ๊ฐ„์ƒ‰ (๋งˆ์ด๋„ˆ์Šค) | +| ๊ถŒ์žฅ์ƒ์‚ฐ๋Ÿ‰ | ๋…น์ƒ‰ | +| ์ตœ์ข…์ž…๊ณ ์ผ | | + +### 6.3 ์™„์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš ํƒญ (์˜ค๋ฅธ์ชฝ ํŒจ๋„) + +**์Šค์ผ€์ค„ ์˜ต์…˜**: +- ์•ˆ์ „๋ฆฌ๋“œํƒ€์ž„ (์ผ) +- ํ‘œ์‹œ ๊ธฐ๊ฐ„ (์ฃผ) +- ๋ฏธ์ง„ํ–‰ ๊ณ„ํš ์žฌ๊ณ„์‚ฐ ์ฒดํฌ๋ฐ•์Šค + +**๋ฒ”๋ก€**: +- ๊ณ„ํš (ํŒŒ๋ž€์ƒ‰) +- ์ง€์‹œ (์ฃผํ™ฉ์ƒ‰) +- ์ง„ํ–‰ (๋…น์ƒ‰) +- ์™„๋ฃŒ (ํšŒ์ƒ‰) +- ๋‚ฉ๊ธฐ์ผ (๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ) +- ๊ธด๊ธ‰ (๋นจ๊ฐ„ ์•„์ด์ฝ˜) + +**ํƒ€์ž„๋ผ์ธ ๊ตฌ์กฐ**: +- ๋‚ ์งœ๋ณ„ ํ—ค๋” (์ผ/์›” ํ‘œ์‹œ, ์ฃผ๋ง ๊ฐ•์กฐ, ์˜ค๋Š˜ ๊ฐ•์กฐ) +- ํ’ˆ๋ชฉ๋ณ„ ํ–‰ +- ์ƒ์‚ฐ๊ณ„ํš ๋ฐ” (๋“œ๋ž˜๊ทธ๋กœ ์ด๋™ ๊ฐ€๋Šฅ) +- ํด๋ฆญ ์‹œ ์ƒ์„ธ ๋ชจ๋‹ฌ ์˜คํ”ˆ + +**๋ฒ„ํŠผ**: +- `์ƒˆ๋กœ๊ณ ์นจ` +- `์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ`: ์„ ํƒ๋œ ํ’ˆ๋ชฉ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ ์ƒ์‚ฐ๊ณ„ํš ์ƒ์„ฑ +- `์„ ํƒ ๊ณ„ํš ๋ณ‘ํ•ฉ`: ๊ฐ™์€ ํ’ˆ๋ชฉ์˜ ๊ณ„ํš์„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉ +- `์„ ํƒ ํ’ˆ๋ชฉ โ†’ ๋ฐ˜์ œํ’ˆ ๊ณ„ํš`: BOM ๊ธฐ๋ฐ˜ ๋ฐ˜์ œํ’ˆ ๊ณ„ํš ์ƒ์„ฑ +- `์ €์žฅ` +- `์ดˆ๊ธฐํ™”` + +### 6.4 ๋ฐ˜์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš ํƒญ (์˜ค๋ฅธ์ชฝ ํŒจ๋„) + +**์˜ต์…˜**: +- ํ˜„์žฌ๊ณ  ๋ฐ ์•ˆ์ „์žฌ๊ณ  ๊ฐ์•ˆ +- ์ง„ํ–‰์ค‘์ธ ๊ณ„ํš ์œ ์ง€ํ•˜๊ณ  ์žฌ๊ณ„์‚ฐ +- ํˆฌ์ž… ์™„๋ฃŒ๋œ ๋ฐ˜์ œํ’ˆ ์ œ์™ธ + +**์•ˆ๋‚ด**: +- ์™„์ œํ’ˆ ์ƒ์‚ฐ๊ณ„ํš ๊ธฐ์ค€์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ˜์ œํ’ˆ ๊ณ„ํš ์ž๋™ ์ƒ์„ฑ +- ๋ชจํ’ˆ๋ชฉ ์ƒ์‚ฐ ์‹œ์ž‘์ผ ๊ณ ๋ คํ•˜์—ฌ ๋‚ฉ๊ธฐ์ผ ์„ค์ • +- BOM(์ž์žฌ๋ช…์„ธ์„œ) ์ •๋ณด ๊ธฐ๋ฐ˜ ํ•„์š” ์ˆ˜๋Ÿ‰ ๊ณ„์‚ฐ + +### 6.5 ์ƒ์‚ฐ ์Šค์ผ€์ค„ ์ƒ์„ธ ๋ชจ๋‹ฌ + +**๊ธฐ๋ณธ ์ •๋ณด**: +- ํ’ˆ๋ชฉ์ฝ”๋“œ (์ฝ๊ธฐ์ „์šฉ) +- ํ’ˆ๋ชฉ๋ช… (์ฝ๊ธฐ์ „์šฉ) + +**๊ทผ๊ฑฐ ์ •๋ณด**: +- ์ˆ˜์ฃผ๋ฒˆํ˜ธ, ์•ˆ์ „์žฌ๊ณ , ์žฌ๊ณ ๋ถ€์กฑ ๋“ฑ ํ‘œ์‹œ + +**์ƒ์‚ฐ ์ •๋ณด**: +- ์ด ์ƒ์‚ฐ์ˆ˜๋Ÿ‰ +- ๋‚ฉ๊ธฐ์ผ (์ฝ๊ธฐ์ „์šฉ) +- ๊ณ„ํš ์‹œ์ž‘์ผ (์ˆ˜์ • ๊ฐ€๋Šฅ) +- ๊ณ„ํš ์ข…๋ฃŒ์ผ (์ˆ˜์ • ๊ฐ€๋Šฅ) +- ์ƒ์‚ฐ ๊ธฐ๊ฐ„ (์ž๋™ ๊ณ„์‚ฐ) + +**๊ณผ๊ฑฐ ๊ณ„ํš ๊ฒฝ๊ณ **: +- ์‹œ์ž‘์ผ์ด ๊ณผ๊ฑฐ์ธ ๊ฒฝ์šฐ ๊ฒฝ๊ณ  ํ‘œ์‹œ +- `์˜ค๋Š˜๋ถ€ํ„ฐ ์žฌ์กฐ์ •` ๋ฒ„ํŠผ +- `์ž‘์—…์ง€์‹œ ์ฆ‰์‹œ ์ƒ์„ฑ` ๋ฒ„ํŠผ + +**๊ณ„ํš ๋ถ„ํ• **: +- ๋ถ„ํ•  ๊ฐœ์ˆ˜ ์„ ํƒ (2~4๊ฐœ) +- ๊ฐ ๋ถ„ํ•  ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ +- ๋ถ„ํ•  ์‹คํ–‰ + +**์„ค๋น„ ํ• ๋‹น**: +- ์„ค๋น„ ์„ ํƒ ๋ฒ„ํŠผ +- ์„ ํƒ๋œ ์„ค๋น„ ๋ชฉ๋ก + +**์ƒ์‚ฐ ์ƒํƒœ**: +- ์ƒํƒœ (์ž๋™ ๊ด€๋ฆฌ): ๊ณ„ํš๋จ/์ž‘์—…์ง€์‹œ/์ง„ํ–‰์ค‘/์™„๋ฃŒ + +**์ถ”๊ฐ€ ์ •๋ณด**: +- ๋‹ด๋‹น์ž +- ์ž‘์—…์ง€์‹œ๋ฒˆํ˜ธ +- ๋น„๊ณ  + +**๋ฒ„ํŠผ**: +- ์‚ญ์ œ +- ์ทจ์†Œ +- ์ €์žฅ + +--- + +## 7. ๊ตฌํ˜„ ์šฐ์„ ์ˆœ์œ„ + +### Phase 1: ๊ฐ„์†Œํ™” ๋ฒ„์ „ (ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ) + +V2 ์ปดํฌ๋„ŒํŠธ๋กœ ๊ธฐ๋ณธ CRUD ํ™”๋ฉด ๊ตฌํ˜„: +- ๊ฒ€์ƒ‰ ์œ„์ ฏ +- ๋‹จ์ผ ํ…Œ์ด๋ธ” (๊ทธ๋ฃนํ™” ์—†์Œ) +- ๊ธฐ๋ณธ ๋ชจ๋‹ฌ ํผ +- ์ƒํƒœ ๋ฐฐ์ง€ + +### Phase 2: ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ํ›„ + +1. `v2-tabs` ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ +2. `v2-split-panel` ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ +3. `v2-table-grouped` ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ + +### Phase 3: ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ + +1. `v2-timeline-scheduler` ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ +2. ๋“œ๋ž˜๊ทธ&๋“œ๋กญ ๊ธฐ๋Šฅ +3. ์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ ๋กœ์ง +4. ๋ฐ˜์ œํ’ˆ ์—ฐ๋™ + +--- + +## 8. ์ฐธ๊ณ  ์‚ฌํ•ญ + +### 8.1 ์ƒํƒœ ๋ฐฐ์ง€ ์Šคํƒ€์ผ + +| ์ƒํƒœ | ๋ฐฐ๊ฒฝ์ƒ‰ | ๊ธ€์ž์ƒ‰ | ์„ค๋ช… | +|------|--------|--------|------| +| ๊ณ„ํš | #dbeafe | #1e40af | ํŒŒ๋ž€์ƒ‰ | +| ์ง€์‹œ | #fef3c7 | #92400e | ์ฃผํ™ฉ์ƒ‰ | +| ์ง„ํ–‰ | #d1fae5 | #065f46 | ๋…น์ƒ‰ | +| ์™„๋ฃŒ | #f3f4f6 | #4b5563 | ํšŒ์ƒ‰ | +| ๊ธด๊ธ‰ | #fee2e2 | #991b1b | ๋นจ๊ฐ„์ƒ‰ | + +### 8.2 ์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ ๋กœ์ง + +``` +1. ์„ ํƒ๋œ ํ’ˆ๋ชฉ์˜ ํ•„์š” ์ƒ์‚ฐ์ˆ˜๋Ÿ‰ ๊ณ„์‚ฐ + - ํ•„์š”์ˆ˜๋Ÿ‰ = ์ž”๋Ÿ‰ + ์•ˆ์ „์žฌ๊ณ  - ํ˜„์žฌ๊ณ  - ๊ธฐ์ƒ์‚ฐ๊ณ„ํš๋Ÿ‰ + +2. ๋‚ฉ๊ธฐ์ผ์—์„œ ์•ˆ์ „๋ฆฌ๋“œํƒ€์ž„ ์ฐจ๊ฐํ•˜์—ฌ ์™„๋ฃŒ์ผ ๊ณ„์‚ฐ + +3. ์ผ์ผ ์ƒ์‚ฐ๋Šฅ๋ ฅ์œผ๋กœ ํ•„์š” ์ƒ์‚ฐ์ผ์ˆ˜ ๊ณ„์‚ฐ + +4. ์™„๋ฃŒ์ผ์—์„œ ์—ญ์‚ฐํ•˜์—ฌ ์‹œ์ž‘์ผ ๊ณ„์‚ฐ + +5. ์„ค๋น„ ๊ฐ€์šฉ์„ฑ ํ™•์ธ ๋ฐ ์ž๋™ ํ• ๋‹น + +6. ๋ฐ˜์ œํ’ˆ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ BOM ๊ธฐ๋ฐ˜ ๋ฐ˜์ œํ’ˆ ๊ณ„ํš ์ƒ์„ฑ +``` + +### 8.3 ๊ณ„ํš ๋ถ„ํ•  ๋กœ์ง + +``` +1. ์›๋ณธ ๊ณ„ํš์˜ ์ด ์ˆ˜๋Ÿ‰ ํ™•์ธ + +2. ๋ถ„ํ•  ๊ฐœ์ˆ˜ ์„ ํƒ (2~4๊ฐœ) + +3. ๊ฐ ๋ถ„ํ•  ์ˆ˜๋Ÿ‰ ์ž…๋ ฅ (ํ•ฉ๊ณ„ = ์›๋ณธ ์ˆ˜๋Ÿ‰) + +4. ๋ถ„ํ•  ์‹คํ–‰ ์‹œ: + - ์›๋ณธ ๊ณ„ํš ์‚ญ์ œ + - ์ƒˆ๋กœ์šด N๊ฐœ์˜ ๊ณ„ํš ์ƒ์„ฑ + - ๊ฐ๊ฐ ๋ณ„๋„์˜ ์‹œ์ž‘์ผ/์ข…๋ฃŒ์ผ ์„ค์ • ๊ฐ€๋Šฅ +``` + +--- + +## 9. DB INSERT JSON (๊ฐ„์†Œํ™” ๋ฒ„์ „) + +> โš ๏ธ ์ด JSON์€ **๊ฐ„์†Œํ™” ๋ฒ„์ „**์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์‹œ ๋ณ„๋„ ๊ฐœ๋ฐœ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. + +### 9.1 screen_definitions + +```json +{ + "screen_name": "์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ", + "screen_code": "{COMPANY_CODE}_PP_MAIN", + "table_name": "production_plan_mng", + "company_code": "{COMPANY_CODE}", + "description": "์ƒ์‚ฐ๊ณ„ํš ๊ด€๋ฆฌ ํ™”๋ฉด (๊ฐ„์†Œํ™” ๋ฒ„์ „)", + "is_active": "Y", + "db_source_type": "internal", + "data_source_type": "database" +} +``` + +### 9.2 screen_layouts_v2.layout_data (๊ฐ„์†Œํ™” ๋ฒ„์ „) + +```json +{ + "version": "2.0", + "components": [ + { + "id": "comp_search", + "url": "@/lib/registry/components/v2-table-search-widget", + "size": { "width": 1920, "height": 80 }, + "position": { "x": 0, "y": 20, "z": 1 }, + "overrides": { + "type": "v2-table-search-widget", + "label": "๊ฒ€์ƒ‰ ํ•„ํ„ฐ" + }, + "displayOrder": 0 + }, + { + "id": "comp_table", + "url": "@/lib/registry/components/v2-table-list", + "size": { "width": 1920, "height": 700 }, + "position": { "x": 0, "y": 120, "z": 1 }, + "overrides": { + "type": "v2-table-list", + "label": "์ƒ์‚ฐ๊ณ„ํš ๋ชฉ๋ก", + "columns": [ + { "columnName": "plan_no", "displayName": "๊ณ„ํš๋ฒˆํ˜ธ", "order": 0, "visible": true, "sortable": true, "format": "text", "align": "left" }, + { "columnName": "plan_date", "displayName": "๊ณ„ํš์ผ์ž", "order": 1, "visible": true, "sortable": true, "format": "date", "align": "center" }, + { "columnName": "item_code", "displayName": "ํ’ˆ๋ชฉ์ฝ”๋“œ", "order": 2, "visible": true, "sortable": true, "format": "text", "align": "left" }, + { "columnName": "item_name", "displayName": "ํ’ˆ๋ช…", "order": 3, "visible": true, "sortable": true, "format": "text", "align": "left" }, + { "columnName": "plan_qty", "displayName": "๊ณ„ํš์ˆ˜๋Ÿ‰", "order": 4, "visible": true, "sortable": true, "format": "number", "align": "right" }, + { "columnName": "start_date", "displayName": "์‹œ์ž‘์ผ", "order": 5, "visible": true, "sortable": true, "format": "date", "align": "center" }, + { "columnName": "end_date", "displayName": "์ข…๋ฃŒ์ผ", "order": 6, "visible": true, "sortable": true, "format": "date", "align": "center" }, + { "columnName": "due_date", "displayName": "๋‚ฉ๊ธฐ์ผ", "order": 7, "visible": true, "sortable": true, "format": "date", "align": "center" }, + { "columnName": "equipment_name", "displayName": "์„ค๋น„", "order": 8, "visible": true, "sortable": true, "format": "text", "align": "left" }, + { "columnName": "status", "displayName": "์ƒํƒœ", "order": 9, "visible": true, "sortable": true, "format": "text", "align": "center" }, + { "columnName": "product_type", "displayName": "์ œํ’ˆ์œ ํ˜•", "order": 10, "visible": true, "sortable": true, "format": "text", "align": "center" }, + { "columnName": "manager_name", "displayName": "๋‹ด๋‹น์ž", "order": 11, "visible": true, "sortable": true, "format": "text", "align": "left" } + ], + "selectedTable": "production_plan_mng", + "pagination": { "enabled": true, "pageSize": 20, "pageSizeOptions": [10, 20, 50, 100] }, + "checkbox": { "enabled": true, "multiple": true }, + "horizontalScroll": { "enabled": true, "minColumnWidth": 80, "maxColumnWidth": 200 } + }, + "displayOrder": 1 + }, + { + "id": "comp_btn_register", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 100, "height": 40 }, + "position": { "x": 1580, "y": 70, "z": 1 }, + "overrides": { + "text": "์‹ ๊ทœ ๋“ฑ๋ก", + "type": "v2-button-primary", + "action": { "type": "modal", "modalTitle": "์ƒ์‚ฐ๊ณ„ํš ๋“ฑ๋ก", "targetScreenId": null }, + "variant": "success" + }, + "displayOrder": 2 + }, + { + "id": "comp_btn_edit", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1690, "y": 70, "z": 1 }, + "overrides": { + "text": "์ˆ˜์ •", + "type": "v2-button-primary", + "action": { "type": "edit", "modalTitle": "์ƒ์‚ฐ๊ณ„ํš ์ˆ˜์ •", "targetScreenId": null }, + "variant": "secondary" + }, + "displayOrder": 3 + }, + { + "id": "comp_btn_delete", + "url": "@/lib/registry/components/v2-button-primary", + "size": { "width": 80, "height": 40 }, + "position": { "x": 1780, "y": 70, "z": 1 }, + "overrides": { + "text": "์‚ญ์ œ", + "type": "v2-button-primary", + "action": { "type": "delete" }, + "variant": "danger" + }, + "displayOrder": 4 + } + ] +} +``` + +--- + +## 10. ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### 10.1 ๊ฐ„์†Œํ™” ๋ฒ„์ „ (ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ) + +| ์ฒดํฌ | ํ•ญ๋ชฉ | ์„ค๋ช… | +|:----:|------|------| +| โ˜ | **ํ…Œ์ด๋ธ” ์ƒ์„ฑ** | `production_plan_mng` ํ…Œ์ด๋ธ” ์ƒ์„ฑ | +| โ˜ | **ํ™”๋ฉด ์ •์˜** | `screen_definitions` INSERT | +| โ˜ | **๋ชจ๋‹ฌ ํ™”๋ฉด ์ƒ์„ฑ** | ๋“ฑ๋ก/์ˆ˜์ • ๋ชจ๋‹ฌ ํ™”๋ฉด ์ƒ์„ฑ | +| โ˜ | **๋ฉ”์ธ ํ™”๋ฉด ์ƒ์„ฑ** | `screen_layouts_v2` INSERT | +| โ˜ | **๋ฉ”๋‰ด ์—ฐ๊ฒฐ** | ๋Œ€์ƒ ๋ฉ”๋‰ด์— ํ™”๋ฉด ํ• ๋‹น | +| โ˜ | **๊ธฐ๋ณธ CRUD ํ…Œ์ŠคํŠธ** | ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ/์กฐํšŒ ํ…Œ์ŠคํŠธ | + +### 10.2 ์ „์ฒด ๋ฒ„์ „ (ํ–ฅํ›„ ๊ตฌํ˜„) + +| ์ฒดํฌ | ํ•ญ๋ชฉ | ์„ค๋ช… | +|:----:|------|------| +| โ˜ | **v2-tabs ๊ฐœ๋ฐœ** | ํƒญ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ | +| โ˜ | **v2-split-panel ๊ฐœ๋ฐœ** | ๋ถ„ํ•  ํŒจ๋„ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ | +| โ˜ | **v2-table-grouped ๊ฐœ๋ฐœ** | ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ | +| โ˜ | **v2-timeline-scheduler ๊ฐœ๋ฐœ** | ํƒ€์ž„๋ผ์ธ ์Šค์ผ€์ค„๋Ÿฌ ๊ฐœ๋ฐœ | +| โ˜ | **์ž๋™ ์Šค์ผ€์ค„ ๋กœ์ง** | ์ž๋™ ์Šค์ผ€์ค„ ์ƒ์„ฑ ๋ฐฑ์—”๋“œ API | +| โ˜ | **๋ฐ˜์ œํ’ˆ ์—ฐ๋™** | BOM ๊ธฐ๋ฐ˜ ๋ฐ˜์ œํ’ˆ ๊ณ„ํš ์ƒ์„ฑ | +| โ˜ | **๋“œ๋ž˜๊ทธ&๋“œ๋กญ** | ํƒ€์ž„๋ผ์ธ ๋“œ๋ž˜๊ทธ ์ด๋™ ๊ธฐ๋Šฅ | + +--- + +## 11. ๊ด€๋ จ ๋ฌธ์„œ + +- [์ˆ˜์ฃผ๊ด€๋ฆฌ](../02_sales/order.md) +- [ํ’ˆ๋ชฉ์ •๋ณด](../01_master-data/item-info.md) +- [์„ค๋น„๊ด€๋ฆฌ](../05_equipment/equipment-info.md) (์˜ˆ์ •) +- [BOM๊ด€๋ฆฌ](../01_master-data/bom-info.md) (์˜ˆ์ •) diff --git a/docs/screen-implementation-guide/03_production/work-order.md b/docs/screen-implementation-guide/03_production/work-order.md new file mode 100644 index 00000000..47f3cd05 --- /dev/null +++ b/docs/screen-implementation-guide/03_production/work-order.md @@ -0,0 +1,194 @@ +# ์ž‘์—…์ง€์‹œ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ์ž‘์—…์ง€์‹œ +> **ํŒŒ์ผ**: ์ž‘์—…์ง€์‹œ.html +> **๋ถ„๋ฅ˜**: ์ƒ์‚ฐ๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โš ๏ธ ๋ถ€๋ถ„ (๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” ํ•„์š”) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +์ƒ์‚ฐ๊ณ„ํš์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์—…์ง€์‹œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ์ž‘์—…์ง€์‹œ ๋ชฉ๋ก ์กฐํšŒ (ํƒญ๋ณ„ ๊ตฌ๋ถ„) +- ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (์ž‘์—…์ผ์ž, ๊ณต์ •๋ณ„) +- ์ž‘์—…์ง€์‹œ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ +- ์ž‘์—…์ง€์‹œ์„œ ์ธ์‡„ +- ์‹ค์  ์—ฐ๊ณ„ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ธฐ๊ฐ„] [ํ’ˆ๋ชฉ] [๊ณต์ •] [์ž‘์—…์ƒํƒœโ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] [์‚ฌ์šฉ์ž์˜ต์…˜][์—‘์…€] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [์ „์ฒด] [๋Œ€๊ธฐ] [์ง„ํ–‰์ค‘] [์™„๋ฃŒ] [์ง€์—ฐ] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ์ž‘์—…์ง€์‹œ ๋ชฉ๋ก โ”‚ ๐Ÿ“„ ์ž‘์—…์ง€์‹œ ์ƒ์„ธ โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ [์ธ์‡„] [์‹œ์ž‘] [์™„๋ฃŒ] [์ˆ˜์ •] [์‚ญ์ œ] โ”‚ +โ”‚ Group by: [์ž‘์—…์ผ์žโ–ผ] โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ์ง€์‹œ๋ฒˆํ˜ธ: WO-2026-0001 โ”‚ +โ”‚ โ”‚โ–ผ 2026-01-30 (5) โ”‚ โ”‚ ํ’ˆ๋ชฉ๋ช…: ์ œํ’ˆA โ”‚ +โ”‚ โ”‚ WO-001|์ œํ’ˆA|๋Œ€๊ธฐโ”‚ โ”‚ ์ง€์‹œ์ˆ˜๋Ÿ‰: 100 EA โ”‚ +โ”‚ โ”‚ WO-002|์ œํ’ˆB|์ง„ํ–‰โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚โ–ผ 2026-01-31 (3) โ”‚ โ”‚ [์ž์žฌํˆฌ์ž…] [๊ณต์ •ํ˜„ํ™ฉ] [์‹ค์ ํ˜„ํ™ฉ] โ”‚ +โ”‚ โ”‚ WO-003|์ œํ’ˆC|๋Œ€๊ธฐโ”‚ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ [ํˆฌ์ž…์ž์žฌ ํ…Œ์ด๋ธ”] โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ์ƒํƒœ ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | +| ์ž‘์—…์ง€์‹œ ๋ชฉ๋ก (๊ทธ๋ฃนํ™”) | `v2-table-list` | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | +| ๋ถ„ํ•  ํŒจ๋„ | `v2-split-panel-layout` | โœ… ๊ฐ€๋Šฅ | +| ์ƒ์„ธ ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +### 4.1 ์ž‘์—…์ง€์‹œ ๋ชฉ๋ก + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'work_order_no', label: '์ง€์‹œ๋ฒˆํ˜ธ', width: 120 }, + { id: 'work_date', label: '์ž‘์—…์ผ', width: 100 }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 100 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'order_qty', label: '์ง€์‹œ์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'prod_qty', label: '์ƒ์‚ฐ์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'process_name', label: '๊ณต์ •', width: 100 }, + { id: 'status', label: '์ƒํƒœ', width: 80 }, + { id: 'worker', label: '์ž‘์—…์ž', width: 100 } +] +``` + +### 4.2 ์ž์žฌํˆฌ์ž… ํƒญ + +```typescript +materialColumns: [ + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 100 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'required_qty', label: '์†Œ์š”๋Ÿ‰', width: 100, align: 'right' }, + { id: 'issued_qty', label: 'ํˆฌ์ž…๋Ÿ‰', width: 100, align: 'right' }, + { id: 'unit', label: '๋‹จ์œ„', width: 60 }, + { id: 'warehouse', label: '์ถœ๊ณ ์ฐฝ๊ณ ', width: 100 } +] +``` + +--- + +## 5. ์ƒํƒœ ํƒญ + +```typescript +statusTabs: [ + { id: 'all', label: '์ „์ฒด', count: 25 }, + { id: 'waiting', label: '๋Œ€๊ธฐ', count: 10 }, + { id: 'progress', label: '์ง„ํ–‰์ค‘', count: 8 }, + { id: 'completed', label: '์™„๋ฃŒ', count: 5 }, + { id: 'delayed', label: '์ง€์—ฐ', count: 2 } +] +``` + +--- + +## 6. ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (v2-grouped-table ํ•„์š”) + +```typescript +groupByOptions: [ + { id: 'work_date', label: '์ž‘์—…์ผ์ž' }, + { id: 'process_name', label: '๊ณต์ •' }, + { id: 'item_type', label: 'ํ’ˆ๋ชฉ๊ตฌ๋ถ„' } +] +``` + +--- + +## 7. ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„ + +### โœ… ๊ฐ€๋Šฅ +- ๊ฒ€์ƒ‰ ์˜์—ญ +- ์ƒํƒœ ํƒญ ์ „ํ™˜ +- ๋ถ„ํ•  ํŒจ๋„ +- ์ƒ์„ธ ํƒญ +- ์ž์žฌํˆฌ์ž…/๊ณต์ •ํ˜„ํ™ฉ/์‹ค์ ํ˜„ํ™ฉ ํ…Œ์ด๋ธ” + +### โš ๏ธ ๋ถ€๋ถ„ ๊ฐ€๋Šฅ +- ์ž‘์—…์ง€์‹œ ๋ชฉ๋ก: ๊ทธ๋ฃนํ™” ์—†์ด ์ผ๋ฐ˜ ํ…Œ์ด๋ธ” + +### โŒ ๋ถˆ๊ฐ€๋Šฅ +- ๋™์  ๊ทธ๋ฃนํ™” + +--- + +## 8. ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "WORK_ORDER_MAIN", + "screen_name": "์ž‘์—…์ง€์‹œ", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 1 }, + "config": { + "searchFields": [ + { "type": "date", "id": "date_range", "placeholder": "๊ธฐ๊ฐ„", "dateRange": true }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ๋ช…" }, + { "type": "select", "id": "process", "placeholder": "๊ณต์ •" }, + { "type": "select", "id": "status", "placeholder": "์ƒํƒœ" } + ] + } + }, + { + "type": "v2-tabs-widget", + "position": { "x": 0, "y": 1, "w": 12, "h": 11 }, + "config": { + "tabs": [ + { "id": "all", "label": "์ „์ฒด" }, + { "id": "waiting", "label": "๋Œ€๊ธฐ" }, + { "id": "progress", "label": "์ง„ํ–‰์ค‘" }, + { "id": "completed", "label": "์™„๋ฃŒ" }, + { "id": "delayed", "label": "์ง€์—ฐ" } + ], + "tabContent": { + "type": "v2-split-panel-layout", + "config": { + "masterPanel": { + "title": "์ž‘์—…์ง€์‹œ ๋ชฉ๋ก", + "entityId": "work_order", + "columns": [ + { "id": "work_order_no", "label": "์ง€์‹œ๋ฒˆํ˜ธ" }, + { "id": "work_date", "label": "์ž‘์—…์ผ" }, + { "id": "item_name", "label": "ํ’ˆ๋ชฉ๋ช…" }, + { "id": "order_qty", "label": "์ง€์‹œ์ˆ˜๋Ÿ‰" }, + { "id": "status", "label": "์ƒํƒœ" } + ] + }, + "detailPanel": { + "tabs": [ + { "id": "material", "label": "์ž์žฌํˆฌ์ž…", "entityId": "work_order_material" }, + { "id": "process", "label": "๊ณต์ •ํ˜„ํ™ฉ", "entityId": "work_order_process" }, + { "id": "result", "label": "์‹ค์ ํ˜„ํ™ฉ", "entityId": "work_order_result" } + ] + } + } + } + } + } + ] +} +``` + +**v2-grouped-table ๊ฐœ๋ฐœ ์‹œ ์žฌํ™œ์šฉ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/04_purchase/.gitkeep b/docs/screen-implementation-guide/04_purchase/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/screen-implementation-guide/04_purchase/purchase-order.md b/docs/screen-implementation-guide/04_purchase/purchase-order.md new file mode 100644 index 00000000..225a331b --- /dev/null +++ b/docs/screen-implementation-guide/04_purchase/purchase-order.md @@ -0,0 +1,172 @@ +# ๋ฐœ์ฃผ๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ๋ฐœ์ฃผ๊ด€๋ฆฌ +> **ํŒŒ์ผ**: ๋ฐœ์ฃผ๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ๊ตฌ๋งค๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โœ… ์™„์ „ (ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +์ž์žฌ/์›์ž์žฌ ๋ฐœ์ฃผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ๋ฐœ์ฃผ ๋ชฉ๋ก ์กฐํšŒ/๊ฒ€์ƒ‰ +- ๋ฐœ์ฃผ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ +- ๋ฐœ์ฃผ์„œ ์ธ์‡„ +- ์ž…๊ณ  ์—ฐ๊ณ„ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ธฐ๊ฐ„] [๊ณต๊ธ‰์—…์ฒด] [๋ฐœ์ฃผ๋ฒˆํ˜ธ] [ํ’ˆ๋ชฉ๋ช…] [์ƒํƒœโ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][OCR][์—‘์…€] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ๋ฐœ์ฃผ ๋ชฉ๋ก [์‹ ๊ทœ๋“ฑ๋ก] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”‚โ–ก|๋ฐœ์ฃผ๋ฒˆํ˜ธ |๋ฐœ์ฃผ์ผ |๊ณต๊ธ‰์—…์ฒด |๋ฐœ์ฃผ๊ธˆ์•ก |์ƒํƒœ |๋‹ด๋‹น์žโ”‚ โ”‚ +โ”‚ โ”‚โ–ก|PO-2026..|2026-01-30|(์ฃผ)์›์ž์žฌ|5,000,000 |์ง„ํ–‰์ค‘|ํ™๊ธธ๋™โ”‚ โ”‚ +โ”‚ โ”‚โ–ก|PO-2026..|2026-01-29|(์ฃผ)๋ถ€ํ’ˆ์‚ฌ|3,200,000 |์™„๋ฃŒ |๊น€์ฒ ์ˆ˜โ”‚ โ”‚ +โ”‚ โ”‚โ–ก|PO-2026..|2026-01-28|(์ฃผ)์ž์žฌ์‚ฌ|1,800,000 |์ง„ํ–‰์ค‘|์ด์˜ํฌโ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ๋ฐœ์ฃผ ๋ชฉ๋ก | `v2-table-list` | โœ… ๊ฐ€๋Šฅ | +| ๋ฐœ์ฃผ ๋“ฑ๋ก ๋ชจ๋‹ฌ | `v2-modal-form` (ํ•„์š”) | โš ๏ธ ๋Œ€์ฒด ๊ฐ€๋Šฅ | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'po_no', label: '๋ฐœ์ฃผ๋ฒˆํ˜ธ', width: 120 }, + { id: 'po_date', label: '๋ฐœ์ฃผ์ผ', width: 100 }, + { id: 'supplier_name', label: '๊ณต๊ธ‰์—…์ฒด', width: 200 }, + { id: 'total_amount', label: '๋ฐœ์ฃผ๊ธˆ์•ก', width: 120, align: 'right', format: 'currency' }, + { id: 'delivery_date', label: '๋‚ฉ๊ธฐ์ผ', width: 100 }, + { id: 'status', label: '์ƒํƒœ', width: 80 }, + { id: 'receive_status', label: '์ž…๊ณ ์ƒํƒœ', width: 100 }, + { id: 'manager', label: '๋‹ด๋‹น์ž', width: 100 } +] +``` + +--- + +## 5. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์„ค์ • | +|--------|----------|------| +| ๊ธฐ๊ฐ„ | `v2-date` | dateRange: true | +| ๊ณต๊ธ‰์—…์ฒด | `v2-input` | placeholder: "๊ณต๊ธ‰์—…์ฒด" | +| ๋ฐœ์ฃผ๋ฒˆํ˜ธ | `v2-input` | placeholder: "๋ฐœ์ฃผ๋ฒˆํ˜ธ" | +| ํ’ˆ๋ชฉ๋ช… | `v2-input` | placeholder: "ํ’ˆ๋ชฉ๋ช…" | +| ์ƒํƒœ | `v2-select` | ์ž‘์„ฑ์ค‘, ๋ฐœ์ฃผ, ๋ถ€๋ถ„์ž…๊ณ , ์ž…๊ณ ์™„๋ฃŒ | + +--- + +## 6. ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "PO_MAIN", + "screen_name": "๋ฐœ์ฃผ๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 2 }, + "config": { + "searchFields": [ + { "type": "date", "id": "date_range", "placeholder": "๋ฐœ์ฃผ๊ธฐ๊ฐ„", "dateRange": true }, + { "type": "input", "id": "supplier_name", "placeholder": "๊ณต๊ธ‰์—…์ฒด" }, + { "type": "input", "id": "po_no", "placeholder": "๋ฐœ์ฃผ๋ฒˆํ˜ธ" }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ๋ช…" }, + { "type": "select", "id": "status", "placeholder": "์ƒํƒœ" } + ], + "buttons": [ + { "label": "์ดˆ๊ธฐํ™”", "action": "reset", "variant": "outline" }, + { "label": "์กฐํšŒ", "action": "search", "variant": "primary" } + ], + "rightButtons": [ + { "label": "์‚ฌ์šฉ์ž์˜ต์…˜", "action": "userOptions" }, + { "label": "OCR์ž…๋ ฅ", "action": "ocr" }, + { "label": "์—‘์…€๋‹ค์šด๋กœ๋“œ", "action": "excelDownload" } + ] + } + }, + { + "type": "v2-table-list", + "position": { "x": 0, "y": 2, "w": 12, "h": 10 }, + "config": { + "title": "๋ฐœ์ฃผ ๋ชฉ๋ก", + "entityId": "purchase_order", + "buttons": [ + { "label": "์‹ ๊ทœ๋“ฑ๋ก", "action": "create", "variant": "primary" } + ], + "columns": [ + { "id": "po_no", "label": "๋ฐœ์ฃผ๋ฒˆํ˜ธ", "width": 120 }, + { "id": "po_date", "label": "๋ฐœ์ฃผ์ผ", "width": 100 }, + { "id": "supplier_name", "label": "๊ณต๊ธ‰์—…์ฒด", "width": 200 }, + { "id": "total_amount", "label": "๋ฐœ์ฃผ๊ธˆ์•ก", "width": 120, "align": "right" }, + { "id": "delivery_date", "label": "๋‚ฉ๊ธฐ์ผ", "width": 100 }, + { "id": "status", "label": "์ƒํƒœ", "width": 80 }, + { "id": "manager", "label": "๋‹ด๋‹น์ž", "width": 100 } + ], + "rowActions": [ + { "label": "์ƒ์„ธ", "action": "view" }, + { "label": "์ˆ˜์ •", "action": "edit" }, + { "label": "์‚ญ์ œ", "action": "delete" } + ] + } + } + ] +} +``` + +--- + +## 7. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” + +### purchase_order (๋ฐœ์ฃผ ํ—ค๋”) +```sql +CREATE TABLE purchase_order ( + id SERIAL PRIMARY KEY, + company_code VARCHAR(20) NOT NULL, + po_no VARCHAR(50) NOT NULL, + po_date DATE NOT NULL, + supplier_code VARCHAR(50), + supplier_name VARCHAR(200), + total_amount NUMERIC(15,2), + tax_amount NUMERIC(15,2), + status VARCHAR(20) DEFAULT 'draft', + delivery_date DATE, + manager VARCHAR(100), + remark TEXT, + created_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +--- + +## 8. ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +- [x] ๊ฒ€์ƒ‰ ์˜์—ญ: v2-table-search-widget +- [x] ๋ฐœ์ฃผ ๋ชฉ๋ก ํ…Œ์ด๋ธ”: v2-table-list +- [x] ์ปฌ๋Ÿผ ์ •๋ ฌ/ํ•„ํ„ฐ +- [ ] ๋ฐœ์ฃผ ๋“ฑ๋ก ๋ชจ๋‹ฌ +- [ ] OCR ์ž…๋ ฅ ๊ธฐ๋Šฅ (๋ณ„๋„) +- [ ] ์ธ์‡„ ๊ธฐ๋Šฅ + +**ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/05_equipment/.gitkeep b/docs/screen-implementation-guide/05_equipment/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/screen-implementation-guide/05_equipment/equipment-info.md b/docs/screen-implementation-guide/05_equipment/equipment-info.md new file mode 100644 index 00000000..70405df8 --- /dev/null +++ b/docs/screen-implementation-guide/05_equipment/equipment-info.md @@ -0,0 +1,244 @@ +# ์„ค๋น„์ •๋ณด ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ์„ค๋น„์ •๋ณด +> **ํŒŒ์ผ**: ์„ค๋น„์ •๋ณด.html +> **๋ถ„๋ฅ˜**: ์„ค๋น„๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โœ… ์™„์ „ (v2-card-display ํ™œ์šฉ) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +์ƒ์‚ฐ ์„ค๋น„์˜ ๊ธฐ๋ณธ์ •๋ณด ๋ฐ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ์„ค๋น„ ๋ชฉ๋ก ์กฐํšŒ (์นด๋“œ ํ˜•ํƒœ) +- ์„ค๋น„ ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ +- ์„ค๋น„ ์ƒ์„ธ ์ •๋ณด ํƒญ ๊ด€๋ฆฌ +- ์„ค๋น„ ์ด๋ฏธ์ง€ ๊ด€๋ฆฌ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [์„ค๋น„์ฝ”๋“œ] [์„ค๋น„๋ช…] [์„ค๋น„์œ ํ˜•โ–ผ] [์ƒํƒœโ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][์—…๋กœ๋“œ][๋‹ค์šด๋กœ๋“œ]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿญ ์„ค๋น„ ๋ชฉ๋ก โ”‚ [๊ธฐ๋ณธ์ •๋ณด][๋ณด์ „์ด๋ ฅ][์ ๊ฒ€์ด๋ ฅ][๊ฐ€๋™ํ˜„ํ™ฉ] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ [์‹ ๊ทœ๋“ฑ๋ก] โ”‚ ์„ค๋น„์ฝ”๋“œ: EQ-001 โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ์„ค๋น„๋ช…: CNC ๋ฐ€๋ง๋จธ์‹  1ํ˜ธ๊ธฐ โ”‚ +โ”‚ โ”‚ [์ด๋ฏธ์ง€] EQ-001 โ”‚ โ”‚ ์„ค๋น„์œ ํ˜•: ๊ฐ€๊ณต์„ค๋น„ โ”‚ +โ”‚ โ”‚ CNC ๋ฐ€๋ง [๊ฐ€๋™์ค‘] โ”‚ โ”‚ ์ƒํƒœ: ๊ฐ€๋™์ค‘ โ”‚ +โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ ์ œ์กฐ์‚ฌ: ํ˜„๋Œ€๊ณต์ž‘๊ธฐ๊ณ„ โ”‚ +โ”‚ โ”‚ [์ด๋ฏธ์ง€] EQ-002 โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ โ”‚ ์„ ๋ฐ˜ 1ํ˜ธ [์ ๊ฒ€์ค‘] โ”‚ โ”‚ [๋ณด์ „์ด๋ ฅ ํ…Œ์ด๋ธ”] โ”‚ +โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚์ผ์ž |์œ ํ˜• |๋‚ด์šฉ |๋‹ด๋‹น์žโ”‚ โ”‚ +โ”‚ โ”‚ [์ด๋ฏธ์ง€] EQ-003 โ”‚ โ”‚ โ”‚2026-01|์ •๊ธฐ |์˜ค์ผ ๊ตํ™˜ |๊น€์ฒ ์ˆ˜โ”‚ โ”‚ +โ”‚ โ”‚ ํ”„๋ ˆ์Šค [๊ณ ์žฅ] โ”‚ โ”‚ โ”‚2026-01|์ˆ˜๋ฆฌ |๋ฒ ์–ด๋ง ๊ต์ฒด |์ด์˜ํฌโ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ์„ค๋น„ ์นด๋“œ ๋ชฉ๋ก | `v2-card-display` | โœ… ๊ฐ€๋Šฅ | +| ๋ถ„ํ•  ํŒจ๋„ | `v2-split-panel-layout` | โœ… ๊ฐ€๋Šฅ | +| ์ƒ์„ธ ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | + +--- + +## 4. ์„ค๋น„ ์นด๋“œ ๊ตฌ์กฐ + +```typescript +interface EquipmentCard { + id: string; + image: string; // ์„ค๋น„ ์ด๋ฏธ์ง€ URL + code: string; // ์„ค๋น„์ฝ”๋“œ + name: string; // ์„ค๋น„๋ช… + type: string; // ์„ค๋น„์œ ํ˜• + status: 'running' | 'idle' | 'maintenance' | 'broken'; + location: string; +} + +// ์ƒํƒœ๋ณ„ ์Šคํƒ€์ผ +statusStyles: { + running: { bg: '#d1fae5', color: '#065f46', label: '๊ฐ€๋™์ค‘' }, + idle: { bg: '#e5e7eb', color: '#374151', label: '๋Œ€๊ธฐ์ค‘' }, + maintenance: { bg: '#fef3c7', color: '#92400e', label: '์ ๊ฒ€์ค‘' }, + broken: { bg: '#fee2e2', color: '#991b1b', label: '๊ณ ์žฅ' } +} +``` + +--- + +## 5. ์ƒ์„ธ ํƒญ ๊ตฌ์„ฑ + +```typescript +tabs: [ + { + id: 'basic', + label: '๊ธฐ๋ณธ์ •๋ณด', + fields: [ + { id: 'eq_code', label: '์„ค๋น„์ฝ”๋“œ' }, + { id: 'eq_name', label: '์„ค๋น„๋ช…' }, + { id: 'eq_type', label: '์„ค๋น„์œ ํ˜•' }, + { id: 'status', label: '์ƒํƒœ' }, + { id: 'manufacturer', label: '์ œ์กฐ์‚ฌ' }, + { id: 'model', label: '๋ชจ๋ธ๋ช…' }, + { id: 'serial_no', label: '์‹œ๋ฆฌ์–ผ๋ฒˆํ˜ธ' }, + { id: 'install_date', label: '์„ค์น˜์ผ' }, + { id: 'location', label: '์„ค์น˜์œ„์น˜' }, + { id: 'manager', label: '๋‹ด๋‹น์ž' } + ] + }, + { + id: 'maintenance', + label: '๋ณด์ „์ด๋ ฅ', + type: 'table', + entityId: 'equipment_maintenance', + columns: [ + { id: 'date', label: '์ผ์ž' }, + { id: 'type', label: '์œ ํ˜•' }, + { id: 'content', label: '๋‚ด์šฉ' }, + { id: 'worker', label: '๋‹ด๋‹น์ž' }, + { id: 'cost', label: '๋น„์šฉ' } + ] + }, + { + id: 'inspection', + label: '์ ๊ฒ€์ด๋ ฅ', + type: 'table', + entityId: 'equipment_inspection' + }, + { + id: 'operation', + label: '๊ฐ€๋™ํ˜„ํ™ฉ', + type: 'chart' // ํ–ฅํ›„ ํ™•์žฅ + } +] +``` + +--- + +## 6. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์˜ต์…˜ | +|--------|----------|------| +| ์„ค๋น„์ฝ”๋“œ | `v2-input` | placeholder: "์„ค๋น„์ฝ”๋“œ" | +| ์„ค๋น„๋ช… | `v2-input` | placeholder: "์„ค๋น„๋ช…" | +| ์„ค๋น„์œ ํ˜• | `v2-select` | ๊ฐ€๊ณต์„ค๋น„, ์กฐ๋ฆฝ์„ค๋น„, ๊ฒ€์‚ฌ์„ค๋น„ ๋“ฑ | +| ์ƒํƒœ | `v2-select` | ๊ฐ€๋™์ค‘, ๋Œ€๊ธฐ์ค‘, ์ ๊ฒ€์ค‘, ๊ณ ์žฅ | + +--- + +## 7. ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„ + +### โœ… ๊ฐ€๋Šฅ +- ๊ฒ€์ƒ‰ ์˜์—ญ: `v2-table-search-widget` +- ์„ค๋น„ ์นด๋“œ ๋ชฉ๋ก: `v2-card-display` (์ด๋ฏธ์ง€+์ •๋ณด ์กฐํ•ฉ ์ง€์›) +- ๋ถ„ํ•  ํŒจ๋„ ๋ ˆ์ด์•„์›ƒ: `v2-split-panel-layout` +- ์ƒ์„ธ ํƒญ: `v2-tabs-widget` +- ๋ณด์ „์ด๋ ฅ/์ ๊ฒ€์ด๋ ฅ ํ…Œ์ด๋ธ”: `v2-table-list` + +### โš ๏ธ ๋ถ€๋ถ„ ๊ฐ€๋Šฅ +- ๊ฐ€๋™ํ˜„ํ™ฉ ์ฐจํŠธ: ๋ณ„๋„ ์ฐจํŠธ ์ปดํฌ๋„ŒํŠธ ํ•„์š” + +--- + +## 8. ํ…Œ์ด๋ธ” ๋Œ€์ฒด ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "EQUIPMENT_MAIN", + "screen_name": "์„ค๋น„์ •๋ณด", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 2 }, + "config": { + "searchFields": [ + { "type": "input", "id": "eq_code", "placeholder": "์„ค๋น„์ฝ”๋“œ" }, + { "type": "input", "id": "eq_name", "placeholder": "์„ค๋น„๋ช…" }, + { "type": "select", "id": "eq_type", "placeholder": "์„ค๋น„์œ ํ˜•" }, + { "type": "select", "id": "status", "placeholder": "์ƒํƒœ", + "options": [ + { "value": "running", "label": "๊ฐ€๋™์ค‘" }, + { "value": "idle", "label": "๋Œ€๊ธฐ์ค‘" }, + { "value": "maintenance", "label": "์ ๊ฒ€์ค‘" }, + { "value": "broken", "label": "๊ณ ์žฅ" } + ] + } + ] + } + }, + { + "type": "v2-split-panel-layout", + "position": { "x": 0, "y": 2, "w": 12, "h": 10 }, + "config": { + "masterPanel": { + "title": "์„ค๋น„ ๋ชฉ๋ก", + "entityId": "equipment", + "buttons": [ + { "label": "์‹ ๊ทœ๋“ฑ๋ก", "action": "create", "variant": "primary" } + ], + "columns": [ + { "id": "eq_code", "label": "์„ค๋น„์ฝ”๋“œ", "width": 100 }, + { "id": "eq_name", "label": "์„ค๋น„๋ช…", "width": 200 }, + { "id": "eq_type", "label": "์„ค๋น„์œ ํ˜•", "width": 100 }, + { "id": "status", "label": "์ƒํƒœ", "width": 80 }, + { "id": "location", "label": "์„ค์น˜์œ„์น˜", "width": 150 } + ] + }, + "detailPanel": { + "tabs": [ + { "id": "basic", "label": "๊ธฐ๋ณธ์ •๋ณด", "type": "form" }, + { "id": "maintenance", "label": "๋ณด์ „์ด๋ ฅ", "type": "table", "entityId": "eq_maintenance" }, + { "id": "inspection", "label": "์ ๊ฒ€์ด๋ ฅ", "type": "table", "entityId": "eq_inspection" }, + { "id": "operation", "label": "๊ฐ€๋™ํ˜„ํ™ฉ", "type": "custom" } + ] + } + } + } + ] +} +``` + +--- + +## 9. v2-card-display ์„ค์ • ์˜ˆ์‹œ + +`v2-card-display`๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. + +```typescript +// v2-card-display ์„ค์ • +cardDisplayConfig: { + cardsPerRow: 3, + cardSpacing: 16, + cardStyle: { + showTitle: true, // eq_name ํ‘œ์‹œ + showSubtitle: true, // eq_code ํ‘œ์‹œ + showDescription: true, + showImage: true, // ์„ค๋น„ ์ด๋ฏธ์ง€ ํ‘œ์‹œ + showActions: true, + imagePosition: "top", + imageSize: "medium", + }, + columnMapping: { + title: "eq_name", + subtitle: "eq_code", + image: "image_url", + status: "status" + }, + dataSource: "table" +} +``` + +**ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ์™„์ „ ๊ตฌํ˜„ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/06_logistics/.gitkeep b/docs/screen-implementation-guide/06_logistics/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/screen-implementation-guide/06_logistics/inout.md b/docs/screen-implementation-guide/06_logistics/inout.md new file mode 100644 index 00000000..943e07a4 --- /dev/null +++ b/docs/screen-implementation-guide/06_logistics/inout.md @@ -0,0 +1,179 @@ +# ์ž…์ถœ๊ณ ๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ์ž…์ถœ๊ณ ๊ด€๋ฆฌ +> **ํŒŒ์ผ**: ์ž…์ถœ๊ณ ๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ๋ฌผ๋ฅ˜๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โš ๏ธ ๋ถ€๋ถ„ (๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” ํ•„์š”) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +์ž์žฌ/์ œํ’ˆ์˜ ์ž…๊ณ  ๋ฐ ์ถœ๊ณ  ๋‚ด์—ญ์„ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ์ž…์ถœ๊ณ  ๋‚ด์—ญ ์กฐํšŒ/๊ฒ€์ƒ‰ +- ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (์ž…์ถœ๊ณ ๊ตฌ๋ถ„, ์ฐฝ๊ณ , ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„) +- ์—‘์…€ ์—…๋กœ๋“œ/๋‹ค์šด๋กœ๋“œ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [์ž…์ถœ๊ณ ๊ตฌ๋ถ„โ–ผ][์นดํ…Œ๊ณ ๋ฆฌโ–ผ][์ฐฝ๊ณ โ–ผ][ํ’ˆ๋ชฉ์ฝ”๋“œ][ํ’ˆ๋ชฉ๋ช…][๊ธฐ๊ฐ„][์ดˆ๊ธฐํ™”][๊ฒ€์ƒ‰]โ”‚ +โ”‚ [์‚ฌ์šฉ์ž์˜ต์…˜][์—…๋กœ๋“œ][๋‹ค์šด๋กœ๋“œ]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ์ž…์ถœ๊ณ  ๋‚ด์—ญ ์ „์ฒด 150๊ฑด โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ Group by: [์ž…์ถœ๊ณ ๊ตฌ๋ถ„โ–ผ] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”‚โ–ผ ์ž…๊ณ  (80) โ”‚ +โ”‚ โ”‚ โ”‚IN-001|๊ตฌ๋งค์ž…๊ณ |2026-01-30|๋ณธ์‚ฌ์ฐฝ๊ณ |P-001|์›์ž์žฌA|100|KG โ”‚ +โ”‚ โ”‚ โ”‚IN-002|์ƒ์‚ฐ์ž…๊ณ |2026-01-30|์ œ1์ฐฝ๊ณ |P-002|์ œํ’ˆA |50 |EA โ”‚ +โ”‚ โ”‚โ–ผ ์ถœ๊ณ  (70) โ”‚ +โ”‚ โ”‚ โ”‚OUT-001|ํŒ๋งค์ถœ๊ณ |2026-01-30|๋ณธ์‚ฌ์ฐฝ๊ณ |P-003|์ œํ’ˆB|30|EA โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ์ž…์ถœ๊ณ  ๋ชฉ๋ก (๊ทธ๋ฃนํ™”) | `v2-table-list` | โš ๏ธ ๊ทธ๋ฃนํ™” ๋ฏธ์ง€์› | + +--- + +## 4. ํ…Œ์ด๋ธ” ์ •์˜ + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'inout_type', label: '์ž…์ถœ๊ณ ๊ตฌ๋ถ„', width: 100 }, + { id: 'category', label: '์นดํ…Œ๊ณ ๋ฆฌ', width: 120 }, + { id: 'doc_no', label: '์ „ํ‘œ๋ฒˆํ˜ธ', width: 120 }, + { id: 'process_date', label: '์ฒ˜๋ฆฌ์ผ์ž', width: 100 }, + { id: 'warehouse', label: '์ฐฝ๊ณ ', width: 120 }, + { id: 'location', label: '์œ„์น˜', width: 100 }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 120 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'quantity', label: '์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'unit', label: '๋‹จ์œ„', width: 60 }, + { id: 'lot_no', label: '๋กœํŠธ๋ฒˆํ˜ธ', width: 120 }, + { id: 'customer', label: '๊ฑฐ๋ž˜์ฒ˜', width: 120 }, + { id: 'manager', label: '๋‹ด๋‹น์ž', width: 100 }, + { id: 'remark', label: '๋น„๊ณ ', width: 200 } +] +``` + +--- + +## 5. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์˜ต์…˜ | +|--------|----------|------| +| ์ž…์ถœ๊ณ ๊ตฌ๋ถ„ | `v2-select` | ์ž…๊ณ , ์ถœ๊ณ  | +| ์นดํ…Œ๊ณ ๋ฆฌ | `v2-select` | ๊ตฌ๋งค์ž…๊ณ , ์ƒ์‚ฐ์ž…๊ณ , ๋ฐ˜ํ’ˆ์ž…๊ณ , ํŒ๋งค์ถœ๊ณ , ์ƒ์‚ฐ์ถœ๊ณ  ๋“ฑ | +| ์ฐฝ๊ณ  | `v2-select` | ๋ณธ์‚ฌ์ฐฝ๊ณ , ์ œ1์ฐฝ๊ณ , ์ œ2์ฐฝ๊ณ  | +| ํ’ˆ๋ชฉ์ฝ”๋“œ | `v2-input` | - | +| ํ’ˆ๋ชฉ๋ช… | `v2-input` | - | +| ๊ธฐ๊ฐ„ | `v2-date` | dateRange: true | + +--- + +## 6. ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ (v2-grouped-table ํ•„์š”) + +```typescript +groupByOptions: [ + { id: 'inout_type', label: '์ž…์ถœ๊ณ ๊ตฌ๋ถ„' }, + { id: 'category', label: '์นดํ…Œ๊ณ ๋ฆฌ' }, + { id: 'warehouse', label: '์ฐฝ๊ณ ' }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ' }, + { id: 'process_date', label: '์ฒ˜๋ฆฌ์ผ์ž' }, + { id: 'customer', label: '๊ฑฐ๋ž˜์ฒ˜' } +] +``` + +--- + +## 7. ํ˜„์žฌ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋ฒ”์œ„ + +### โœ… ๊ฐ€๋Šฅ +- ๊ฒ€์ƒ‰ ์˜์—ญ +- ์ผ๋ฐ˜ ํ…Œ์ด๋ธ” ๋ชฉ๋ก + +### โš ๏ธ ๋ถ€๋ถ„ ๊ฐ€๋Šฅ +- ๊ทธ๋ฃนํ™” ์—†์ด ํ•„ํ„ฐ๋กœ ๋Œ€์ฒด + +### โŒ ๋ถˆ๊ฐ€๋Šฅ +- ๋™์  ๊ทธ๋ฃนํ™” + +--- + +## 8. ๊ฐ„์†Œํ™” ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "INOUT_MAIN", + "screen_name": "์ž…์ถœ๊ณ ๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 2 }, + "config": { + "searchFields": [ + { "type": "select", "id": "inout_type", "placeholder": "์ž…์ถœ๊ณ ๊ตฌ๋ถ„", + "options": [ + { "value": "IN", "label": "์ž…๊ณ " }, + { "value": "OUT", "label": "์ถœ๊ณ " } + ] + }, + { "type": "select", "id": "category", "placeholder": "์นดํ…Œ๊ณ ๋ฆฌ", + "options": [ + { "value": "purchase", "label": "๊ตฌ๋งค์ž…๊ณ " }, + { "value": "production_in", "label": "์ƒ์‚ฐ์ž…๊ณ " }, + { "value": "return_in", "label": "๋ฐ˜ํ’ˆ์ž…๊ณ " }, + { "value": "sales", "label": "ํŒ๋งค์ถœ๊ณ " }, + { "value": "production_out", "label": "์ƒ์‚ฐ์ถœ๊ณ " } + ] + }, + { "type": "select", "id": "warehouse", "placeholder": "์ฐฝ๊ณ " }, + { "type": "input", "id": "item_code", "placeholder": "ํ’ˆ๋ชฉ์ฝ”๋“œ" }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ๋ช…" }, + { "type": "date", "id": "date_range", "placeholder": "์ฒ˜๋ฆฌ์ผ์ž", "dateRange": true } + ], + "buttons": [ + { "label": "์ดˆ๊ธฐํ™”", "action": "reset" }, + { "label": "๊ฒ€์ƒ‰", "action": "search", "variant": "primary" } + ] + } + }, + { + "type": "v2-table-list", + "position": { "x": 0, "y": 2, "w": 12, "h": 10 }, + "config": { + "title": "์ž…์ถœ๊ณ  ๋‚ด์—ญ", + "entityId": "inventory_transaction", + "showTotalCount": true, + "columns": [ + { "id": "inout_type", "label": "์ž…์ถœ๊ณ ๊ตฌ๋ถ„", "width": 100 }, + { "id": "category", "label": "์นดํ…Œ๊ณ ๋ฆฌ", "width": 120 }, + { "id": "doc_no", "label": "์ „ํ‘œ๋ฒˆํ˜ธ", "width": 120 }, + { "id": "process_date", "label": "์ฒ˜๋ฆฌ์ผ์ž", "width": 100 }, + { "id": "warehouse", "label": "์ฐฝ๊ณ ", "width": 120 }, + { "id": "item_code", "label": "ํ’ˆ๋ชฉ์ฝ”๋“œ", "width": 120 }, + { "id": "item_name", "label": "ํ’ˆ๋ชฉ๋ช…", "width": 200 }, + { "id": "quantity", "label": "์ˆ˜๋Ÿ‰", "width": 100, "align": "right" }, + { "id": "unit", "label": "๋‹จ์œ„", "width": 60 } + ] + } + } + ] +} +``` + +**v2-grouped-table ๊ฐœ๋ฐœ ์‹œ ๊ทธ๋ฃนํ™” ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/07_quality/.gitkeep b/docs/screen-implementation-guide/07_quality/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/docs/screen-implementation-guide/07_quality/inspection.md b/docs/screen-implementation-guide/07_quality/inspection.md new file mode 100644 index 00000000..a2fdc95d --- /dev/null +++ b/docs/screen-implementation-guide/07_quality/inspection.md @@ -0,0 +1,169 @@ +# ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ + +> **ํ™”๋ฉด๋ช…**: ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ +> **ํŒŒ์ผ**: ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ.html +> **๋ถ„๋ฅ˜**: ํ’ˆ์งˆ๊ด€๋ฆฌ +> **๊ตฌํ˜„ ๊ฐ€๋Šฅ**: โœ… ์™„์ „ (ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ) + +--- + +## 1. ํ™”๋ฉด ๊ฐœ์š” + +ํ’ˆ์งˆ ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ๊ธฐ๋Šฅ +- ๊ฒ€์‚ฌ ์œ ํ˜•๋ณ„ ํƒญ (์ˆ˜์ž…๊ฒ€์‚ฌ, ๊ณต์ •๊ฒ€์‚ฌ, ์ถœํ•˜๊ฒ€์‚ฌ) +- ๊ฒ€์‚ฌ ๊ฒฐ๊ณผ ๋“ฑ๋ก/์ˆ˜์ • +- ๋ถˆ๋Ÿ‰ ์ฒ˜๋ฆฌ ์—ฐ๊ณ„ +- ๊ฒ€์‚ฌ ์ด๋ ฅ ๊ด€๋ฆฌ + +--- + +## 2. ํ™”๋ฉด ๋ ˆ์ด์•„์›ƒ + +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ธฐ๊ฐ„] [ํ’ˆ๋ชฉ] [๊ฑฐ๋ž˜์ฒ˜] [๊ฒ€์‚ฌ๊ฒฐ๊ณผโ–ผ] [์ดˆ๊ธฐํ™”][์กฐํšŒ] [์‚ฌ์šฉ์ž์˜ต์…˜][์—‘์…€]โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ [๐Ÿ”์ˆ˜์ž…๊ฒ€์‚ฌ(25)][โš™๏ธ๊ณต์ •๊ฒ€์‚ฌ(18)][๐Ÿ“ฆ์ถœํ•˜๊ฒ€์‚ฌ(12)] โ”‚ +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ๐Ÿ“‹ ์ˆ˜์ž…๊ฒ€์‚ฌ ๋ชฉ๋ก [์‹ ๊ทœ๋“ฑ๋ก] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ”‚โ–ก|๊ฒ€์‚ฌ๋ฒˆํ˜ธ |๊ฒ€์‚ฌ์ผ |ํ’ˆ๋ชฉ๋ช… |๊ฒ€์‚ฌ์ˆ˜๋Ÿ‰|ํ•ฉ๊ฒฉ์ˆ˜๋Ÿ‰|๋ถˆ๋Ÿ‰์ˆ˜๋Ÿ‰|๊ฒฐ๊ณผโ”‚ +โ”‚ โ”‚โ–ก|IQC-001 |2026-01-30|์›์ž์žฌA |100 |98 |2 |ํ•ฉ๊ฒฉโ”‚ +โ”‚ โ”‚โ–ก|IQC-002 |2026-01-30|์›์ž์žฌB |200 |195 |5 |ํ•ฉ๊ฒฉโ”‚ +โ”‚ โ”‚โ–ก|IQC-003 |2026-01-29|๋ถ€ํ’ˆC |50 |30 |20 |๋ถˆํ•ฉ๊ฒฉโ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +## 3. V2 ์ปดํฌ๋„ŒํŠธ ๋งคํ•‘ + +| HTML ์˜์—ญ | V2 ์ปดํฌ๋„ŒํŠธ | ์ƒํƒœ | +|-----------|-------------|------| +| ๊ฒ€์ƒ‰ ์„น์…˜ | `v2-table-search-widget` | โœ… ๊ฐ€๋Šฅ | +| ๊ฒ€์‚ฌ์œ ํ˜• ํƒญ | `v2-tabs-widget` | โœ… ๊ฐ€๋Šฅ | +| ๊ฒ€์‚ฌ ๋ชฉ๋ก | `v2-table-list` | โœ… ๊ฐ€๋Šฅ | + +--- + +## 4. ํƒญ ๊ตฌ์„ฑ + +```typescript +tabs: [ + { id: 'incoming', label: '์ˆ˜์ž…๊ฒ€์‚ฌ', icon: '๐Ÿ”', count: 25 }, + { id: 'process', label: '๊ณต์ •๊ฒ€์‚ฌ', icon: 'โš™๏ธ', count: 18 }, + { id: 'shipping', label: '์ถœํ•˜๊ฒ€์‚ฌ', icon: '๐Ÿ“ฆ', count: 12 } +] +``` + +--- + +## 5. ํ…Œ์ด๋ธ” ์ •์˜ + +```typescript +columns: [ + { id: 'checkbox', type: 'checkbox', width: 50 }, + { id: 'inspect_no', label: '๊ฒ€์‚ฌ๋ฒˆํ˜ธ', width: 120 }, + { id: 'inspect_date', label: '๊ฒ€์‚ฌ์ผ', width: 100 }, + { id: 'item_code', label: 'ํ’ˆ๋ชฉ์ฝ”๋“œ', width: 100 }, + { id: 'item_name', label: 'ํ’ˆ๋ชฉ๋ช…', width: 200 }, + { id: 'lot_no', label: '๋กœํŠธ๋ฒˆํ˜ธ', width: 120 }, + { id: 'inspect_qty', label: '๊ฒ€์‚ฌ์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'pass_qty', label: 'ํ•ฉ๊ฒฉ์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'fail_qty', label: '๋ถˆ๋Ÿ‰์ˆ˜๋Ÿ‰', width: 100, align: 'right' }, + { id: 'result', label: '๊ฒฐ๊ณผ', width: 80 }, + { id: 'inspector', label: '๊ฒ€์‚ฌ์ž', width: 100 } +] +``` + +--- + +## 6. ๊ฒ€์ƒ‰ ์กฐ๊ฑด + +| ํ•„๋“œ๋ช… | ์ปดํฌ๋„ŒํŠธ | ์„ค์ • | +|--------|----------|------| +| ๊ธฐ๊ฐ„ | `v2-date` | dateRange: true | +| ํ’ˆ๋ชฉ | `v2-input` | placeholder: "ํ’ˆ๋ชฉ" | +| ๊ฑฐ๋ž˜์ฒ˜ | `v2-input` | placeholder: "๊ฑฐ๋ž˜์ฒ˜" | +| ๊ฒ€์‚ฌ๊ฒฐ๊ณผ | `v2-select` | ์ „์ฒด, ํ•ฉ๊ฒฉ, ๋ถˆํ•ฉ๊ฒฉ, ์กฐ๊ฑด๋ถ€ํ•ฉ๊ฒฉ | + +--- + +## 7. ๊ตฌํ˜„ JSON + +```json +{ + "screen_code": "INSPECTION_MAIN", + "screen_name": "๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ", + "components": [ + { + "type": "v2-table-search-widget", + "position": { "x": 0, "y": 0, "w": 12, "h": 2 }, + "config": { + "searchFields": [ + { "type": "date", "id": "date_range", "placeholder": "๊ฒ€์‚ฌ๊ธฐ๊ฐ„", "dateRange": true }, + { "type": "input", "id": "item_name", "placeholder": "ํ’ˆ๋ชฉ" }, + { "type": "input", "id": "supplier", "placeholder": "๊ฑฐ๋ž˜์ฒ˜" }, + { "type": "select", "id": "result", "placeholder": "๊ฒ€์‚ฌ๊ฒฐ๊ณผ", + "options": [ + { "value": "pass", "label": "ํ•ฉ๊ฒฉ" }, + { "value": "fail", "label": "๋ถˆํ•ฉ๊ฒฉ" }, + { "value": "conditional", "label": "์กฐ๊ฑด๋ถ€ํ•ฉ๊ฒฉ" } + ] + } + ], + "buttons": [ + { "label": "์ดˆ๊ธฐํ™”", "action": "reset" }, + { "label": "์กฐํšŒ", "action": "search", "variant": "primary" } + ] + } + }, + { + "type": "v2-tabs-widget", + "position": { "x": 0, "y": 2, "w": 12, "h": 10 }, + "config": { + "tabs": [ + { "id": "incoming", "label": "์ˆ˜์ž…๊ฒ€์‚ฌ" }, + { "id": "process", "label": "๊ณต์ •๊ฒ€์‚ฌ" }, + { "id": "shipping", "label": "์ถœํ•˜๊ฒ€์‚ฌ" } + ], + "tabContent": { + "type": "v2-table-list", + "config": { + "entityId": "inspection", + "filterByTab": true, + "tabFilterField": "inspect_type", + "buttons": [ + { "label": "์‹ ๊ทœ๋“ฑ๋ก", "action": "create", "variant": "primary" } + ], + "columns": [ + { "id": "inspect_no", "label": "๊ฒ€์‚ฌ๋ฒˆํ˜ธ", "width": 120 }, + { "id": "inspect_date", "label": "๊ฒ€์‚ฌ์ผ", "width": 100 }, + { "id": "item_name", "label": "ํ’ˆ๋ชฉ๋ช…", "width": 200 }, + { "id": "lot_no", "label": "๋กœํŠธ๋ฒˆํ˜ธ", "width": 120 }, + { "id": "inspect_qty", "label": "๊ฒ€์‚ฌ์ˆ˜๋Ÿ‰", "width": 100 }, + { "id": "pass_qty", "label": "ํ•ฉ๊ฒฉ์ˆ˜๋Ÿ‰", "width": 100 }, + { "id": "fail_qty", "label": "๋ถˆ๋Ÿ‰์ˆ˜๋Ÿ‰", "width": 100 }, + { "id": "result", "label": "๊ฒฐ๊ณผ", "width": 80 } + ] + } + } + } + } + ] +} +``` + +--- + +## 8. ๊ตฌํ˜„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +- [x] ๊ฒ€์ƒ‰ ์˜์—ญ: v2-table-search-widget +- [x] ๊ฒ€์‚ฌ์œ ํ˜• ํƒญ: v2-tabs-widget +- [x] ๊ฒ€์‚ฌ ๋ชฉ๋ก ํ…Œ์ด๋ธ”: v2-table-list +- [ ] ๊ฒ€์‚ฌ ๋“ฑ๋ก ๋ชจ๋‹ฌ +- [ ] ๋ถˆ๋Ÿ‰ ์ฒ˜๋ฆฌ ์—ฐ๊ณ„ + +**ํ˜„์žฌ V2 ์ปดํฌ๋„ŒํŠธ๋กœ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๊ฐ€๋Šฅ** diff --git a/docs/screen-implementation-guide/README.md b/docs/screen-implementation-guide/README.md index 18acd6db..f82a1fda 100644 --- a/docs/screen-implementation-guide/README.md +++ b/docs/screen-implementation-guide/README.md @@ -2,56 +2,89 @@ V2 ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•œ ERP ํ™”๋ฉด ๊ตฌํ˜„ ๊ฐ€์ด๋“œ์ž…๋‹ˆ๋‹ค. +--- + +## ์ „์ฒด ํ™”๋ฉด ๋ถ„์„ ์š”์•ฝ (2026-01-30) + +### ์ปดํฌ๋„ŒํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ + +| ๊ตฌ๋ถ„ | ํ™”๋ฉด ์ˆ˜ | ๋น„์œจ | +|------|--------|------| +| ํ˜„์žฌ ์ฆ‰์‹œ ๊ตฌํ˜„ ๊ฐ€๋Šฅ | 17๊ฐœ | 65% | +| v2-grouped-table ์ถ”๊ฐ€ ์‹œ | 22๊ฐœ | 85% | +| v2-tree-view ์ถ”๊ฐ€ ์‹œ | 24๊ฐœ | 92% | +| ๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š” | 2๊ฐœ | 8% | + +### ์‹ ๊ทœ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์šฐ์„ ์ˆœ์œ„ + +| ์ˆœ์œ„ | ์ปดํฌ๋„ŒํŠธ | ์žฌํ™œ์šฉ ํ™”๋ฉด ์ˆ˜ | ROI | +|------|----------|--------------|-----| +| 1 | v2-grouped-table | 5+ | ๋†’์Œ | +| 2 | v2-tree-view | 3 | ์ค‘๊ฐ„ | +| 3 | v2-timeline-scheduler | 1~2 | ๋‚ฎ์Œ | + +> **์ฐธ๊ณ **: ํ™”๋ฉด ๋””์ž์ด๋„ˆ์—์„œ ํผ ๋ฐฐ์น˜๊ฐ€ ์ž์ฒด ๊ทœ๊ฒฉ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ๋ณ„๋„ ๋ชจ๋‹ฌ/ํผ ์ปดํฌ๋„ŒํŠธ ๋ถˆํ•„์š”. +> `v2-card-display`๋Š” ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. + +> ์ƒ์„ธ ๋ถ„์„: [full-screen-analysis.md](./00_analysis/full-screen-analysis.md) + +--- + ## ํด๋” ๊ตฌ์กฐ ``` screen-implementation-guide/ +โ”œโ”€โ”€ 00_analysis/ # ์ „์ฒด ๋ถ„์„ +โ”‚ โ””โ”€โ”€ full-screen-analysis.md # ํ™”๋ฉด ์ „์ฒด ๋ถ„์„ ๋ณด๊ณ ์„œ +โ”‚ โ”œโ”€โ”€ 01_master-data/ # ๊ธฐ์ค€์ •๋ณด +โ”‚ โ”œโ”€โ”€ item-info.md # ํ’ˆ๋ชฉ์ •๋ณด โœ… +โ”‚ โ”œโ”€โ”€ bom.md # BOM๊ด€๋ฆฌ โš ๏ธ โ”‚ โ”œโ”€โ”€ company-info.md # ํšŒ์‚ฌ์ •๋ณด โ”‚ โ”œโ”€โ”€ department.md # ๋ถ€์„œ๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ item-info.md # ํ’ˆ๋ชฉ์ •๋ณด โ”‚ โ””โ”€โ”€ options.md # ์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 02_sales/ # ์˜์—…๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ quotation.md # ๊ฒฌ์ ๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ order.md # ์ˆ˜์ฃผ๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ customer.md # ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ +โ”‚ โ”œโ”€โ”€ order.md # ์ˆ˜์ฃผ๊ด€๋ฆฌ โœ… +โ”‚ โ”œโ”€โ”€ quote.md # ๊ฒฌ์ ๊ด€๋ฆฌ โœ… +โ”‚ โ”œโ”€โ”€ customer.md # ๊ฑฐ๋ž˜์ฒ˜๊ด€๋ฆฌ โš ๏ธ โ”‚ โ”œโ”€โ”€ sales-item.md # ํŒ๋งคํ’ˆ๋ชฉ์ •๋ณด โ”‚ โ””โ”€โ”€ options.md # ์˜์—…์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 03_production/ # ์ƒ์‚ฐ๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ production-plan.md # ์ƒ์‚ฐ๊ณ„ํš -โ”‚ โ”œโ”€โ”€ work-order.md # ์ž‘์—…์ง€์‹œ +โ”‚ โ”œโ”€โ”€ production-plan.md # ์ƒ์‚ฐ๊ณ„ํš๊ด€๋ฆฌ โŒ +โ”‚ โ”œโ”€โ”€ work-order.md # ์ž‘์—…์ง€์‹œ โš ๏ธ โ”‚ โ”œโ”€โ”€ production-result.md # ์ƒ์‚ฐ์‹ค์  โ”‚ โ”œโ”€โ”€ process-info.md # ๊ณต์ •์ •๋ณด๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ bom.md # BOM๊ด€๋ฆฌ โ”‚ โ””โ”€โ”€ options.md # ์ƒ์‚ฐ์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 04_purchase/ # ๊ตฌ๋งค๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ purchase-order.md # ๋ฐœ์ฃผ๊ด€๋ฆฌ +โ”‚ โ”œโ”€โ”€ purchase-order.md # ๋ฐœ์ฃผ๊ด€๋ฆฌ โœ… โ”‚ โ”œโ”€โ”€ purchase-item.md # ๊ตฌ๋งคํ’ˆ๋ชฉ์ •๋ณด โ”‚ โ”œโ”€โ”€ supplier.md # ๊ณต๊ธ‰์—…์ฒด๊ด€๋ฆฌ โ”‚ โ”œโ”€โ”€ receiving.md # ์ž…๊ณ ๊ด€๋ฆฌ โ”‚ โ””โ”€โ”€ options.md # ๊ตฌ๋งค์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 05_equipment/ # ์„ค๋น„๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ equipment-info.md # ์„ค๋น„์ •๋ณด +โ”‚ โ”œโ”€โ”€ equipment-info.md # ์„ค๋น„์ •๋ณด โœ… โ”‚ โ””โ”€โ”€ options.md # ์„ค๋น„์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 06_logistics/ # ๋ฌผ๋ฅ˜๊ด€๋ฆฌ +โ”‚ โ”œโ”€โ”€ inout.md # ์ž…์ถœ๊ณ ๊ด€๋ฆฌ โš ๏ธ โ”‚ โ”œโ”€โ”€ logistics-info.md # ๋ฌผ๋ฅ˜์ •๋ณด๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ inout.md # ์ž…์ถœ๊ณ ๊ด€๋ฆฌ โ”‚ โ”œโ”€โ”€ inventory.md # ์žฌ๊ณ ํ˜„ํ™ฉ โ”‚ โ”œโ”€โ”€ warehouse.md # ์ฐฝ๊ณ ์ •๋ณด๊ด€๋ฆฌ โ”‚ โ”œโ”€โ”€ shipping.md # ์ถœ๊ณ ๊ด€๋ฆฌ โ”‚ โ””โ”€โ”€ options.md # ๋ฌผ๋ฅ˜์˜ต์…˜์„ค์ • โ”‚ โ”œโ”€โ”€ 07_quality/ # ํ’ˆ์งˆ๊ด€๋ฆฌ -โ”‚ โ”œโ”€โ”€ inspection-info.md # ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ +โ”‚ โ”œโ”€โ”€ inspection.md # ๊ฒ€์‚ฌ์ •๋ณด๊ด€๋ฆฌ โœ… โ”‚ โ”œโ”€โ”€ item-inspection.md # ํ’ˆ๋ชฉ๊ฒ€์‚ฌ์ •๋ณด โ”‚ โ””โ”€โ”€ options.md # ํ’ˆ์งˆ์˜ต์…˜์„ค์ • โ”‚ โ””โ”€โ”€ README.md + +# ๋ฒ”๋ก€: โœ… ์™„์ „๊ตฌํ˜„ | โš ๏ธ ๋ถ€๋ถ„๊ตฌํ˜„ | โŒ ์‹ ๊ทœ๊ฐœ๋ฐœํ•„์š” ``` ## ๋ฌธ์„œ ์ž‘์„ฑ ํ˜•์‹ diff --git a/docs/screen-implementation-guide/SCREEN_DEVELOPMENT_STANDARD.md b/docs/screen-implementation-guide/SCREEN_DEVELOPMENT_STANDARD.md new file mode 100644 index 00000000..606caa03 --- /dev/null +++ b/docs/screen-implementation-guide/SCREEN_DEVELOPMENT_STANDARD.md @@ -0,0 +1,572 @@ +# Screen Development Standard Guide (AI Agent Reference) + +> **Purpose**: Ensure consistent screen development output regardless of who develops it +> **Target**: AI Agents (Cursor, etc.), Developers +> **Version**: 1.0.0 + +--- + +## CRITICAL RULES + +1. **ONLY use V2 components** (components with `v2-` prefix) +2. **SEPARATE UI and Logic**: UI in `screen_layouts_v2`, Logic in `dataflow_diagrams` +3. **ALWAYS apply company_code filtering** (multi-tenancy) + +--- + +## AVAILABLE V2 COMPONENTS (23 total) + +### Input Components +| ID | Name | Purpose | +|----|------|---------| +| `v2-input` | Input | text, number, password, email, tel, url, textarea | +| `v2-select` | Select | dropdown, combobox, radio, checkbox | +| `v2-date` | Date | date, time, datetime, daterange, month, year | + +### Display Components +| ID | Name | Purpose | +|----|------|---------| +| `v2-text-display` | Text Display | labels, titles | +| `v2-card-display` | Card Display | table data as cards | +| `v2-aggregation-widget` | Aggregation Widget | sum, avg, count, min, max | + +### Table/Data Components +| ID | Name | Purpose | +|----|------|---------| +| `v2-table-list` | Table List | data grid with CRUD | +| `v2-table-search-widget` | Search Widget | table search/filter | +| `v2-pivot-grid` | Pivot Grid | multi-dimensional analysis | + +### Layout Components +| ID | Name | Purpose | +|----|------|---------| +| `v2-split-panel-layout` | Split Panel | master-detail layout | +| `v2-tabs-widget` | Tabs Widget | tab navigation | +| `v2-section-card` | Section Card | titled grouping container | +| `v2-section-paper` | Section Paper | background grouping | +| `v2-divider-line` | Divider | area separator | +| `v2-repeat-container` | Repeat Container | data-driven repeat | +| `v2-repeater` | Repeater | repeat control | +| `v2-repeat-screen-modal` | Repeat Screen Modal | modal repeat | + +### Action/Special Components +| ID | Name | Purpose | +|----|------|---------| +| `v2-button-primary` | Primary Button | save, delete, etc. | +| `v2-numbering-rule` | Numbering Rule | auto code generation | +| `v2-category-manager` | Category Manager | category management | +| `v2-location-swap-selector` | Location Swap | location selection | +| `v2-rack-structure` | Rack Structure | warehouse rack visualization | +| `v2-media` | Media | image/video display | + +--- + +## SCREEN PATTERNS (5 types) + +### Pattern A: Basic Master Screen +**When**: Single table CRUD +**Components**: +``` +v2-table-search-widget +v2-table-list +v2-button-primary +``` + +### Pattern B: Master-Detail Screen +**When**: Master selection โ†’ Detail display +**Components**: +``` +v2-split-panel-layout + โ”œโ”€ left: v2-table-list (master) + โ””โ”€ right: v2-table-list (detail) +``` +**Required Config**: +```json +{ + "leftPanel": { "tableName": "master_table" }, + "rightPanel": { + "tableName": "detail_table", + "relation": { "type": "detail", "foreignKey": "master_id" } + }, + "splitRatio": 30 +} +``` + +### Pattern C: Master-Detail + Tabs +**When**: Master selection โ†’ Multiple tabs +**Components**: +``` +v2-split-panel-layout + โ”œโ”€ left: v2-table-list (master) + โ””โ”€ right: v2-tabs-widget +``` + +### Pattern D: Card View +**When**: Image + info card display +**Components**: +``` +v2-table-search-widget +v2-card-display +``` +**Required Config**: +```json +{ + "cardsPerRow": 3, + "columnMapping": { + "title": "name", + "subtitle": "code", + "image": "image_url" + } +} +``` + +### Pattern E: Pivot Analysis +**When**: Multi-dimensional aggregation +**Components**: +``` +v2-pivot-grid +``` + +--- + +## DATABASE TABLES + +### Screen Definition +```sql +-- screen_definitions: Screen basic info +INSERT INTO screen_definitions ( + screen_name, screen_code, description, table_name, company_code +) VALUES (...) RETURNING screen_id; + +-- screen_layouts_v2: UI layout (JSON) +INSERT INTO screen_layouts_v2 ( + screen_id, company_code, layout_data +) VALUES (...); + +-- screen_menu_assignments: Menu connection +INSERT INTO screen_menu_assignments ( + screen_id, menu_objid, company_code +) VALUES (...); +``` + +### Control Management (Business Logic) +```sql +-- dataflow_diagrams: Business logic +INSERT INTO dataflow_diagrams ( + diagram_name, company_code, control, plan +) VALUES (...); +``` + +--- + +## UI SETTING vs BUSINESS LOGIC + +### UI Setting (Screen Designer) +| Item | Storage | +|------|---------| +| Component placement | screen_layouts_v2.layout_data | +| Table name | layout_data.tableName | +| Column visibility | layout_data.columns | +| Search fields | layout_data.searchFields | +| Basic save/delete | button config.action.type | + +### Business Logic (Control Management) +| Item | Storage | +|------|---------| +| Conditional execution | dataflow_diagrams.control | +| Multi-table save | dataflow_diagrams.plan | +| Before/after trigger | control.triggerType | +| Field mapping | plan.mappings | + +--- + +## BUSINESS LOGIC JSON STRUCTURE + +### Control (Conditions) +```json +{ + "control": { + "actionType": "update|insert|delete", + "triggerType": "before|after", + "conditions": [ + { + "id": "unique-id", + "type": "condition", + "field": "column_name", + "operator": "=|!=|>|<|>=|<=|LIKE|IN|IS NULL", + "value": "compare_value", + "dataType": "string|number|date|boolean" + } + ] + } +} +``` + +### Plan (Actions) +```json +{ + "plan": { + "actions": [ + { + "id": "action-id", + "actionType": "update|insert|delete", + "targetTable": "table_name", + "fieldMappings": [ + { + "sourceField": "source_column", + "targetField": "target_column", + "defaultValue": "static_value", + "valueType": "field|static" + } + ] + } + ] + } +} +``` + +### Special Values +| Value | Meaning | +|-------|---------| +| `#NOW` | Current timestamp | +| `#USER` | Current user ID | +| `#COMPANY` | Current company code | + +--- + +## DEVELOPMENT STEPS + +### Step 1: Analyze Requirements +``` +1. Which tables? (table names) +2. Table relationships? (FK) +3. Which pattern? (A/B/C/D/E) +4. Which buttons? +5. Business logic per button? +``` + +### Step 2: INSERT screen_definitions +```sql +INSERT INTO screen_definitions ( + screen_name, screen_code, description, table_name, company_code, created_at +) VALUES ( + 'ํ™”๋ฉด๋ช…', 'SCREEN_CODE', '์„ค๋ช…', 'main_table', 'COMPANY_CODE', NOW() +) RETURNING screen_id; +``` + +### Step 3: INSERT screen_layouts_v2 +```sql +INSERT INTO screen_layouts_v2 ( + screen_id, company_code, layout_data +) VALUES ( + {screen_id}, 'COMPANY_CODE', '{layout_json}'::jsonb +); +``` + +### Step 4: INSERT dataflow_diagrams (if complex logic) +```sql +INSERT INTO dataflow_diagrams ( + diagram_name, company_code, control, plan +) VALUES ( + 'ํ™”๋ฉด๋ช…_์ œ์–ด', 'COMPANY_CODE', '{control_json}'::jsonb, '{plan_json}'::jsonb +) RETURNING diagram_id; +``` + +### Step 5: Link button to dataflow +In layout_data, set button config: +```json +{ + "id": "btn-action", + "componentType": "v2-button-primary", + "componentConfig": { + "text": "ํ™•์ •", + "enableDataflowControl": true, + "dataflowDiagramId": {diagram_id} + } +} +``` + +### Step 6: INSERT screen_menu_assignments +```sql +INSERT INTO screen_menu_assignments ( + screen_id, menu_objid, company_code +) VALUES ( + {screen_id}, {menu_objid}, 'COMPANY_CODE' +); +``` + +--- + +## EXAMPLE: Order Management + +### Requirements +``` +Screen: ์ˆ˜์ฃผ๊ด€๋ฆฌ (Order Management) +Pattern: B (Master-Detail) +Tables: + - Master: order_master + - Detail: order_detail +Buttons: + - [์ €์žฅ]: Save to order_master + - [ํ™•์ •]: + - Condition: status = '๋Œ€๊ธฐ' + - Action: Update status to 'ํ™•์ •' + - Additional: Insert to order_history +``` + +### layout_data JSON +```json +{ + "components": [ + { + "id": "search-1", + "componentType": "v2-table-search-widget", + "position": {"x": 0, "y": 0}, + "size": {"width": 1920, "height": 80} + }, + { + "id": "split-1", + "componentType": "v2-split-panel-layout", + "position": {"x": 0, "y": 80}, + "size": {"width": 1920, "height": 800}, + "componentConfig": { + "leftPanel": {"tableName": "order_master"}, + "rightPanel": { + "tableName": "order_detail", + "relation": {"type": "detail", "foreignKey": "order_id"} + }, + "splitRatio": 30 + } + }, + { + "id": "btn-save", + "componentType": "v2-button-primary", + "componentConfig": { + "text": "์ €์žฅ", + "action": {"type": "save"} + } + }, + { + "id": "btn-confirm", + "componentType": "v2-button-primary", + "componentConfig": { + "text": "ํ™•์ •", + "enableDataflowControl": true, + "dataflowDiagramId": 123 + } + } + ] +} +``` + +### dataflow_diagrams JSON (for ํ™•์ • button) +```json +{ + "control": { + "actionType": "update", + "triggerType": "after", + "conditions": [ + { + "id": "cond-1", + "type": "condition", + "field": "status", + "operator": "=", + "value": "๋Œ€๊ธฐ", + "dataType": "string" + } + ] + }, + "plan": { + "actions": [ + { + "id": "action-1", + "actionType": "update", + "targetTable": "order_master", + "fieldMappings": [ + {"targetField": "status", "defaultValue": "ํ™•์ •"} + ] + }, + { + "id": "action-2", + "actionType": "insert", + "targetTable": "order_history", + "fieldMappings": [ + {"sourceField": "order_no", "targetField": "order_no"}, + {"sourceField": "customer_name", "targetField": "customer_name"}, + {"defaultValue": "#NOW", "targetField": "confirmed_at"} + ] + } + ] + } +} +``` + +--- + +## NOT SUPPORTED (Requires Custom Development) + +| UI Type | Status | Alternative | +|---------|--------|-------------| +| Tree View | โŒ | Develop `v2-tree-view` | +| Grouped Table | โŒ | Develop `v2-grouped-table` | +| Gantt Chart | โŒ | Separate development | +| Drag & Drop | โŒ | Use order column | + +--- + +## CHECKLIST + +### Screen Creation +``` +โ–ก screen_definitions INSERT completed +โ–ก screen_layouts_v2 INSERT completed +โ–ก screen_menu_assignments INSERT completed (if needed) +โ–ก company_code filtering applied +โ–ก All components have v2- prefix +``` + +### Business Logic +``` +โ–ก Basic actions (save/delete) โ†’ Screen designer setting +โ–ก Conditional/Multi-table โ†’ dataflow_diagrams INSERT +โ–ก Button config has dataflowDiagramId +โ–ก control.conditions configured +โ–ก plan.actions or plan.mappings configured +``` + +--- + +## BUSINESS LOGIC REQUEST FORMAT (MANDATORY) + +> **WARNING**: No format = No processing. Write it properly, idiot. +> Vague input = vague output. No input = no output. + +### Request Template + +``` +=== BUSINESS LOGIC REQUEST === + +ใ€SCREEN INFOใ€‘ +- Screen Name: +- Company Code: +- Menu ID (if any): + +ใ€TABLE INFOใ€‘ +- Main Table: +- Detail Table (if any): +- FK Relation (if any): + +ใ€BUTTON LISTใ€‘ +Button 1: + - Name: + - Action Type: (save/delete/update/query/other) + - Condition (if any): + - Target Table: + - Additional Actions (if any): + +Button 2: + - Name: + - ... + +ใ€ADDITIONAL REQUIREMENTSใ€‘ +- +``` + +### Valid Example + +``` +=== BUSINESS LOGIC REQUEST === + +ใ€SCREEN INFOใ€‘ +- Screen Name: ์ˆ˜์ฃผ๊ด€๋ฆฌ (Order Management) +- Company Code: ssalmeog +- Menu ID: 55566 + +ใ€TABLE INFOใ€‘ +- Main Table: order_master +- Detail Table: order_detail +- FK Relation: order_id + +ใ€BUTTON LISTใ€‘ +Button 1: + - Name: ์ €์žฅ (Save) + - Action Type: save + - Condition: none + - Target Table: order_master, order_detail + - Additional Actions: none + +Button 2: + - Name: ํ™•์ • (Confirm) + - Action Type: update + - Condition: status = '๋Œ€๊ธฐ' + - Target Table: order_master + - Additional Actions: + 1. Change status to 'ํ™•์ •' + 2. INSERT to order_history (order_no, customer_name, confirmed_at=NOW) + +Button 3: + - Name: ์‚ญ์ œ (Delete) + - Action Type: delete + - Condition: status != 'ํ™•์ •' + - Target Table: order_master, order_detail (cascade) + - Additional Actions: none + +ใ€ADDITIONAL REQUIREMENTSใ€‘ +- Confirmed orders cannot be modified/deleted +- Auto-numbering for order_no (ORDER-YYYYMMDD-0001) +``` + +### Invalid Examples (DO NOT DO THIS) + +``` +โŒ "Make an order management screen" + โ†’ Which table? Buttons? Logic? + +โŒ "Save button should save" + โ†’ To which table? Conditions? + +โŒ "Handle inventory when confirmed" + โ†’ Which table? Increase? Decrease? By how much? + +โŒ "Similar to the previous screen" + โ†’ What previous screen? +``` + +### Complex Logic Format + +For multiple conditions or complex workflows: + +``` +ใ€COMPLEX BUTTON LOGICใ€‘ +Button Name: ์ถœ๊ณ ํ™•์ • (Shipment Confirm) + +Execution Conditions: + Cond1: status = '์ถœ๊ณ ๋Œ€๊ธฐ' AND + Cond2: qty > 0 AND + Cond3: warehouse_id IS NOT NULL + +Execution Steps (in order): + 1. shipment_master.status โ†’ '์ถœ๊ณ ์™„๋ฃŒ' + 2. Decrease qty in inventory (WHERE item_code = current_row.item_code) + 3. INSERT to shipment_history: + - shipment_no โ† current_row.shipment_no + - shipped_qty โ† current_row.qty + - shipped_at โ† #NOW + - shipped_by โ† #USER + +On Failure: + - Insufficient stock: Show "์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค" + - Condition not met: Show "์ถœ๊ณ ๋Œ€๊ธฐ ์ƒํƒœ๋งŒ ํ™•์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค" +``` + +--- + +## REFERENCE PATHS + +| Item | Path/Table | +|------|------------| +| Control Management Page | `/admin/systemMng/dataflow` | +| Screen Definition Table | `screen_definitions` | +| Layout Table | `screen_layouts_v2` | +| Control Table | `dataflow_diagrams` | +| Menu Assignment Table | `screen_menu_assignments` | diff --git a/docs/screen-implementation-guide/ํ™”๋ฉด๊ฐœ๋ฐœ_ํ‘œ์ค€_๊ฐ€์ด๋“œ.md b/docs/screen-implementation-guide/ํ™”๋ฉด๊ฐœ๋ฐœ_ํ‘œ์ค€_๊ฐ€์ด๋“œ.md new file mode 100644 index 00000000..83774f38 --- /dev/null +++ b/docs/screen-implementation-guide/ํ™”๋ฉด๊ฐœ๋ฐœ_ํ‘œ์ค€_๊ฐ€์ด๋“œ.md @@ -0,0 +1,706 @@ +# ํ™”๋ฉด ๊ฐœ๋ฐœ ํ‘œ์ค€ ๊ฐ€์ด๋“œ + +> **๋ชฉ์ **: ์–ด๋–ค ๊ฐœ๋ฐœ์ž/AI๊ฐ€ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•˜๋“  ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ค๋„๋ก ํ•˜๋Š” ํ‘œ์ค€ ๊ฐ€์ด๋“œ +> **๋Œ€์ƒ**: ๊ฐœ๋ฐœ์ž, AI ์—์ด์ „ํŠธ (Cursor ๋“ฑ) +> **๋ฒ„์ „**: 1.0.0 + +--- + +## 1. ๊ฐœ์š” + +์ด ๋ฌธ์„œ๋Š” WACE ์†”๋ฃจ์…˜์—์„œ ํ™”๋ฉด์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ฐ˜๋“œ์‹œ ๋”ฐ๋ผ์•ผ ํ•˜๋Š” ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. +๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ์„ค๋ช…ํ•˜๋“ , ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ ์ด ๊ฐ€์ด๋“œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. + +### ํ•ต์‹ฌ ์›์น™ + +1. **V2 ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉ**: `v2-` ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ์ปดํฌ๋„ŒํŠธ๋งŒ ์‚ฌ์šฉ +2. **UI์™€ ๋กœ์ง ๋ถ„๋ฆฌ**: UI๋Š” `screen_layouts_v2`, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ `dataflow_diagrams` +3. **๋ฉ€ํ‹ฐํ…Œ๋„Œ์‹œ ํ•„์ˆ˜**: ๋ชจ๋“  ์ฟผ๋ฆฌ์— `company_code` ํ•„ํ„ฐ๋ง + +--- + +## 2. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ V2 ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก (23๊ฐœ) + +### ์ž…๋ ฅ ์ปดํฌ๋„ŒํŠธ + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-input` | ์ž…๋ ฅ | ํ…์ŠคํŠธ, ์ˆซ์ž, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ด๋ฉ”์ผ ๋“ฑ | +| `v2-select` | ์„ ํƒ | ๋“œ๋กญ๋‹ค์šด, ์ฝค๋ณด๋ฐ•์Šค, ๋ผ๋””์˜ค, ์ฒดํฌ๋ฐ•์Šค | +| `v2-date` | ๋‚ ์งœ | ๋‚ ์งœ, ์‹œ๊ฐ„, ๋‚ ์งœ๋ฒ”์œ„ | + +### ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-text-display` | ํ…์ŠคํŠธ ํ‘œ์‹œ | ๋ผ๋ฒจ, ์ œ๋ชฉ | +| `v2-card-display` | ์นด๋“œ ๋””์Šคํ”Œ๋ ˆ์ด | ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ๋ฅผ ์นด๋“œ ํ˜•ํƒœ๋กœ ํ‘œ์‹œ | +| `v2-aggregation-widget` | ์ง‘๊ณ„ ์œ„์ ฏ | ํ•ฉ๊ณ„, ํ‰๊ท , ๊ฐœ์ˆ˜ ๋“ฑ | + +### ํ…Œ์ด๋ธ”/๋ฐ์ดํ„ฐ ์ปดํฌ๋„ŒํŠธ + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-table-list` | ํ…Œ์ด๋ธ” ๋ฆฌ์ŠคํŠธ | ๋ฐ์ดํ„ฐ ์กฐํšŒ/ํŽธ์ง‘ ํ…Œ์ด๋ธ” | +| `v2-table-search-widget` | ๊ฒ€์ƒ‰ ํ•„ํ„ฐ | ํ…Œ์ด๋ธ” ๊ฒ€์ƒ‰/ํ•„ํ„ฐ | +| `v2-pivot-grid` | ํ”ผ๋ฒ— ๊ทธ๋ฆฌ๋“œ | ๋‹ค์ฐจ์› ๋ถ„์„ | + +### ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-split-panel-layout` | ๋ถ„ํ•  ํŒจ๋„ | ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ์ขŒ์šฐ ๋ถ„ํ•  | +| `v2-tabs-widget` | ํƒญ ์œ„์ ฏ | ํƒญ ์ „ํ™˜ | +| `v2-section-card` | ์„น์…˜ ์นด๋“œ | ์ œ๋ชฉ+ํ…Œ๋‘๋ฆฌ ๊ทธ๋ฃนํ™” | +| `v2-section-paper` | ์„น์…˜ ํŽ˜์ดํผ | ๋ฐฐ๊ฒฝ์ƒ‰ ๊ทธ๋ฃนํ™” | +| `v2-divider-line` | ๊ตฌ๋ถ„์„  | ์˜์—ญ ๊ตฌ๋ถ„ | +| `v2-repeat-container` | ๋ฆฌํ”ผํ„ฐ ์ปจํ…Œ์ด๋„ˆ | ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต ๋ Œ๋”๋ง | +| `v2-repeater` | ๋ฆฌํ”ผํ„ฐ | ๋ฐ˜๋ณต ์ปจํŠธ๋กค | +| `v2-repeat-screen-modal` | ๋ฐ˜๋ณต ํ™”๋ฉด ๋ชจ๋‹ฌ | ๋ชจ๋‹ฌ ๋ฐ˜๋ณต | + +### ์•ก์…˜/ํŠน์ˆ˜ ์ปดํฌ๋„ŒํŠธ + +| ID | ์ด๋ฆ„ | ์šฉ๋„ | +|----|------|------| +| `v2-button-primary` | ๊ธฐ๋ณธ ๋ฒ„ํŠผ | ์ €์žฅ, ์‚ญ์ œ ๋“ฑ ์•ก์…˜ | +| `v2-numbering-rule` | ์ฑ„๋ฒˆ๊ทœ์น™ | ์ž๋™ ์ฝ”๋“œ ์ƒ์„ฑ | +| `v2-category-manager` | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ์ž | ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ | +| `v2-location-swap-selector` | ์œ„์น˜ ๊ตํ™˜ | ์œ„์น˜ ์„ ํƒ/๊ตํ™˜ | +| `v2-rack-structure` | ๋ž™ ๊ตฌ์กฐ | ์ฐฝ๊ณ  ๋ž™ ์‹œ๊ฐํ™” | +| `v2-media` | ๋ฏธ๋””์–ด | ์ด๋ฏธ์ง€/๋™์˜์ƒ ํ‘œ์‹œ | + +--- + +## 3. ํ™”๋ฉด ํŒจํ„ด (5๊ฐ€์ง€) + +### ํŒจํ„ด A: ๊ธฐ๋ณธ ๋งˆ์Šคํ„ฐ ํ™”๋ฉด + +**์‚ฌ์šฉ ์กฐ๊ฑด**: ๋‹จ์ผ ํ…Œ์ด๋ธ” CRUD + +**์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: +``` +v2-table-search-widget (๊ฒ€์ƒ‰) +v2-table-list (ํ…Œ์ด๋ธ”) +v2-button-primary (์ €์žฅ/์‚ญ์ œ) +``` + +**๋ ˆ์ด์•„์›ƒ**: +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ [๊ฒ€์ƒ‰ํ•„๋“œ๋“ค] [์กฐํšŒ] [์—‘์…€] โ”‚ โ† v2-table-search-widget +โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค +โ”‚ ์ œ๋ชฉ [์‹ ๊ทœ] [์‚ญ์ œ] โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ +โ”‚ โ–ก | ์ฝ”๋“œ | ์ด๋ฆ„ | ์ƒํƒœ | ๋“ฑ๋ก์ผ | โ”‚ โ† v2-table-list +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ +``` + +--- + +### ํŒจํ„ด B: ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ ํ™”๋ฉด + +**์‚ฌ์šฉ ์กฐ๊ฑด**: ๋งˆ์Šคํ„ฐ ํ…Œ์ด๋ธ” ์„ ํƒ โ†’ ๋””ํ…Œ์ผ ํ…Œ์ด๋ธ” ํ‘œ์‹œ + +**์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: +``` +v2-split-panel-layout (๋ถ„ํ• ) + โ”œโ”€ ์ขŒ์ธก: v2-table-list (๋งˆ์Šคํ„ฐ) + โ””โ”€ ์šฐ์ธก: v2-table-list (๋””ํ…Œ์ผ) +``` + +**๋ ˆ์ด์•„์›ƒ**: +``` +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ ๋งˆ์Šคํ„ฐ ๋ฆฌ์ŠคํŠธ โ”‚ ๋””ํ…Œ์ผ ๋ฆฌ์ŠคํŠธ โ”‚ +โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚ โ”‚ +โ”‚ โ–ก A001 ํ•ญ๋ชฉ1 โ”‚ [๋””ํ…Œ์ผ ํ…Œ์ด๋ธ”] โ”‚ +โ”‚ โ–ก A002 ํ•ญ๋ชฉ2 โ† โ”‚ โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + v2-split-panel-layout +``` + +**ํ•„์ˆ˜ ์„ค์ •**: +```json +{ + "leftPanel": { + "tableName": "๋งˆ์Šคํ„ฐ_ํ…Œ์ด๋ธ”๋ช…" + }, + "rightPanel": { + "tableName": "๋””ํ…Œ์ผ_ํ…Œ์ด๋ธ”๋ช…", + "relation": { + "type": "detail", + "foreignKey": "master_id" + } + }, + "splitRatio": 30 +} +``` + +--- + +### ํŒจํ„ด C: ๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ + ํƒญ + +**์‚ฌ์šฉ ์กฐ๊ฑด**: ๋งˆ์Šคํ„ฐ ์„ ํƒ โ†’ ์—ฌ๋Ÿฌ ํƒญ์œผ๋กœ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ + +**์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: +``` +v2-split-panel-layout (๋ถ„ํ• ) + โ”œโ”€ ์ขŒ์ธก: v2-table-list (๋งˆ์Šคํ„ฐ) + โ””โ”€ ์šฐ์ธก: v2-tabs-widget (ํƒญ) + โ”œโ”€ ํƒญ1: v2-table-list + โ”œโ”€ ํƒญ2: v2-table-list + โ””โ”€ ํƒญ3: ํผ ์ปดํฌ๋„ŒํŠธ๋“ค +``` + +--- + +### ํŒจํ„ด D: ์นด๋“œ ๋ทฐ + +**์‚ฌ์šฉ ์กฐ๊ฑด**: ์ด๋ฏธ์ง€+์ •๋ณด ์นด๋“œ ํ˜•ํƒœ ํ‘œ์‹œ + +**์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: +``` +v2-table-search-widget (๊ฒ€์ƒ‰) +v2-card-display (์นด๋“œ) +``` + +**ํ•„์ˆ˜ ์„ค์ •**: +```json +{ + "cardsPerRow": 3, + "columnMapping": { + "title": "name", + "subtitle": "code", + "image": "image_url", + "status": "status" + } +} +``` + +--- + +### ํŒจํ„ด E: ํ”ผ๋ฒ— ๋ถ„์„ + +**์‚ฌ์šฉ ์กฐ๊ฑด**: ๋‹ค์ฐจ์› ์ง‘๊ณ„/๋ถ„์„ + +**์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ**: +``` +v2-pivot-grid (ํ”ผ๋ฒ—) +``` + +**ํ•„์ˆ˜ ์„ค์ •**: +```json +{ + "fields": [ + { "field": "region", "area": "row" }, + { "field": "year", "area": "column" }, + { "field": "amount", "area": "data", "summaryType": "sum" } + ] +} +``` + +--- + +## 4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ + +### ํ™”๋ฉด ์ •์˜ ํ…Œ์ด๋ธ” + +```sql +-- screen_definitions: ํ™”๋ฉด ๊ธฐ๋ณธ ์ •๋ณด +INSERT INTO screen_definitions ( + screen_id, + screen_name, + screen_code, + description, + table_name, + company_code +) VALUES (...); + +-- screen_layouts_v2: UI ๋ ˆ์ด์•„์›ƒ (JSON) +INSERT INTO screen_layouts_v2 ( + screen_id, + company_code, + layout_data -- JSON: ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ ์ •๋ณด +) VALUES (...); + +-- screen_menu_assignments: ๋ฉ”๋‰ด ์—ฐ๊ฒฐ +INSERT INTO screen_menu_assignments ( + screen_id, + menu_objid, + company_code +) VALUES (...); +``` + +### ์ œ์–ด๊ด€๋ฆฌ ํ…Œ์ด๋ธ” + +```sql +-- dataflow_diagrams: ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง +INSERT INTO dataflow_diagrams ( + diagram_name, + company_code, + control, -- JSON: ์กฐ๊ฑด ์„ค์ • + plan -- JSON: ์‹คํ–‰ ๊ณ„ํš +) VALUES (...); +``` + +--- + +## 5. UI ์„ค์ • vs ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„ค์ • + +### UI ์„ค์ • (ํ™”๋ฉด ๋””์ž์ด๋„ˆ์—์„œ ์ฒ˜๋ฆฌ) + +| ํ•ญ๋ชฉ | ์ €์žฅ ์œ„์น˜ | +|------|----------| +| ์ปดํฌ๋„ŒํŠธ ๋ฐฐ์น˜ | screen_layouts_v2.layout_data | +| ํ…Œ์ด๋ธ”๋ช… | layout_data ๋‚ด tableName | +| ์ปฌ๋Ÿผ ํ‘œ์‹œ/์ˆจ๊น€ | layout_data ๋‚ด columns | +| ๊ฒ€์ƒ‰ ํ•„๋“œ | layout_data ๋‚ด searchFields | +| ๊ธฐ๋ณธ ์ €์žฅ/์‚ญ์ œ | ๋ฒ„ํŠผ config.action.type | + +### ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง (์ œ์–ด๊ด€๋ฆฌ์—์„œ ์ฒ˜๋ฆฌ) + +| ํ•ญ๋ชฉ | ์ €์žฅ ์œ„์น˜ | +|------|----------| +| ์กฐ๊ฑด๋ถ€ ์‹คํ–‰ | dataflow_diagrams.control | +| ๋‹ค์ค‘ ํ…Œ์ด๋ธ” ์ €์žฅ | dataflow_diagrams.plan | +| ๋ฒ„ํŠผ ์ „/ํ›„ ํŠธ๋ฆฌ๊ฑฐ | dataflow_diagrams.control.triggerType | +| ํ•„๋“œ ๋งคํ•‘ | dataflow_diagrams.plan.mappings | + +--- + +## 6. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„ค์ • ํ‘œ์ค€ ํ˜•์‹ + +### ๊ธฐ๋ณธ ๊ตฌ์กฐ + +```json +{ + "control": { + "actionType": "update", + "triggerType": "after", + "conditions": [ + { + "id": "์กฐ๊ฑดID", + "type": "condition", + "field": "status", + "operator": "=", + "value": "๋Œ€๊ธฐ", + "dataType": "string" + } + ] + }, + "plan": { + "mappings": [ + { + "id": "๋งคํ•‘ID", + "sourceField": "์†Œ์Šคํ•„๋“œ", + "targetField": "ํƒ€๊ฒŸํ•„๋“œ", + "targetTable": "ํƒ€๊ฒŸํ…Œ์ด๋ธ”", + "valueType": "field" + } + ] + } +} +``` + +### ์กฐ๊ฑด ์—ฐ์‚ฐ์ž + +| ์—ฐ์‚ฐ์ž | ์„ค๋ช… | +|--------|------| +| `=` | ๊ฐ™์Œ | +| `!=` | ๋‹ค๋ฆ„ | +| `>` | ํผ | +| `<` | ์ž‘์Œ | +| `>=` | ํฌ๊ฑฐ๋‚˜ ๊ฐ™์Œ | +| `<=` | ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Œ | +| `LIKE` | ํฌํ•จ | +| `IN` | ๋ชฉ๋ก์— ํฌํ•จ | +| `IS NULL` | NULL ๊ฐ’ | + +### ์•ก์…˜ ํƒ€์ž… + +| ํƒ€์ž… | ์„ค๋ช… | +|------|------| +| `insert` | ์ƒˆ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… | +| `update` | ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ˆ˜์ • | +| `delete` | ๋ฐ์ดํ„ฐ ์‚ญ์ œ | + +### ํŠธ๋ฆฌ๊ฑฐ ํƒ€์ž… + +| ํƒ€์ž… | ์„ค๋ช… | +|------|------| +| `before` | ๋ฒ„ํŠผ ํด๋ฆญ ์ „ ์‹คํ–‰ | +| `after` | ๋ฒ„ํŠผ ํด๋ฆญ ํ›„ ์‹คํ–‰ | + +--- + +## 7. ํ™”๋ฉด ๊ฐœ๋ฐœ ์ˆœ์„œ + +### Step 1: ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ + +``` +1. ์–ด๋–ค ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? +2. ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋Š”? (FK) +3. ์–ด๋–ค ํŒจํ„ด์ธ๊ฐ€? (A/B/C/D/E) +4. ์–ด๋–ค ๋ฒ„ํŠผ์ด ํ•„์š”ํ•œ๊ฐ€? +5. ๊ฐ ๋ฒ„ํŠผ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€? +``` + +### Step 2: screen_definitions INSERT + +```sql +INSERT INTO screen_definitions ( + screen_name, + screen_code, + description, + table_name, + company_code, + created_at +) VALUES ( + 'ํ™”๋ฉด๋ช…', + 'SCREEN_CODE', + 'ํ™”๋ฉด ์„ค๋ช…', + '๋ฉ”์ธํ…Œ์ด๋ธ”๋ช…', + 'ํšŒ์‚ฌ์ฝ”๋“œ', + NOW() +) RETURNING screen_id; +``` + +### Step 3: screen_layouts_v2 INSERT + +```sql +INSERT INTO screen_layouts_v2 ( + screen_id, + company_code, + layout_data +) VALUES ( + ์œ„์—์„œ_๋ฐ›์€_screen_id, + 'ํšŒ์‚ฌ์ฝ”๋“œ', + '{"components": [...], "layout": {...}}'::jsonb +); +``` + +### Step 4: dataflow_diagrams INSERT (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์žˆ๋Š” ๊ฒฝ์šฐ) + +```sql +INSERT INTO dataflow_diagrams ( + diagram_name, + company_code, + control, + plan +) VALUES ( + 'ํ™”๋ฉด๋ช…_์ œ์–ด', + 'ํšŒ์‚ฌ์ฝ”๋“œ', + '{"์กฐ๊ฑด์„ค์ •"}'::jsonb, + '{"์‹คํ–‰๊ณ„ํš"}'::jsonb +); +``` + +### Step 5: screen_menu_assignments INSERT + +```sql +INSERT INTO screen_menu_assignments ( + screen_id, + menu_objid, + company_code +) VALUES ( + screen_id, + ๋ฉ”๋‰ดID, + 'ํšŒ์‚ฌ์ฝ”๋“œ' +); +``` + +--- + +## 8. ์˜ˆ์‹œ: ์ˆ˜์ฃผ๊ด€๋ฆฌ ํ™”๋ฉด + +### ์š”๊ตฌ์‚ฌํ•ญ + +``` +ํ™”๋ฉด๋ช…: ์ˆ˜์ฃผ๊ด€๋ฆฌ +ํŒจํ„ด: B (๋งˆ์Šคํ„ฐ-๋””ํ…Œ์ผ) +ํ…Œ์ด๋ธ”: + - ๋งˆ์Šคํ„ฐ: order_master + - ๋””ํ…Œ์ผ: order_detail +๋ฒ„ํŠผ: + - [์ €์žฅ]: order_master์— ์ €์žฅ + - [ํ™•์ •]: + - ์กฐ๊ฑด: status = '๋Œ€๊ธฐ' + - ๋™์ž‘: status๋ฅผ 'ํ™•์ •'์œผ๋กœ ๋ณ€๊ฒฝ + - ์ถ”๊ฐ€: order_history์— ์ด๋ ฅ ์ €์žฅ +``` + +### screen_definitions + +```sql +INSERT INTO screen_definitions ( + screen_name, screen_code, description, table_name, company_code +) VALUES ( + '์ˆ˜์ฃผ๊ด€๋ฆฌ', 'ORDER_MNG', '์ˆ˜์ฃผ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ™”๋ฉด', 'order_master', 'COMPANY_A' +); +``` + +### screen_layouts_v2 (layout_data) + +```json +{ + "components": [ + { + "id": "search-1", + "componentType": "v2-table-search-widget", + "position": {"x": 0, "y": 0}, + "size": {"width": 1920, "height": 80} + }, + { + "id": "split-1", + "componentType": "v2-split-panel-layout", + "position": {"x": 0, "y": 80}, + "size": {"width": 1920, "height": 800}, + "componentConfig": { + "leftPanel": { + "tableName": "order_master" + }, + "rightPanel": { + "tableName": "order_detail", + "relation": { + "type": "detail", + "foreignKey": "order_id" + } + }, + "splitRatio": 30 + } + }, + { + "id": "btn-save", + "componentType": "v2-button-primary", + "componentConfig": { + "text": "์ €์žฅ", + "action": {"type": "save"} + } + }, + { + "id": "btn-confirm", + "componentType": "v2-button-primary", + "componentConfig": { + "text": "ํ™•์ •", + "enableDataflowControl": true, + "dataflowDiagramId": 123 + } + } + ] +} +``` + +### dataflow_diagrams (ํ™•์ • ๋ฒ„ํŠผ ๋กœ์ง) + +```json +{ + "control": { + "actionType": "update", + "triggerType": "after", + "conditions": [ + { + "id": "cond-1", + "type": "condition", + "field": "status", + "operator": "=", + "value": "๋Œ€๊ธฐ", + "dataType": "string" + } + ] + }, + "plan": { + "actions": [ + { + "id": "action-1", + "actionType": "update", + "targetTable": "order_master", + "fieldMappings": [ + {"targetField": "status", "defaultValue": "ํ™•์ •"} + ] + }, + { + "id": "action-2", + "actionType": "insert", + "targetTable": "order_history", + "fieldMappings": [ + {"sourceField": "order_no", "targetField": "order_no"}, + {"sourceField": "customer_name", "targetField": "customer_name"}, + {"defaultValue": "#NOW", "targetField": "confirmed_at"} + ] + } + ] + } +} +``` + +--- + +## 9. ์ง€์›ํ•˜์ง€ ์•Š๋Š” UI (๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š”) + +| UI ์œ ํ˜• | ์ƒํƒœ | ๋Œ€์•ˆ | +|---------|------|------| +| ํŠธ๋ฆฌ ๋ทฐ | โŒ ๋ฏธ์ง€์› | ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด or `v2-tree-view` ๊ฐœ๋ฐœ ํ•„์š” | +| ๊ทธ๋ฃนํ™” ํ…Œ์ด๋ธ” | โŒ ๋ฏธ์ง€์› | ์ผ๋ฐ˜ ํ…Œ์ด๋ธ”๋กœ ๋Œ€์ฒด or `v2-grouped-table` ๊ฐœ๋ฐœ ํ•„์š” | +| ๊ฐ„ํŠธ ์ฐจํŠธ | โŒ ๋ฏธ์ง€์› | ๋ณ„๋„ ๊ฐœ๋ฐœ ํ•„์š” | +| ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ | โŒ ๋ฏธ์ง€์› | ์ˆœ์„œ ์ปฌ๋Ÿผ์œผ๋กœ ๋Œ€์ฒด | + +--- + +## 10. ์ฒดํฌ๋ฆฌ์ŠคํŠธ + +### ํ™”๋ฉด ์ƒ์„ฑ ์‹œ + +``` +โ–ก screen_definitions INSERT ์™„๋ฃŒ +โ–ก screen_layouts_v2 INSERT ์™„๋ฃŒ +โ–ก screen_menu_assignments INSERT ์™„๋ฃŒ (๋ฉ”๋‰ด ์—ฐ๊ฒฐ ํ•„์š” ์‹œ) +โ–ก company_code ํ•„ํ„ฐ๋ง ์ ์šฉ +โ–ก ์‚ฌ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ชจ๋‘ v2- ์ ‘๋‘์‚ฌ์ธ์ง€ ํ™•์ธ +``` + +### ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์„ค์ • ์‹œ + +``` +โ–ก ๊ธฐ๋ณธ ์•ก์…˜ (์ €์žฅ/์‚ญ์ œ)๋งŒ โ†’ ํ™”๋ฉด ๋””์ž์ด๋„ˆ์—์„œ ์„ค์ • +โ–ก ์กฐ๊ฑด๋ถ€/๋‹ค์ค‘ํ…Œ์ด๋ธ” โ†’ dataflow_diagrams INSERT +โ–ก ๋ฒ„ํŠผ config์— dataflowDiagramId ์—ฐ๊ฒฐ +โ–ก control.conditions ์„ค์ • +โ–ก plan.actions ๋˜๋Š” plan.mappings ์„ค์ • +``` + +--- + +## 11. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ ์–‘์‹ (ํ•„์ˆ˜) + +> **๊ฒฝ๊ณ **: ์–‘์‹๋Œ€๋กœ ์•ˆ ์“ฐ๋ฉด ์ฒ˜๋ฆฌ ์•ˆ ํ•จ. ๋ณ‘์‹ ์•„ ์ œ๋Œ€๋กœ ์จ. +> ๋Œ€์ถฉ ์“ฐ๋ฉด ๋Œ€์ถฉ ๋งŒ๋“ค์–ด์ง€๊ณ , ์•ˆ ์“ฐ๋ฉด ์•ˆ ๋งŒ๋“ค์–ด์คŒ. + +### 11.1 ์–‘์‹ ํ…œํ”Œ๋ฆฟ + +``` +=== ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ์„œ === + +ใ€ํ™”๋ฉด ์ •๋ณดใ€‘ +- ํ™”๋ฉด๋ช…: +- ํšŒ์‚ฌ์ฝ”๋“œ: +- ๋ฉ”๋‰ดID (์žˆ์œผ๋ฉด): + +ใ€ํ…Œ์ด๋ธ” ์ •๋ณดใ€‘ +- ๋ฉ”์ธ ํ…Œ์ด๋ธ”: +- ๋””ํ…Œ์ผ ํ…Œ์ด๋ธ” (์žˆ์œผ๋ฉด): +- ๊ด€๊ณ„ FK (์žˆ์œผ๋ฉด): + +ใ€๋ฒ„ํŠผ ๋ชฉ๋กใ€‘ +๋ฒ„ํŠผ1: + - ๋ฒ„ํŠผ๋ช…: + - ๋™์ž‘ ์œ ํ˜•: (์ €์žฅ/์‚ญ์ œ/์ˆ˜์ •/์กฐํšŒ/๊ธฐํƒ€) + - ์กฐ๊ฑด (์žˆ์œผ๋ฉด): + - ๋Œ€์ƒ ํ…Œ์ด๋ธ”: + - ์ถ”๊ฐ€ ๋™์ž‘ (์žˆ์œผ๋ฉด): + +๋ฒ„ํŠผ2: + - ๋ฒ„ํŠผ๋ช…: + - ... + +ใ€์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญใ€‘ +- +``` + +### 11.2 ์ž‘์„ฑ ์˜ˆ์‹œ (์˜ฌ๋ฐ”๋ฅธ ์˜ˆ์‹œ) + +``` +=== ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์š”์ฒญ์„œ === + +ใ€ํ™”๋ฉด ์ •๋ณดใ€‘ +- ํ™”๋ฉด๋ช…: ์ˆ˜์ฃผ๊ด€๋ฆฌ +- ํšŒ์‚ฌ์ฝ”๋“œ: ssalmeog +- ๋ฉ”๋‰ดID: 55566 + +ใ€ํ…Œ์ด๋ธ” ์ •๋ณดใ€‘ +- ๋ฉ”์ธ ํ…Œ์ด๋ธ”: order_master +- ๋””ํ…Œ์ผ ํ…Œ์ด๋ธ”: order_detail +- ๊ด€๊ณ„ FK: order_id + +ใ€๋ฒ„ํŠผ ๋ชฉ๋กใ€‘ +๋ฒ„ํŠผ1: + - ๋ฒ„ํŠผ๋ช…: ์ €์žฅ + - ๋™์ž‘ ์œ ํ˜•: ์ €์žฅ + - ์กฐ๊ฑด: ์—†์Œ + - ๋Œ€์ƒ ํ…Œ์ด๋ธ”: order_master, order_detail + - ์ถ”๊ฐ€ ๋™์ž‘: ์—†์Œ + +๋ฒ„ํŠผ2: + - ๋ฒ„ํŠผ๋ช…: ํ™•์ • + - ๋™์ž‘ ์œ ํ˜•: ์ˆ˜์ • + - ์กฐ๊ฑด: status = '๋Œ€๊ธฐ' + - ๋Œ€์ƒ ํ…Œ์ด๋ธ”: order_master + - ์ถ”๊ฐ€ ๋™์ž‘: + 1. status๋ฅผ 'ํ™•์ •'์œผ๋กœ ๋ณ€๊ฒฝ + 2. order_history์— ์ด๋ ฅ INSERT (order_no, customer_name, confirmed_at=ํ˜„์žฌ์‹œ๊ฐ„) + +๋ฒ„ํŠผ3: + - ๋ฒ„ํŠผ๋ช…: ์‚ญ์ œ + - ๋™์ž‘ ์œ ํ˜•: ์‚ญ์ œ + - ์กฐ๊ฑด: status != 'ํ™•์ •' + - ๋Œ€์ƒ ํ…Œ์ด๋ธ”: order_master, order_detail (cascade) + - ์ถ”๊ฐ€ ๋™์ž‘: ์—†์Œ + +ใ€์ถ”๊ฐ€ ์š”๊ตฌ์‚ฌํ•ญใ€‘ +- ํ™•์ •๋œ ์ˆ˜์ฃผ๋Š” ์ˆ˜์ •/์‚ญ์ œ ๋ถˆ๊ฐ€ +- ์ˆ˜์ฃผ๋ฒˆํ˜ธ ์ž๋™์ฑ„๋ฒˆ (ORDER-YYYYMMDD-0001) +``` + +### 11.3 ์ž˜๋ชป๋œ ์˜ˆ์‹œ (์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ์•ˆ ๋จ) + +``` +โŒ "์ˆ˜์ฃผ๊ด€๋ฆฌ ํ™”๋ฉด ๋งŒ๋“ค์–ด์ค˜" + โ†’ ํ…Œ์ด๋ธ”์ด ๋ญ”๋ฐ? ๋ฒ„ํŠผ์€? ๋กœ์ง์€? + +โŒ "์ €์žฅ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์ €์žฅํ•ด์ค˜" + โ†’ ์–ด๋–ค ํ…Œ์ด๋ธ”์—? ์กฐ๊ฑด์€? + +โŒ "ํ™•์ •ํ•˜๋ฉด ์žฌ๊ณ  ์ฒ˜๋ฆฌํ•ด์ค˜" + โ†’ ์–ด๋–ค ํ…Œ์ด๋ธ”? ์ฆ๊ฐ€? ๊ฐ์†Œ? ์–ผ๋งˆ๋‚˜? + +โŒ "์ด์ „ ํ™”๋ฉด์ด๋ž‘ ๋น„์Šทํ•˜๊ฒŒ" + โ†’ ์ด์ „ ํ™”๋ฉด์ด ๋ญ”๋ฐ? +``` + +### 11.4 ๋ณต์žกํ•œ ๋กœ์ง ์ถ”๊ฐ€ ์–‘์‹ + +์กฐ๊ฑด์ด ์—ฌ๋Ÿฌ ๊ฐœ์ด๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๊ฒฝ์šฐ: + +``` +ใ€๋ณต์žกํ•œ ๋ฒ„ํŠผ ๋กœ์งใ€‘ +๋ฒ„ํŠผ๋ช…: ์ถœ๊ณ ํ™•์ • + +์‹คํ–‰ ์กฐ๊ฑด: + ์กฐ๊ฑด1: status = '์ถœ๊ณ ๋Œ€๊ธฐ' AND + ์กฐ๊ฑด2: qty > 0 AND + ์กฐ๊ฑด3: warehouse_id IS NOT NULL + +์‹คํ–‰ ๋™์ž‘ (์ˆœ์„œ๋Œ€๋กœ): + 1. shipment_master.status โ†’ '์ถœ๊ณ ์™„๋ฃŒ' + 2. inventory์—์„œ qty๋งŒํผ ๊ฐ์†Œ (WHERE item_code = ํ˜„์žฌํ–‰.item_code) + 3. shipment_history์— INSERT: + - shipment_no โ† ํ˜„์žฌํ–‰.shipment_no + - shipped_qty โ† ํ˜„์žฌํ–‰.qty + - shipped_at โ† ํ˜„์žฌ์‹œ๊ฐ„ + - shipped_by โ† ํ˜„์žฌ์‚ฌ์šฉ์ž + +์‹คํŒจ ์‹œ: + - ์žฌ๊ณ  ๋ถ€์กฑ: "์žฌ๊ณ ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค" ๋ฉ”์‹œ์ง€ + - ์กฐ๊ฑด ๋ถˆ์ถฉ์กฑ: "์ถœ๊ณ ๋Œ€๊ธฐ ์ƒํƒœ๋งŒ ํ™•์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค" ๋ฉ”์‹œ์ง€ +``` + +--- + +## 12. ์ฐธ๊ณ  ๊ฒฝ๋กœ + +| ํ•ญ๋ชฉ | ๊ฒฝ๋กœ/ํ…Œ์ด๋ธ” | +|------|------------| +| ์ œ์–ด๊ด€๋ฆฌ ํŽ˜์ด์ง€ | `/admin/systemMng/dataflow` | +| ํ™”๋ฉด ์ •์˜ ํ…Œ์ด๋ธ” | `screen_definitions` | +| ๋ ˆ์ด์•„์›ƒ ํ…Œ์ด๋ธ” | `screen_layouts_v2` | +| ์ œ์–ด๊ด€๋ฆฌ ํ…Œ์ด๋ธ” | `dataflow_diagrams` | +| ๋ฉ”๋‰ด ์—ฐ๊ฒฐ ํ…Œ์ด๋ธ” | `screen_menu_assignments` | diff --git a/frontend/components/screen/ScreenSettingModal.tsx b/frontend/components/screen/ScreenSettingModal.tsx index b2d59539..88ee9ece 100644 --- a/frontend/components/screen/ScreenSettingModal.tsx +++ b/frontend/components/screen/ScreenSettingModal.tsx @@ -733,7 +733,12 @@ function TableColumnAccordion({ if (allTables.length === 0) { const tablesResult = await tableManagementApi.getTableList(); if (tablesResult.success && tablesResult.data) { - setAllTables(tablesResult.data); + // ์ค‘๋ณต ํ…Œ์ด๋ธ” ์ œ๊ฑฐ (tableName ๊ธฐ์ค€) + const uniqueTables = tablesResult.data.filter( + (table, index, self) => + index === self.findIndex((t) => t.tableName === table.tableName) + ); + setAllTables(uniqueTables); } } } catch (error) { @@ -1348,9 +1353,9 @@ function JoinSettingEditor({ ํ…Œ์ด๋ธ”์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. - {allTables.map(t => ( + {allTables.map((t, idx) => ( { setEditingJoin({ ...editingJoin, referenceTable: t.tableName, referenceColumn: "", displayColumn: "" });