safety-eval-service/docs/监管端驾驶舱接口设计.md

104 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 监管端驾驶舱(/container/driver → Cockpit接口设计
> 适用范围:前端「监管端」大屏(`src/pages/Container/Supervision/Cockpit`)。
> 设计原则:高内聚(一业务域一接口)、松耦合(前端只消费扁平 CO、高性能单接口聚合 + 短 TTL 缓存)、稳定性(面板级接口独立、可降级)、业务边界清晰。
> 实现约束:全部为**新增接口**,落在新的 `RegulatorCockpitController`,不改/不删任何既有功能;聚合逻辑在 `RegulatorCockpitExecutor` 内基于现有 Gateway 完成(监管端上下文 orgId 为空Gateway `page` 不强制机构过滤,返回全市数据)。
---
## 一、总体说明
大屏原 `RegulatorRiskCenterController` 为内存 Mock本设计基于**现有数据源**给出可用的真实接口,剔除无数据源的板块(风险预警研判、隐患整改率、合格率)。
新增 7 个聚合接口(基址 `/safetyEval/regulator/cockpit`
| # | 路径 | 对应板块 | 主数据源 |
|---|---|---|---|
| 1 | `GET /qualification-overview` | 资质全生命周期管理 | `org_info`、`org_personnel`、`IndustryEnum` |
| 2 | `GET /kpi` | 核心KPI仅开展评价率 | `eval_project`、`eval_risk_analysis` |
| 3 | `GET /region-distribution` | 区域地图分布 | `eval_project`、`org_info` |
| 4 | `GET /process-overview` | 执业全过程管控 + 项目流程 | 8 个节点(复用 `EvalProjectNodeOverviewAssembler`+ `eval_project` |
| 5 | `GET /eval-type-trend` | 评价类型趋势 | `eval_project`、`insp_notice` |
| 6 | `GET /review-summary` | 复盘评估改进提效 | `insp_notice`、`eval_project` |
| 7 | `GET /project-monitor` | 项目实时监控 | `eval_project`、`eval_project_process_waring`、复用 `selectRegulatorSurveyStat` |
---
## 二、各接口详细设计
### 1. 资质全生命周期管理 `qualification-overview`
- **入参**`year`(可选,默认当前年)。
- **出参**`lifecycleStats`{newFilingOrgCount, currentFilingOrgCount, logoutOrgCount, totalFilingOrgCount, exitedEvaluatorCount, currentEvaluatorCount}`progress`{filingCompleteRate, bizActiveRate, newGrowthRate}`industryList`[{industryCode, industryName, orgCount, typeCount}]。
- **边界**:仅机构/人员/资质维度;不含项目与风险。
- **数据源**`org_info``filing_record_status_code`、`create_time`、`district_code`、`safety_industry_category_code`)、`org_personnel``person_type_code='2' 专职评价师`、`employment_status_code` 1在职/2离职、`eval_project`(计算开展业务率:有在监项目的机构数 ÷ 当前备案机构数)、`IndustryEnum`(行业字典)。
- **业务逻辑**
- `currentFilingOrgCount` = `filing_record_status_code=1`(已备案)机构数;`newFilingOrgCount` = 同上且 `create_time` 落在 `year``totalFilingOrgCount` = 全部机构数;`logoutOrgCount` = 当前字典无「注销」状态,**暂置 0**(待补来源)。
- 评价师按 `person_type_code='2'``employment_status_code` 区分在职/离职计数。
- `industryList``safety_industry_category_code` 分组(支持单值或逗号分隔多值)。
- **已知缺口**`logoutOrgCount` 无「注销」状态,需后续补数据源。
### 2. 核心KPI `kpi`
- **入参**`cycle`year|quarter|month默认 year、`year`(可选)。
- **出参**`items`[{code, name, value, yoy}]。
- **边界**:仅提供「备案项目开展评价率」(现有数据可支撑);**不提供**「企业评价项目合格率」(无合格状态字段)、「隐患整改率」(无隐患表)。
- **数据源**`eval_project``is_statutory=1`)、`eval_risk_analysis`(风险分析已建立=已开展评价)。
- **业务逻辑**:分母=法定项目数;分子=存在 `eval_risk_analysis` 的项目数;`value`=率值;`yoy`=当前周期率−上一周期率(百分点)。
### 3. 区域地图分布 `region-distribution`
- **入参**:无。
- **出参**`list`[{districtCode, districtName, evalProjectCount, filingOrgCount}]`summary`{totalEvalProject, totalFilingOrg}。
- **边界**:仅「评价项目数」「备案机构数」两维度;隐患/整改率无数据源,前端可用项目数替代。
- **数据源**`eval_project.district_code`(法定项目按区县计数)、`org_info.district_code`(已备案机构按区县计数)。
- **业务逻辑**:两路按 `district_code` 分组后按区县编码对齐,缺侧补 0。
### 4. 执业全过程管控 + 项目流程 `process-overview`
- **入参**:无。
- **出参**`nodes`[{nodeCode, nodeName, totalCount, pendingCount}]。
- **边界**`totalCount`=到达该节点项目数(状态≠未开始);`pendingCount`=未开始(待办)项目数。覆盖 8 个真实节点(风险分析/合同签订/成立项目组/现场勘查/过程管控/报告草稿/内审/技审);大屏额外的「初勘/从业告知/编制检查表/制定工作计划/归档」无独立实体,由前端并入相邻节点或留空。
- **数据源**:复用 `EvalProjectNodeOverviewAssembler.buildForRegulator(projectId)` 逐项目取节点状态,再全局累加。
- **业务逻辑**:遍历法定项目,对每个节点累计 reached/pendingstatusName≠「未开始」即 reached否则 pending
### 5. 评价类型趋势 `eval-type-trend`
- **入参**`period`year|quarter|month必填、`year`(可选)。
- **出参**`buckets`[时间桶]`series`[{evalTypeCode, evalTypeName, projectCounts[], inspCounts[]}]。
- **边界**`projectCounts` 来自 `eval_project``eval_type_code`+时间桶;`inspCounts` 来自 `insp_notice``project_id` 关联 `eval_project``eval_type_code`+时间桶。
- **数据源**`eval_project.eval_type_code`/`create_time`、`insp_notice.create_time`/`project_id`。
- **业务逻辑**:先按项目建 `projectId→evalTypeCode` 映射;项目按创建时间入桶,监督检查按创建时间入桶(仅统计能关联到项目的检查)。
### 6. 复盘评估改进提效 `review-summary`
- **入参**`year`(可选,默认当前年)。
- **出参**`stats`{inspCount, onsiteCheckCount(项目过程检查), qualKeepCount(资质保持检查), specialCount(专项检查), checkedOrgCount, foundProblemCount(resultCode=2/3)}`pie`[{OVERDUE 超期未完成数, PUNISH 监管处罚数}]。
- **边界**:基于 `insp_notice` 真实字段(`insp_type_code` = PROJECT_PROCESS/QUAL_KEEP/SPECIAL`result_code` 1未发现问题/2责令整改/3转入风险预警。原大屏 pie 中的「现场确认风险隐患数/复查评估报告数/项目主要负责人变更数」无现成数据源,本次仅输出可用的 OVERDUE、PUNISH 两项。
- **数据源**`insp_notice`、`eval_project``plan_end_date` 逾期、未归档)。
- **业务逻辑**:检查类按 `insp_type_code``result_code` 分组;`OVERDUE`=法定未归档且 `plan_end_date` 早于今日;`PUNISH`=`result_code=3` 检查数。
### 7. 项目实时监控 `project-monitor`
- **入参**`month`可选yyyy-MM默认当前月
- **出参**`monitor`{activeProjectCount, normalExecCount, warningCount, monthPlanFinishCount}`survey`{noticeArchived, noticeAbnormal, clockInNormal, clockInAbnormal}。
- **边界**
- `activeProjectCount`=法定项目数;`normalExecCount`=`clock_in_status='NORMAL'``warningCount`=存在过程预警的项目数(**真实计算,替代原硬编码 0**`monthPlanFinishCount`=`plan_end_date` 落在 `month` 的项目数。
- `survey` 四项复用既有聚合 SQL `EvalProjectMapper.selectRegulatorSurveyStat()`(告知书/打卡数据源正确性);监控/预警/计划完成数为本次新实现。
- **数据源**`eval_project`、`eval_project_process_waring`、`eval_survey_attach`(经既有 Mapper
- **业务逻辑**:遍历法定项目计数;`warningCount` 调 `EvalProjectProcessWaringGateway.checkProjectHasWaring(projectId)`
---
## 三、实现要点与性能建议
- **聚合方式**:监管端无机构上下文,`Gateway.page()` 不强制 org 过滤Executor 以较大 `pageSize` 拉取全量后在内存聚合,避免 N+1 与脆弱手写 SQL。
- **缓存**:大屏建议对 7 个接口加 30~60s 短 TTL 缓存,降低 DB 压力。
- **索引建议**`eval_project(is_statutory, district_code, eval_type_code, create_time, plan_end_date, clock_in_status)`、`insp_notice(insp_type_code, result_code, create_time, project_id, org_id)`、`org_info(filing_record_status_code, district_code)`。
- **故障隔离**7 个接口相互独立,单接口异常不影响其余面板。
## 四、已剔除(无现有数据源)
- `risk-overview`(资质备案类失信统计、违法触发饼图)—— `RegulatorRiskCenterController` 为内存 Mock缺信/违法实体。
- KPI「企业评价项目合格率」「隐患整改率」——缺合格状态字段与隐患表。
## 五、新增文件清单
- `safety-eval-adapter/.../web/regulator/RegulatorCockpitController.java`(新 Controller
- `safety-eval-client/.../api/regulator/RegulatorCockpitApi.java`(新 Api
- `safety-eval-client/.../co/regulator/cockpit/*.java`7 个 CO
- `safety-eval-app/.../executor/regulator/RegulatorCockpitExecutor.java`(新 Executor聚合逻辑