Files
his/scripts/execute_repair.py

183 lines
6.2 KiB
Python
Raw 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.

import psycopg2
import json
import sys
# 设置UTF-8编码
sys.stdout.reconfigure(encoding="utf-8")
# 数据库连接
conn = psycopg2.connect(
host="192.168.110.252",
port=15432,
database="postgresql",
user="postgresql",
password="Jchl1528",
)
cursor = conn.cursor()
# 设置schema
cursor.execute("SET search_path TO hisdev, public")
conn.commit()
# 1. 查询需要修复的记录数
print("=" * 60)
print("Bug #318 历史数据修复")
print("=" * 60)
print()
print("步骤1: 查询需要修复的手术申请单...")
cursor.execute("""
SELECT COUNT(*)
FROM doc_request_form rf
LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no
AND sr.delete_flag = '0'
WHERE rf.type_code = 'PROCEDURE'
AND rf.delete_flag = '0'
AND sr.id IS NULL
""")
count = cursor.fetchone()[0]
print(f"✓ 发现 {count} 条需要修复的手术申请单")
print()
if count == 0:
print("没有需要修复的数据")
else:
# 2. 查看部分记录详情
print("步骤2: 查看部分记录详情...")
cursor.execute("""
SELECT rf.id, rf.prescription_no, rf.encounter_id, rf.patient_id, rf.create_time
FROM doc_request_form rf
LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no
AND sr.delete_flag = '0'
WHERE rf.type_code = 'PROCEDURE'
AND rf.delete_flag = '0'
AND sr.id IS NULL
ORDER BY rf.create_time DESC
LIMIT 5
""")
rows = cursor.fetchall()
for row in rows:
print(
f" ID: {row[0]}, 单号: {row[1]}, 就诊: {row[2]}, 患者: {row[3]}, 时间: {row[4]}"
)
print()
# 3. 执行修复 - 生成ServiceRequest
print("步骤3: 生成手术医嘱ServiceRequest...")
cursor.execute("""
INSERT INTO wor_service_request (
bus_no, prescription_no, status_enum, generate_source_enum,
therapy_enum, quantity, unit_code, category_enum,
patient_id, requester_id, encounter_id, authored_time,
org_id, content_json, delete_flag, create_time, create_by, tenant_id
)
SELECT
LPAD(FLOOR(RANDOM() * 10000)::TEXT, 4, '0'),
rf.prescription_no,
1, 1, 2, 1, '', 4,
rf.patient_id, rf.requester_id, rf.encounter_id, rf.create_time,
rf.org_id, rf.desc_json, '0', rf.create_time, rf.requester_id, 1
FROM doc_request_form rf
LEFT JOIN wor_service_request sr ON sr.prescription_no = rf.prescription_no
AND sr.delete_flag = '0'
WHERE rf.type_code = 'PROCEDURE'
AND rf.delete_flag = '0'
AND sr.id IS NULL
RETURNING id, prescription_no
""")
new_requests = cursor.fetchall()
print(f"✓ 成功生成 {len(new_requests)} 条手术医嘱")
print()
# 4. 生成ChargeItem
print("步骤4: 生成收费项目ChargeItem...")
# 获取刚插入的ServiceRequest
prescription_nos = [r[1] for r in new_requests]
if prescription_nos:
cursor.execute(
"""
INSERT INTO adm_charge_item (
bus_no, status_enum, generate_source_enum, patient_id,
context_enum, encounter_id, enterer_id, entered_date,
service_table, service_id, product_table, requesting_org_id,
quantity_value, quantity_unit, unit_price, total_price,
delete_flag, create_time, create_by, tenant_id
)
SELECT
'CI' || sr.bus_no, 1, 1, sr.patient_id, 3, sr.encounter_id,
sr.requester_id, sr.create_time, 'wor_service_request', sr.id,
'wor_activity_definition', sr.org_id, 1, '',
COALESCE((sr.content_json::jsonb->>'surgeryFee')::numeric, 0),
COALESCE((sr.content_json::jsonb->>'surgeryFee')::numeric, 0),
'0', sr.create_time, sr.requester_id, 1
FROM wor_service_request sr
WHERE sr.prescription_no = ANY(%s)
AND sr.category_enum = 4
AND sr.delete_flag = '0'
""",
(prescription_nos,),
)
# 麻醉费用
cursor.execute(
"""
INSERT INTO adm_charge_item (
bus_no, status_enum, generate_source_enum, patient_id,
context_enum, encounter_id, enterer_id, entered_date,
service_table, service_id, product_table, requesting_org_id,
quantity_value, quantity_unit, unit_price, total_price,
delete_flag, create_time, create_by, tenant_id
)
SELECT
'CI' || sr.bus_no || '_A', 1, 1, sr.patient_id, 3, sr.encounter_id,
sr.requester_id, sr.create_time, 'wor_service_request', sr.id,
'wor_activity_definition', sr.org_id, 1, '',
(sr.content_json::jsonb->>'anesthesiaFee')::numeric,
(sr.content_json::jsonb->>'anesthesiaFee')::numeric,
'0', sr.create_time, sr.requester_id, 1
FROM wor_service_request sr
WHERE sr.prescription_no = ANY(%s)
AND sr.category_enum = 4
AND sr.delete_flag = '0'
AND sr.content_json::jsonb->>'anesthesiaFee' IS NOT NULL
AND (sr.content_json::jsonb->>'anesthesiaFee')::numeric > 0
""",
(prescription_nos,),
)
print(f"✓ 成功生成收费项目")
print()
# 5. 验证结果
print("步骤5: 验证修复结果...")
cursor.execute("""
SELECT COUNT(*) FROM wor_service_request
WHERE category_enum = 4 AND delete_flag = '0'
""")
service_count = cursor.fetchone()[0]
cursor.execute("""
SELECT COUNT(*) FROM adm_charge_item ci
WHERE ci.service_table = 'wor_service_request'
AND EXISTS (
SELECT 1 FROM wor_service_request sr
WHERE sr.id = ci.service_id AND sr.category_enum = 4
)
""")
charge_count = cursor.fetchone()[0]
print(f"✓ 手术医嘱总数: {service_count}")
print(f"✓ 手术收费项目总数: {charge_count}")
print()
# 提交事务
conn.commit()
print("=" * 60)
print("✓ 修复完成!")
print("=" * 60)
cursor.close()
conn.close()