Add skills-lock.json to manage skill dependencies for drawio-skill and prd

This commit is contained in:
Guangfei.Zhao
2026-08-21 13:46:56 +08:00
parent 257b9cda08
commit 88f4a6e8a7
26 changed files with 1542 additions and 1320 deletions
+36 -6
View File
@@ -140,7 +140,7 @@ data class StoreResponse(
)
```
路径和响应体是照着客户端 [../11-store-context-and-session.md](../11-store-context-and-session.md)、[../05-networking.md](../05-networking.md) 写的——**这两个端点客户端已经实现了,后端对齐客户端,不是反过来**。切店返回的是含新 `accessToken` 和菜单的完整上下文,不是空 body,理由见 04。
路径和响应体是照着客户端 [../flutter-app/11-store-context-and-session.md](../flutter-app/11-store-context-and-session.md)、[../flutter-app/05-networking.md](../flutter-app/05-networking.md) 写的——**这两个端点客户端已经实现了,后端对齐客户端,不是反过来**。切店返回的是含新 `accessToken` 和菜单的完整上下文,不是空 body,理由见 04。
Controller 不直接返回 `StoreEntity`,而是转换成 `StoreResponse`——即使当前字段一模一样,也统一走这层转换,避免以后 entity 加了内部字段被不小心带出去。
@@ -182,7 +182,7 @@ interface StoreMapper {
## 统一请求头约定
客户端每个请求固定携带以下头(见 [../05-networking.md](../05-networking.md)),后端的处理规则:
客户端每个请求固定携带以下头(见 [../flutter-app/05-networking.md](../flutter-app/05-networking.md)),后端的处理规则:
| 请求头 | 必带 | 后端处理 |
| --- | --- | --- |
@@ -196,7 +196,7 @@ interface StoreMapper {
## 数据格式约定
这一节的每一条都要求前后端一字不差地对齐,客户端侧对应 [../12-error-and-api-contract.md](../12-error-and-api-contract.md)。
这一节的每一条都要求前后端一字不差地对齐,客户端侧对应 [../flutter-app/12-error-and-api-contract.md](../flutter-app/12-error-and-api-contract.md)。
- **时间**:一律 ISO-8601 UTC 字符串,带毫秒和 `Z` 后缀——`"2026-08-14T03:21:45.123Z"`。Kotlin 侧类型是 `Instant`。**不传时间戳数字**(数字看不出单位是秒还是毫秒,出过太多次事),**不传本地时间**(不带时区的时间在跨时区场景下无解)。库里存的也是 UTC,见 [03-persistence.md](./03-persistence.md)。
- **金额**Kotlin 侧 `BigDecimal`,序列化成**字符串**`"1234.56"`)而不是 JSON number。JSON number 在很多客户端会被解析成双精度浮点,`0.1 + 0.2` 那一类精度问题会直接变成对不上账。单位统一为元,小数位固定两位。
@@ -208,7 +208,7 @@ interface StoreMapper {
## 分页与排序约定
(这条同时解决客户端 [../05-networking.md](../05-networking.md) 里挂着的"分页字段名待定"。)
(这条同时解决客户端 [../flutter-app/05-networking.md](../flutter-app/05-networking.md) 里挂着的"分页字段名待定"。)
**请求参数**
@@ -250,13 +250,43 @@ interface StoreMapper {
| `20xxx` / `21xxx` | 采购 / 库存 |
| `30xxx` | F6 集成 |
| `31xxx` | Mini 域集成 |
| `32xxx` | 阿里云 OCR 集成(车牌识别) |
分段的价值是看到前两位就知道该找哪个域;全局连续编号在多域并行开发时必然撞号。
- **分段和下面这组基础码现在定死,业务码在开发对应模块时随接口增补**。不等一份"完整码表"齐了再开工——需求还在动的时候那份表不可能齐,等它等于卡住所有人。
```kotlin
object ErrorCode {
const val OK = 0
// 10xxx 平台通用
const val INVALID_PARAM = 10001
const val UNAUTHORIZED = 10401
const val FORBIDDEN = 10403
const val NOT_FOUND = 10404
const val RATE_LIMITED = 10429
const val INTERNAL_ERROR = 10500
// 11xxx 认证与门店
const val STORE_NOT_ACCESSIBLE = 11001
const val NO_STORE_PERMISSION = 11002
// 3xxxx 集成
const val F6_UNAVAILABLE = 30001
const val MINI_UNAVAILABLE = 31001
const val OCR_UNAVAILABLE = 32001 // 车牌识别不可用 → APP 切手工输码
const val OCR_NO_PLATE_FOUND = 32002 // 图片里没找到车牌 → 提示重拍
}
```
这组码**客户端有对应分支逻辑**(触发刷新、重拉门店上下文、展示 traceId 等),改动要两边一起改。段内新增的业务码不需要客户端配合——客户端默认直接展示 `message`。
- **码表和代码放在一起维护**`ErrorCode` 常量即码表),不落在某个人的 Excel 里。新增码值时在常量上写注释说明触发场景。
- **不允许在业务代码里写裸数字**,一律走 `ErrorCode` 常量。数字码在监控里聚合方便(可以直接 `group by code`),代价是不自解释——所以 `message` 必须始终是给人看的,日志里 `code` 和 `message` 一起打。
- **`message` 是给用户看的**,不放技术细节(SQL、堆栈、下游状态码、内部服务名)。技术细节进日志,用 `traceId` 关联。
- **HTTP status code 仍然要用对**:成功 200,参数错 400,未认证 401,无权限 403,不存在 404,并发冲突 409,下游不可用 502。客户端主要看 `code`,但 401 是例外——它触发自动刷新逻辑,必须准确(见 04)。网关、监控、日志分析也都依赖 status code。
- 新增错误码时**同步更新客户端的 `ApiCode`**[../12-error-and-api-contract.md](../12-error-and-api-contract.md)),两边分段方案必须一致。
- 新增**需要客户端特殊 UX** 的错误码时同步更新客户端的 `ApiCode`[../flutter-app/12-error-and-api-contract.md](../flutter-app/12-error-and-api-contract.md)),两边分段方案必须一致。
## 版本与兼容
@@ -289,7 +319,7 @@ interface StoreMapper {
## 待补充
- **完整错误码表**:分段方案已定(见上),但各 domain 段内的具体码值还没分配,需要各 domain 负责人一起填,并与客户端的 `ApiCode`[../12-error-and-api-contract.md](../12-error-and-api-contract.md)保持同步
- **各 domain 段内的业务码**:分段方案和基础码已定(见上),采购、库存、集成段内的具体码值由各 domain 负责人在开发对应模块时随接口增补,不集中排期。只有需要客户端特殊 UX 的码才要同步到客户端 `ApiCode`[../flutter-app/12-error-and-api-contract.md](../flutter-app/12-error-and-api-contract.md))。
- 强制升级用的错误码码值,以及触发它的版本判断规则(放在网关还是应用里)。
## 参考链接