feat: 实现账号与佣金管理模块
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 4m35s

新增功能:
- 店铺佣金查询:店铺佣金统计、店铺佣金记录列表、店铺提现记录
- 佣金提现审批:提现申请列表、审批通过、审批拒绝
- 提现配置管理:配置列表、新增配置、获取当前生效配置
- 企业管理:企业列表、创建、更新、删除、获取详情
- 企业卡授权:授权列表、批量授权、批量取消授权、统计
- 客户账号管理:账号列表、创建、更新状态、重置密码
- 我的佣金:佣金统计、佣金记录、提现申请、提现记录

数据库变更:
- 扩展 tb_commission_withdrawal_request 新增提现单号等字段
- 扩展 tb_account 新增 is_primary 字段
- 扩展 tb_commission_record 新增 shop_id、balance_after
- 扩展 tb_commission_withdrawal_setting 新增每日提现次数限制
- 扩展 tb_iot_card、tb_device 新增 shop_id 冗余字段
- 新建 tb_enterprise_card_authorization 企业卡授权表
- 新建 tb_asset_allocation_record 资产分配记录表
- 数据迁移:owner_type 枚举值 agent 统一为 shop

测试:
- 新增 7 个单元测试文件覆盖各服务
- 修复集成测试 Redis 依赖问题
This commit is contained in:
2026-01-21 18:20:44 +08:00
parent 1489abe668
commit 91c9bbfeb8
89 changed files with 11958 additions and 159 deletions

View File

@@ -1,49 +1,90 @@
package model
// CreateEnterpriseRequest 创建企业请求
type CreateEnterpriseRequest struct {
EnterpriseName string `json:"enterprise_name" validate:"required" required:"true" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" description:"企业编号"`
type CreateEnterpriseReq struct {
EnterpriseName string `json:"enterprise_name" validate:"required,max=100" required:"true" maximum:"100" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" validate:"required,max=50" required:"true" maximum:"50" description:"企业编号(唯一)"`
OwnerShopID *uint `json:"owner_shop_id" description:"归属店铺ID可不填则归属平台"`
LegalPerson string `json:"legal_person" description:"法人代表"`
ContactName string `json:"contact_name" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" description:"联系人电话"`
BusinessLicense string `json:"business_license" description:"营业执照号"`
Province string `json:"province" description:"省份"`
City string `json:"city" description:"城市"`
District string `json:"district" description:"区县"`
Address string `json:"address" description:"详细地址"`
LegalPerson string `json:"legal_person" validate:"max=50" maximum:"50" description:"法人代表"`
ContactName string `json:"contact_name" validate:"required,max=50" required:"true" maximum:"50" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" validate:"required,max=20" required:"true" maximum:"20" description:"联系人电话"`
LoginPhone string `json:"login_phone" validate:"required,len=11" required:"true" description:"登录手机号(作为企业账号)"`
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"登录密码"`
BusinessLicense string `json:"business_license" validate:"max=100" maximum:"100" description:"营业执照号"`
Province string `json:"province" validate:"max=50" maximum:"50" description:"省份"`
City string `json:"city" validate:"max=50" maximum:"50" description:"城市"`
District string `json:"district" validate:"max=50" maximum:"50" description:"区县"`
Address string `json:"address" validate:"max=255" maximum:"255" description:"详细地址"`
}
// UpdateEnterpriseRequest 更新企业请求
type UpdateEnterpriseRequest struct {
EnterpriseName *string `json:"enterprise_name" description:"企业名称"`
EnterpriseCode *string `json:"enterprise_code" description:"企业编号"`
LegalPerson *string `json:"legal_person" description:"法人代表"`
ContactName *string `json:"contact_name" description:"联系人姓名"`
ContactPhone *string `json:"contact_phone" description:"联系人电话"`
BusinessLicense *string `json:"business_license" description:"营业执照号"`
Province *string `json:"province" description:"省份"`
City *string `json:"city" description:"城市"`
District *string `json:"district" description:"区县"`
Address *string `json:"address" description:"详细地址"`
type UpdateEnterpriseReq struct {
OwnerShopID *uint `json:"owner_shop_id" description:"归属店铺ID"`
EnterpriseName *string `json:"enterprise_name" validate:"omitempty,max=100" maximum:"100" description:"企业名称"`
EnterpriseCode *string `json:"enterprise_code" validate:"omitempty,max=50" maximum:"50" description:"企业编号"`
LegalPerson *string `json:"legal_person" validate:"omitempty,max=50" maximum:"50" description:"法人代表"`
ContactName *string `json:"contact_name" validate:"omitempty,max=50" maximum:"50" description:"联系人姓名"`
ContactPhone *string `json:"contact_phone" validate:"omitempty,max=20" maximum:"20" description:"联系人电话"`
BusinessLicense *string `json:"business_license" validate:"omitempty,max=100" maximum:"100" description:"营业执照号"`
Province *string `json:"province" validate:"omitempty,max=50" maximum:"50" description:"省份"`
City *string `json:"city" validate:"omitempty,max=50" maximum:"50" description:"城市"`
District *string `json:"district" validate:"omitempty,max=50" maximum:"50" description:"区县"`
Address *string `json:"address" validate:"omitempty,max=255" maximum:"255" description:"详细地址"`
}
// EnterpriseResponse 企业响应
type EnterpriseResponse struct {
type EnterpriseListReq struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码默认1"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量默认20最大100"`
EnterpriseName string `json:"enterprise_name" query:"enterprise_name" description:"企业名称(模糊查询)"`
LoginPhone string `json:"login_phone" query:"login_phone" description:"登录手机号(模糊查询)"`
ContactPhone string `json:"contact_phone" query:"contact_phone" description:"联系人电话(模糊查询)"`
OwnerShopID *uint `json:"owner_shop_id" query:"owner_shop_id" description:"归属店铺ID"`
Status *int `json:"status" query:"status" description:"状态0=禁用, 1=启用)"`
}
type EnterpriseItem struct {
ID uint `json:"id" description:"企业ID"`
EnterpriseName string `json:"enterprise_name" description:"企业名称"`
EnterpriseCode string `json:"enterprise_code" description:"企业编号"`
OwnerShopID *uint `json:"owner_shop_id,omitempty" description:"归属店铺ID"`
OwnerShopName string `json:"owner_shop_name" description:"归属店铺名称"`
LegalPerson string `json:"legal_person" description:"法人代表"`
ContactName string `json:"contact_name" description:"联系人姓名"`
ContactPhone string `json:"contact_phone" description:"联系人电话"`
LoginPhone string `json:"login_phone" description:"登录手机号"`
BusinessLicense string `json:"business_license" description:"营业执照号"`
Province string `json:"province" description:"省份"`
City string `json:"city" description:"城市"`
District string `json:"district" description:"区县"`
Address string `json:"address" description:"详细地址"`
Status int `json:"status" description:"状态 (0:禁用, 1:启用)"`
Status int `json:"status" description:"状态0=禁用, 1=启用"`
StatusName string `json:"status_name" description:"状态名称"`
CreatedAt string `json:"created_at" description:"创建时间"`
UpdatedAt string `json:"updated_at" description:"更新时间"`
}
type EnterprisePageResult struct {
Items []EnterpriseItem `json:"items" description:"企业列表"`
Total int64 `json:"total" description:"总记录数"`
Page int `json:"page" description:"当前页码"`
Size int `json:"size" description:"每页数量"`
}
type UpdateEnterpriseStatusReq struct {
Status int `json:"status" validate:"required,oneof=0 1" required:"true" enum:"0,1" description:"状态0=禁用, 1=启用)"`
}
type UpdateEnterprisePasswordReq struct {
Password string `json:"password" validate:"required,min=6,max=20" required:"true" minimum:"6" maximum:"20" description:"新密码"`
}
type CreateEnterpriseResp struct {
Enterprise EnterpriseItem `json:"enterprise" description:"企业信息"`
AccountID uint `json:"account_id" description:"账号ID"`
}
// CreateEnterpriseRequest 创建企业请求(兼容旧接口)
type CreateEnterpriseRequest = CreateEnterpriseReq
// UpdateEnterpriseRequest 更新企业请求(兼容旧接口)
type UpdateEnterpriseRequest = UpdateEnterpriseReq
// EnterpriseResponse 企业响应(兼容旧接口)
type EnterpriseResponse = EnterpriseItem