feat: 清理示例数据并统一空态体验
This commit is contained in:
@@ -0,0 +1,397 @@
|
||||
"""cleanup overview demo data
|
||||
|
||||
Revision ID: 20260331_01
|
||||
Revises: 20260302_02
|
||||
Create Date: 2026-03-31 10:45:00.000000
|
||||
|
||||
"""
|
||||
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
revision: str = "20260331_01"
|
||||
down_revision: Union[str, None] = "20260302_02"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
DEMO_FEASIBILITY_CODES = ("PROJ-001", "PROJ-002", "PROJ-003", "PROJ-004", "PROJ-005")
|
||||
DEMO_ETHICS_CODES = ("EC-001", "EC-002", "EC-003", "EC-004")
|
||||
DEMO_FINANCE_CONTRACT_CODES = ("CT-001", "CT-002", "CT-003")
|
||||
DEMO_STUDY_CODE = "DEMO-CTMS"
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
conn = op.get_bind()
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id
|
||||
FROM startup_feasibility
|
||||
WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id
|
||||
FROM startup_ethics
|
||||
WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id
|
||||
FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes)
|
||||
AND amount = 500000.0
|
||||
AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id
|
||||
FROM kickoff_meetings
|
||||
WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id
|
||||
FROM subjects
|
||||
WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
),
|
||||
candidate_sites AS (
|
||||
SELECT DISTINCT site_id
|
||||
FROM startup_feasibility
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT site_id
|
||||
FROM startup_ethics
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND (
|
||||
approval_no = ANY(:ethics_codes)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-10'
|
||||
AND accept_date = DATE '2025-01-15'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-20'
|
||||
AND accept_date = DATE '2025-01-25'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-30'
|
||||
AND accept_date = DATE '2025-02-04'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
)
|
||||
UNION
|
||||
SELECT DISTINCT site_id
|
||||
FROM kickoff_meetings
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT site_id
|
||||
FROM subjects
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
UPDATE sites
|
||||
SET enrollment_target = 0
|
||||
WHERE id IN (SELECT site_id FROM candidate_sites WHERE site_id IS NOT NULL)
|
||||
AND enrollment_target IN (40, 50, 60, 70, 80)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
DELETE FROM subjects
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
DELETE FROM kickoff_meetings
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND attendees::text = '["研究者", "CRA", "PM"]'
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
DELETE FROM finance_contracts
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND contract_no = ANY(:contract_codes)
|
||||
AND amount = 500000.0
|
||||
AND currency = 'CNY'
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
DELETE FROM startup_ethics
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND (
|
||||
approval_no = ANY(:ethics_codes)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-10'
|
||||
AND accept_date = DATE '2025-01-15'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-20'
|
||||
AND accept_date = DATE '2025-01-25'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
OR (
|
||||
approval_no IS NULL
|
||||
AND submit_date = DATE '2025-01-30'
|
||||
AND accept_date = DATE '2025-02-04'
|
||||
AND meeting_date IS NULL
|
||||
AND approved_date IS NULL
|
||||
)
|
||||
)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH candidate_studies AS (
|
||||
SELECT DISTINCT study_id FROM startup_feasibility WHERE project_no = ANY(:feasibility_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM startup_ethics WHERE approval_no = ANY(:ethics_codes)
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM finance_contracts
|
||||
WHERE contract_no = ANY(:contract_codes) AND amount = 500000.0 AND currency = 'CNY'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM kickoff_meetings WHERE attendees::text = '["研究者", "CRA", "PM"]'
|
||||
UNION
|
||||
SELECT DISTINCT study_id FROM subjects WHERE subject_no ~ '^S0[1-3]-[0-9]{3}$'
|
||||
)
|
||||
DELETE FROM startup_feasibility
|
||||
WHERE study_id IN (SELECT study_id FROM candidate_studies)
|
||||
AND project_no = ANY(:feasibility_codes)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"feasibility_codes": list(DEMO_FEASIBILITY_CODES),
|
||||
"ethics_codes": list(DEMO_ETHICS_CODES),
|
||||
"contract_codes": list(DEMO_FINANCE_CONTRACT_CODES),
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH demo_study AS (
|
||||
SELECT id
|
||||
FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
),
|
||||
demo_contract_fees AS (
|
||||
SELECT id
|
||||
FROM contract_fees
|
||||
WHERE project_id IN (SELECT id FROM demo_study)
|
||||
),
|
||||
demo_special_expenses AS (
|
||||
SELECT id
|
||||
FROM special_expenses
|
||||
WHERE project_id IN (SELECT id FROM demo_study)
|
||||
)
|
||||
DELETE FROM fee_attachments
|
||||
WHERE (
|
||||
entity_type = 'contract_fee'
|
||||
AND entity_id IN (SELECT id FROM demo_contract_fees)
|
||||
) OR (
|
||||
entity_type = 'special_expense'
|
||||
AND entity_id IN (SELECT id FROM demo_special_expenses)
|
||||
) OR (
|
||||
url IN (
|
||||
'https://example.com/contract-demo.pdf',
|
||||
'https://example.com/voucher-demo.pdf',
|
||||
'https://example.com/invoice-demo.pdf'
|
||||
)
|
||||
)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
WITH demo_study AS (
|
||||
SELECT id
|
||||
FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
),
|
||||
demo_contract_fees AS (
|
||||
SELECT id
|
||||
FROM contract_fees
|
||||
WHERE project_id IN (SELECT id FROM demo_study)
|
||||
)
|
||||
DELETE FROM contract_fee_payments
|
||||
WHERE contract_fee_id IN (SELECT id FROM demo_contract_fees)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
DELETE FROM contract_fees
|
||||
WHERE project_id IN (
|
||||
SELECT id
|
||||
FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
DELETE FROM special_expenses
|
||||
WHERE project_id IN (
|
||||
SELECT id
|
||||
FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
)
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
DELETE FROM sites
|
||||
WHERE study_id IN (
|
||||
SELECT id
|
||||
FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
)
|
||||
AND name LIKE '示例中心 %'
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
conn.execute(
|
||||
sa.text(
|
||||
"""
|
||||
DELETE FROM studies
|
||||
WHERE code = :demo_study_code
|
||||
"""
|
||||
),
|
||||
{
|
||||
"demo_study_code": DEMO_STUDY_CODE,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
return
|
||||
Reference in New Issue
Block a user