-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathVC_BC01_constant.py
More file actions
283 lines (245 loc) · 24.9 KB
/
VC_BC01_constant.py
File metadata and controls
283 lines (245 loc) · 24.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
"""
VAPORCONE 项目常量定义模块
该模块包含了VAPORCONE项目中使用的所有常量定义,包括:
- 研究配置参数
- 数据库连接参数
- 文件路径配置
- 字段映射常量
- 标准字段定义
"""
import csv
import json
import logging
import os
import re
import shutil
import sys
import mysql.connector
import numpy
import pandas
from openpyxl import load_workbook
from mysql.connector import errorcode
from dateutil import parser
from datetime import datetime
DEFAULT_PROJECT_CONFIG = {
'STUDY_ID': '',
'CODELIST_TABLE_NAME': '',
'METADATA_TABLE_NAME': '',
'TRANSDATA_VIEW_NAME': '',
'M5_PROJECT_NAME': '',
'ROOT_PATH': '',
'RAW_DATA_ROOT_PATH': '',
}
PROJECT_CONFIG_ENV = 'PROJECT_CONFIG_PATH'
PROJECT_CONFIG_FILENAME = 'project.local.json'
def _load_project_config():
"""Load project-specific overrides from a local JSON file if present."""
config = DEFAULT_PROJECT_CONFIG.copy()
config_path = os.getenv(PROJECT_CONFIG_ENV) or os.path.join(
os.path.dirname(__file__), PROJECT_CONFIG_FILENAME
)
if os.path.isfile(config_path):
try:
with open(config_path, 'r', encoding='utf-8') as f:
overrides = json.load(f)
if not isinstance(overrides, dict):
raise ValueError('config content must be a JSON object')
# only accept keys we know; ignore others silently
for key in DEFAULT_PROJECT_CONFIG:
if key in overrides:
config[key] = overrides[key]
except Exception as exc:
print(f'[VC_BC01_constant] Failed to load {config_path}: {exc}. Using defaults.')
return config
_PROJECT_CONFIG = _load_project_config()
STUDY_ID = _PROJECT_CONFIG['STUDY_ID']
CODELIST_TABLE_NAME = _PROJECT_CONFIG['CODELIST_TABLE_NAME']
METADATA_TABLE_NAME = _PROJECT_CONFIG['METADATA_TABLE_NAME']
TRANSDATA_VIEW_NAME = _PROJECT_CONFIG['TRANSDATA_VIEW_NAME']
M5_PROJECT_NAME = _PROJECT_CONFIG['M5_PROJECT_NAME']
ROOT_PATH = _PROJECT_CONFIG['ROOT_PATH']
RAW_DATA_ROOT_PATH = _PROJECT_CONFIG['RAW_DATA_ROOT_PATH']
DB_HOST = '127.0.0.1'
DB_USER = 'root'
DB_PASSWORD = 'root'
DB_DATABASE = 'VC-DataMigration_2.0'
SPECIFIC_PATH = os.path.join(ROOT_PATH, 'studySpecific', STUDY_ID)
FOLDER_CLEANINGSTEP = '02_Cleaning'
CLEANINGSTEP_PATH = os.path.join(SPECIFIC_PATH, FOLDER_CLEANINGSTEP)
CLEANINGSTEP_TRANSFER_FILE_PATH = os.path.join(CLEANINGSTEP_PATH, 'cleaning_dataset')
CLEANINGSTEP_NOT_TRANSFER_COLS_PATH = os.path.join(CLEANINGSTEP_TRANSFER_FILE_PATH, 'deletedCols')
CLEANINGSTEP_NOT_TRANSFER_ROWS_PATH = os.path.join(CLEANINGSTEP_TRANSFER_FILE_PATH, 'deletedRows')
FOLDER_FORMAT = '03_Format'
FORMAT_PATH = os.path.join(SPECIFIC_PATH, FOLDER_FORMAT)
FORMAT_TRANSFER_FILE_PATH = os.path.join(FORMAT_PATH, 'format_dataset')
FOLDER_SDTMDATASET = '04_SDTM'
SDTMDATASET_PATH = os.path.join(SPECIFIC_PATH, FOLDER_SDTMDATASET)
SDTMDATASET_FILE_PATH = os.path.join(SDTMDATASET_PATH, 'sdtm_dataset')
FOLDER_VALIDATION = '08_Validation'
VALIDATION_PATH = os.path.join(SPECIFIC_PATH, FOLDER_VALIDATION)
VALIDATION_ITEM_PATH = os.path.join(VALIDATION_PATH, 'csv')
VALIDATION_FILE_PATH = os.path.join(VALIDATION_PATH, 'validationset')
INPUTFILE_PATH = os.path.join(SPECIFIC_PATH, "05_Inputfile")
INPUTFILE_DATASET_PATH = os.path.join(INPUTFILE_PATH, 'inputfile_dataset')
INPUTPACKAGE_PATH = os.path.join(SPECIFIC_PATH, '06_Inputpackage')
INPUTPACKAGE_DATASET_PATH = os.path.join(INPUTPACKAGE_PATH, 'inputpackage_dataset')
CONFIG_NAME = STUDY_ID + '_OperationConf.xlsx'
SHEETSETTING_SHEET_NAME = 'SheetSetting'
FILELIST_SHEET_NAME = 'Files'
CASELIST_SHEET_NAME = 'Patients'
PROCESS_SHEET_NAME = 'Process'
REFACTORING_SHEET_NAME = 'Refactoring'
COMBINE_SHEET_NAME = 'Combine'
COMBINE_PROCESS_SHEET_NAME = 'Combine_process'
CODELIST_SHEET_NAME = 'CodeList'
HUMANTRANS_SHEET_NAME = 'HumanTrans'
MAPPING_SHEET_NAME = 'Mapping'
DOMAINSSETTING_SHEET_NAME = 'DomainsSetting'
SITEMASTER_SHEET_NAME = 'Sites'
EXDETAILS_SHEET_NAME = 'EXDETAILS'
VARIABLE_STUDYID = 'STUDYID'
VARIABLE_DOMAIN = 'DOMAIN'
VARIABLE_USUBJID = 'USUBJID'
VARIABLE_SUBJID = 'SUBJID'
VARIABLE_SEQSUFF = 'SEQ'
VARIABLE_DTCSUFF = 'DTC'
COL_STARTINGROW = 'STARTINGROW'
COL_MAXCOL = 'MAXCOL'
COL_USUBJID = 'USUBJID'
COL_SUBJID = 'SUBJID'
COL_MIGRATIONFLAG = 'MIGRATIONFLAG'
COL_FILENAME = 'FILENAME'
COL_STEP = 'STEP'
COL_TITLEROW = 'TITLEROW'
COL_DATARROW = 'DATARROW'
COL_SUBJIDFIELDID = 'SUBJIDFIELDID'
COL_PROCESSINGLOGIC = 'PROCESSINGLOGIC'
COL_FIELDNAME = 'FIELDNAME'
COL_LABEL = 'LABEL'
COL_CODELISTNAME = 'CODELISTNAME'
COL_CHKTYPE = 'CHKTYPE'
COL_OTHERDETAILSPROCESS = 'OTHERDETAILSPROCESS'
COL_DATAEXTRACTION = 'DATAEXTRACTION'
COL_OTHERVAL = 'OTHERVAL'
COL_OTHERDETAILS = 'OTHERDETAILS'
COL_OTHERDETAILSFIELD = 'OTHERDETAILSFIELD'
COL_FUNCTION = 'FUNCTION'
COL_CODE = 'CODE'
COL_VALUERAW = 'VALUERAW'
COL_VALUEEN = 'VALUEEN'
COL_VALUESDTM = 'VALUESDTM'
COL_DEFINITION = 'DEFINITION'
COL_DOMAIN = 'DOMAIN'
COL_VARIABLE = 'VARIABLE'
COL_NDKEY = 'NDKEY'
COL_SORTKEYS = 'SORTKEYS'
COL_MERGERULE = 'MERGERULE'
COL_OPERTYPE = 'OPERTYPE'
COL_PARAMETER = 'PARAMETER'
COL_SITENAME = 'SITENAME'
COL_SITECODE = 'SITECODE'
MARK_BLANK = ''
MARK_DOLLAR = '$$$'
MARK_LINEBREAK = '\n'
MARK_COLON = ':'
MARK_COMMA = ','
MARK_DOT = '.'
MARK_CIRCLE = ['○','〇','◯'] # 〇, ×,
MARK_CROSS = ['×','☓']
MARK_PARENTHESIS_LEFT = '('
MARK_PARENTHESIS_RIGHT = ')'
MARK_SQUARE_BRACKET_LEFT = '['
MARK_SQUARE_BRACKET_RIGHT = ']'
MARK_CURLY_BRACKET_LEFT = '{'
MARK_CURLY_BRACKET_RIGHT = '}'
MARK_EQUAL = '='
MARK_LESS_THAN = '<'
MARK_GREATER_THAN = '>'
MARK_MAX = 'max'
MARK_MIN = 'min'
OPERTYPE_DEF = 'DEF'
OPERTYPE_FIX = 'FIX'
OPERTYPE_FLG = 'FLG'
OPERTYPE_IIF = 'IIF'
OPERTYPE_COB = 'COB'
OPERTYPE_CDL = 'CDL'
OPERTYPE_SEL = 'SEL'
OPERTYPE_PRF = 'PRF'
EXTENSION = '.csv'
PREFIX_SUPP = 'SUPP'
PREFIX_F = 'F-'
PREFIX_C = 'C-'
PREFIX_DC = 'DC-'
PREFIX_DR = 'DR-'
PATTERN_CYCLE_NUM = r'^CYCLE(\d+)'
PATTERN_CYCLE_PRA = r'^CYCLE\((.+)\)$'
STANDARD_FIELDS = {
'AG':['STUDYID','DOMAIN','USUBJID','AGSEQ','AGGRPID','AGSPID','AGLNKID','AGLNKGRP','AGTRT','AGMODIFY','AGDECOD','AGCAT','AGSCAT','AGPRESP','AGOCCUR','AGSTAT','AGREASND','AGCLAS','AGCLASCD','AGDOSE','AGDOSTXT','AGDOSU','AGDOSFRM','AGDOSFRQ','AGROUTE','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','AGSTDTC','AGENDTC','AGSTDY','AGENDY','AGDUR','AGSTRF','AGENRF','AGSTRTPT','AGSTTPT','AGENRTPT','AGENTPT'],
'CM':['STUDYID','DOMAIN','USUBJID','CMSEQ','CMGRPID','CMSPID','CMTRT','CMMODIFY','CMDECOD','CMCAT','CMSCAT','CMPRESP','CMOCCUR','CMSTAT','CMREASND','CMINDC','CMCLAS','CMCLASCD','CMDOSE','CMDOSTXT','CMDOSU','CMDOSFRM','CMDOSFRQ','CMDOSTOT','CMDOSRGM','CMROUTE','CMADJ','CMRSDISC','TAETORD','EPOCH','CMSTDTC','CMENDTC','CMSTDY','CMENDY','CMDUR','CMSTRF','CMENRF','CMSTRTPT','CMSTTPT','CMENRTPT','CMENTPT'],
'EC':['STUDYID','DOMAIN','USUBJID','ECSEQ','ECGRPID','ECREFID','ECSPID','ECLNKID','ECLNKGRP','ECTRT','ECMOOD','ECCAT','ECSCAT','ECPRESP','ECOCCUR','ECREASOC','ECDOSE','ECDOSTXT','ECDOSU','ECDOSFRM','ECDOSFRQ','ECDOSTOT','ECDOSRGM','ECROUTE','ECLOT','ECLOC','ECLAT','ECDIR','ECPORTOT','ECFAST','ECPSTRG','ECPSTRGU','ECADJ','TAETORD','EPOCH','ECSTDTC','ECENDTC','ECSTDY','ECENDY','ECDUR','ECTPT','ECTPTNUM','ECELTM','ECTPTREF','ECRFTDTC'],
'EX':['STUDYID','DOMAIN','USUBJID','EXSEQ','EXGRPID','EXREFID','EXSPID','EXLNKID','EXLNKGRP','EXTRT','EXCAT','EXSCAT','EXDOSE','EXDOSTXT','EXDOSU','EXDOSFRM','EXDOSFRQ','EXDOSRGM','EXROUTE','EXLOT','EXLOC','EXLAT','EXDIR','EXFAST','EXADJ','TAETORD','EPOCH','EXSTDTC','EXENDTC','EXSTDY','EXENDY','EXDUR','EXTPT','EXTPTNUM','EXELTM','EXTPTREF','EXRFTDTC'],
'ML':['STUDYID','DOMAIN','USUBJID','MLSEQ','MLGRPID','MLSPID','MLTRT','MLCAT','MLSCAT','MLPRESP','MLOCCUR','MLSTAT','MLREASND','MLDOSE','MLDOSTXT','MLDOSU','MLDOSFRM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','MLDTC','MLSTDTC','MLENDTC','MLDY','MLSTDY','MLENDY','MLDUR','MLTPT','MLTPTNUM','MLELTM','MLTPTREF','MLRFTDTC','MIDS','RELMIDS','MIDSDTC'],
'PR':['STUDYID','DOMAIN','USUBJID','PRSEQ','PRGRPID','PRSPID','PRLNKID','PRLNKGRP','PRTRT','PRDECOD','PRCAT','PRSCAT','PRPRESP','PROCCUR','PRINDC','PRDOSE','PRDOSTXT','PRDOSU','PRDOSFRM','PRDOSFRQ','PRDOSRGM','PRROUTE','PRLOC','PRLAT','PRDIR','PRPORTOT','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','PRSTDTC','PRENDTC','PRSTDY','PRENDY','PRDUR','PRTPT','PRTPTNUM','PRELTM','PRTPTREF','PRRFTDTC','PRSTRTPT','PRSTTPT','PRENRTPT','PRENTPT'],
'SU':['STUDYID','DOMAIN','USUBJID','SUSEQ','SUGRPID','SUSPID','SUTRT','SUMODIFY','SUDECOD','SUCAT','SUSCAT','SUPRESP','SUOCCUR','SUSTAT','SUREASND','SUCLAS','SUCLASCD','SUDOSE','SUDOSTXT','SUDOSU','SUDOSFRM','SUDOSFRQ','SUDOSTOT','SUROUTE','TAETORD','EPOCH','SUSTDTC','SUENDTC','SUSTDY','SUENDY','SUDUR','SUSTRF','SUENRF','SUSTRTPT','SUSTTPT','SUENRTPT','SUENTPT'],
'AE':['STUDYID','DOMAIN','USUBJID','SPDEVID','AESEQ','AEGRPID','AEREFID','AESPID','AETERM','AEMODIFY','AELLT','AELLTCD','AEDECOD','AEPTCD','AEHLT','AEHLTCD','AEHLGT','AEHLGTCD','AECAT','AESCAT','AEPRESP','AEBODSYS','AEBDSYCD','AESOC','AESOCCD','AELOC','AESEV','AESER','AEACN','AEACNOTH','AEACNDEV','AEREL','AERLDEV','AERELNST','AEPATT','AEOUT','AESCAN','AESCONG','AESDISAB','AESDTH','AESHOSP','AESLIFE','AESOD','AESMIE','AESINTV','AEUNANT','AERLPRT','AERLPRC','AECONTRT','AETOXGR','TAETORD','EPOCH','AESTDTC','AEENDTC','AESTDY','AEENDY','AEDUR','AEENRF','AEENRTPT','AEENTPT'],
'BE':['STUDYID','DOMAIN','USUBJID','SPDEVID','BESEQ','BEGRPID','BEREFID','BESPID','BETERM','BEMODIFY','BEDECOD','BECAT','BESCAT','BELOC','BEPARTY','BEPRTYID','VISITNUM','VISIT','VISITDY','BEDTC','BESTDTC','BEENDTC','BESTDY','BEENDY','BEDUR'],
'CE':['STUDYID','DOMAIN','USUBJID','CESEQ','CEGRPID','CEREFID','CESPID','CETERM','CEDECOD','CECAT','CESCAT','CEPRESP','CEOCCUR','CESTAT','CEREASND','CEBODSYS','CESEV','CETOXGR','TAETORD','EPOCH','CEDTC','CESTDTC','CEENDTC','CEDY','CESTDY','CEENDY','CESTRF','CEENRF','CESTRTPT','CESTTPT','CEENRTPT','CEENTPT'],
'DS':['STUDYID','DOMAIN','USUBJID','DSSEQ','DSGRPID','DSREFID','DSSPID','DSTERM','DSDECOD','DSCAT','DSSCAT','EPOCH','DSDTC','DSSTDTC','DSDY','DSSTDY'],
'DV':['STUDYID','DOMAIN','USUBJID','DVSEQ','DVREFID','DVSPID','DVTERM','DVDECOD','DVCAT','DVSCAT','TAETORD','EPOCH','DVSTDTC','DVENDTC','DVSTDY','DVENDY'],
'HO':['STUDYID','DOMAIN','USUBJID','HOSEQ','HOGRPID','HOREFID','HOSPID','HOTERM','HODECOD','HOCAT','HOSCAT','HOPRESP','HOOCCUR','HOSTAT','HOREASND','TAETORD','EPOCH','HODTC','HOSTDTC','HOENDTC','HODY','HOSTDY','HOENDY','HODUR','HOSTRTPT','HOSTTPT','HOENRTPT','HOENTPT'],
'MH':['STUDYID','DOMAIN','USUBJID','MHSEQ','MHGRPID','MHREFID','MHSPID','MHTERM','MHMODIFY','MHDECOD','MHEVDTYP','MHCAT','MHSCAT','MHPRESP','MHOCCUR','MHSTAT','MHREASND','MHBODSYS','TAETORD','EPOCH','MHDTC','MHSTDTC','MHENDTC','MHDY','MHENRF','MHENRTPT','MHENTPT'],
'BS':['STUDYID','DOMAIN','USUBJID','SPDEVID','BSSEQ','BSGRPID','BSREFID','BSSPID','BSTESTCD','BSTEST','BSCAT','BSSCAT','BSORRES','BSORRESU','BSSTRESC','BSSTRESN','BSSTRESU','BSSTAT','BSREASND','BSNAM','BSSPEC','BSANTREG','BSSPCCND','BSMETHOD','BSBLFL','VISITNUM','VISIT','VISITDY','BSDTC','BSDY','BSTPT','BSTPTNUM','BSELTM','BSTPTREF','BSRFTDTC'],
'CP':['STUDYID','DOMAIN','USUBJID','CPSEQ','CPGRPID','CPREFID','CPSPID','CPLNKID','CPLNKGRP','CPTESTCD','CPTEST','CPSBMRKS','CPCELSTA','CPCSMRKS','CPTSTCND','CPCNDAGT','CPBDAGNT','CPABCLID','CPMRKSTR','CPGATE','CPGATDEF','CPSPTSTD','CPCAT','CPSCAT','CPTSTPNL','CPORRES','CPORRESU','CPRESSCL','CPRESTYP','CPCOLSRT','CPORNRLO','CPORNRHI','CPSTRESC','CPSTRESN','CPSTRESU','CPSTNRLO','CPSTNRHI','CPNRIND','CPSTAT','CPREASND','CPNAM','CPLOINC','CPSPEC','CPSPCCND','CPMETHOD','PCANMETH','CPLOBXFL','CPBLFL','CPDRVFL','CPCLSIG','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','CPDTC','CPDY','CPTPT','CPTPTNUM','CPELTM','CPTPTREF','CPRFTDTC'],
'CV':['STUDYID','DOMAIN','USUBJID','CVSEQ','CVGRPID','CVREFID','CVSPID','CVLNKID','CVLNKGRP','CVTESTCD','CVTEST','CVCAT','CVSCAT','CVPOS','CVORRES','CVORRESU','CVSTRESC','CVSTRESN','CVSTRESU','CVSTAT','CVREASND','CVLOC','CVLAT','CVDIR','CVMETHOD','CVLOBXFL','CVBLFL','CVDRVFL','CVEVAL','CVEVALID','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','CVDTC','CVDY','CVTPT','CVTPTNUM','CVELTM','CVTPTREF','CVRFTDTC'],
'DA':['STUDYID','DOMAIN','USUBJID','DASEQ','DAGRPID','DAREFID','DASPID','DALNKID','DALNKGRP','DATESTCD','DATEST','DACAT','DASCAT','DAORRES','DAORRESU','DASTRESC','DASTRESN','DASTRESU','DASTAT','DAREASND','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','DADTC','DADY'],
'DD':['STUDYID','DOMAIN','USUBJID','DDSEQ','DDTESTCD','DDTEST','DDORRES','DDSTRESC','DDRESCAT','DDEVAL','DDDTC','DDDY'],
'EG':['STUDYID','DOMAIN','USUBJID','SPDEVID','EGSEQ','EGGRPID','EGREFID','EGSPID','EGBEATNO','EGTESTCD','EGTEST','EGCAT','EGSCAT','EGPOS','EGORRES','EGORRESU','EGSTRESC','EGSTRESN','EGSTRESU','EGSTAT','EGREASND','EGNAM','EGMETHOD','EGLEAD','EGLOBXFL','EGBLFL','EGDRVFL','EGEVAL','EGEVALID','EGCLSIG','EGREPNUM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','EGDTC','EGDY','EGTPT','EGTPTNUM','EGELTM','EGTPTREF','EGRFTDTC'],
'FT':['STUDYID','DOMAIN','USUBJID','FTSEQ','FTGRPID','FTREFID','FTSPID','FTTESTCD','FTTEST','FTCAT','FTSCAT','FTPOS','FTORRES','FTORRESU','FTSTRESC','FTSTRESN','FTSTRESU','FTSTAT','FTREASND','FTNAM','FTMETHOD','FTLOBXFL','FTBLFL','FTDRVFL','FTREPNUM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','FTDTC','FTDY','FTTPT','FTTPTNUM','FTELTM','FTTPTREF','FTRFTDTC'],
'GF':['STUDYID','DOMAIN','USUBJID','SPDEVID','NHOID','GFSEQ','GFGRPID','GFREFID','GFSPID','GFLNKID','GFLNKGRP','GFTESTCD','GFTEST','GFTSTDTL','GFCAT','GFSCAT','GFORRES','GFORRESU','GFORREF','GFSTRESC','GFSTRESN','GFSTRESU','GFSTREFC','GFSTREFN','GFRESCAT','GFINHERT','GFGENREF','GFCHROM','GFSYM','GFSYMTYP','GFGENLOC','GFGENSR','GFSEQID','GFPVRID','GFCOPYID','GFSTAT','GFREASND','GFNAM','GFSPEC','GFMETHOD','GFRUNID','GFANMETH','GFBLFL','GFDRVFL','GFLLOQ','GFREPNUM','VISITNUM','VISIT','VISITDY','GFDTC','GFDY','GFTPT','GFTPTNUM','GFELTM','GFTPTREF','GFRFTDTC'],
'IE':['STUDYID','DOMAIN','USUBJID','IESEQ','IESPID','IETESTCD','IETEST','IECAT','IESCAT','IEORRES','IESTRESC','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','IEDTC','IEDY'],
'IS':['STUDYID','DOMAIN','USUBJID','NHOID','ISSEQ','ISGRPID','ISREFID','ISSPID','ISTESTCD','ISTEST','ISTSTCND','ISCNDAGT','ISBDAGNT','ISTSTOPO','ISMSCBCE','ISTSTDTL','ISCAT','ISSCAT','ISORRES','ISORRESU','ISORNRLO','ISORNRHI','ISSTRESC','ISSTRESN','ISSTRESU','ISSTNRLO','ISSTNRHI','ISSTNRC','ISNRIND','ISSTAT','ISREASND','ISNAM','ISSPEC','ISSPCCND','ISSPCUFL','ISMETHOD','ISLOBXFL','ISBLFL','ISDRVFL','ISLLOQ','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','ISDTC','ISENDTC','ISDY','ISENDY','ISTPT','ISTPTNUM','ISELTM','ISTPTREF','ISRFTDTC'],
'LB':['STUDYID','DOMAIN','USUBJID','LBSEQ','LBGRPID','LBREFID','LBSPID','LBTESTCD','LBTEST','LBTSTCND','LBBDAGNT','LBTSTOPO','LBCAT','LBSCAT','LBORRES','LBORRESU','LBRESSCL','LBRESTYP','LBCOLSRT','LBORNRLO','LBORNRHI','LBLLOD','LBSTRESC','LBSTRESN','LBSTRESU','LBSTNRLO','LBSTNRHI','LBSTNRC','LBNRIND','LBSTAT','LBREASND','LBNAM','LBLOINC','LBSPEC','LBSPCCND','LBSPCUFL','LBMETHOD','LBANMETH','LBTMTHSN','LBLOBXFL','LBBLFL','LBFAST','LBDRVFL','LBTOX','LBTOXGR','LBCLSIG','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','LBDTC','LBENDTC','LBDY','LBENDY','LBTPT','LBTPTNUM','LBELTM','LBTPTREF','LBRFTDTC','LBPTFL','LBPDUR'],
'MB':['STUDYID','DOMAIN','USUBJID','FOCID','MBSEQ','MBGRPID','MBREFID','MBSPID','MBLNKID','MBLNKGRP','MBTESTCD','MBTEST','MBTSTDTL','MBCAT','MBSCAT','MBORRES','MBORRESU','MBSTRESC','MBSTRESN','MBSTRESU','MBRESCAT','MBSTAT','MBREASND','MBNAM','MBLOINC','MBSPEC','MBSPCCND','MBLOC','MBLAT','MBDIR','MBMETHOD','MBLOBXFL','MBBLFL','MBFAST','MBDRVFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','MBDTC','MBDY','MBTPT','MBTPTNUM','MBELTM','MBTPTREF','MBRFTDTC'],
'MI':['STUDYID','DOMAIN','USUBJID','MISEQ','MIGRPID','MIREFID','MISPID','MITESTCD','MITEST','MITSTDTL','MICAT','MISCAT','MIORRES','MIORRESU','MISTRESC','MISTRESN','MISTRESU','MIRESCAT','MISTAT','MIREASND','MINAM','MISPEC','MISPCCND','MILOC','MILAT','MIDIR','MIMETHOD','MILOBXFL','MIBLFL','MIEVAL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','MIDTC','MIDY'],
'MK':['STUDYID','DOMAIN','USUBJID','MKSEQ','MKGRPID','MKREFID','MKSPID','MKLNKID','MKLNKGRP','MKTESTCD','MKTEST','MKCAT','MKSCAT','MKPOS','MKORRES','MKORRESU','MKSTRESC','MKSTRESN','MKSTRESU','MKSTAT','MKREASND','MKLOC','MKLAT','MKDIR','MKMETHOD','MKLOBXFL','MKBLFL','MKDRVFL','MKEVAL','MKEVALID','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','MKDTC','MKDY','MKTPT','MKTPTNUM','MKELTM','MKTPTREF','MKRFTDTC'],
'MS':['STUDYID','DOMAIN','USUBJID','NHOID','MSSEQ','MSGRPID','MSREFID','MSSPID','MSLNKID','MSTESTCD','MSTEST','MSAGENT','MSCONC','MSCONCU','MSTSTDTL','MSCAT','MSSCAT','MSORRES','MSORRESU','MSSTRESC','MSSTRESN','MSSTRESU','MSNRIND','MSRESCAT','MSSTAT','MSREASND','MSNAM','MSLOINC','MSSPEC','MSSPCCND','MSLOC','MSLAT','MSDIR','MSMETHOD','MSANMETH','MSLOBXFL','MSBLFL','MSFAST','MSDRVFL','MSEVAL','MSEVALID','MSACPTFL','MSLLOQ','MSULOQ','MSREPNUM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','MSDTC','MSDY','MSDUR','MSTPT','MSTPTNUM','MSELTM','MSTPTREF','MSRFTDTC','MSEVLINT','MSEVINTX'],
'NV':['STUDYID','DOMAIN','USUBJID','FOCID','NVSEQ','NVGRPID','NVREFID','NVSPID','NVLNKID','NVLNKGRP','NVTESTCD','NVTEST','NVCAT','NVSCAT','NVORRES','NVORRESU','NVSTRESC','NVSTRESN','NVSTRESU','NVSTAT','NVREASND','NVLOC','NVLAT','NVDIR','NVMETHOD','NVLOBXFL','NVBLFL','NVDRVFL','NVEVAL','NVEVALID','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','NVDTC','NVDY','NVTPT','NVTPTNUM','NVELTM','NVTPTREF','NVRFTDTC'],
'OE':['STUDYID','DOMAIN','USUBJID','FOCID','OESEQ','OEGRPID','OELNKID','OELNKGRP','OETESTCD','OETEST','OETSTDTL','OECAT','OESCAT','OEORRES','OEORRESU','OEORNRLO','OEORNRHI','OESTRESC','OESTRESN','OESTRESU','OESTNRLO','OESTNRHI','OESTNRC','OENRIND','OERESCAT','OESTAT','OEREASND','OELOC','OELAT','OEDIR','OEPORTOT','OEMETHOD','OELOBXFL','OEBLFL','OEDRVFL','OEEVAL','OEEVALID','OEACPTFL','OEREPNUM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','OEDTC','OEDY','OETPT','OETPTNUM','OEELTM','OETPTREF','OERFTDTC'],
'PC':['STUDYID','DOMAIN','USUBJID','PCSEQ','PCGRPID','PCREFID','PCSPID','PCTESTCD','PCTEST','PCCAT','PCSCAT','PCORRES','PCORRESU','PCSTRESC','PCSTRESN','PCSTRESU','PCSTAT','PCREASND','PCNAM','PCSPEC','PCSPCCND','PCMETHOD','PCFAST','PCDRVFL','PCLLOQ','PCULOQ','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','PCDTC','PCENDTC','PCDY','PCENDY','PCTPT','PCTPTNUM','PCELTM','PCTPTREF','PCRFTDTC','PCEVLINT'],
'PE':['STUDYID','DOMAIN','USUBJID','PESEQ','PEGRPID','PESPID','PETESTCD','PETEST','PEMODIFY','PECAT','PESCAT','PEBODSYS','PEORRES','PEORRESU','PESTRESC','PESTAT','PEREASND','PELOC','PELAT','PEMETHOD','PELOBXFL','PEBLFL','PEEVAL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','PEDTC','PEDY'],
'PP':['STUDYID','DOMAIN','USUBJID','PPSEQ','PPGRPID','PPTESTCD','PPTEST','PPCAT','PPSCAT','PPORRES','PPORRESU','PPSTRESC','PPSTRESN','PPSTRESU','PPSTAT','PPREASND','PPSPEC','PPANMETH','TAETORD','EPOCH','PPDTC','PPDY','PPTPTREF','PPRFTDTC','PPSTINT','PPENINT'],
'QS':['STUDYID','DOMAIN','USUBJID','QSSEQ','QSGRPID','QSSPID','QSTESTCD','QSTEST','QSCAT','QSSCAT','QSORRES','QSORRESU','QSSTRESC','QSSTRESN','QSSTRESU','QSSTAT','QSREASND','QSMETHOD','QSLOBXFL','QSBLFL','QSDRVFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','QSDTC','QSDY','QSTPT','QSTPTNUM','QSELTM','QSTPTREF','QSRFTDTC','QSEVLINT','QSEVINTX'],
'RE':['STUDYID','DOMAIN','USUBJID','SPDEVID','RESEQ','REGRPID','REREFID','RESPID','RELNKID','RELNKGRP','RETESTCD','RETEST','RECAT','RESCAT','REPOS','REORRES','REORRESU','REORREF','RESTRESC','RESTRESN','RESTRESU','RESTREFC','RESTREFN','RESTAT','REREASND','RELOC','RELAT','REDIR','REMETHOD','RELOBXFL','REBLFL','REDRVFL','REEVAL','REEVALID','REREPNUM','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','REDTC','REDY','RETPT','RETPTNUM','REELTM','RETPTREF','RERFTDTC'],
'RP':['STUDYID','DOMAIN','USUBJID','RPSEQ','RPGRPID','RPREFID','RPSPID','RPLNKID','RPLNKGRP','RPTESTCD','RPTEST','RPCAT','RPSCAT','RPORRES','RPORRESU','RPSTRESC','RPSTRESN','RPSTRESU','RPSTAT','RPREASND','RPLOBXFL','RPBLFL','RPDRVFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','RPDTC','RPDY','RPDUR','RPTPT','RPTPTNUM','RPELTM','RPTPTREF','RPRFTDTC'],
'RS':['STUDYID','DOMAIN','USUBJID','RSSEQ','RSGRPID','RSREFID','RSSPID','RSLNKID','RSLNKGRP','RSTESTCD','RSTEST','RSCAT','RSSCAT','RSORRES','RSORRESU','RSSTRESC','RSSTRESN','RSSTRESU','RSSTAT','RSREASND','RSNAM','RSMETHOD','RSLOBXFL','RSBLFL','RSDRVFL','RSEVAL','RSEVALID','RSACPTFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','RSDTC','RSDY','RSTPT','RSTPTNUM','RSELTM','RSTPTREF','RSRFTDTC','RSEVLINT','RSEVINTX','RSSTRTPT','RSSTTPT','RSENRTPT','RSENTPT'],
'SC':['STUDYID','DOMAIN','USUBJID','SCSEQ','SCGRPID','SCSPID','SCTESTCD','SCTEST','SCCAT','SCSCAT','SCORRES','SCORRESU','SCSTRESC','SCSTRESN','SCSTRESU','SCSTAT','SCREASND','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','SCDTC','SCDY'],
'SS':['STUDYID','DOMAIN','USUBJID','SSSEQ','SSGRPID','SSSPID','SSTESTCD','SSTEST','SSCAT','SSSCAT','SSORRES','SSSTRESC','SSSTAT','SSREASND','SSEVAL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','SSDTC','SSDY'],
'TR':['STUDYID','DOMAIN','USUBJID','TRSEQ','TRGRPID','TRREFID','TRSPID','TRLNKID','TRLNKGRP','TRTESTCD','TRTEST','TRORRES','TRORRESU','TRSTRESC','TRSTRESN','TRSTRESU','TRSTAT','TRREASND','TRNAM','TRMETHOD','TRLOBXFL','TRBLFL','TREVAL','TREVALID','TRACPTFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','TRDTC','TRDY'],
'TU':['STUDYID','DOMAIN','USUBJID','TUSEQ','TUGRPID','TUREFID','TUSPID','TULNKID','TULNKGRP','TUTESTCD','TUTEST','TUORRES','TUSTRESC','TUNAM','TULOC','TULAT','TUDIR','TUPORTOT','TUMETHOD','TULOBXFL','TUBLFL','TUEVAL','TUEVALID','TUACPTFL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','TUDTC','TUDY'],
'UR':['STUDYID','DOMAIN','USUBJID','URSEQ','URGRPID','URREFID','URSPID','URLNKID','URLNKGRP','URTESTCD','URTEST','URTSTDTL','URCAT','URSCAT','URORRES','URORRESU','URSTRESC','URSTRESN','URSTRESU','URRESCAT','URSTAT','URREASND','URLOC','URLAT','URDIR','URMETHOD','URLOBXFL','URBLFL','URDRVFL','UREVAL','UREVALID','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','URDTC','URDY','URTPT','URTPTNUM','URELTM','URTPTREF','URRFTDTC'],
'VS':['STUDYID','DOMAIN','USUBJID','VSSEQ','VSGRPID','VSSPID','VSTESTCD','VSTEST','VSCAT','VSSCAT','VSPOS','VSORRES','VSORRESU','VSSTRESC','VSSTRESN','VSSTRESU','VSSTAT','VSREASND','VSLOC','VSLAT','VSLOBXFL','VSBLFL','VSDRVFL','VSTOX','VSTOXGR','VSCLSIG','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','VSDTC','VSDY','VSTPT','VSTPTNUM','VSELTM','VSTPTREF','VSRFTDTC'],
'FA':['STUDYID','DOMAIN','USUBJID','FASEQ','FAGRPID','FASPID','FATESTCD','FATEST','FAOBJ','FACAT','FASCAT','FAORRES','FAORRESU','FASTRESC','FASTRESN','FASTRESU','FASTAT','FAREASND','FALOC','FALAT','FALOBXFL','FABLFL','FAEVAL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','FADTC','FADY'],
'SR':['STUDYID','DOMAIN','USUBJID','SRSEQ','SRGRPID','SRREFID','SRSPID','SRTESTCD','SRTEST','SROBJ','SRCAT','SRSCAT','SRORRES','SRORRESU','SRSTRESC','SRSTRESN','SRSTRESU','SRSTAT','SRREASND','SRNAM','SRSPEC','SRLOC','SRLAT','SRMETHOD','SRLOBXFL','SRBLFL','SREVAL','VISITNUM','VISIT','VISITDY','TAETORD','EPOCH','SRDTC','SRDY','SRTPT','SRTPTNUM','SRELTM','SRTPTREF','SRRFTDTC'],
'CO':['STUDYID','DOMAIN','RDOMAIN','USUBJID','COSEQ','IDVAR','IDVARVAL','COREF','COVAL','COEVAL','COEVALID','CODTC','CODY'],
'DM':['STUDYID','DOMAIN','USUBJID','SUBJID','RFSTDTC','RFENDTC','RFXSTDTC','RFXENDTC','RFCSTDTC','RFCENDTC','RFICDTC','RFPENDTC','DTHDTC','DTHFL','SITEID','INVID','INVNAM','BRTHDTC','AGE','AGEU','SEX','RACE','ETHNIC','ARMCD','ARM','ACTARMCD','ACTARM','ARMNRS','ACTARMUD','COUNTRY','DMDTC','DMDY'],
'SE':['STUDYID','DOMAIN','USUBJID','SESEQ','ETCD','ELEMENT','TAETORD','EPOCH','SESTDTC','SEENDTC','SESTDY','SEENDY','SEUPDES'],
'SM':['STUDYID','DOMAIN','USUBJID','SMSEQ','MIDS','MIDSTYPE','SMSTDTC','SMENDTC','SMSTDY','SMENDY'],
}
EXCLUSION_DOMAIN = ['DM','SV','TA','TD','TE','TI','TM','TV']
# 工作表持久化开关(由 VC_OP04 和 VC_BC02 共用,放在基础层避免循环依赖)
ENABLE_WORK_TABLE_PERSISTENCE = False
TIME_VARIABLE = ['AGSTDTC','AGENDTC','CMSTDTC','CMENDTC','ECSTDTC','ECENDTC','ECRFTDTC'
,'EXSTDTC','EXENDTC','EXRFTDTC','MLDTC','MLSTDTC','MLENDTC','MLRFTDTC'
,'MIDSDTC','PRSTDTC','PRENDTC','PRRFTDTC','SUSTDTC','SUENDTC','AESTDTC'
,'AEENDTC','BEDTC','BESTDTC','BEENDTC','CEDTC','CESTDTC','CEENDTC','DSDTC'
,'DSSTDTC','DVSTDTC','DVENDTC','HODTC','HOSTDTC','HOENDTC','MHDTC','MHSTDTC'
,'MHENDTC','BSDTC','BSRFTDTC','CPDTC','CPRFTDTC','CVDTC','CVRFTDTC','DADTC'
,'DDDTC','EGDTC','EGRFTDTC','FTDTC','FTRFTDTC','GFDTC','GFRFTDTC','IEDTC'
,'ISDTC','ISENDTC','ISRFTDTC','LBDTC','LBENDTC','LBRFTDTC','MBDTC','MBRFTDTC'
,'MIDTC','MKDTC','MKRFTDTC','MSDTC','MSRFTDTC','NVDTC','NVRFTDTC','OEDTC'
,'OERFTDTC','PCDTC','PCENDTC','PCRFTDTC','PEDTC','PPDTC','PPRFTDTC','QSDTC'
,'QSRFTDTC','REDTC','RERFTDTC','RPDTC','RPRFTDTC','RSDTC','RSRFTDTC','SCDTC'
,'SSDTC','TRDTC','TUDTC','URDTC','URRFTDTC','VSDTC','VSRFTDTC','FADTC','SRDTC'
,'SRRFTDTC','CODTC','RFSTDTC','RFENDTC','RFXSTDTC','RFXENDTC','RFCSTDTC'
,'RFCENDTC','RFICDTC','RFPENDTC','DTHDTC','BRTHDTC','DMDTC','SESTDTC'
,'SEENDTC','SMSTDTC','SMENDTC','SVSTDTC','SVENDTC']