# 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\ | 是 | 经营种类ID列表 | ["101", "102"] | | administrativeRegionProvinceAdcode | String | 是 | 省份行政区划代码 | "110000" | | administrativeRegionCityAdcode | String | 是 | 城市行政区划代码 | "110100" | | administrativeRegionDistrictAdcode | String | 是 | 区县行政区划代码 | "110105" | | businessLicenseAddress | List\ | 是 | 营业执照图片URL列表 | ["https://xxx/license.jpg"] | | contractImageList | List\ | 否 | 合同图片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 请求示例 ```http 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 响应示例 **成功响应:** ```json { "code": 200, "success": true, "msg": "店铺入住申请已提交", "data": { "id": 12345 } } ``` **失败响应:** ```json { "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:完整信息提交 ```bash 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:包含可选字段 ```bash 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