Jelajahi Sumber

修改获取订单列表

qmj 1 bulan lalu
induk
melakukan
083edc7277

+ 51 - 0
.claude/agents/i18n-consistency-checker.md

@@ -0,0 +1,51 @@
+---
+name: i18n-consistency-checker
+description: 检查 4 个 i18n 语言文件(zh.js、tw.js、en.js、vi.js)的 key 是否一致
+model: haiku
+---
+
+# i18n 一致性检查子代理
+
+检查前端项目中 4 个语言文件的 key 结构是否一致。
+
+## 检查范围
+
+前端项目路径:
+- 商家端: `E:/QtwCode/foodie/foodie-store/src/lang/`
+- 平台管理端: `E:/QtwCode/foodie/foodie-admin-vue/src/lang/`
+
+4 个语言文件:
+- `zh.js`(简体中文)
+- `tw.js`(繁体中文)
+- `en.js`(英语)
+- `vi.js`(越南语)
+
+## 检查步骤
+
+1. 提取每个文件中所有的 key 路径(如 `foots.AddCategoryFirst`)
+2. 比对 4 个文件的 key 集合
+3. 报告以下问题:
+   - **缺失 key**: 某文件有但其他文件缺失的 key
+   - **空值 key**: 值为空字符串或明显占位符的 key
+   - **key 数量不一致**: 各文件的 key 总数差异
+
+## 输出格式
+
+```
+## i18n 一致性检查报告
+
+### 统计
+- zh.js: X 个 key
+- tw.js: X 个 key
+- en.js: X 个 key
+- vi.js: X 个 key
+
+### 缺失 key(如有)
+- [文件名] 缺少: key1, key2, ...
+
+### 空值 key(如有)
+- [文件名] key_name = ""
+
+### 结论
+通过/未通过
+```

+ 24 - 0
.claude/settings.local.json

@@ -28,5 +28,29 @@
       "Bash(mvn compile *)",
       "mcp__zread__get_repo_structure"
     ]
+  },
+  "hooks": {
+    "PreToolUse": [
+      {
+        "matcher": "Edit|Write",
+        "hooks": [
+          {
+            "type": "command",
+            "command": "bash -c 'FILE=\"$CLAUDE_FILE_PATH\"; if echo \"$FILE\" | grep -qiE \"\\.env$|\\.env\\.|application-prod|application-druid\"; then echo \"ERROR: 不允许直接编辑配置文件 $FILE\" >&2; exit 1; fi'"
+          }
+        ]
+      }
+    ],
+    "PostToolUse": [
+      {
+        "matcher": "Edit|Write",
+        "hooks": [
+          {
+            "type": "command",
+            "command": "bash -c 'FILE=\"$CLAUDE_FILE_PATH\"; if echo \"$FILE\" | grep -qiE \"\\.java$\"; then cd /e/QtwCode/foodie/foodie_server && mvn compile -pl ruoyi-admin -q 2>&1 | tail -5; fi'"
+          }
+        ]
+      }
+    ]
   }
 }

+ 36 - 0
.claude/skills/create-migration/SKILL.md

@@ -0,0 +1,36 @@
+---
+name: create-migration
+description: 将带日期标注的 SQL 迁移脚本追加到 updatesql/sql.md
+---
+
+# SQL 迁移脚本添加技能
+
+将数据库变更写入 `updatesql/sql.md`,遵循项目的数据库变更管理规范。
+
+## 输入参数
+
+用户需提供:
+- **SQL 语句**: 如 `ALTER TABLE pos_order ADD COLUMN delivery_status BIGINT DEFAULT NULL`
+- **用途描述**: 如 "订单状态四字段分离"
+
+## 执行步骤
+
+### 第1步:生成注释头
+- 获取当前日期,格式 `YYYY-MM-DD`
+- 生成注释行:`-- YYYY-MM-DD <用途描述>`
+
+### 第2步:追加到 sql.md
+- 读取 `updatesql/sql.md` 当前内容
+- 在文件末尾追加注释头 + SQL 语句 + 空行
+- **绝不直接执行 SQL**,只写入文件
+
+### 第3步:验证
+- 确认 SQL 语法基本正确(以 ALTER/CREATE/UPDATE/INSERT/DELETE 开头)
+- 确认注释头格式正确
+- 确认文件已成功写入
+
+## 注意事项
+
+- SQL 语句末尾必须有分号
+- 每条迁移之间保留空行分隔
+- 不要修改已有的迁移记录

+ 1 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -4,5 +4,6 @@
     <inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,org.apache.http.impl.client.HttpClients,createDefault" />
     </inspection_tool>
+    <inspection_tool class="XmlUnresolvedReference" enabled="false" level="ERROR" enabled_by_default="false" />
   </profile>
 </component>

+ 18 - 4
CLAUDE.md

@@ -40,10 +40,6 @@ Auto-generated from all feature plans. Last updated: 2026-05-15
 
 **正确做法:** 编辑前端文件时,使用 Python 脚本(`python << 'PYEOF'`)通过 `content.replace()` 或行号操作来修改文件内容,避免换行符匹配问题。
 
-## 越南盾(VND)货币格式化
-
-所有展示给越南用户的货币/金额必须使用**整数格式**(无小数位),因为越南盾不使用分。Java 计算使用 `.setScale(0, RoundingMode.HALF_UP)`,JS 格式化使用 `Math.floor()` 或 `parseInt()`。
-
 ## 数据库变更管理
 
 所有数据库变更(ALTER TABLE、数据迁移等)**不直接执行**,必须写入 `updatesql/sql.md` 文件。由开发者统一到数据库手动执行。SQL 语句需标注日期和用途注释,例如:
@@ -65,10 +61,28 @@ ALTER TABLE pos_order ADD COLUMN delivery_status BIGINT DEFAULT NULL COMMENT '
 7. 四个 i18n 语言文件(vi.js、zh.js、tw.js、en.js)
 8. SQL 迁移脚本
 
+## 商家类型与订单查询逻辑
+
+`InfoUser.userType` 区分不同商家角色,查询订单时必须按类型使用不同字段过滤:
+
+| userType | 角色 | 订单过滤条件 |
+|----------|------|-------------|
+| 1 | 普通商家 | `PosOrder.shId = userId` |
+| 3 | 夜市商家 | `PosOrder.shId = userId` |
+| 其他 | 摊位商家 | `PosOrder.mdId = InfoUser.storeId`(从用户表查关联的摊位门店ID) |
+
+**关键字段:**
+- `InfoUser.userType`:0=普通用户, 1=商家, 2=骑手, 3=夜市
+- `InfoUser.storeId`:摊位商家关联的摊位门店ID
+- `PosOrder.shId`:商家ID(普通/夜市商家直接等于userId)
+- `PosOrder.mdId`:门店ID(摊位商家用 InfoUser.storeId 匹配)
+
 ## 范围控制
 
 当用户说"只改 X"时,就只改 X——不要广泛探索、创建任务或为简单的定向修改启动 Agent。从用户提到的具体文件或区域开始,做最小的必要修改。
 
+**对于简单的格式化或显示变更**(如截断小数、重命名 key、单文件修改),**不要**创建任务计划或启动 Agent,直接做编辑。
+
 <!-- MANUAL ADDITIONS END -->
 # CLAUDE.md
 

+ 0 - 1
ruoyi-system/src/main/resources/mapper/system/PosOrderMapper.xml

@@ -103,7 +103,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="payStatus != null"> and pay_status = #{payStatus}</if>
             <if test="deliveryStatus != null"> and delivery_status = #{deliveryStatus}</if>
             <if test="afterSaleStatus != null"> and after_sale_status = #{afterSaleStatus}</if>
-            and not (state=0 and collect_payment=0)
         </where>
         order by id desc
     </select>

+ 78 - 30
specs/006-orderstate/frontend-api-guide.md

@@ -37,36 +37,41 @@
 | 已取消 | `cancelled` | 已取消订单 | `?tab=cancelled&page=1&size=10` |
 | 退款/售后 | `refund` | 有售后记录的订单 | `?tab=refund&page=1&size=10` |
 
-### 前端展示文字对照表
-
-根据返回字段组合显示用户看到的文字:
-
-| type | state | payStatus | deliveryStatus | afterSaleStatus | 显示文字 |
-|------|-------|-----------|----------------|-----------------|---------|
-| 0(外送) | 0 | 0 | - | 0 | 待付款 |
-| 0(外送) | 0 | 1 | - | 0 | 待商家确认 |
-| 0(外送) | 1 | 1 | - | 0 | 商家备餐中 |
-| 0(外送) | 2 | 1 | 0 | 0 | 待骑手配送 |
-| 0(外送) | 2 | 1 | 1 | 0 | 骑手已接单 |
-| 0(外送) | 2 | 1 | 2 | 0 | 配送中 |
-| 0(外送) | 2 | 1 | 3 | 0 | 已送达 |
-| 0(外送) | 3 | 1 | - | 0 | 已完成 |
-| 0(外送) | * | * | * | 1 | 退款申请中 |
-| 0(外送) | * | * | * | 2 | 退款中 |
-| 0(外送) | 4 | 2 | - | 3 | 已退款 |
-| 0(外送) | 4 | - | - | 0 | 已取消 |
-| 1(自取) | 0 | 0 | null | 0 | 待商家确认 |
-| 1(自取) | 1 | 1 | null | 0 | 商家备餐中 |
-| 1(自取) | 2 | 1 | null | 0 | 待取餐(请到店取餐) |
-| 1(自取) | 3 | 1 | null | 0 | 已完成 |
-| 1(自取) | 4 | - | null | 0 | 已取消 |
-| 2(堂食) | 0 | 0 | null | 0 | 待商家确认 |
-| 2(堂食) | 1 | 1 | null | 0 | 商家备餐中 |
-| 2(堂食) | 2 | 1 | null | 0 | 备餐完成 |
-| 2(堂食) | 3 | 1 | null | 0 | 已完成 |
-| 2(堂食) | 4 | - | null | 0 | 已取消 |
-
-> `*` 表示该字段值不影响展示文字,优先展示 afterSaleStatus 对应文字
+### 前端展示文字对照表(对齐美团精简方案)
+
+用户只关心关键节点,多个内部状态合并为一个展示文字。前端根据字段组合判断,`afterSaleStatus` 优先。
+
+**外送 (type=0) 用户看到的文字**
+
+| 原来的文字 | 美团方案 | 对应字段条件 |
+|-----------|---------|-------------|
+| 待付款 | 待支付 | payStatus=0 |
+| 待商家确认 + 商家备餐中 | 商家已接单 | state=0/1, payStatus=1, afterSaleStatus=0 |
+| 待骑手配送 + 骑手已接单 + 配送中 | 配送中 | state=2, deliveryStatus=0/1/2 |
+| 已送达 | 已送达 | state=2, deliveryStatus=3 |
+| 已完成 | 已完成 | state=3 |
+| 已取消 | 已取消 | state=4, afterSaleStatus=0 |
+| 退款申请中/退款中/已退款 | 退款中/已退款 | afterSaleStatus=1/2/3 |
+
+**自取 (type=1) 用户看到的文字**
+
+| 美团方案 | 条件 |
+|---------|------|
+| 待支付 | payStatus=0 |
+| 商家已接单 | state=0/1 |
+| 待取餐 | state=2 |
+| 已完成 | state=3 |
+| 已取消 | state=4 |
+
+**堂食 (type=2) 用户看到的文字**
+
+| 美团方案 | 条件 |
+|---------|------|
+| 待支付 | payStatus=0 |
+| 商家已接单 | state=0/1 |
+| 备餐完成 | state=2 |
+| 已完成 | state=3 |
+| 已取消 | state=4 |
 
 ---
 
@@ -192,3 +197,46 @@
 | 0 | 外送 |
 | 1 | 自取 |
 | 2 | 堂食 |
+
+---
+
+## 五、商家端订单卡片状态显示规则
+
+参考美团商家端:每个订单卡片只显示**一个状态文字**,用商家视角("我该做什么")。
+
+### 外送订单 (type=0)
+
+| 条件 | 显示文字 | 颜色 |
+|------|---------|------|
+| state=0, payStatus=0 | 待支付 | 灰色 |
+| state=0, payStatus=1 | 待接单 | 橙色 |
+| state=1 | 制作中 | 蓝色 |
+| state=2, deliveryStatus=0/1 | 待骑手取餐 | 蓝色 |
+| state=2, deliveryStatus=2 | 配送中 | 蓝色 |
+| state=2, deliveryStatus=3 | 已送达 | 绿色 |
+| state=3 | 已完成 | 灰色 |
+| state=4 | 已取消 | 红色 |
+
+### 自取 (type=1) + 堂食 (type=2) 统一
+
+| 条件 | 显示文字 | 颜色 |
+|------|---------|------|
+| state=0 | 待接单 | 橙色 |
+| state=1 | 制作中 | 蓝色 |
+| state=2 | 备餐完成 | 橙色 |
+| state=3 | 已完成 | 灰色 |
+| state=4 | 已取消 | 红色 |
+
+### 售后状态(所有类型,afterSaleStatus > 0 时覆盖上面的状态文字)
+
+| 条件 | 显示文字 | 颜色 |
+|------|---------|------|
+| afterSaleStatus=1 | 退款申请中 | 橙色 |
+| afterSaleStatus=2 | 退款中 | 橙色 |
+| afterSaleStatus=3 | 已退款 | 红色 |
+| afterSaleStatus=4 | 退款已拒绝 | 灰色 |
+
+### 判断优先级
+
+1. 先检查 afterSaleStatus,如果 > 0,显示售后状态文字
+2. 否则根据 type + state + deliveryStatus 组合判断显示文字

+ 35 - 44
specs/006-orderstate/spec.md

@@ -216,50 +216,41 @@ afterSaleStatus: 0(无售后) → 1(申请中) → 2(退款中) → 3(已退款)
 | 已取消 | state=4 + qsId=当前骑手 + afterSaleStatus=0 |
 | 退款/售后 | afterSaleStatus > 0 + qsId=当前骑手 |
 
-### 前端展示给用户的文字
-
-| type | state | deliveryStatus | payStatus | afterSaleStatus | 展示给用户 |
-|------|-------|----------------|-----------|-----------------|-----------|
-| 0(外送) | 0 | - | 0 | 0 | 待付款 |
-| 0(外送) | 0 | - | 1 | 0 | 待商家确认 |
-| 0(外送) | 1 | - | 1 | 0 | 商家备餐中 |
-| 0(外送) | 2 | 0 | 1 | 0 | 待骑手配送 |
-| 0(外送) | 2 | 1 | 1 | 0 | 骑手已接单 |
-| 0(外送) | 2 | 2 | 1 | 0 | 配送中 |
-| 0(外送) | 2 | 3 | 1 | 0 | 已送达 |
-| 0(外送) | 3 | - | 1 | 0 | 已完成 |
-| 0(外送) | * | * | * | 1 | 退款申请中 |
-| 0(外送) | * | * | * | 2 | 退款中 |
-| 0(外送) | 4 | - | 2 | 3 | 已退款 |
-| 0(外送) | 4 | - | 0 | 0 | 已取消 |
-| 0(外送) | 4 | - | 1 | 0 | 已取消 |
-| 0(外送) | * | * | * | 4 | 退款已拒绝 |
-| 0(外送) | * | * | * | 5 | 客服介入中 |
-| 0(外送) | * | * | * | 6 | 售后完成 |
-| 1(自取) | 0 | - | 0 | 0 | 待商家确认 |
-| 1(自取) | 0 | - | 1 | 0 | 待商家确认 |
-| 1(自取) | 1 | - | 1 | 0 | 商家备餐中 |
-| 1(自取) | 2 | - | 1 | 0 | 待取餐(请到店取餐) |
-| 1(自取) | 3 | - | 1 | 0 | 已完成 |
-| 1(自取) | * | - | * | 1 | 退款申请中 |
-| 1(自取) | 4 | - | 0 | 0 | 已取消 |
-| 1(自取) | 4 | - | 1 | 0 | 已取消 |
-| 1(自取) | * | - | * | 2 | 退款中 |
-| 1(自取) | * | - | * | 4 | 退款已拒绝 |
-| 1(自取) | * | - | * | 5 | 客服介入中 |
-| 1(自取) | * | - | * | 6 | 售后完成 |
-| 2(堂食) | 0 | - | 0 | 0 | 待商家确认 |
-| 2(堂食) | 0 | - | 1 | 0 | 待商家确认 |
-| 2(堂食) | 1 | - | 1 | 0 | 商家备餐中 |
-| 2(堂食) | 2 | - | 1 | 0 | 备餐完成 |
-| 2(堂食) | 3 | - | 1 | 0 | 已完成 |
-| 2(堂食) | * | - | * | 1 | 退款申请中 |
-| 2(堂食) | 4 | - | 0 | 0 | 已取消 |
-| 2(堂食) | 4 | - | 1 | 0 | 已取消 |
-| 2(堂食) | * | - | * | 2 | 退款中 |
-| 2(堂食) | * | - | * | 4 | 退款已拒绝 |
-| 2(堂食) | * | - | * | 5 | 客服介入中 |
-| 2(堂食) | * | - | * | 6 | 售后完成 |
+### 前端展示给用户的文字(对齐美团精简方案)
+
+用户只关心关键节点,多个内部状态合并为一个展示文字。前端根据字段组合判断,`afterSaleStatus` 优先。
+
+**外送 (type=0) 用户看到的文字**
+
+| 原来的文字 | 美团方案 | 对应字段条件 |
+|-----------|---------|-------------|
+| 待付款 | 待支付 | payStatus=0 |
+| 待商家确认 + 商家备餐中 | 商家已接单 | state=0/1, payStatus=1, afterSaleStatus=0 |
+| 待骑手配送 + 骑手已接单 + 配送中 | 配送中 | state=2, deliveryStatus=0/1/2 |
+| 已送达 | 已送达 | state=2, deliveryStatus=3 |
+| 已完成 | 已完成 | state=3 |
+| 已取消 | 已取消 | state=4, afterSaleStatus=0 |
+| 退款申请中/退款中/已退款 | 退款中/已退款 | afterSaleStatus=1/2/3 |
+
+**自取 (type=1) 用户看到的文字**
+
+| 美团方案 | 条件 |
+|---------|------|
+| 待支付 | payStatus=0 |
+| 商家已接单 | state=0/1 |
+| 待取餐 | state=2 |
+| 已完成 | state=3 |
+| 已取消 | state=4 |
+
+**堂食 (type=2) 用户看到的文字**
+
+| 美团方案 | 条件 |
+|---------|------|
+| 待支付 | payStatus=0 |
+| 商家已接单 | state=0/1 |
+| 备餐完成 | state=2 |
+| 已完成 | state=3 |
+| 已取消 | state=4 |
 
 ## 需要修改的代码