Files
njts-accounting-core/fix_orphan_records.py
2026-02-20 15:47:27 +09:00

134 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""
修复孤立的 is_latest=false 记录
将所有 is_latest=false 且 original_entry_id=NULL 的记录
链接到它们对应的最新版本
"""
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("=" * 80)
print("【修復孤立記錄的版本鏈】")
print("=" * 80)
# 找出所有孤立的 is_latest=false, original_entry_id=NULL 的記錄
cur.execute("""
SELECT journal_entry_id, description, entry_date
FROM journal_entries
WHERE is_latest = false
AND original_entry_id IS NULL
AND is_deleted = false
ORDER BY journal_entry_id
""")
orphans = cur.fetchall()
if not orphans:
print("\n✓ 沒有孤立的記錄")
else:
print(f"\n發現 {len(orphans)} 條孤立記錄\n")
fixed_count = 0
for orphan in orphans:
orphan_id, desc, entry_date = orphan
print(f"【修復 ID={orphan_id}{desc}")
# 找出這條記錄對應的最新版本
# 假設修正版本的 ID 會比原始版本更大(遞增)
# 且 is_latest=true並且創建時間更晚
cur.execute("""
SELECT journal_entry_id
FROM journal_entries
WHERE journal_entry_id > %s
AND entry_date = %s
AND is_latest = true
AND (description LIKE %s OR description LIKE %s)
ORDER BY journal_entry_id DESC
LIMIT 1
""", (orphan_id, entry_date, f"%{desc}%", f"%【修正後】%{desc}%"))
latest_row = cur.fetchone()
if latest_row:
latest_id = latest_row[0]
# 更新孤立記錄,將其 original_entry_id 設置為它自己
# 這樣它就成為一條有效的"原始版本"
cur.execute("""
UPDATE journal_entries
SET original_entry_id = %s
WHERE journal_entry_id = %s
""", (orphan_id, orphan_id))
# 更新最新版本,確保指向正確的原始 ID
cur.execute("""
UPDATE journal_entries
SET original_entry_id = %s
WHERE journal_entry_id = %s
AND (original_entry_id IS NULL OR original_entry_id != %s)
""", (orphan_id, latest_id, orphan_id))
conn.commit()
print(f" ✓ 已將 ID={latest_id} 的 original_entry_id 設置為 {orphan_id}")
fixed_count += 1
else:
# 如果沒有找到更新的版本,就把這條記錄標記為原始版本
cur.execute("""
UPDATE journal_entries
SET original_entry_id = %s
WHERE journal_entry_id = %s
""", (orphan_id, orphan_id))
conn.commit()
print(f" ✓ 標記為原始版本")
fixed_count += 1
print(f"\n✓ 修復完成,共處理 {fixed_count} 條記錄")
# 驗證結果
print("\n【驗證結果】")
print("-" * 80)
cur.execute("""
SELECT COUNT(*)
FROM journal_entries
WHERE is_latest = false
AND original_entry_id IS NULL
AND is_deleted = false
""")
remaining = cur.fetchone()[0]
print(f"剩餘孤立記錄: {remaining}")
# 檢查 test 元 是否已修復
cur.execute("""
SELECT journal_entry_id, description, original_entry_id, is_latest
FROM journal_entries
WHERE description LIKE '%test%'
AND is_deleted = false
ORDER BY journal_entry_id
""")
test_records = cur.fetchall()
print(f"\ntest 元 記錄(修復後):")
for rec in test_records:
je_id, desc, orig_id, is_latest = rec
status = "" if is_latest else " "
print(f"{status} ID={je_id}: original_entry_id={orig_id} - {desc}")
conn.close()
except Exception as e:
print(f'錯誤: {e}')
import traceback
traceback.print_exc()