183 lines
6.2 KiB
Python
183 lines
6.2 KiB
Python
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()
|