diff --git a/患者首页处理/数据可视化网页端/app/main.py b/患者首页处理/数据可视化网页端/app/main.py old mode 100644 new mode 100755 index e91c272..60713ed --- a/患者首页处理/数据可视化网页端/app/main.py +++ b/患者首页处理/数据可视化网页端/app/main.py @@ -52,6 +52,44 @@ PDF_DIR = Path(env("PDF_DIR", str(PROJECT_ROOT / "待处理-患者首页PDF"))). SETTINGS_PATH = Path(env("REVIEW_SETTINGS_PATH", str(PROJECT_ROOT / "数据可视化网页端/review_settings.local.json"))).resolve() APP_TIMEZONE = ZoneInfo(env("APP_TIMEZONE", "Asia/Shanghai") or "Asia/Shanghai") +DEFAULT_MAJOR_DEPARTMENT_OPTIONS = [ + "肝胆外科及肝移植相关", + "普通外科及腹部外科", + "急诊医学科", + "重症医学科", + "骨科", + "泌尿外科", + "呼吸内科", + "耳鼻喉头颈外科", + "日间诊疗中心", + "乳腺外科", + "胸外科", + "肝病内科", + "感染科", + "肿瘤放疗科", + "消化内科", + "肿瘤外科", + "特需/涉外病房", + "老年外科", +] + + +def load_major_department_options() -> list[str]: + rule_path = PROJECT_ROOT / "数据处理工作区" / "01_配置规则" / "01_科室分类规则.json" + if rule_path.exists(): + try: + data = json.loads(rule_path.read_text(encoding="utf-8")) + options = [str(group.get("大科室", "")).strip() for group in data.get("大科室列表", [])] + options = [option for option in options if option] + if options: + return options + except Exception: # noqa: BLE001 + pass + return DEFAULT_MAJOR_DEPARTMENT_OPTIONS + + +MAJOR_DEPARTMENT_OPTIONS = load_major_department_options() + FIELD_GROUPS: list[dict[str, Any]] = [ { @@ -81,7 +119,7 @@ FIELD_GROUPS: list[dict[str, Any]] = [ ("discharge_dept", "出院科别", "text", None), ("discharge_ward", "出院病房", "text", None), ("hospital_days", "实际住院天数", "integer", None), - ("major_department", "大科室", "text", None), + ("major_department", "大科室", "select", MAJOR_DEPARTMENT_OPTIONS), ], }, { diff --git a/患者首页处理/数据可视化网页端/app/static/app.js b/患者首页处理/数据可视化网页端/app/static/app.js old mode 100644 new mode 100755 index 6bdf2df..24286a0 --- a/患者首页处理/数据可视化网页端/app/static/app.js +++ b/患者首页处理/数据可视化网页端/app/static/app.js @@ -705,8 +705,12 @@ function renderField(record, name, label, type, options, alerted = false, source const sourceClass = source === "ai" ? " is-ai-modified" : source === "manual" ? " is-manual-modified" : ""; let control = ""; if (type === "select") { + const normalizedValue = String(value ?? ""); + const normalizedOptions = (options || []).map((option) => String(option)); + const optionItems = ["", ...normalizedOptions]; + if (normalizedValue && !normalizedOptions.includes(normalizedValue)) optionItems.push(normalizedValue); control = ``; } else if (type === "json") { control = renderJsonEditor(name, value, sourceMap); diff --git a/患者首页处理/数据处理工作区/01_配置规则/01_科室分类规则.json b/患者首页处理/数据处理工作区/01_配置规则/01_科室分类规则.json old mode 100644 new mode 100755 index 110c8e6..a8a0af1 --- a/患者首页处理/数据处理工作区/01_配置规则/01_科室分类规则.json +++ b/患者首页处理/数据处理工作区/01_配置规则/01_科室分类规则.json @@ -65,7 +65,8 @@ { "大科室": "呼吸内科", "子科室": [ - "呼吸内科3病区" + "呼吸内科3病区", + "呼吸内科RCU" ] }, { @@ -126,6 +127,18 @@ "肿瘤放疗日间【无人】" ] }, + { + "大科室": "消化内科", + "子科室": [ + "消化内科2病房" + ] + }, + { + "大科室": "肿瘤外科", + "子科室": [ + "肿瘤外科2病房" + ] + }, { "大科室": "特需/涉外病房", "子科室": [ @@ -141,6 +154,9 @@ ], "aliases": { "呼吸内科3": "呼吸内科3病区", + "呼吸内科RCU": "呼吸内科RCU", + "消化内科2": "消化内科2病房", + "消化内科2病房": "消化内科2病房", "外科ICU": "外科ICU", "急诊中心病房": "急诊中心", "急诊中心": "急诊中心", @@ -176,10 +192,14 @@ "肝移植内科": "肝移植内", "肝移植内N": "肝移植内N", "肝移植内科N": "肝移植内N", + "肝脏移植内科N": "肝移植内N", + "肝胆外科ICU": "肝胆ICU", "肿瘤放疗3": "肿瘤放疗3", "肿放3": "肿瘤放疗3", "肿瘤放疗L": "肿瘤放疗病区L", "肿放L": "肿瘤放疗病区L", + "肿瘤外科2": "肿瘤外科2病房", + "肿瘤外科2病房": "肿瘤外科2病房", "重症医学1": "※重症医学1病区", "重症医学科1": "※重症医学1病区", "重症1": "※重症医学1病区",