여러 방법으로 테스트해보다가 성공하지 못해서 구현이 가능한건지 궁금해서 문의드립니다
이해를 돕기 위해 간략한 테이블 예시를 함께 첨부합니다!
테이블 구조는 아래와 같습니다.
journal : 전표 테이블
account_chart : 계정과목 테이블
journal_entry : 개별 분개 테이블. 전표 데이터의 상세 데이터입니다. (journal_id와 account_chart_id를 FK로 보유)
구현하고 싶은 기능은 아래와 같습니다.
journal 데이터는 journal_entry 데이터를 최소 2개 이상 보유해야 하기 때문에, journal과 journal_entry(2개 이상)를 동시에 생성해야 하며, 생성되는 journal_entry는 journal_id를 FK로 보유해야 합니다.
모달에서 insert하는 경우, table 형식으로 복수 데이터를 입력하는 방법을 찾지 못해, 아래와 같이 고민하고 있었습니다!
기능의 동작 순서는 아래와 같습니다.
1. journal 조회 페이지에 표시된 [등록] 버튼을 눌러 모달 열기
여기까지는 아무 문제 없습니다!
2. 모달에서 journal과 journal_entry 정보를 각각 입력
insert 기능이 포함된 경우, form이 자동 적용되어서 display: html table을 사용해봐야 하나 고민 중입니다!
3. 입력 완료 후 제출 버튼 클릭
4. sqlTransaction으로 journal을 먼저 insert
5. sqlTransaction으로 (4)에서 생성된 journal_id를 활용하여 journal_entry 생성
(4)에서 생성된 journal_id를 params로 잡을 수 있을지, 아니면 LAST_INSERT_ID() 등으로 인용할 수 있을지 궁금합니다!
hbkim
7월 7, 2025, 4:00오전
2
안녕하세요.
requestSubmitFn 과 block id, params format: table 등을 활용한 방법 예제와 함께 안내드립니다.
추가로 궁금하신점은 문의 주시기 바랍니다.
감사합니다.
menus:
- path: pages/QNA_wz
name: 새로운 메뉴
pages:
- path: pages/QNA_wz
title: 제목
subtitle: 내용
blocks:
# 전표 목록 조회
- type: query
resource: mysql.qa
sql: >
SELECT
j.id,
j.date,
j.status,
j.description,
COUNT(je.id) as entry_count,
j.created_at
FROM journal j
LEFT JOIN journal_entry je ON j.id = je.journal_id
GROUP BY j.id, j.date, j.status, j.description
ORDER BY j.date DESC
id: journal_list
# Journal 생성 쿼리 (숨김)
- type: query
resource: mysql.qa
sqlType: insert
sql: >
INSERT INTO journal
SET date = :date,
status = :status,
url = :url,
description = :description,
created_at = NOW()
params:
- key: date
- key: status
- key: url
- key: description
id: query_create_journal
hidden: true
reloadAfterSubmit: true
toast: 전표 기본정보 저장됨
# Journal Entry 생성 쿼리 (숨김)
- type: query
resource: mysql.qa
sqlType: insert
sql: >
INSERT INTO journal_entry
SET journal_id = :journal_id,
partner_id = :partner_id,
debit_account_chart_id = :debit_account_chart_id,
debit_amount = :debit_amount,
credit_account_chart_id = :credit_account_chart_id,
credit_amount = :credit_amount,
created_at = NOW()
params:
- key: journal_id
- key: partner_id
- key: debit_account_chart_id
- key: debit_amount
- key: credit_account_chart_id
- key: credit_amount
id: query_create_journal_entry
hidden: true
toast: 분개 항목 추가됨
# 전표 등록 폼
- type: query
resource: mysql.qa
sqlType: insert
sql: >
SELECT 1
resetAfterSubmit: true
display: form
formOptions:
firstLabelWidth: 90px
width: 1200px
params:
- key: date
label: 전표 날짜
required: true
format: date
title: 전표 정보
- key: status
label: 상태
required: true
datalist:
- value: draft
label: 임시저장
- value: confirmed
label: 승인완료
selectOptions:
enabled: true
defaultValue: draft
- key: url
label: URL
width: 400px
- key: description
label: 적요
required: true
width: 400px
- key: entries
title: 분개 정보
label: 분개 내역
format: table
value:
- partner_id: ''
debit_account_chart_id: ''
debit_amount: ''
credit_account_chart_id: ''
credit_amount: ''
headers:
partner_id:
label: 거래처
required: true
datalist:
- value: 1
label: ABC상사
- value: 2
label: XYZ유통
- value: 3
label: 대한상사
- value: 4
label: 글로벌무역
selectOptions:
enabled: true
thStyle:
width: 150px
debit_account_chart_id:
label: 차변 계정
datalist:
- value: 1
label: 현금
- value: 2
label: 보통예금
- value: 3
label: 매출채권
- value: 4
label: 상품
- value: 5
label: 매입채무
- value: 6
label: 매출
- value: 7
label: 매입
- value: 8
label: 급여
selectOptions:
enabled: true
thStyle:
width: 150px
debit_amount:
label: 차변 금액
format: number
thStyle:
width: 120px
credit_account_chart_id:
label: 대변 계정
datalist:
- value: 1
label: 현금
- value: 2
label: 보통예금
- value: 3
label: 매출채권
- value: 4
label: 상품
- value: 5
label: 매입채무
- value: 6
label: 매출
- value: 7
label: 매입
- value: 8
label: 급여
selectOptions:
enabled: true
thStyle:
width: 150px
credit_amount:
label: 대변 금액
format: number
thStyle:
width: 120px
id: form
toast: |
전표가 성공적으로 등록되었습니다.
toastOptions:
type: success
position: top-right
duration: 4000
requestSubmitFn: |
const entries = form.params.entries.value || []
if (entries.length === 0) {
throw new Error('분개 내역을 입력해주세요. (최소 1개 필요)')
}
let totalDebit = 0
let totalCredit = 0
for (const entry of entries) {
const debitAmount = parseFloat(entry.debit_amount.value) || 0
const creditAmount = parseFloat(entry.credit_amount.value) || 0
totalDebit += debitAmount
totalCredit += creditAmount
}
if (totalDebit !== totalCredit) {
throw new Error(`차변 합계(${totalDebit.toLocaleString()})와 대변 합계(${totalCredit.toLocaleString()})가 일치하지 않습니다.`)
}
// 유효성 통과 후 journal 생성
query_create_journal.params.date.value = form.params.date.value
query_create_journal.params.status.value = form.params.status.value
query_create_journal.params.url.value = form.params.url.value
query_create_journal.params.description.value = form.params.description.value
const journalResult = await query_create_journal.trigger()
const journal_id = journalResult.insertId ||
(journalResult.rows && journalResult.rows.insertId) ||
(journalResult.rows && journalResult.rows[0] && journalResult.rows[0].insertId)
if (!journal_id) {
console.error('journal_id를 찾을 수 없습니다:', journalResult)
throw new Error('전표 생성에 실패했습니다.')
}
for (const entry of entries) {
query_create_journal_entry.params.journal_id.value = journal_id
query_create_journal_entry.params.partner_id.value = entry.partner_id.value || null
query_create_journal_entry.params.debit_account_chart_id.value = entry.debit_account_chart_id.value || null
query_create_journal_entry.params.debit_amount.value = parseFloat(entry.debit_amount.value) || 0
query_create_journal_entry.params.credit_account_chart_id.value = entry.credit_account_chart_id.value || null
query_create_journal_entry.params.credit_amount.value = parseFloat(entry.credit_amount.value) || 0
await query_create_journal_entry.trigger()
}
1개의 좋아요
자세히 안내해주셔서 감사합니다!
한 번에 이해가 되네요
1개의 좋아요