fetch(add): 订单管理-企业设备
All checks were successful
构建并部署前端到测试环境 / build-and-deploy (push) Successful in 3m30s

This commit is contained in:
sexygoat
2026-01-29 15:43:45 +08:00
parent 1812b7a6c4
commit 841cf0442b
58 changed files with 8948 additions and 1164 deletions

View File

@@ -0,0 +1,110 @@
# My Packages (代理可售套餐) Specification
## ADDED Requirements
### Requirement: 我的可售套餐列表查询
系统 SHALL 提供代理商查询被分配套餐的功能。
#### Scenario: 查询当前代理商的可售套餐
- **WHEN** 代理商用户访问可售套餐页面
- **THEN** 系统显示被分配给该代理商的套餐列表
- **AND** 每个套餐包含套餐ID、套餐编码、套餐名称、套餐类型、系列信息
- **AND** 显示成本价cost_price单位
- **AND** 显示建议售价suggested_retail_price单位
- **AND** 显示利润空间profit_margin = 建议售价 - 成本价)
- **AND** 显示价格来源series_pricing:系列加价 / package_override:单套餐覆盖)
- **AND** 显示套餐状态和上架状态
- **AND** 支持分页每页最多100条记录
#### Scenario: 按系列筛选
- **WHEN** 代理商选择特定系列ID筛选
- **THEN** 系统返回该系列下的所有可售套餐
#### Scenario: 按套餐类型筛选
- **WHEN** 代理商选择套餐类型formal/addon筛选
- **THEN** 系统返回该类型的所有可售套餐
### Requirement: 可售套餐详情查询
系统 SHALL 允许代理商查看单个可售套餐的详细信息。
#### Scenario: 查询套餐详情
- **WHEN** 代理商点击查看套餐详情
- **THEN** 系统显示套餐完整信息
- **AND** 包含套餐描述、流量信息、时长等
- **AND** 显示定价详情(成本价、建议售价、利润空间、价格来源)
- **AND** 显示系列信息
#### Scenario: 查询未分配的套餐
- **WHEN** 代理商查询未被分配的套餐ID
- **THEN** 系统返回404错误或无权访问错误
### Requirement: 我的被分配系列列表
系统 SHALL 提供代理商查询被分配系列的功能。
#### Scenario: 查询被分配系列列表
- **WHEN** 代理商访问被分配系列列表
- **THEN** 系统显示分配给该代理商的系列列表
- **AND** 每个系列包含分配ID、系列ID、系列编码、系列名称
- **AND** 显示定价模式fixed:固定金额 / percent:百分比)
- **AND** 显示定价值pricing_value
- **AND** 显示分配者店铺名称
- **AND** 显示可售套餐数量
- **AND** 显示状态
- **AND** 支持分页
### Requirement: 成本价计算规则
系统 SHALL 根据价格来源计算代理商的成本价。
#### Scenario: 系列加价模式series_pricing
- **WHEN** 套餐通过系列分配获得定价
- **AND** 定价模式为 fixed固定金额
- **THEN** 成本价 = 套餐价格 + 固定加价金额
- **WHEN** 定价模式为 percent百分比
- **THEN** 成本价 = 套餐价格 × (1 + 加价百分比)
#### Scenario: 单套餐覆盖模式package_override
- **WHEN** 套餐被单独分配并设置了成本价
- **THEN** 成本价 = 单套餐分配中设置的成本价
- **AND** 价格来源显示为 package_override
### Requirement: 数据隔离
系统 SHALL 确保代理商只能查看被分配给自己的套餐。
#### Scenario: 数据访问隔离
- **WHEN** 代理商查询可售套餐列表
- **THEN** 系统仅返回分配给该代理商的套餐
- **AND** 不显示其他代理商的套餐信息
#### Scenario: 跨代理商访问保护
- **WHEN** 代理商尝试访问未分配给自己的套餐详情
- **THEN** 系统返回403无权访问错误
### Requirement: 权限控制
系统 SHALL 对可售套餐查询功能实施权限控制。
#### Scenario: 仅代理商可访问
- **WHEN** 非代理商用户访问可售套餐接口
- **THEN** 系统返回403无权访问错误
#### Scenario: 未认证用户访问
- **WHEN** 未登录用户访问可售套餐接口
- **THEN** 系统返回401未认证错误

View File

@@ -0,0 +1,159 @@
# Package Management Specification
## ADDED Requirements
### Requirement: 套餐列表查询
系统 SHALL 提供套餐列表查询功能,支持分页和多条件筛选。
#### Scenario: 查询所有套餐
- **WHEN** 用户访问套餐管理页面
- **THEN** 系统显示套餐列表包含套餐编码、套餐名称、系列ID、套餐类型、流量、价格、状态、上架状态等
- **AND** 支持按套餐名称模糊搜索
- **AND** 支持按系列ID筛选
- **AND** 支持按状态筛选(启用/禁用)
- **AND** 支持按上架状态筛选(上架/下架)
- **AND** 支持按套餐类型筛选formal/addon
- **AND** 支持分页每页最多100条记录
#### Scenario: 多条件组合查询
- **WHEN** 用户同时使用多个筛选条件
- **THEN** 系统返回满足所有条件的套餐列表
### Requirement: 创建套餐
系统 SHALL 允许管理员创建新的套餐。
#### Scenario: 成功创建套餐
- **WHEN** 用户填写必填字段(套餐编码、套餐名称、套餐类型、套餐时长、套餐价格)
- **AND** 可选填写系列ID、流量信息、成本价、建议售价等
- **AND** 提交表单
- **THEN** 系统创建套餐,默认状态为启用,默认上架状态为下架
- **AND** 返回创建的套餐详情
#### Scenario: 套餐编码唯一性验证
- **WHEN** 用户使用已存在的套餐编码创建套餐
- **THEN** 系统返回错误提示"套餐编码已存在"
#### Scenario: 验证套餐时长范围
- **WHEN** 套餐时长小于1个月或大于120个月
- **THEN** 系统返回验证错误"套餐时长必须在1-120个月之间"
#### Scenario: 流量类型与流量额度关系
- **WHEN** 流量类型为真流量real
- **THEN** 真流量额度real_data_mb必须大于0
- **AND** 总流量额度data_amount_mb等于真流量额度
- **WHEN** 流量类型为虚流量virtual
- **THEN** 虚流量额度virtual_data_mb必须大于0
- **AND** 真流量额度和虚流量额度之和等于总流量额度
### Requirement: 查看套餐详情
系统 SHALL 允许用户查看单个套餐的详细信息。
#### Scenario: 查询存在的套餐
- **WHEN** 用户通过套餐ID查询详情
- **THEN** 系统返回该套餐的完整信息,包括所有字段
#### Scenario: 查询不存在的套餐
- **WHEN** 用户查询不存在的套餐ID
- **THEN** 系统返回404错误
### Requirement: 更新套餐
系统 SHALL 允许管理员更新套餐信息。
#### Scenario: 成功更新套餐
- **WHEN** 用户修改套餐的可变字段(名称、时长、价格、流量等)
- **AND** 提交更新
- **THEN** 系统更新套餐信息
- **AND** 返回更新后的套餐详情
#### Scenario: 套餐编码不可修改
- **WHEN** 用户尝试修改套餐编码
- **THEN** 系统忽略该字段,不允许修改
### Requirement: 删除套餐
系统 SHALL 允许管理员删除套餐。
#### Scenario: 成功删除套餐
- **WHEN** 用户删除未被使用的套餐
- **THEN** 系统删除该套餐
- **AND** 返回成功状态
#### Scenario: 删除被分配的套餐
- **WHEN** 用户删除已被分配给代理商的套餐
- **THEN** 系统返回错误提示"该套餐已被分配,无法删除"
### Requirement: 套餐状态管理
系统 SHALL 支持套餐启用/禁用状态管理。
#### Scenario: 启用套餐
- **WHEN** 用户将禁用状态的套餐切换为启用
- **THEN** 系统更新状态为启用status=1
#### Scenario: 禁用套餐
- **WHEN** 用户将启用状态的套餐切换为禁用
- **THEN** 系统更新状态为禁用status=2
- **AND** 该套餐将不可用于新的分配或充值
### Requirement: 套餐上架状态管理
系统 SHALL 支持套餐上架/下架状态管理。
#### Scenario: 上架套餐
- **WHEN** 用户将下架状态的套餐切换为上架
- **THEN** 系统更新上架状态为上架shelf_status=1
- **AND** 该套餐将对代理商可见
#### Scenario: 下架套餐
- **WHEN** 用户将上架状态的套餐切换为下架
- **THEN** 系统更新上架状态为下架shelf_status=2
- **AND** 该套餐将对代理商不可见
### Requirement: 套餐类型支持
系统 SHALL 支持两种套餐类型。
#### Scenario: 正式套餐
- **WHEN** 创建套餐类型为 formal 的套餐
- **THEN** 系统记录为正式套餐
#### Scenario: 附加套餐
- **WHEN** 创建套餐类型为 addon 的套餐
- **THEN** 系统记录为附加套餐
### Requirement: 权限控制
系统 SHALL 对套餐管理功能实施权限控制。
#### Scenario: 未认证用户访问
- **WHEN** 未登录用户访问套餐管理接口
- **THEN** 系统返回401未认证错误
#### Scenario: 无权限用户访问
- **WHEN** 已登录但无权限的用户访问套餐管理接口
- **THEN** 系统返回403无权访问错误

View File

@@ -0,0 +1,116 @@
# Package Series Management Specification
## ADDED Requirements
### Requirement: 套餐系列列表查询
系统 SHALL 提供套餐系列列表查询功能,支持分页和条件筛选。
#### Scenario: 查询所有套餐系列
- **WHEN** 用户访问套餐系列管理页面
- **THEN** 系统显示套餐系列列表,包含系列名称、系列编码、描述、状态、创建时间、更新时间
- **AND** 支持按系列名称模糊搜索
- **AND** 支持按状态筛选(启用/禁用)
- **AND** 支持分页每页最多100条记录
#### Scenario: 空列表处理
- **WHEN** 没有符合条件的套餐系列
- **THEN** 系统显示空状态提示
### Requirement: 创建套餐系列
系统 SHALL 允许管理员创建新的套餐系列。
#### Scenario: 成功创建套餐系列
- **WHEN** 用户填写系列编码、系列名称(必填)
- **AND** 可选填写描述最大500字符
- **AND** 提交表单
- **THEN** 系统创建套餐系列,默认状态为启用
- **AND** 返回创建的套餐系列详情
#### Scenario: 系列编码重复
- **WHEN** 用户使用已存在的系列编码创建套餐系列
- **THEN** 系统返回错误提示"系列编码已存在"
#### Scenario: 验证系列名称长度
- **WHEN** 系列名称长度小于1或大于255个字符
- **THEN** 系统返回验证错误
### Requirement: 查看套餐系列详情
系统 SHALL 允许用户查看单个套餐系列的详细信息。
#### Scenario: 查询存在的套餐系列
- **WHEN** 用户通过系列ID查询详情
- **THEN** 系统返回该套餐系列的完整信息
#### Scenario: 查询不存在的套餐系列
- **WHEN** 用户查询不存在的系列ID
- **THEN** 系统返回404错误
### Requirement: 更新套餐系列
系统 SHALL 允许管理员更新套餐系列信息。
#### Scenario: 成功更新套餐系列
- **WHEN** 用户修改系列名称或描述
- **AND** 提交更新
- **THEN** 系统更新套餐系列信息
- **AND** 返回更新后的套餐系列详情
#### Scenario: 系列编码不可修改
- **WHEN** 用户尝试修改系列编码
- **THEN** 系统忽略该字段,不允许修改
### Requirement: 删除套餐系列
系统 SHALL 允许管理员删除套餐系列。
#### Scenario: 成功删除套餐系列
- **WHEN** 用户删除未被套餐使用的系列
- **THEN** 系统删除该套餐系列
- **AND** 返回成功状态
#### Scenario: 删除被使用的套餐系列
- **WHEN** 用户删除已被套餐关联的系列
- **THEN** 系统返回错误提示"该系列下存在套餐,无法删除"
### Requirement: 套餐系列状态管理
系统 SHALL 支持套餐系列状态的开关管理。
#### Scenario: 启用套餐系列
- **WHEN** 用户将禁用状态的系列切换为启用
- **THEN** 系统更新状态为启用status=1
#### Scenario: 禁用套餐系列
- **WHEN** 用户将启用状态的系列切换为禁用
- **THEN** 系统更新状态为禁用status=2
- **AND** 该系列下的套餐可能受到影响(业务规则)
### Requirement: 权限控制
系统 SHALL 对套餐系列管理功能实施权限控制。
#### Scenario: 未认证用户访问
- **WHEN** 未登录用户访问套餐系列管理接口
- **THEN** 系统返回401未认证错误
#### Scenario: 无权限用户访问
- **WHEN** 已登录但无权限的用户访问套餐系列管理接口
- **THEN** 系统返回403无权访问错误

View File

@@ -0,0 +1,164 @@
# Shop Package Allocation (单套餐分配) Specification
## ADDED Requirements
### Requirement: 单套餐分配列表查询
系统 SHALL 提供单套餐分配记录的查询功能。
#### Scenario: 查询所有单套餐分配
- **WHEN** 管理员访问单套餐分配管理页面
- **THEN** 系统显示单套餐分配列表
- **AND** 每条记录包含分配ID、套餐ID、套餐编码、套餐名称
- **AND** 显示被分配的店铺ID和店铺名称
- **AND** 显示覆盖的成本价cost_price单位
- **AND** 显示原计算成本价calculated_cost_price供参考
- **AND** 显示关联的系列分配ID
- **AND** 显示状态、创建时间、更新时间
- **AND** 支持分页每页最多100条记录
#### Scenario: 按店铺筛选
- **WHEN** 管理员选择特定店铺ID筛选
- **THEN** 系统返回该店铺的所有单套餐分配记录
#### Scenario: 按套餐筛选
- **WHEN** 管理员选择特定套餐ID筛选
- **THEN** 系统返回该套餐的所有分配记录
#### Scenario: 按状态筛选
- **WHEN** 管理员选择状态(启用/禁用)筛选
- **THEN** 系统返回符合状态条件的分配记录
### Requirement: 创建单套餐分配
系统 SHALL 允许管理员为店铺分配特定套餐并设置成本价。
#### Scenario: 成功创建单套餐分配
- **WHEN** 管理员选择套餐ID、店铺ID
- **AND** 设置覆盖的成本价必填最小值为0
- **AND** 提交分配
- **THEN** 系统创建单套餐分配记录
- **AND** 计算并保存原计算成本价(基于系列分配规则)
- **AND** 返回创建的分配详情包括关联的系列分配ID
#### Scenario: 重复分配检查
- **WHEN** 管理员为同一店铺分配已分配过的套餐
- **THEN** 系统返回错误提示"该套餐已分配给此店铺"
#### Scenario: 店铺和套餐验证
- **WHEN** 管理员使用不存在的店铺ID或套餐ID
- **THEN** 系统返回错误提示"店铺或套餐不存在"
### Requirement: 查看单套餐分配详情
系统 SHALL 允许管理员查看单个分配记录的详细信息。
#### Scenario: 查询存在的分配记录
- **WHEN** 管理员通过分配ID查询详情
- **THEN** 系统返回该分配记录的完整信息
- **AND** 包含套餐完整信息、店铺信息、定价信息
#### Scenario: 查询不存在的分配记录
- **WHEN** 管理员查询不存在的分配ID
- **THEN** 系统返回404错误
### Requirement: 更新单套餐分配
系统 SHALL 允许管理员更新单套餐分配的成本价。
#### Scenario: 成功更新成本价
- **WHEN** 管理员修改覆盖的成本价
- **AND** 提交更新
- **THEN** 系统更新成本价
- **AND** 返回更新后的分配详情
#### Scenario: 成本价验证
- **WHEN** 管理员设置成本价小于0
- **THEN** 系统返回验证错误"成本价必须大于等于0"
### Requirement: 删除单套餐分配
系统 SHALL 允许管理员删除单套餐分配记录。
#### Scenario: 成功删除分配
- **WHEN** 管理员删除单套餐分配记录
- **THEN** 系统删除该分配记录
- **AND** 该店铺将无法再以此定价售卖该套餐
- **AND** 返回成功状态
#### Scenario: 删除正在使用的分配
- **WHEN** 管理员删除正在被订单使用的分配记录
- **THEN** 系统可能返回警告或阻止删除(根据业务规则)
### Requirement: 单套餐分配状态管理
系统 SHALL 支持单套餐分配的启用/禁用状态管理。
#### Scenario: 启用分配
- **WHEN** 管理员将禁用状态的分配切换为启用
- **THEN** 系统更新状态为启用status=1
- **AND** 该店铺可以使用此定价售卖套餐
#### Scenario: 禁用分配
- **WHEN** 管理员将启用状态的分配切换为禁用
- **THEN** 系统更新状态为禁用status=2
- **AND** 该店铺将无法使用此定价售卖套餐
### Requirement: 成本价优先级规则
系统 SHALL 实现单套餐分配成本价覆盖系列分配规则。
#### Scenario: 单套餐分配优先
- **WHEN** 店铺同时拥有系列分配和单套餐分配
- **THEN** 系统使用单套餐分配的成本价
- **AND** 原计算成本价calculated_cost_price保存系列分配规则计算的价格供参考
#### Scenario: 仅系列分配
- **WHEN** 店铺只有系列分配,没有单套餐分配
- **THEN** 系统使用系列分配规则计算成本价
### Requirement: 关联系列分配追踪
系统 SHALL 追踪单套餐分配与系列分配的关联关系。
#### Scenario: 记录关联的系列分配
- **WHEN** 创建单套餐分配时
- **THEN** 系统记录关联的系列分配IDallocation_id
- **AND** 用于追溯定价来源
### Requirement: 权限控制
系统 SHALL 对单套餐分配管理功能实施权限控制。
#### Scenario: 未认证用户访问
- **WHEN** 未登录用户访问单套餐分配接口
- **THEN** 系统返回401未认证错误
#### Scenario: 无权限用户访问
- **WHEN** 已登录但无权限的用户访问单套餐分配接口
- **THEN** 系统返回403无权访问错误
#### Scenario: 仅管理员可操作
- **WHEN** 非管理员用户尝试创建、更新或删除单套餐分配
- **THEN** 系统返回403无权访问错误