feat(purchase): allow absolute price ceiling (#180)

This commit is contained in:
QiuSW
2026-08-31 21:27:50 +08:00
parent 55ded8b598
commit 9cdb6bb962
15 changed files with 387 additions and 57 deletions
+6 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Business-Rules-and-Glossary
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Business-Rules-and-Glossary.-
wiki_revision: 61b266de8fe17554a736e9a084b15c7f9eb777c2
synchronized_at: 2026-08-31T09:01:46Z
wiki_revision: 85e881bd4fd1ebffb6af24d0f2f7512dfeda2a16
synchronized_at: 2026-08-31T13:17:16Z
<!-- gitea-wiki-mirror:end -->
<!-- gitea-wiki-mirror:start -->
@@ -382,6 +382,10 @@ synchronized_at: 2026-08-29T01:39:44Z
## 采购规则与 Agent 版本管理
- `purchase_rule` 保存管理员维护的采购规则;单例 `purchase_rule_setting` 指向当前规则。迁移以现有默认正式规则原字节播种首条记录。新建、批量预检、批量创建和安全重试读取当前规则;已有采购任务始终执行自身快照。
- `priceGuard` 缺省或 `enabled=true` 时继续按参考价倍率保护:`minRatio` 为 0.1~1.0,`maxRatio` 为 1.0~3.0;旧规则未声明 `enabled` 时按启用处理。
- 管理员可以设置 `priceGuard.enabled=false` 关闭参考价倍率保护,但必须同时配置整数分 `absoluteMaxUnitPriceCent`,范围 1~100000(¥0.01~¥1000.00),且不能混入倍率字段。服务端仍保留参考价用于预检和审计,并把新任务价格范围固化为 0~绝对上限;不存在无金额上限的采购模式。
- Admin 保存关闭倍率保护的规则前必须二次确认,并在列表摘要和切换当前规则确认中显示绝对上限。规则编辑只影响新任务;既有任务继续使用自身规则和业务价格快照,安全的同任务重试也不得悄悄扩大原价格范围。
- Android 始终以任务固化的 `minUnitPriceCent` / `maxUnitPriceCent` 为执行边界,在核价、订单摘要和创建订单前 fail-closed 校验;价格越界失败应回传实际观察单价供服务端保存和诊断。支付仍永久禁止。
- Agent 采购历史必须分开显示任务原始目标规格与服务端最终映射的执行规格;映射缺失不等于目标规格缺失。本地历史缓存同时保存两组字段,自动化始终只消费执行规格。
- “采购规则”是“采采管理”下与“采集规则”同级的管理员菜单,采购员角色没有菜单和 API 权限。
- Agent APK 版本由管理员在设备页抽屉中上传、核对并显式设为当前。服务端从 APK Manifest 读取整数 `versionCode` 和 `versionName`,保存 SHA-256、大小、说明和创建人;APK 位于非公开目录,Admin 与设备下载均需认证。
+17 -2
View File
@@ -2,8 +2,8 @@
generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件)
wiki_page: Android-Agent-API-Contract
wiki_url: https://git.ilapage.cn/OPC/goauto/wiki/Android-Agent-API-Contract.-
wiki_revision: 8b0d54fcaa649f9b5b4eebabba8f02ff6128a431
synchronized_at: 2026-08-31T09:00:48Z
wiki_revision: bf61d3493fc4cd16649c0564b87580a5b78704aa
synchronized_at: 2026-08-31T13:18:18Z
<!-- gitea-wiki-mirror:end -->
<!-- gitea-wiki-mirror:start -->
@@ -825,6 +825,21 @@ file=<JPEG 二进制>
| `GET` / `PUT` | `/api/admin/v1/purchase-rules/current` | 查看或按 `requestId + ruleId` 幂等切换当前规则 |
新采购任务、批量预检、批量创建、批量重试和安全的同任务重试读取当前规则;当前设置缺失、规则已删除或内容不通过正式采购契约时返回明确错误,不回退到内置常量。既有任务的 `ruleSnapshot` 不变。所有接口仅管理员可用。
`priceGuard` 支持以下两种互斥形态:
```json
{"enabled":true,"minRatio":0.2,"maxRatio":1.5}
```
```json
{"enabled":false,"absoluteMaxUnitPriceCent":5000}
```
- `enabled` 缺省时视为 `true`,兼容既有倍率规则;整个 `priceGuard` 缺省时继续使用默认倍率 0.2~1.5。
- 启用时必须提供 `minRatio`(0.1~1.0)与 `maxRatio`(1.0~3.0),最多 4 位小数且最低不得大于最高;不得提供绝对上限。
- 关闭时不得提供倍率字段,必须提供整数分 `absoluteMaxUnitPriceCent`,范围 1~100000。服务端仍从精确映射颜色读取参考价用于预检和审计,但新任务固化 `minUnitPriceCent=0`、`maxUnitPriceCent=absoluteMaxUnitPriceCent`。
- Android 严格解析两种形态,但不根据规则自行重算价格范围,只执行任务下发的最小/最大单价;未知字段、混用字段、缺少绝对上限或越界值均以 `PURCHASE_RULE_INVALID` 拒绝。
- `PURCHASE_PRICE_OUT_OF_RANGE` 失败结果应携带本次观察到的 `actualUnitPriceCent`;服务端保存该值用于任务历史诊断。该字段不授权 Agent 放宽任务边界。
## Agent 应用版本接口