shop-wx/doc/Shop运行模式文档.md

240 lines
6.5 KiB
Markdown
Raw 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.

# Shop运行模式文档
本文档详细说明项目中Shop的mode运行模式相关处理逻辑。运行模式决定了商店的业务流程、支付方式以及用户交互方式。
## 运行模式定义
`src/api/shop/types.ts` 中定义了Shop实体和运行模式
```typescript
export interface ShopEntity {
/** 主键ID */
shopId: number;
/** 商店名称 */
shopName: string;
/** 企业微信id */
corpid: string;
/** 运行模式0-支付模式 1-审批模式 2-借还模式 3-会员模式 4-耗材模式) */
mode?: number;
/** 借呗支付1-正常使用 0-禁止使用) */
balanceEnable?: number;
/** 封面图URL */
coverImg?: string;
}
```
运行模式的具体含义:
| 模式值 | 模式名称 | 说明 |
|--------|----------|------|
| 0 | 支付模式 | 用户直接支付购买商品 |
| 1 | 审批模式 | 需要审批流程后才能购买 |
| 2 | 借还模式 | 借还物品模式 |
| 3 | 会员模式 | 会员租用模式 |
| 4 | 耗材模式 | 耗材领用模式 |
## 支付方式映射
不同运行模式支持不同的支付方式,映射关系定义在 `src/utils/maps/payment.ts`
```typescript
export const modeToPaymentMethodMap: Record<number, number[]> = {
0: [0], // 支付模式:微信支付
1: [0, 1], // 审批模式:微信支付、借呗支付
2: [0, 1], // 借还模式:微信支付、借呗支付
3: [0], // 会员模式:微信支付
4: [2], // 耗材模式:要呗支付
};
```
支付方式的枚举值:
- `0`: 微信支付
- `1`: 借呗支付
- `2`: 要呗支付
## 业务逻辑处理
### 1. 首页模式切换 (`pages/index/index.vue`)
首页根据选中的商店模式决定显示内容:
```typescript
// 当选择商店时触发
if (selectedShop.mode == 3) {
// 会员模式:进入租用模式
rentingCabinetStore.fetchRentingCabinetDetail(selectedShopId);
} else {
// 其他模式:获取普通商品列表
productStore.getGoods(selectedShopId);
}
```
### 2. 结账页面处理 (`pages/index/checkout.vue`)
结账页面使用 `isRentingMode` 计算属性区分模式:
```typescript
// 是否为租用模式(会员模式)
const isRentingMode = computed(() => {
return selectedShop.value?.mode === 3;
});
```
根据模式渲染不同的商品列表:
- 普通模式:显示普通购物车商品
- 租用模式:显示租用购物车商品
支付方式动态确定:
```typescript
// 根据模式获取支持的支付方式
const paymentMethodList = computed(() => {
const mode = selectedShop.value?.mode || 0;
const methods = modeToPaymentMethodMap[mode] || [0];
return methods;
});
```
订单提交时传递模式参数:
```typescript
// 在 SubmitOrderRequestData 中包含 mode 字段
const submitData: SubmitOrderRequestData = {
// ... 其他字段
mode: selectedShop.value?.mode || 0,
goodsList: [
{
// ... 商品信息
mode: selectedShop.value?.mode || 0, // 每个商品项也包含 mode
}
]
};
```
### 3. 购物车管理 (`pages/index/components/cart.vue`)
购物车组件支持两种模式:
- 普通购物车:用于模式 0,1,2,4
- 租用购物车:用于模式 3
提供统一的购物车操作方法,内部根据模式区分处理。
### 4. 租用模式专门处理 (`pages/index/components/renting-cabinet-container.vue`)
专门为会员模式(租用模式)设计的组件,提供:
- 租用格口的选择界面
- 不同尺寸格口的展示使用SVG图标
- 加入租用购物车功能
- 租用时长和费用计算
## 相关API端点
### 获取店铺列表
```
GET /shop/list
```
支持根据mode参数过滤店铺。
### 提交订单
```
POST /order/submit
```
请求体需要包含 `mode` 字段,表示订单的运行模式。
### 订单数据模型
`SubmitOrderRequestData` 中:
```typescript
export interface SubmitOrderRequestData {
// ... 其他字段
/** 运行模式0-支付模式 1-审批模式 2-借还模式 3-会员模式 4-耗材模式) */
mode: number;
/** 订单商品明细列表 */
goodsList: Array<{
// ... 商品信息
/** 运行模式0-支付模式 1-审批模式 2-借还模式 3-会员模式 4-耗材模式) */
mode: number;
}>;
}
```
## 组件和页面
### 主要页面
1. **首页 (`pages/index/index.vue`)**
- 模式切换和渲染
- 根据模式调用不同的数据获取方法
2. **结账页面 (`pages/index/checkout.vue`)**
- 模式支付处理
- 订单提交逻辑
### 主要组件
1. **购物车组件 (`pages/index/components/cart.vue`)**
- 模式购物车管理
- 统一的操作接口
2. **租用柜格容器组件 (`pages/index/components/renting-cabinet-container.vue`)**
- 租用模式专门UI
- 格口选择和租用逻辑
3. **商品容器组件 (`pages/index/components/product-container.vue`)**
- 普通商品展示
- 适用于非租用模式
## 模式处理流程图
```mermaid
graph TD
A[用户访问首页] --> B{选择商店}
B --> C[获取商店信息]
C --> D{检查商店模式}
D -->|模式=3| E[进入租用模式]
D -->|模式≠3| F[进入普通模式]
E --> E1[显示租用柜格容器]
E --> E2[使用租用购物车]
E --> E3[租用结算流程]
F --> F1[显示商品容器]
F --> F2[使用普通购物车]
F --> F3[普通结算流程]
E3 --> G[提交订单]
F3 --> G
G --> H{根据模式确定支付方式}
H --> I[完成订单]
```
## 开发注意事项
1. **模式判断一致性**
- 始终使用 `selectedShop.value?.mode` 获取当前模式
- 模式判断应集中在业务逻辑入口处
2. **支付方式配置**
- 修改支付方式映射时更新 `payment.ts` 文件
- 确保前端支付方式与后端一致
3. **租用模式特殊处理**
- 模式3有专门的组件和流程
- 租用购物车与普通购物车数据分离
4. **扩展新模式**
-`types.ts` 中更新模式注释
- 更新 `payment.ts` 中的支付方式映射
- 根据需要添加新的业务逻辑分支
## 常见问题
**Q: 如何添加新的运行模式?**
A: 1. 在 `types.ts` 中更新模式定义注释2. 在 `payment.ts` 中添加支付方式映射3. 在业务逻辑中添加新的处理分支。
**Q: 模式如何影响支付方式?**
A: 通过 `modeToPaymentMethodMap` 映射关系确定,前端根据当前模式过滤可用的支付方式。
**Q: 租用模式与其他模式的主要区别?**
A: 租用模式使用独立的购物车系统、专门的UI组件和不同的结算逻辑。
---
*文档最后更新2025-12-15*
*维护者Claude Code*