API_STORE_APPLY.md 11 KB

Web端商户店铺入住接口开发文档

一、接口概述

本次开发在 alien-store-platform 服务中新增了商户店铺入住申请接口,将原 alien-store 服务中的 /store/info/saveStoreInfo 接口迁移到 web 端商户平台,实现相同的业务逻辑。

二、接口信息

2.1 基本信息

接口路径: POST /storeManage/applyStore

原接口路径: POST /alienStore/store/info/saveStoreInfo

接口说明: 商户提交店铺入住申请,创建店铺信息并进入审批流程

Content-Type: application/json

2.2 请求参数(StoreInfoDto)

参数名 类型 必填 说明 示例
storeName String 店铺名称 "张三烧烤店"
storeContact String 联系人 "张三"
storePhone String 联系电话 "13800138000"
storeAddress String 店铺地址 "北京市朝阳区xxx街道"
storePositionLongitude String 经度 "116.4074"
storePositionLatitude String 纬度 "39.9042"
businessSection Integer 经营板块ID 1
businessTypes List<String> 经营种类ID列表 ["101", "102"]
administrativeRegionProvinceAdcode String 省份行政区划代码 "110000"
administrativeRegionCityAdcode String 城市行政区划代码 "110100"
administrativeRegionDistrictAdcode String 区县行政区划代码 "110105"
businessLicenseAddress List<String> 营业执照图片URL列表 ["https://xxx/license.jpg"]
contractImageList List<String> 合同图片URL列表 ["https://xxx/contract.jpg"]
foodLicenceUrl String 经营许可证图片URL "https://xxx/licence.jpg"
storePass String 店铺密码(默认123456) "123456"
storeStatus Integer 店铺状态 1
userAccount String 商户用户ID "1001"
idCard String 身份证号 "110101199001011234"
commissionRate String 抽成比例(默认3%) "3"

2.3 请求示例

POST /storeManage/applyStore
Content-Type: application/json

{
  "storeName": "张三烧烤店",
  "storeContact": "张三",
  "storePhone": "13800138000",
  "storeAddress": "北京市朝阳区xxx街道100号",
  "storePositionLongitude": "116.4074",
  "storePositionLatitude": "39.9042",
  "businessSection": 1,
  "businessTypes": ["101", "102"],
  "administrativeRegionProvinceAdcode": "110000",
  "administrativeRegionCityAdcode": "110100",
  "administrativeRegionDistrictAdcode": "110105",
  "businessLicenseAddress": ["https://example.com/license.jpg"],
  "contractImageList": ["https://example.com/contract1.jpg"],
  "foodLicenceUrl": "https://example.com/food-licence.jpg",
  "storePass": "888888",
  "storeStatus": 1,
  "userAccount": "1001",
  "idCard": "110101199001011234",
  "commissionRate": "3"
}

2.4 响应示例

成功响应:

{
  "code": 200,
  "success": true,
  "msg": "店铺入住申请已提交",
  "data": {
    "id": 12345
  }
}

失败响应:

{
  "code": 500,
  "success": false,
  "msg": "经营板块不存在:99",
  "data": null
}

三、业务流程说明

3.1 完整业务流程

1. 接收店铺入住申请数据
   ↓
2. 查询经营板块信息
   ↓
3. 查询经营种类信息
   ↓
4. 构建店铺信息对象
   ├─ 设置店铺基本信息
   ├─ 设置经纬度
   ├─ 设置店铺密码(默认123456)
   ├─ 设置经营板块和类型
   ├─ 设置审批状态为"待审批"
   └─ 设置行政区域信息
   ↓
5. 插入店铺信息到数据库
   ↓
6. 添加地理位置到Redis(用于附近商家搜索)
   ↓
7. 更新商户用户绑定关系
   ↓
8. 保存店铺相关图片
   ├─ 营业执照图片(imgType=14)
   ├─ 合同图片(imgType=15)
   └─ 经营许可证图片(imgType=25)
   ↓
9. 初始化店铺标签
   ↓
10. 发送入住申请通知给商户
   ↓
11. 返回店铺ID

3.2 关键业务规则

1. 店铺密码规则

  • 默认密码:123456
  • 如果用户设置密码且不为默认密码,则使用用户密码
  • passType=0:初始密码,passType=1:已修改密码

2. 审批状态

  • 新提交的店铺统一设置为 storeApplicationStatus=0(待审批)
  • 状态说明:
    • 0:待审批
    • 1:审批通过
    • 2:审批失败

3. 抽成比例

  • 默认抽成比例:3%
  • 如果未指定,自动设置为3

4. 行政区域处理

  • 根据行政区划代码(adCode)自动填充省市区名称
  • 查询 essential_city_code 表获取区域名称

5. 地理位置存储

  • 将店铺经纬度存储到 Redis GEO 数据结构
  • 用于后续"附近商家"功能
  • 存储Key:geo:store:primary

四、数据库操作

4.1 插入操作

store_info 表

  • 插入店铺基本信息
  • 包含:名称、地址、经纬度、经营信息、审批状态等

store_img 表

  • 插入3种类型的图片:
    • imgType=14:营业执照
    • imgType=15:合同图片
    • imgType=25:经营许可证

tag_store_relation 表

  • 初始化店铺标签关系
  • 用于后续标签功能

life_notice 表

  • 发送入住申请通知消息

4.2 更新操作

store_user 表

  • 更新商户用户的 storeId(绑定店铺)
  • 更新联系人姓名(storeContact)
  • 更新身份证号(idCard)

4.3 查询操作

store_dictionary 表

  • 查询经营板块信息
  • 查询经营种类信息

essential_city_code 表

  • 查询省市区名称

五、Redis操作

5.1 GEO地理位置存储

Key: geo:store:primary

操作:

GEOADD geo:store:primary 经度 纬度 店铺ID

示例:

GEOADD geo:store:primary 116.4074 39.9042 "12345"

用途:

  • 支持"附近商家"功能
  • 根据用户位置搜索周边店铺

六、通知消息

6.1 入住申请通知

接收人: store_{商户手机号}

消息内容:

您在2025-01-15 14:30:00提交的入驻店铺申请,平台已受理,1-3个工作日将审核结果发送至应用内的消息-通知中,请注意查收。

通知类型: noticeType=1(系统通知)

发送人: system


七、代码结构

7.1 新增文件列表

alien-store-platform/
├── controller/
│   └── StoreManageController.java         # 店铺管理控制器
├── service/
│   ├── StoreManageService.java            # 店铺管理服务接口
│   └── impl/
│       └── StoreManageServiceImpl.java    # 店铺管理服务实现
└── util/
    └── NearMeUtil.java                     # 附近商家地理位置工具类

7.2 依赖注入

StoreManageServiceImpl 依赖:

  • StoreInfoMapper:店铺信息Mapper
  • StoreDictionaryMapper:字典Mapper
  • EssentialCityCodeMapper:城市编码Mapper
  • StoreUserMapper:商户用户Mapper
  • StoreImgMapper:店铺图片Mapper
  • TagStoreRelationMapper:标签关系Mapper
  • LifeNoticeMapper:通知消息Mapper
  • NearMeUtil:地理位置工具类

NearMeUtil 依赖:

  • StringRedisTemplate:Redis操作模板

八、图片类型说明

8.1 店铺图片类型(img_type)

类型值 类型名称 说明 是否必填
14 营业执照 店铺营业执照图片 ✅ 必填
15 合同图片 店铺与平台的合同图片 ❌ 可选
25 经营许可证 食品经营许可证等 ❌ 可选

8.2 图片存储说明

  • 图片URL应该是已上传到OSS的地址
  • 营业执照可以有多张
  • 合同图片可以有多张
  • 经营许可证只能有一张

九、测试用例

测试用例1:完整信息提交

curl -X POST "http://localhost:8080/storeManage/applyStore" \
  -H "Content-Type: application/json" \
  -d '{
    "storeName": "测试烧烤店",
    "storeContact": "测试联系人",
    "storePhone": "13800138000",
    "storeAddress": "北京市朝阳区测试街道100号",
    "storePositionLongitude": "116.4074",
    "storePositionLatitude": "39.9042",
    "businessSection": 1,
    "businessTypes": ["101", "102"],
    "administrativeRegionProvinceAdcode": "110000",
    "administrativeRegionCityAdcode": "110100",
    "administrativeRegionDistrictAdcode": "110105",
    "businessLicenseAddress": ["https://example.com/license.jpg"],
    "storeStatus": 1,
    "userAccount": "1001"
  }'

测试用例2:包含可选字段

curl -X POST "http://localhost:8080/storeManage/applyStore" \
  -H "Content-Type: application/json" \
  -d '{
    "storeName": "测试餐厅",
    "storeContact": "张经理",
    "storePhone": "13900139000",
    "storeAddress": "上海市浦东新区测试路200号",
    "storePositionLongitude": "121.4737",
    "storePositionLatitude": "31.2304",
    "businessSection": 1,
    "businessTypes": ["101"],
    "administrativeRegionProvinceAdcode": "310000",
    "administrativeRegionCityAdcode": "310100",
    "administrativeRegionDistrictAdcode": "310115",
    "businessLicenseAddress": ["https://example.com/license.jpg"],
    "contractImageList": ["https://example.com/contract.jpg"],
    "foodLicenceUrl": "https://example.com/food.jpg",
    "storePass": "888888",
    "storeStatus": 1,
    "userAccount": "1002",
    "idCard": "310101199001011234",
    "commissionRate": "5"
  }'

十、异常处理

10.1 常见异常

异常情况 错误信息 处理建议
经营板块不存在 "经营板块不存在:{id}" 检查businessSection参数
商户用户不存在 "未找到商户用户" 检查userAccount参数
行政区划代码错误 查询结果为空 检查adCode参数
Redis连接失败 地理位置添加失败(仅警告) 不影响主流程
数据库操作失败 事务回滚 检查数据完整性

10.2 事务处理

  • 使用 @Transactional 注解
  • 任何异常都会触发事务回滚
  • 确保数据一致性

十一、技术亮点

  1. 代码复用:完全复用原接口业务逻辑
  2. 事务管理:使用声明式事务确保数据一致性
  3. 异常处理:完善的异常捕获和日志记录
  4. 解耦设计:工具类独立,便于测试和维护
  5. Redis集成:支持地理位置搜索功能
  6. 消息通知:自动发送入住申请通知

十二、部署检查清单

  • 确认数据库表结构完整
    • store_info
    • store_img
    • store_user
    • store_dictionary
    • essential_city_code
    • tag_store_relation
    • life_notice
  • 确认Redis可用
  • 确认所有Mapper已注册
  • 确认事务配置正确
  • 测试地理位置存储功能
  • 测试通知消息发送功能

十三、接口对比

对比项 原接口 新接口
服务 alien-store alien-store-platform
路径 /store/info/saveStoreInfo /storeManage/applyStore
方法 POST POST
参数 StoreInfoDto StoreInfoDto
返回 StoreInfoVo StoreInfoVo
业务逻辑 ✅ 完全一致 ✅ 完全一致

开发完成时间: 2025-01-xx
开发人员: AI Assistant
版本号: v1.0.0