This commit is contained in:
admin
2026-02-20 15:47:27 +09:00
parent c60cbf2d9a
commit 584530937b
108 changed files with 12112 additions and 416 deletions

171
debug_is_latest.py Normal file
View File

@@ -0,0 +1,171 @@
#!/usr/bin/env python3
"""
详细检查数据库中的 is_latest 标记问题
"""
import psycopg
try:
conn = psycopg.connect(
host='192.168.0.61',
port=55432,
dbname='njts_acct',
user='njts_app',
password='njts_app2025'
)
with conn.cursor() as cur:
print("=" * 90)
print("【詳細檢查is_latest 標記問題】")
print("=" * 90)
# 1. 檢查有多少條記錄的 is_latest = true
cur.execute("SELECT COUNT(*) as cnt FROM journal_entries WHERE is_latest = true AND is_deleted = false")
true_count = cur.fetchone()[0]
cur.execute("SELECT COUNT(*) as cnt FROM journal_entries WHERE is_latest = false AND is_deleted = false")
false_count = cur.fetchone()[0]
print(f"\nis_latest 統計:")
print(f" is_latest = true: {true_count}")
print(f" is_latest = false: {false_count}")
# 2. 查看最近創建的仕訳
print(f"\n【最近100條仕訳】(查看 is_latest 標記)")
print("-" * 90)
cur.execute("""
SELECT
journal_entry_id,
entry_date,
description,
is_latest,
revision_count,
original_entry_id,
created_at
FROM journal_entries
WHERE is_deleted = false
ORDER BY created_at DESC
LIMIT 100
""")
rows = cur.fetchall()
# 分組统计
is_latest_true = []
is_latest_false = []
for row in rows:
je_id, entry_date, desc, is_latest, rev_cnt, orig_id, created_at = row
if is_latest:
is_latest_true.append(row)
else:
is_latest_false.append(row)
print(f"最近100條中")
print(f" is_latest = true: {len(is_latest_true)}")
print(f" is_latest = false: {len(is_latest_false)}")
# 3. 查看 test 元記錄
print(f"\n【test 元 記錄詳細檢查】")
print("-" * 90)
cur.execute("""
SELECT
journal_entry_id,
entry_date,
description,
is_latest,
revision_count,
original_entry_id
FROM journal_entries
WHERE description LIKE '%test%'
AND is_deleted = false
ORDER BY journal_entry_id DESC
LIMIT 10
""")
test_rows = cur.fetchall()
for row in test_rows:
je_id, entry_date, desc, is_latest, rev_cnt, orig_id = row
status = "" if is_latest else ""
orig_str = f"{orig_id}" if orig_id else ""
print(f"{status} ID={je_id:4d} rev={rev_cnt} {orig_str:>8s} {desc}")
# 4. 檢查同一個 original_entry_id 下是否有多個 is_latest=true
print(f"\n【檢查同一鏈中的重複 is_latest=true】")
print("-" * 90)
cur.execute("""
SELECT
original_entry_id,
COUNT(*) as latest_count,
STRING_AGG(CAST(journal_entry_id AS text), ',') as ids
FROM journal_entries
WHERE is_latest = true
AND is_deleted = false
AND original_entry_id IS NOT NULL
GROUP BY original_entry_id
HAVING COUNT(*) > 1
""")
duplicates = cur.fetchall()
if duplicates:
print("發現重複的 is_latest=true")
for dup in duplicates:
orig_id, count, ids = dup
print(f" original_entry_id={orig_id}: {count} 條 (IDs: {ids})")
else:
print("✓ 沒有發現重複的 is_latest=true")
# 5. 直接執行試算表查詢邏輯,看查詢結果
print(f"\n【執行試算表查詢with is_latest=true")
print("-" * 90)
cur.execute("""
SELECT
a.account_id,
a.account_code,
a.account_name,
COALESCE(SUM(l.debit), 0) AS debit,
COALESCE(SUM(l.credit), 0) AS credit,
COUNT(DISTINCT e.journal_entry_id) as entry_count
FROM journal_lines l
JOIN journal_entries e ON e.journal_entry_id = l.journal_entry_id
JOIN accounts a ON a.account_id = l.account_id
WHERE e.is_deleted = false
AND e.is_latest = true
AND EXTRACT(YEAR FROM e.entry_date) = 2025
AND EXTRACT(MONTH FROM e.entry_date) = 6
GROUP BY
a.account_id,
a.account_code,
a.account_name
ORDER BY
a.account_code
""")
tb_rows = cur.fetchall()
total_debit = 0
total_credit = 0
for row in tb_rows:
account_id, account_code, account_name, debit, credit, entry_count = row
total_debit += debit
total_credit += credit
if '売上高' in account_name or debit > 0 or credit > 0:
print(f"{account_code:>8s} {account_name:20s} 借:{debit:>15,.2f} 貸:{credit:>15,.2f} (entries: {entry_count})")
print("-" * 90)
print(f"試算表合計:")
print(f" 借方: {total_debit:>15,.2f}")
print(f" 貸方: {total_credit:>15,.2f}")
print(f" 平衡: {total_debit == total_credit}")
conn.close()
except Exception as e:
print(f'錯誤: {e}')
import traceback
traceback.print_exc()