docs/sql/zkxw.sql(全库导出基线)已包含 biz_customer、biz_cell_sample_type、biz_collection_region、biz_collection_hospital、biz_collection_protocol_no、biz_sample_code 等表;需求文档 docs/中科兴皖需求V0.3.md 2.2.1~2.2.5 描述了字段与交互。后端 app/models 与路由中尚未覆盖上述业务主数据的完整 CRUD;Web 管理端缺少对应页面。
与需求文档的差异(以 DDL 为准):2.2.3 文案提到「医院名称逗号分隔」;当前 schema 为地区表 + 医院子表 1:N,实现 SHALL 以子表为准,弹窗内维护医院行,避免双写。
现有代码模式参考:
openspec/changes/dict-management 与 crud/tenant.py 类独立函数、api/admin.py 路由风格;租户 tenant_no、软删 del_flag、列表默认排序 create_time DESC(见 engineering-standards)。views/system/unit/index.vue;复杂子表弹窗可参考字典「字典数据配置」或订单模块弹窗;API 封装于 src/api/*.ts。Goals:
biz_collection_hospital 增删改查(按 region_id)。docs/web-admin-ui-spec-fresh-mint.md 与 .cursor/rules/web-admin-crud-dialog.mdc。docs/sql/(与仓库惯例一致)。Non-Goals:
biz_customer_follow 客户随访(2.2.1 未在本次菜单范围单独展开时可列为后续)。issued 字段与展示)。选择:新增独立路由模块(例如 app/api/basic_info.py 或按域拆分为 customer.py + 聚合少量路由的文件),在 app/api/__init__.py 与 app/main.py 注册;路径前缀与现有 /api + admin 子前缀保持一致(如 /web/admin/... 或与 dict 同级命名空间)。
理由:五组资源边界清晰,避免单个 admin.py 过度膨胀;仍属同一业务域「基础信息」。
替代方案:全部写入 admin.py → 可行但不利于评审与合并冲突控制。
选择:在 app/models/models.py(或按项目惯例的拆分文件)增加与 DDL 一致的 ORM 模型;app/crud/ 下每域独立模块或 basic_info 包内多文件,函数命名 list_*、get_*、create_*、update_*、soft_delete_*。
理由:与现有 tenant、dict 等模式一致,满足 database-conventions 公共字段与软删查询约定。
选择:创建与更新时若 id_card_no 非空,则查询同租户下是否存在其他未删除记录占用相同证件号;存在则返回 4xx 与明确业务文案(与需求「不要重复创建…提醒」一致)。
理由:表上已有 idx_customer_idcard;应用层给出可读错误信息。
选择:五个菜单入口(或二级菜单「基础信息」下五项),每页一个标准列表 + 表单弹窗;地区页主表 + 「地区医院配置」子弹窗(内嵌表格 + 分页)。
理由:与需求操作描述及工程 UI 模板一致。
选择:可选 SQL 种子插入三种需求既定编码(wcqzxgxb、qdjczgxb、tpyqngxb),若环境已手动录入则脚本需幂等(INSERT IGNORE 或先判存)。
理由:需求 2.2.2 明确当前三种类型。
uk_sample_type 等包含 del_flag → 删除后再建同编码可能冲突 → 缓解:软删后「复活」走更新 del_flag=0 或换编码;接口文档说明。docs/sql/zkxw.sql 为基线导入/对齐,或从其中摘取对应 CREATE TABLE 段落执行。docs/sql 初始化脚本。biz_customer_follow 是否与本迭代一并提供只读/编辑入口:默认本变更 Non-Goal,若需可追加 capability。