From 40251d2aaac91686acd6009f8899cc4d48c59c49 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 25 Jul 2026 20:33:48 +0900 Subject: [PATCH] feat(wbs-ux): add OMS/WMS/ERP quick transaction modals to SystemSettingsView --- src/frontend/src/views/SystemSettingsView.vue | 189 ++++++++++++++---- 1 file changed, 151 insertions(+), 38 deletions(-) diff --git a/src/frontend/src/views/SystemSettingsView.vue b/src/frontend/src/views/SystemSettingsView.vue index 1dbf557b..0536b064 100644 --- a/src/frontend/src/views/SystemSettingsView.vue +++ b/src/frontend/src/views/SystemSettingsView.vue @@ -39,8 +39,17 @@ const activeDomain = ref<'ALL' | 'OMS' | 'WMS' | 'ERP'>('ALL'); const searchKeyword = ref(''); const activeCategoryTab = ref('ALL'); -// 2. 동적 드래그 반응형 Split Pane Resizer & 1-Click 스플릿 프리셋 -const masterPanelWidth = ref(60); // 기본 60% +// 2. OMS / WMS / ERP 전용 퀵 트랜잭션 모달 상태 +const isOmsModalOpen = ref(false); +const isWmsModalOpen = ref(false); +const isErpModalOpen = ref(false); + +const omsOrderForm = ref({ symbol: '005930 (삼성전자)', orderType: 'LIMIT', price: '72,500', qty: '100' }); +const wmsVaultForm = ref({ fromAccount: 'D+2 Vault Main', toAccount: 'KIS Trading Account', amount: '50,000,000' }); +const erpApprovalForm = ref({ reqId: 'REQ-2026-0725', approver: 'risk_director_kjh', decision: 'APPROVED', comment: '리스크 가드 검토 승인 완료' }); + +// 3. 동적 드래그 반응형 Split Pane Resizer & 1-Click 스플릿 프리셋 +const masterPanelWidth = ref(60); const isDraggingSplitter = ref(false); const setSplitRatio = (percent: number) => { @@ -72,12 +81,12 @@ const stopSplitterDrag = () => { document.removeEventListener('mouseup', stopSplitterDrag); }; -// 3. Master-Detail 바인딩 및 편집 모드 토글 상태 +// 4. Master-Detail 바인딩 및 편집 모드 토글 상태 const items = ref([]); const selectedItem = ref(null); const isEditMode = ref(false); -// 4. 현장감 텔레메트리, 소켓, AI AX 코파일럿 상태 +// 5. 현장감 텔레메트리, 소켓, AI AX 코파일럿 상태 const pingMs = ref(4); const isBatchRunning = ref(false); const batchProgress = ref(0); @@ -91,12 +100,12 @@ const liveLogs = ref([ '[14:02:15] [WARN] WMS Vault Safety Check: D+2 Cash level 500,000,000 KRW OK' ]); -// 5. 페이지네이션 및 드롭다운 상태 +// 6. 페이지네이션 및 드롭다운 상태 const currentPage = ref(1); const showExportMenu = ref(false); const isGuideModalOpen = ref(false); -// 6. 토스트 알림 메시지 +// 7. 토스트 알림 메시지 const toastMessage = ref<{ text: string; type: 'success' | 'warning' | 'error' } | null>(null); const showToast = (text: string, type: 'success' | 'warning' | 'error' = 'success') => { toastMessage.value = { text, type }; @@ -105,7 +114,7 @@ const showToast = (text: string, type: 'success' | 'warning' | 'error' = 'succes }, 3000); }; -// 7. 모달 대화상자 상태 +// 8. 모달 대화상자 상태 const isModalOpen = ref(false); const modalItem = ref({ id: 0, @@ -120,7 +129,7 @@ const modalItem = ref({ maker_checker: 'APPROVED' }); -// 8. 필터링된 항목 계산 +// 9. 필터링된 항목 계산 const filteredItems = computed(() => { return items.value.filter(item => { const matchDomain = activeDomain.value === 'ALL' || item.domain === activeDomain.value; @@ -132,7 +141,7 @@ const filteredItems = computed(() => { }); }); -// 9. AG Grid 컬럼 정의 +// 10. AG Grid 컬럼 정의 const columnDefs = ref([ { field: 'id', headerName: 'ID', width: 55, sortable: true }, { field: 'domain', headerName: '도메인', width: 85, cellRenderer: (p: any) => `${p.value}` }, @@ -200,6 +209,24 @@ const runFactorBatch = () => { }, 300); }; +const submitOmsOrder = () => { + isOmsModalOpen.value = false; + liveLogs.value.unshift(`[${new Date().toLocaleTimeString()}] [OMS] Submitted Order: ${omsOrderForm.value.symbol} ${omsOrderForm.value.qty}개 (${omsOrderForm.value.price}원)`); + showToast(`📈 OMS 주문이 성공적으로 전송되었습니다 (${omsOrderForm.value.symbol}).`, 'success'); +}; + +const executeWmsTransfer = () => { + isWmsModalOpen.value = false; + liveLogs.value.unshift(`[${new Date().toLocaleTimeString()}] [WMS] Transferred ${wmsVaultForm.value.amount} KRW from ${wmsVaultForm.value.fromAccount}`); + showToast(`🏦 WMS 현금 이체가 완료되었습니다 (${wmsVaultForm.value.amount} KRW).`, 'success'); +}; + +const approveErpRequest = () => { + isErpModalOpen.value = false; + liveLogs.value.unshift(`[${new Date().toLocaleTimeString()}] [ERP] Request ${erpApprovalForm.value.reqId} approved by ${erpApprovalForm.value.approver}`); + showToast(`📑 ERP Maker-Checker 결재 승인이 완료되었습니다.`, 'success'); +}; + const applyAiRecommendation = () => { if (selectedItem.value) { selectedItem.value.setting_value = '68.5'; @@ -299,12 +326,19 @@ onMounted(loadData); 🟢 Live ({{ pingMs }}ms) 📡 SignalR Active - +
- - - - + + + + + + +
+ + + +
@@ -313,7 +347,7 @@ onMounted(loadData); - + @@ -354,7 +388,6 @@ onMounted(loadData); -
✂️ 스플릿 비율: @@ -529,6 +562,63 @@ onMounted(loadData); ⚡ Hangfire Jobs: Healthy
+ + + + + + + + + - +