# Specification: 典型案例查询API集成 ## Capability `typical-case-search` ## Overview 集成CaseAPIService的多个API实现典型案例查询、筛选、列表展示和详情查看的完整功能。支持案例类型(判决文书/调解案例)切换,并根据不同案例类型展示对应的数据和详情内容。 ## ADDED Requirements ### Requirement: 查询条件布局优化 查询条件表单布局MUST优化,提升用户体验和操作效率。 #### Scenario: 用户打开典型案例查询弹窗 **Given** 用户点击"典型案例查询"工具 **When** 弹窗打开 **Then** 查询条件区域第一行显示关键词输入框(占满整行) **And** 第二行依次显示:案例类型单选按钮组、纠纷类型下拉框、查询按钮、重置按钮 **And** 案例类型默认选中"判决文书" **And** 不显示纠纷发生时间RangePicker组件 **And** 不显示案例类型筛选卡片 **And** 保留发生时间和纠纷发生地树形筛选卡片 ### Requirement: 案例类型切换联动加载 切换案例类型时,相关筛选条件MUST自动重新加载对应数据。 #### Scenario: 用户切换到调解案例 **Given** 用户当前选中判决文书案例类型 **When** 用户点击切换到调解案例 **Then** 系统调用`CaseAPIService.getDisputeTypes('mediation')`重新加载纠纷类型下拉数据 **And** 系统调用`CaseAPIService.getMediationYearStatistics()`重新加载发生时间统计数据 **And** 系统调用`CaseAPIService.getAreaStatistics('mediation')`重新加载纠纷发生地统计数据 **And** 纠纷类型下拉框选项更新为调解案例的纠纷类型 **And** 发生时间树形卡片节点更新为调解案例的年份统计 **And** 纠纷发生地树形卡片节点更新为调解案例的地区统计 **And** 当前选中的纠纷类型被重置 #### Scenario: 用户切换到判决文书 **Given** 用户当前选中调解案例类型 **When** 用户点击切换到判决文书 **Then** 系统调用`CaseAPIService.getDisputeTypes('judgment')`重新加载纠纷类型下拉数据 **And** 系统调用`CaseAPIService.getYearStatistics()`重新加载发生时间统计数据 **And** 系统调用`CaseAPIService.getAreaStatistics('judgment')`重新加载纠纷发生地统计数据 **And** 纠纷类型下拉框选项更新为判决文书的纠纷类型 **And** 发生时间树形卡片节点更新为判决文书的年份统计 **And** 纠纷发生地树形卡片节点更新为判决文书的地区统计 **And** 当前选中的纠纷类型被重置 ### Requirement: 案例列表数据加载 系统MUST支持根据查询条件和案例类型动态加载案例列表数据。 #### Scenario: 首次打开弹窗默认加载判决文书 **Given** 用户点击典型案例查询工具 **When** 弹窗打开 **Then** 系统调用`CaseAPIService.getCourtCases({page: 1, size: 10})`加载默认判决文书列表 **And** 显示Loading状态 **And** 加载成功后展示判决文书列表数据 **And** 记录总数显示API返回的total字段值 #### Scenario: 查询判决文书案例 **Given** 用户选中判决文书案例类型 **And** 用户填写了查询条件(关键词、纠纷类型、发生时间、发生地) **When** 用户点击查询按钮 **Then** 系统构建查询参数:`{page: 1, size: 10, keyword, caseTypeFirst, occurrenceYears, regionList}` **And** occurrenceYears和regionList多个值用英文逗号拼接 **And** 系统调用`CaseAPIService.getCourtCases(params)` **And** 显示Loading状态 **And** 加载成功后展示判决文书列表数据 **And** 分页组件使用返回的total和size计算页数 #### Scenario: 查询调解案例 **Given** 用户选中调解案例类型 **And** 用户填写了查询条件 **When** 用户点击查询按钮 **Then** 系统调用`CaseAPIService.getMediationCases(params)` **And** 显示Loading状态 **And** 加载成功后展示调解案例列表数据 ### Requirement: 案例列表字段映射 不同案例类型的列表数据MUST使用不同的字段映射。 #### Scenario: 展示调解案例列表 **Given** 系统成功加载调解案例列表数据 **When** 渲染列表项 **Then** 标题字段映射为`case_title` **And** 发生时间字段映射为`occur_time`并格式化为"YYYY年MM月DD日" **And** 发生地点字段映射为`que_prov_name + "/" + que_city_name` **And** 纠纷类型字段映射为`case_type_first_name` **And** 案例类型标签显示"调解案例" **And** 案例ID字段映射为`id` #### Scenario: 展示判决文书列表 **Given** 系统成功加载判决文书列表数据 **When** 渲染列表项 **Then** 标题字段映射为`case_name` **And** 发生时间字段映射为`judgment_date`并格式化为"YYYY年MM月DD日" **And** 发生地点字段映射为`court` **And** 纠纷类型字段映射为`case_reason` **And** 案例类型标签显示"判决文书" **And** 案例ID字段映射为`cpws_case_info_id` ### Requirement: 案例详情加载 点击案例项时MUST根据案例类型调用对应的详情API。 #### Scenario: 点击调解案例查看详情 **Given** 用户在列表中看到一个调解案例 **When** 用户点击该案例 **Then** 系统从案例数据中提取`id`字段 **And** 系统调用`CaseAPIService.getMediationCaseDetail(id)` **And** 显示Loading状态 **And** 加载成功后打开详情弹窗 **And** 详情弹窗标题显示"典型案例详情" #### Scenario: 点击判决文书查看详情 **Given** 用户在列表中看到一个判决文书 **When** 用户点击该案例 **Then** 系统从案例数据中提取`cpws_case_info_id`字段 **And** 系统调用`CaseAPIService.getCourtCaseDetail(cpws_case_info_id)` **And** 显示Loading状态 **And** 加载成功后打开详情弹窗 **And** 详情弹窗标题显示"判决文书详情" ### Requirement: 调解案例详情展示 调解案例详情MUST展示特定的字段和布局。 #### Scenario: 展示调解案例详情基本信息 **Given** 系统成功加载调解案例详情数据 **When** 渲染案件基本信息区域 **Then** 第一行显示案件标题,取`case_title`字段 **And** 第二行显示纠纷发生时间,取`occur_time`字段并格式化 **And** 第二行显示发生地点,取`que_prov_name + "/" + que_city_name` **And** 第二行显示纠纷类型,取`case_type_first_name`字段 **And** 不显示调解组织字段 #### Scenario: 展示调解案例详情内容 **Given** 系统成功加载调解案例详情数据 **When** 渲染案例内容区域 **Then** 显示案例概述section,取`case_des`字段 **And** 显示原告诉讼请求section,取`case_claim`字段 **And** 显示调解结果section,取`agree_content`字段 **And** 不显示其他section(法院审理与判决、调解背景、双方立场等) ### Requirement: 判决文书详情展示 判决文书详情MUST展示完整的裁判文书信息。 #### Scenario: 展示判决文书详情基本信息 **Given** 系统成功加载判决文书详情数据 **When** 渲染案件基本信息区域 **Then** 第一行显示案件标题,取`case_name`字段 **And** 第一行显示案号,取`case_number`字段 **And** 第二行显示判决日期(而非纠纷发生时间),取`judgment_date`字段并格式化 **And** 第二行显示发生地点,取`court`字段 **And** 第二行显示纠纷类型,取`case_reason`字段 #### Scenario: 展示判决文书详情内容 **Given** 系统成功加载判决文书详情数据 **When** 渲染案例内容区域 **Then** 显示案例概述section,取`basic_case_info`字段 **And** 显示原告介绍section(而非原告诉讼请求),取`plaintiff`字段 **And** 显示被告介绍section(新增),取`defendant`字段 **And** 显示法院审理与判决section,取`trial_finding`字段 **And** 显示审理经过section(而非调解过程),取`trial_process`字段 **And** 显示审理程序section(而非调解方案),取`trial_procedure`字段 **And** 显示调解结果section,取`judgment`字段 **And** 显示案例相关法律条文section,取`legal_basis`字段 **And** 不显示调解背景section **And** 不显示双方立场section ### Requirement: 分页功能 系统MUST支持案例列表的分页浏览。 #### Scenario: 切换到下一页 **Given** 用户在查看第1页案例列表 **And** 总记录数大于每页显示数量 **When** 用户点击下一页按钮 **Then** 系统调用对应的案例列表API,传入page=2参数 **And** 显示Loading状态 **And** 加载成功后展示第2页数据 **And** 分页组件高亮显示当前页码 ### Requirement: 错误处理 API调用失败时MUST给用户明确的错误提示。 #### Scenario: 加载案例列表失败 **Given** 用户点击查询按钮 **When** API调用失败(网络错误、服务器错误等) **Then** 隐藏Loading状态 **And** 使用message.error显示"加载案例列表失败"提示 **And** 控制台输出详细错误信息 #### Scenario: 加载案例详情失败 **Given** 用户点击某个案例查看详情 **When** API调用失败 **Then** 隐藏Loading状态 **And** 使用message.error显示"加载案例详情失败"提示 **And** 不打开详情弹窗 ## REMOVED Requirements ### Requirement: 纠纷发生时间RangePicker 移除查询条件中的纠纷发生时间日期范围选择器。 #### Scenario: 用户打开典型案例查询弹窗 **Given** 用户点击典型案例查询工具 **When** 弹窗打开 **Then** 查询条件区域不显示纠纷发生时间RangePicker组件 ### Requirement: 案例类型筛选卡片 移除筛选器区域中的案例类型树形卡片。 #### Scenario: 用户查看筛选器区域 **Given** 用户打开典型案例查询弹窗 **When** 用户查看筛选器区域 **Then** 不显示案例类型筛选卡片 **And** 只显示发生时间和纠纷发生地筛选卡片 ## Implementation Notes ### API参数说明 - **caseSource**: 案例来源参数,判决文书传'judgment',调解案例传'mediation' - **occurrenceYears**: 发生时间参数,多个年份用英文逗号拼接,如"2022,2023" - **regionList**: 地区参数,多个地区用英文逗号拼接,如"广东省,广州市" - **page**: 页码,从1开始 - **size**: 每页记录数,默认10 ### 日期格式化规则 所有日期字段统一格式化为"YYYY年MM月DD日"格式,如"2025年01月20日"。 ### 字段映射表 **调解案例列表字段映射**: | 显示字段 | API字段 | 备注 | |---------|---------|------| | 标题 | case_title | - | | 发生时间 | occur_time | 需格式化 | | 发生地点 | que_prov_name + "/" + que_city_name | 字符串拼接 | | 纠纷类型 | case_type_first_name | - | | 案例ID | id | - | **判决文书列表字段映射**: | 显示字段 | API字段 | 备注 | |---------|---------|------| | 标题 | case_name | - | | 发生时间 | judgment_date | 需格式化 | | 发生地点 | court | - | | 纠纷类型 | case_reason | - | | 案例ID | cpws_case_info_id | - | **调解案例详情字段映射**: | 显示标签 | API字段 | 备注 | |---------|---------|------| | 案件标题 | case_title | - | | 纠纷发生时间 | occur_time | 需格式化 | | 发生地点 | que_prov_name + "/" + que_city_name | 字符串拼接 | | 纠纷类型 | case_type_first_name | - | | 案例概述 | case_des | - | | 原告诉讼请求 | case_claim | - | | 调解结果 | agree_content | - | **判决文书详情字段映射**: | 显示标签 | API字段 | 备注 | |---------|---------|------| | 案件标题 | case_name | - | | 案号 | case_number | - | | 判决日期 | judgment_date | 需格式化 | | 发生地点 | court | - | | 纠纷类型 | case_reason | - | | 案例概述 | basic_case_info | - | | 原告介绍 | plaintiff | - | | 被告介绍 | defendant | - | | 法院审理与判决 | trial_finding | - | | 审理经过 | trial_process | - | | 审理程序 | trial_procedure | - | | 调解结果 | judgment | - | | 案例相关法律条文 | legal_basis | - | ## Related Capabilities - None (首个案例查询API集成capability) ## Version 1.0.0