# 店铺设置 — 技术方案

> **依据：** 《店铺设置功能需求.md》v1.1  
> **关联：** 《店铺管理技术方案.md》v1.2.2、《商品管理技术方案.md》v1.2、《商品审核技术方案.md》v1.0、《关联需求分析.md》v1.2  
> **范围：** 平台 **全平台唯一** 店铺策略；**针对所有店铺**；`biz_shop_global_config` 单例配置。  
> **原则：** submit 读 **全局** Facade；改开关 **不批量改商品**。  
> **v1.1.1：** `biz_shop` **不再** 存储 `default_audit_pass`、`max_sub_admin`；策略 **仅存** 全局表。

---

## 1. 技术架构

| 项 | 选型 |
|----|------|
| 基础框架 | RuoYi **v3.9.2**（`springboot2`） |
| 数据库 | **MySQL 5.7.39** |
| 配置存储 | **`biz_shop_global_config`**（`config_id=1` 单例） |
| 权限 | `agri:shop:setting` |

### 1.1 模块落位

```text
baqing-shop
└── com.ruoyi.web.modules.store
    ├── controller.ShopGlobalSettingController     # GET/PUT /agri/shopSetting
    ├── service.IShopGlobalConfigService
    ├── service.impl.ShopGlobalConfigServiceImpl
    ├── facade.IShopGlobalConfigFacade             # 商品 submit 读全局
    ├── domain.BizShopGlobalConfig
    ├── mapper.BizShopGlobalConfigMapper
    ├── dto.ShopSettingsDTO / vo.ShopSettingsVO
    └── constant.ShopGlobalConfigConstants
sql/
└── biz_shop_global_config.sql
```

> **v1.1：** 移除 `GET/PUT /agri/shop/{shopId}/settings` 逐店接口；`ShopController` **不再** 暴露 settings。

### 1.2 业务链

```text
biz_shop_global_config（config_id=1，全平台唯一）
    ├── default_audit_pass ──► IShopGlobalConfigFacade
    │                              └── GoodsServiceImpl.submitGoods（任意 shopId）
    └── max_sub_admin ──► （预留）子管理员模块
```

| 模块 | 关系 |
|------|------|
| 商品管理 | submit 读 **`IShopGlobalConfigFacade`** |
| 店铺管理 | 开店 **仅** insert 店铺基础信息；**不写入** 策略字段 |

### 1.3 Facade

| 接口 | 方法 | 用途 |
|------|------|------|
| `IShopGlobalConfigFacade` | `getDefaultAuditPass()` | 商品 submit |
| | `getMaxSubAdmin()` | 预留 |

---

## 2. 数据库设计

### 2.1 `biz_shop_global_config`（单例）

| 字段 | 类型 | 默认 | 说明 |
|------|------|------|------|
| config_id | bigint PK | **1** | 固定单例 |
| default_audit_pass | char(1) | 0 | 全平台免审开关 |
| max_sub_admin | int | 5 | 全平台子管理员上限 |
| create_by/time, update_by/time | | | 审计 |

初始化脚本见 `sql/biz_shop_global_config.sql`（`INSERT ... WHERE NOT EXISTS`）。

> **v1.1.1：** `biz_shop` 表 **不含** 策略字段；存量库执行 `sql/biz_shop_drop_settings_columns.sql` 迁移。

---

## 3. 接口设计

**基路径：** `/agri/shopSetting`（**无 shopId**）  
**权限：** `agri:shop:setting`

### 3.1 获取全局设置 `GET /agri/shopSetting`

```json
{
  "defaultAuditPass": "0",
  "maxSubAdmin": 5
}
```

### 3.2 保存全局设置 `PUT /agri/shopSetting`

**Body：** `ShopSettingsDTO`（`defaultAuditPass`、`maxSubAdmin`）

**成功 msg：** `商品默认审核设置仅对此后新提交上架的商品生效`（`ShopConstants.MSG_SETTINGS_SAVED`）

| 校验 | 失败 msg |
|------|----------|
| defaultAuditPass ∈ {0,1} | 默认审核通过参数无效 |
| maxSubAdmin ∈ [1,99] | 请输入 1～99 之间的整数 |

### 3.3 商品 submit 消费

```java
String pass = shopGlobalConfigFacade.getDefaultAuditPass();
String target = AUDIT_PASS_YES.equals(pass) ? STATUS_ON_SALE : STATUS_PENDING;
```

**任意 `shopId`** 均读 **同一** 全局值。

---

## 4. Service 要点

### 4.1 `getGlobalSettings()`

```text
select config_id=1 → 若无则 lazy insert 默认(0,5) → ShopSettingsVO
```

### 4.2 `updateGlobalSettings(dto, operator)`

```text
validateSettings → UPDATE biz_shop_global_config WHERE config_id=1
（不 UPDATE biz_goods；不 UPDATE 全部 biz_shop）
```

---

## 5. 业务规则映射（SS）

| 编号 | 实现 |
|------|------|
| SS1 | 单表单例 `config_id=1`；Facade 全店共用 |
| SS2 | 默认 `default_audit_pass=0` |
| SS3 | update 仅改全局表 |
| SS4 | `GoodsServiceImpl.submitGoods` → Facade |
| SS5～SS12 | 同功能需求 |

---

## 6. 菜单权限

| 菜单 | 权限 |
|------|------|
| 店铺设置（全局） | `agri:shop:setting` |

---

## 7. 与旧方案差异（v1.0 → v1.1）

| 项 | v1.0 | v1.1 |
|----|------|------|
| 维度 | 单店 `/{shopId}/settings` | **全局** `/agri/shopSetting` |
| 存储 | 仅 `biz_shop` 列 | **`biz_shop_global_config`** |
| submit 读 | 单店字段 | **`IShopGlobalConfigFacade`** |
| 入口 | 列表逐店 | **独立菜单** |

---

## 8. 修订记录

| 版本 | 说明 |
|------|------|
| **v1.0** | 单店方案（已废止） |
| **v1.1** | **全局设计，针对所有店铺** |

---

*文档版本：v1.1 · 关联《店铺设置功能需求.md》v1.1*
