Files
mileage-bonus/docs/里程绩效原型_API对接.md
shishengliang 65904c8270 feat: add assessment workbench and September reconciliation
Preserve August hydrogen revision and September audit evidence; calculate interrupted vehicle history across all prior months. Record remaining carry-policy and layout-baseline discrepancies.
2026-10-09 18:21:45 +08:00

73 lines
5.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 里程绩效:原型与 API 对接
## 页面与业务流程
月度核算展示本次批次的考核明细;异常核对定位缺少里程、来源冲突、交车区间重叠;详情按车牌和租赁记录追溯到每日来源及原始行。数据接入接收租赁区间和三类里程长表。规则中心明确参与车辆、有效期、测试候选、来源提供方优先级。API 对接页面展示真实接口状态与契约。
演示数据完全虚构。真实模式与演示模式不混用结果。当前只提供试算,不模拟已审批或已发放。
## 已接通的本机接口
前端相对路径 `/api`,开发代理转发 `http://127.0.0.1:8765` 并移除 `/api`。JSON 返回 UTF-8;错误体 `{ "error": "说明" }`。状态码 200/201 成功、400 请求错误、404 快照不存在、409 有异常禁止导出。
| 方法 | 路径 | 请求与结果 |
|---|---|---|
| GET | /health | 服务状态、引擎 version |
| POST | /imports/leases | 原始 xlsx 二进制;返回 id、raw_rows、accepted_rows、issues |
| POST | /imports/mileage?source=hydrogen&provider=guangzhou | 原始 xlsx;source 支持 hydrogen/tbox/gps,provider 需与规则对应 |
| GET | /imports/{id} | 标准化导入快照、行和错误 |
| POST | /assessments | 下方请求;返回 id/status/summary/issues |
| GET | /assessments/{id} | records、daily_trace、issues、excluded、inputs、engine_version |
| GET | /assessments/{id}/export.xlsx | ready 时导出业务考核源表;异常返回 409 |
```json
{
"lease_import_id": "导入返回的64位ID",
"mileage_import_ids": ["里程导入ID"],
"config": {
"month": "2026-08",
"test_plates": [],
"test_threshold_km": 50,
"source_priority": {
"hydrogen": ["guangzhou"],
"tbox": ["vehicle-platform"],
"gps": ["g7", "dongfang", "xinda", "guangan"]
},
"rules": [{
"plate": "DEMO-001", "target_id": 1,
"target_name": "交投40辆4.5T普货", "monthly_target_km": 3000,
"valid_from": "2026-08-01", "valid_to": "2026-08-31"
}]
}
}
```
文件最大 20 MB,解压后最大 200 MB,表头必须在前十行。里程表必填 `plate_number,date,mileage_km`(日里程,km)。租赁表字段:`vehicle_id,plate_number,contract_id,contract_code,project_name,customer_name,business_department_name,business_manager_name,delivery_vehicle_id,delivery_time,return_vehicle_task_id,return_time`。未还车可留空最后两项。里程空值不可当零;合法零必须保留。来源提供方顺序用于按日补缺,不能叠加多个 GPS 提供方。
ID 为内容哈希,同输入生成相同快照标识。调用方应保存 ID 并随批次保存输入、规则和引擎版本;重新补数生成新批次,不覆盖旧批次。
## 最新规则与旧 API 的明确差异
依据项目 8 月说明顶部的当前口径:非测试日有纯氢(含 0)取纯氢,无纯氢取仪表;测试日取 GPS;测试候选日无法判定且无纯氢时兜底 GPS。现有 API 则按区间选来源并对测试日清零,不能直接固化为正式规则。规则中心的 JSON 参数只能配置现有引擎支持项,不能靠改参数完成算法迁移。
最新四名离职人员为全部奖金剔除,不发放不转交。历史说明存在被覆盖的停发、转接口径,应采用带生效月份和批准记录的规则版本。结转、累计补发、历史有效奖励和归属分段需从 `calc_engine.py` 与最新计算入口抽离;不能以简单完成率乘奖金替代。
## 后续系统设计(建议契约,尚未实现)
建议实体:source_snapshot、lease_segment、daily_mileage、rule_version、assessment_batch、assessment_record、bonus_ledger、review_event。逐日依据关联来源行;奖金账本以车辆、负责人、政策有效期和所属月份为粒度,金额使用整数分或 Decimal。
建议新增接口:
- `POST /v1/sync-jobs`:按月份从车辆平台、租赁系统及 GPS 拉取快照,返回 job_id;通过 `GET /v1/jobs/{id}` 查询进度与失败原因。
- `GET/POST /v1/rule-versions`:草稿规则、版本、生效期和审批记录。
- `POST /v1/assessment-batches`:固定输入快照 ID、规则版本 ID、历史账本版本,异步执行;支持 Idempotency-Key。
- `GET /v1/assessment-batches/{id}/records`:分页与服务端筛选;详情包含分段和每日证据。
- `GET /v1/assessment-batches/{id}/bonus-ledger`:当月、结转、历史补发、累计补发及剔除依据。
- `POST /v1/assessment-batches/{id}/submit`、`/approve`、`/lock`:核算员提交、复核人审批、财务锁定。未解决异常禁止提交;输入变更后重建批次,锁定结果不可直接改写。
待对接系统提供:租赁区间接口、车辆唯一键、人员及归属变更接口、每日纯氢/仪表/GPS 接口、分页与增量游标、鉴权方法和限流规则。供应商密钥放服务端,不存前端。补数、重复记录、换牌、跨月交还车和跨月规则变更应有回归样本。
## 验收重点
真实零与空值区分;同日多源仅补缺;交还车及负责人切换不重不漏;测试日判定与所取来源可追溯;单条金额舍入后再汇总;历史奖励不被新政策追溯修改;异常阻止正式导出;同输入可复算;快照不可变。