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

240 lines
6.5 KiB
Markdown
Raw Normal View History

# 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*