修正
This commit is contained in:
171
debug_is_latest.py
Normal file
171
debug_is_latest.py
Normal 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()
|
||||
Reference in New Issue
Block a user