Compare commits

...

26 Commits

Author SHA1 Message Date
jiaji.H
f1b0c0d388 Updata:更新错误返回信息 2025-10-13 09:57:23 +08:00
jiaji.H
d915175416 Updata:修正分页返回数据错误 2025-10-11 16:52:23 +08:00
jiaji.H
2fd0f940a0 Updata:添加初始额度类型限制逻辑 2025-10-11 13:29:12 +08:00
jiaji.H
62755cc884 Updata:补充套餐更新逻辑 2025-10-11 11:32:23 +08:00
jiaji.H
91fa9afa58 Updata:添加套餐数量符号检验 2025-09-19 10:54:03 +08:00
jiaji.H
5f4e1610d3 Updata:增加注释 2025-09-17 11:20:01 +08:00
jiaji.H
5fd972942b Updata:订单添加增值服务信息 2025-09-17 11:16:22 +08:00
jiaji.H
2fc46f8bb7 Updata:优化套餐查询逻辑效率 2025-09-16 13:45:16 +08:00
jiaji.H
1b9a64068a Upfata:新增套餐字段添加 2025-09-16 13:25:32 +08:00
jiaji.H
7edef20a45 feat:返回值中添加服务默认数量 2025-09-15 14:55:54 +08:00
jiaji.H
75de934c4f feat:新增加服务添加是否默认选项 2025-09-15 14:33:26 +08:00
jiaji.H
7c08286128 feat:添加套餐权益与附加套餐权益合理性验证 2025-09-15 13:53:32 +08:00
jiaji.H
e406bcc63a Updata:更新套餐类型检索逻辑 2025-09-12 13:20:35 +08:00
jiaji.H
51f1c674fa Updata:调整接口名称 2025-09-12 10:44:49 +08:00
jiaji.H
66c2669557 feat:调整套餐差异更新逻辑 2025-09-12 10:37:25 +08:00
jiaji.H
9635ec4572 Updata:区分套餐权益和附加权益 2025-09-11 14:54:21 +08:00
jiaji.H
4d42019882 feat:分类权益 2025-09-10 13:55:41 +08:00
jiaji.H
2461bb8a93 feat:修改服务列表额度字段逻辑 2025-09-09 10:59:23 +08:00
jiaji.H
2280cc40d9 Updata:更新数据库字段定义 2025-09-09 09:26:21 +08:00
jiaji.H
7741a5dc35 Updata:不在定义内的额度信息 2025-09-04 13:25:52 +08:00
jiaji.H
04b4b3f7c5 Updata:去除不必要err 2025-09-04 11:55:50 +08:00
jiaji.H
4b999f57c4 Updata:更新pb文件 2025-09-04 11:34:13 +08:00
jiaji.H
1624992428 Updata:添加需求字段赋值 2025-09-03 16:29:36 +08:00
jiaji.H
c1e1ef5e0f Updata:补充筛选逻辑 2025-09-03 15:57:56 +08:00
jiaji.H
1c148b0078 feat:增加对增值服务的名称和类型筛选以及额度字段和是否过期作废字段展示 2025-09-03 15:21:02 +08:00
jiaji.H
0c7f70af93 feat:增加额度对应需求字段 2025-09-03 11:33:05 +08:00
14 changed files with 5284 additions and 2371 deletions

33
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,33 @@
{
// 使 IntelliSense
//
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"env": {
"GOPATH":"C:\\Users\\lenovo\\go",
"GOOS":"windows"
},
"program": "${workspaceFolder}\\cmd",
"args":[]
},
{
"name": "Run app.go",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd",
"cwd": "${workspaceFolder}/cmd",
"env": {
"DEBUG": "true",
"DUBBO_GO_CONFIG_PATH": "${workspaceFolder}/conf/dubbogo.yaml"
},
"dlvFlags": ["--check-go-version=false"]
}
]
}

22
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,22 @@
{
"workbench.colorCustomizations": {
"activityBar.activeBackground": "#fa1b49",
"activityBar.background": "#fa1b49",
"activityBar.foreground": "#e7e7e7",
"activityBar.inactiveForeground": "#e7e7e799",
"activityBarBadge.background": "#155e02",
"activityBarBadge.foreground": "#e7e7e7",
"commandCenter.border": "#e7e7e799",
"sash.hoverBorder": "#fa1b49",
"statusBar.background": "#dd0531",
"statusBar.foreground": "#e7e7e7",
"statusBarItem.hoverBackground": "#fa1b49",
"statusBarItem.remoteBackground": "#dd0531",
"statusBarItem.remoteForeground": "#e7e7e7",
"titleBar.activeBackground": "#dd0531",
"titleBar.activeForeground": "#e7e7e7",
"titleBar.inactiveBackground": "#dd053199",
"titleBar.inactiveForeground": "#e7e7e799"
},
"peacock.color": "#dd0531"
}

View File

@ -135,23 +135,27 @@ func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse
res.Bundles = make([]*bundle.BundleProfile, 0)
bundles := make([]*model.BundleProfile, 0)
query := app.ModuleClients.BundleDB.Model(&model.BundleProfile{}).Preload("BundleProfileLang")
baseQuery := app.ModuleClients.BundleDB.Model(&model.BundleProfile{})
if req.Name != "" {
query = query.Where("name like ?", "%"+req.Name+"%")
baseQuery = baseQuery.Where("name like ?", "%"+req.Name+"%")
}
if req.Content != "" {
query = query.Where("content like ?", "%"+req.Content+"%")
baseQuery = baseQuery.Where("content like ?", "%"+req.Content+"%")
}
if req.Language != "" {
query = query.Where("language like ?", req.Language)
baseQuery = baseQuery.Where("language like ?", req.Language)
}
count := *query
var total int64
if err = baseQuery.Count(&total).Error; err != nil {
return res, commonErr.ReturnError(err, msg.ErrorGetBundleList, "获取套餐总数失败: ")
}
// 排序sort 升序,相同 sort 按 created_at 倒序
query := baseQuery.Preload("BundleProfileLang")
query = query.Order("sort ASC").Order("created_at DESC")
if req.PageSize != 0 && req.Page != 0 {
query = query.Limit(int(req.PageSize)).Offset(int(req.Page-1) * int(req.PageSize))
@ -163,12 +167,23 @@ func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse
if len(bundles) > 0 {
for _, bundleProfile := range bundles {
selectValueAddService := make([]*bundle.SelectValueAddService, 0)
SelectValueAdditionalService := make([]*bundle.SelectValueAdditionalService, 0)
if bundleProfile.BundleToValueAddService != nil {
for _, v := range bundleProfile.BundleToValueAddService {
selectValueAddService = append(selectValueAddService, &bundle.SelectValueAddService{
ValueAddUuid: v.ValueUid,
IsDisplay: v.IsDisplay,
})
//根据权益类型存入对应的list
switch v.BenefitsType {
case msg.Benefits:
selectValueAddService = append(selectValueAddService, &bundle.SelectValueAddService{
ValueAddUuid: v.ValueUid,
IsDisplay: v.IsDisplay,
})
case msg.OptionalBenefits:
SelectValueAdditionalService = append(SelectValueAdditionalService, &bundle.SelectValueAdditionalService{
ValueAddUuid: v.ValueUid,
IsDisplay: v.IsDisplay,
})
}
}
}
bundleProfileLang := []*bundle.BundleProfileLang{}
@ -188,33 +203,30 @@ func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse
}
}
res.Bundles = append(res.Bundles, &bundle.BundleProfile{
Uuid: bundleProfile.UUID,
Name: bundleProfile.Name,
Content: bundleProfile.Content,
Price: bundleProfile.Price,
PriceType: bundleProfile.PriceType,
Contract: bundleProfile.Contract,
Language: bundleProfile.Language,
CreatedAt: bundleProfile.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: bundleProfile.UpdatedAt.Format("2006-01-02 15:04:05"),
CompanySign: bundleProfile.CompanySign,
ContractDuration: int64(bundleProfile.ContractDuration),
Sort: bundleProfile.Sort,
ImgOption: int32(bundleProfile.ImgOption),
BgImg1: bundleProfile.BgImg1,
BgImg2: bundleProfile.BgImg2,
SelectValueAddService: selectValueAddService,
BundleProfileLang: bundleProfileLang,
ShelfStatus: int64(bundleProfile.ShelfStatus),
FontColor: bundleProfile.FontColor,
Uuid: bundleProfile.UUID,
Name: bundleProfile.Name,
Content: bundleProfile.Content,
Price: bundleProfile.Price,
PriceType: bundleProfile.PriceType,
Contract: bundleProfile.Contract,
Language: bundleProfile.Language,
CreatedAt: bundleProfile.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: bundleProfile.UpdatedAt.Format("2006-01-02 15:04:05"),
CompanySign: bundleProfile.CompanySign,
ContractDuration: int64(bundleProfile.ContractDuration),
Sort: bundleProfile.Sort,
ImgOption: int32(bundleProfile.ImgOption),
BgImg1: bundleProfile.BgImg1,
BgImg2: bundleProfile.BgImg2,
SelectValueAddService: selectValueAddService,
SelectValueAdditionalService: SelectValueAdditionalService,
BundleProfileLang: bundleProfileLang,
ShelfStatus: int64(bundleProfile.ShelfStatus),
FontColor: bundleProfile.FontColor,
})
}
}
var total int64
count.Count(&total)
res.Total = int32(total)
return
@ -322,6 +334,12 @@ func GetValueAddServiceUuidsByBundleUuid(bundleUuid string) ([]string, error) {
return uuids, err
}
func GetValueAddServiceUuidsByAndBenefitsBundleUuid(bundleUuid string) ([]*model.ValueUidWithBenefits, error) {
var result []*model.ValueUidWithBenefits
err := app.ModuleClients.BundleDB.Model(&model.BundleToValueAddService{}).Select("value_uid, benefits_type").Where("bundle_uuid = ? and deleted_at = 0", bundleUuid).Scan(&result).Error
return result, err
}
// GetBundleToValueAddServiceByBundleUuid 根据套餐UUID获取所有关联的增值服务uuid
func GetBundleToValueAddServiceByBundleUuid(bundleUuid string) ([]*model.BundleToValueAddService, error) {
var result []*model.BundleToValueAddService

View File

@ -103,6 +103,8 @@ func UpdateValueAddService(tx *gorm.DB, columns map[string]interface{}) (err err
}
return
}
// 更新单个语言表
func UpdateValueAddServiceLang(tx *gorm.DB, columns map[string]interface{}) (err error) {
err = tx.Model(&model.ValueAddServiceLang{}).Where("uuid =? and deleted_at = 0", columns["uuid"]).
Where("language = ?", columns["language"]).Updates(columns).Error
@ -112,13 +114,41 @@ func UpdateValueAddServiceLang(tx *gorm.DB, columns map[string]interface{}) (err
return
}
// 更新所有语言版本的服务类型
func UpdateAllValueAddServiceLangServiceType(tx *gorm.DB, columns map[string]interface{}) (err error) {
err = tx.Model(&model.ValueAddServiceLang{}).Where("uuid = ? and deleted_at = 0", columns["uuid"]).
Updates(columns).Error
if err != nil {
return
}
return
}
// 增值套餐列表
func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res []*model.ValueAddService, total int64, err error) {
query := app.ModuleClients.BundleDB.Model(&model.ValueAddService{}).
Where("deleted_at = 0").
Preload("ValueAddServiceLang", func(db *gorm.DB) *gorm.DB {
return db.Select("uuid,service_name,service_type,price_mode,original_price,unit,language,price_type,options,created_at,updated_at")
})
Where("deleted_at = 0")
// 使用子查询筛选符合条件的UUID
if req.Name != "" || req.ServiceType != 0 {
subQuery := app.ModuleClients.BundleDB.Model(&model.ValueAddServiceLang{}).
Select("uuid").
Where("deleted_at = 0")
if req.Name != "" {
subQuery = subQuery.Where("service_name LIKE ?", "%"+req.Name+"%")
}
if req.ServiceType != 0 {
subQuery = subQuery.Where("service_type = ?", req.ServiceType)
}
query = query.Where("uuid IN (?)", subQuery)
}
// 预加载语言表数据
query = query.Preload("ValueAddServiceLang", func(db *gorm.DB) *gorm.DB {
return db.Select("uuid,service_name,service_type,price_mode,original_price,unit,language,price_type,options,created_at,updated_at,quota_type,quota_value,is_expired")
})
count := *query
if req.PageSize != 0 && req.Page != 0 {
@ -203,3 +233,78 @@ func BatchGetValueAddServiceLang(uuids []string, language string) (map[string]*m
}
return resultMap, nil
}
// 判断套餐额度添加是否合理
func ValidateQuotaCompatibility(benefitsQuota, optionalQuota model.QuotaInfo) bool {
// 如果套餐权益是不限额度,则附加权益可以是任意额度
if benefitsQuota.QuotaType == 1 {
return true
}
// 如果附加权益是不限额度,则套餐权益可以是任意额度
if optionalQuota.QuotaType == 1 {
return true
}
// 如果都是限制额度,则额度值必须相同
return benefitsQuota.QuotaValue == optionalQuota.QuotaValue
}
// getServiceQuotaMap 获取服务类型的额度映射
func GetServiceQuotaMap(services []*model.BundleToValueAddService, serviceDetails map[string]*model.ValueAddServiceLang) map[int32]model.QuotaInfo {
quotaMap := make(map[int32]model.QuotaInfo)
for _, service := range services {
if detail, exists := serviceDetails[service.ValueUid]; exists {
quotaMap[int32(detail.ServiceType)] = model.QuotaInfo{
QuotaType: detail.QuotaType,
QuotaValue: detail.QuotaValue,
}
}
}
return quotaMap
}
// 通过增值服务uuid列表批量检查对应增值服务是否有默认套餐数量
func CheckDefaultServiceValueWithUid(uuids []string, language string) (uidList []string, unDefaultServiceNameList []string, err error) {
//为空直接返回
if len(uuids) == 0 {
return []string{}, []string{}, nil
}
// 1. 批量查询所有增值服务
var results []*model.ValueAddServiceLang
err = app.ModuleClients.BundleDB.
Where("uuid IN ? AND language = ? AND deleted_at = 0", uuids, language).
Find(&results).Error
if err != nil {
return nil, nil, fmt.Errorf("批量查询增值服务语言失败: %w", err)
}
// 2. 构建UUID到服务的映射
serviceMap := make(map[string]*model.ValueAddServiceLang, len(results))
for _, result := range results {
serviceMap[result.UUID] = result
}
uidList = make([]string, 0)
unDefaultServiceNameList = make([]string, 0)
//检查套餐中是否有默认值
for _, uuid := range uuids {
hasDefault := false
service, exists := serviceMap[uuid]
if !exists {
return nil, nil, fmt.Errorf("查询增值服务存储失败: %w", err)
}
for _, option := range service.Options {
if option.IsDefault {
uidList = append(uidList, uuid)
hasDefault = true
break
}
}
if !hasDefault {
unDefaultServiceNameList = append(unDefaultServiceNameList, service.ServiceName)
}
}
return
}

View File

@ -3,10 +3,12 @@ package logic
import (
"encoding/json"
"errors"
"fmt"
"micro-bundle/internal/dao"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
"micro-bundle/pkg/msg"
"strings"
"time"
"micro-bundle/internal/model"
@ -64,6 +66,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
if req.Sort <= 0 {
return res, errors.New("排序参数需为正整数")
}
//套餐主表数据
bundleProfile := &model.BundleProfile{
Name: req.Name,
Sort: req.Sort,
@ -84,6 +87,7 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
PriceType: req.PriceType,
Language: req.Language,
}
//必须先创建中文版本
if req.Uuid == "" && req.Language != msg.ZH_CN {
return res, errors.New("请先创建中文版本套餐")
}
@ -99,28 +103,122 @@ func SaveBundle(req *bundle.BundleProfile) (res *bundle.SaveResponse, err error)
// }
// }
// }
//现需要区分类型 分为 1套餐权益该类型必须关联一个可用时长类型的权益 2套餐可选附加权益非必选可为空
selectService := make([]*model.BundleToValueAddService, 0)
var selectValueAddServiceCount = make(map[int]struct{}) //增值服务类型数量
if req.Language == msg.ZH_CN && req.SelectValueAddService != nil && len(req.SelectValueAddService) > 0 {
for _, v := range req.SelectValueAddService {
detail, checkErr := dao.ValueAddServiceDetailByUuidAndLanguage(v.ValueAddUuid, req.Language)
if checkErr != nil {
if checkErr == gorm.ErrRecordNotFound {
//搜集所有增值服务的uuid
if req.Language == msg.ZH_CN {
//符合条件的增值服务uuid
var allValueUuids []string
//批量查询得到的增值服务详情
serviceDetails := make(map[string]*model.ValueAddServiceLang)
//套餐权益增值服务类型数量
var pkgBenefitsValueAddServiceCount = make(map[int]struct{})
//套餐可选附加权益增值服务类型数量
var pkgOptionalValueAddServiceCount = make(map[int]struct{})
if req.SelectValueAddService != nil {
for _, v := range req.SelectValueAddService {
allValueUuids = append(allValueUuids, v.ValueAddUuid)
}
}
if req.SelectValueAdditionalService != nil {
for _, v := range req.SelectValueAdditionalService {
allValueUuids = append(allValueUuids, v.ValueAddUuid)
}
}
// 批量查询增值服务详情
if len(allValueUuids) > 0 {
//筛选uid对应的增值服务是否有默认值
// _, unDefaultServiceNameList, err := dao.CheckDefaultServiceValueWithUid(allValueUuids, req.Language)
// if err != nil {
// return res, errors.New("筛选增值服务默认值失败")
// }
// if len(unDefaultServiceNameList) > 0 {
// warningMsg := "增值服务没有默认套餐数量: " + strings.Join(unDefaultServiceNameList, ",") + "请选择默认套餐数量后重新添加"
// res.Msg = warningMsg
// return res, errors.New(warningMsg)
// }
//
serviceDetails, err = dao.BatchGetValueAddServiceLang(allValueUuids, req.Language)
if err != nil {
return res, errors.New("批量查询增值服务失败")
}
}
if req.SelectValueAddService != nil && len(req.SelectValueAddService) > 0 {
// 获取套餐权益的额度映射
benefitsServices := make([]*model.BundleToValueAddService, 0)
for _, v := range req.SelectValueAddService {
detail, exists := serviceDetails[v.ValueAddUuid]
if !exists {
return res, errors.New("增值服务不存在")
} else {
return res, errors.New("查询增值服务失败")
}
if _, exists := pkgBenefitsValueAddServiceCount[int(detail.ServiceType)]; exists {
return res, errors.New("每种增值服务类型只可选择一个")
}
benefitsServices = append(benefitsServices, &model.BundleToValueAddService{
ValueUid: v.ValueAddUuid,
})
pkgBenefitsValueAddServiceCount[int(detail.ServiceType)] = struct{}{}
selectService = append(selectService, &model.BundleToValueAddService{
ValueUid: v.ValueAddUuid,
IsDisplay: v.IsDisplay,
BenefitsType: msg.Benefits,
})
}
if req.SelectValueAdditionalService != nil && len(req.SelectValueAdditionalService) > 0 {
benefitsQuotaMap := dao.GetServiceQuotaMap(benefitsServices, serviceDetails)
for _, v := range req.SelectValueAdditionalService {
detail, exists := serviceDetails[v.ValueAddUuid]
if !exists {
return res, errors.New("增值服务不存在")
}
if _, exists := pkgOptionalValueAddServiceCount[int(detail.ServiceType)]; exists {
return res, errors.New("每种增值服务类型只可选择一个")
}
//额度兼容性验证
if benefitsQuota, exists := benefitsQuotaMap[detail.ServiceType]; exists {
optionalQuota := model.QuotaInfo{
QuotaType: detail.QuotaType,
QuotaValue: detail.QuotaValue,
}
if !dao.ValidateQuotaCompatibility(benefitsQuota, optionalQuota) {
var serviceName string
switch detail.ServiceType {
case msg.VideoService:
serviceName = "视频"
case msg.TextService:
serviceName = "图文"
case msg.DataReportService:
serviceName = "数据报表"
case msg.AccountService:
serviceName = "账号数"
case msg.AvailableTimeService:
serviceName = "可用时长"
}
return res, fmt.Errorf("服务类型%s的额度不兼容套餐权益额度为%d附加权益额度为%d",
serviceName, benefitsQuota.QuotaValue, optionalQuota.QuotaValue)
}
}
pkgOptionalValueAddServiceCount[int(detail.ServiceType)] = struct{}{}
selectService = append(selectService, &model.BundleToValueAddService{
ValueUid: v.ValueAddUuid,
IsDisplay: v.IsDisplay,
BenefitsType: msg.OptionalBenefits,
})
}
}
if _, exists := selectValueAddServiceCount[int(detail.ServiceType)]; exists {
return res, errors.New("每种增值服务类型只可选择一个")
}
selectValueAddServiceCount[int(detail.ServiceType)] = struct{}{}
selectService = append(selectService, &model.BundleToValueAddService{
ValueUid: v.ValueAddUuid,
IsDisplay: v.IsDisplay,
})
}
}
tx := app.ModuleClients.BundleDB.Begin()
defer func() {
if err != nil {
@ -235,8 +333,7 @@ func BundleListV2(req *bundle.BundleListRequest) (res *bundle.BundleListResponse
func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailResponseV2, err error) {
res = new(bundle.BundleDetailResponseV2)
bundleProfile := &bundle.BundleProfile{}
bundleProfileLangs := make([]*bundle.BundleProfileLang, 0)
selectValueAddServices := make([]*bundle.SelectValueAddService, 0) //已选增值服务
if req.Uuid == "" {
return res, errors.New("缺少套餐UUID")
}
@ -245,38 +342,85 @@ func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailRe
return res, errors.New("获取套餐信息失败")
}
if detail != nil {
bundleProfile.Uuid = detail.UUID
bundleProfile.Name = detail.Name
bundleProfile.Content = detail.Content
bundleProfile.Price = detail.Price
bundleProfile.PriceType = detail.PriceType
bundleProfile.ImgOption = int32(detail.ImgOption)
bundleProfile.BgImg1 = detail.BgImg1
bundleProfile.BgImg2 = detail.BgImg2
bundleProfile.FontColor = detail.FontColor
bundleProfile.Sort = detail.Sort
bundleProfile.ShelfStatus = detail.ShelfStatus
bundleProfile.CreatedAt = detail.CreatedAt.Format("2006-01-02 15:04:05")
bundleProfile.UpdatedAt = detail.UpdatedAt.Format("2006-01-02 15:04:05")
bundleProfile.Contract = detail.Contract
bundleProfile = &bundle.BundleProfile{
Uuid: detail.UUID,
Name: detail.Name,
Content: detail.Content,
Price: detail.Price,
PriceType: detail.PriceType,
ImgOption: int32(detail.ImgOption),
BgImg1: detail.BgImg1,
BgImg2: detail.BgImg2,
FontColor: detail.FontColor,
Sort: detail.Sort,
ShelfStatus: detail.ShelfStatus,
CreatedAt: detail.CreatedAt.Format("2006-01-02 15:04:05"),
UpdatedAt: detail.UpdatedAt.Format("2006-01-02 15:04:05"),
Contract: detail.Contract,
}
if len(detail.BundleToValueAddService) > 0 {
var valueUuids []string
for _, service := range detail.BundleToValueAddService {
valueUuids = append(valueUuids, service.ValueUid)
}
// 批量查询增值服务详情
valueAddServiceMap, err := dao.BatchGetValueAddServiceLang(valueUuids, req.Language)
if err != nil {
return res, errors.New("批量查询增值服务失败")
}
selectValueAddServices := make([]*bundle.SelectValueAddService, 0) //已选套餐服务
selectValueAdditionalServices := make([]*bundle.SelectValueAdditionalService, 0) //已选套餐可选附加服务
for _, valueAddService := range detail.BundleToValueAddService {
valueAddDetail, err := dao.ValueAddServiceDetailByUuidAndLanguage(valueAddService.ValueUid, req.Language)
if err != nil {
valueAddDetail, exists := valueAddServiceMap[valueAddService.ValueUid]
if !exists {
return res, errors.New("查询增值服务失败")
}
selectValueAddService := &bundle.SelectValueAddService{
ValueAddUuid: valueAddService.ValueUid,
IsDisplay: valueAddService.IsDisplay,
ServiceName: valueAddDetail.ServiceName,
ServiceType: valueAddDetail.ServiceType,
// 查找默认选项
var defaultServiceValue int32
for _, option := range valueAddDetail.Options {
if option.IsDefault {
defaultServiceValue = option.Num
break
}
}
//根据权益类型不同进行分类存放
switch valueAddService.BenefitsType {
case msg.Benefits:
selectValueAddServices = append(selectValueAddServices, &bundle.SelectValueAddService{
ValueAddUuid: valueAddService.ValueUid,
IsDisplay: valueAddService.IsDisplay,
ServiceName: valueAddDetail.ServiceName,
ServiceType: valueAddDetail.ServiceType,
QuotaType: valueAddDetail.QuotaType,
QuotaValue: valueAddDetail.QuotaValue,
IsExpired: valueAddDetail.IsExpired,
DefaultServiceValue: defaultServiceValue,
})
case msg.OptionalBenefits:
selectValueAdditionalServices = append(selectValueAdditionalServices, &bundle.SelectValueAdditionalService{
ValueAddUuid: valueAddService.ValueUid,
IsDisplay: valueAddService.IsDisplay,
ServiceName: valueAddDetail.ServiceName,
ServiceType: valueAddDetail.ServiceType,
QuotaType: valueAddDetail.QuotaType,
QuotaValue: valueAddDetail.QuotaValue,
IsExpired: valueAddDetail.IsExpired,
DefaultServiceValue: defaultServiceValue,
})
}
selectValueAddServices = append(selectValueAddServices, selectValueAddService)
}
bundleProfile.SelectValueAddService = selectValueAddServices
bundleProfile.SelectValueAdditionalService = selectValueAdditionalServices
}
if len(detail.BundleProfileLang) > 0 {
bundleProfileLangs := make([]*bundle.BundleProfileLang, 0, len(detail.BundleProfileLang))
for _, lang := range detail.BundleProfileLang {
bundleProfileLang := &bundle.BundleProfileLang{
bundleProfileLangs = append(bundleProfileLangs, &bundle.BundleProfileLang{
Uuid: lang.UUID,
Name: lang.Name,
Price: lang.Price,
@ -291,16 +435,11 @@ func BundleDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleDetailRe
ShelfStatus: detail.ShelfStatus,
CreatedAt: time.Unix(lang.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(int64(lang.UpdatedAt), 0).Format("2006-01-02 15:04:05"),
}
bundleProfileLangs = append(bundleProfileLangs, bundleProfileLang)
})
}
bundleProfile.BundleProfileLang = bundleProfileLangs
}
}
if len(selectValueAddServices) > 0 {
bundleProfile.SelectValueAddService = selectValueAddServices
}
bundleProfile.BundleProfileLang = bundleProfileLangs
res.Bundle = bundleProfile
return
}
@ -316,6 +455,7 @@ func BundleLangDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleProf
if err != nil {
return res, errors.New("获取套餐信息失败")
}
lang, err := dao.BundleDetailByUuidAndLanguage(req.Uuid, req.Language)
if err != nil {
return res, errors.New("获取套餐信息失败")
@ -329,6 +469,16 @@ func BundleLangDetailV2(req *bundle.BundleDetailRequest) (res *bundle.BundleProf
res.Sort = detail.Sort
res.ShelfStatus = detail.ShelfStatus
res.Contract = detail.Contract
if len(detail.BundleToValueAddService) > 0 {
var serviceLangInfos []*bundle.ServiceLangInfo
for _, service := range detail.BundleToValueAddService {
serviceLangInfos = append(serviceLangInfos, &bundle.ServiceLangInfo{
ValueAddUuid: service.ValueUid,
BenefitsType: service.BenefitsType,
})
}
res.ServiceLangInfo = serviceLangInfos
}
}
if lang != nil {
res.Name = lang.Name
@ -423,42 +573,64 @@ func HandleShelf(req *bundle.HandShelfRequest) (*bundle.CommonResponse, error) {
// 差异更新套餐与增值服务中间表
func diffUpdateBundleToValueAddService(tx *gorm.DB, bundleUuid string, selectService []*model.BundleToValueAddService) error {
oldUuids, err := dao.GetValueAddServiceUuidsByBundleUuid(bundleUuid)
// 获取现有的关联记录包含value_uid和benefits_type
oldRecords, err := dao.GetValueAddServiceUuidsByAndBenefitsBundleUuid(bundleUuid)
if err != nil {
return errors.New("查询套餐与增值服务关联失败")
}
newUuids := make(map[string]*model.BundleToValueAddService)
// 构建现有记录的复合键映射 (value_uid + benefits_type)
oldMap := make(map[string]struct{})
for _, record := range oldRecords {
key := fmt.Sprintf("%s_%d", record.ValueUid, record.BenefitsType)
oldMap[key] = struct{}{}
}
// 构建新记录的复合键映射
newMap := make(map[string]*model.BundleToValueAddService)
for _, s := range selectService {
newUuids[s.ValueUid] = s
}
oldSet := make(map[string]struct{})
for _, uid := range oldUuids {
oldSet[uid] = struct{}{}
key := fmt.Sprintf("%s_%d", s.ValueUid, s.BenefitsType)
s.BundleUuid = bundleUuid
newMap[key] = s
}
// 需要新增的
toAdd := make([]*model.BundleToValueAddService, 0)
toDel := make([]string, 0)
toUpdate := make([]*model.BundleToValueAddService, 0)
for uid, s := range newUuids {
if _, exist := oldSet[uid]; !exist {
s.BundleUuid = bundleUuid
toAdd = append(toAdd, s)
for key, newRecord := range newMap {
if _, exists := oldMap[key]; exists {
// 记录存在,需要更新
toUpdate = append(toUpdate, newRecord)
} else {
s.BundleUuid = bundleUuid
toUpdate = append(toUpdate, s)
// 记录不存在,需要新增
toAdd = append(toAdd, newRecord)
}
}
// 需要删除的
for _, uid := range oldUuids {
if _, exist := newUuids[uid]; !exist {
toDel = append(toDel, uid)
for key := range oldMap {
if _, exists := newMap[key]; !exists {
// 旧记录在新数据中不存在,需要删除
toDel = append(toDel, key)
}
}
if len(toDel) > 0 {
if err = tx.Where("bundle_uuid = ? AND value_uid IN ?", bundleUuid, toDel).Delete(&model.BundleToValueAddService{}).Error; err != nil {
return errors.New("删除套餐与增值服务关联失败")
for _, key := range toDel {
parts := strings.Split(key, "_")
if len(parts) == 2 {
valueUid := parts[0]
benefitsType := parts[1]
if err = tx.Where("bundle_uuid = ? AND value_uid = ? AND benefits_type = ? AND deleted_at = 0",
bundleUuid, valueUid, benefitsType).Delete(&model.BundleToValueAddService{}).Error; err != nil {
return errors.New("删除套餐与增值服务关联失败")
}
}
}
}
if len(toAdd) > 0 {
if err = dao.CreateBundleToValueAddService(tx, toAdd); err != nil {
return errors.New("保存套餐与增值服务关联失败")

View File

@ -174,13 +174,27 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
return res, errors.New("优惠单价需小于等于原价")
}
options = append(options, &model.PriceOption{
Id: int32(index),
Num: option.Num,
Symbol: option.Symbol,
Price: float32(price),
Id: int32(index),
Num: option.Num,
Symbol: option.Symbol,
Price: float32(price),
IsDefault: option.IsDefault,
})
index++
}
hasDefault := false
for _, option := range options {
if option.IsDefault {
if option.Symbol != "=" {
return res, errors.New("默认套餐数量只能选择数量符合为等于的选项")
}
hasDefault = true
break
}
}
if !hasDefault {
return res, errors.New("请选择默认套餐数量")
}
ok, err := model.ValidateOptions(options)
if !ok {
return res, err
@ -198,6 +212,9 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
Language: in.Language,
PriceType: in.PriceType,
Options: options,
QuotaType: in.QuotaType,
QuotaValue: in.QuotaValue,
IsExpired: in.IsExpired,
}
if in.Uuid == "" && in.Language != msg.ZH_CN {
return res, errors.New("请先创建中文版本增值服务")
@ -259,6 +276,9 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
Language: lang,
PriceType: valueAddServiceLang.PriceType,
Options: valueAddServiceLang.Options,
QuotaType: valueAddServiceLang.QuotaType,
QuotaValue: valueAddServiceLang.QuotaValue,
IsExpired: valueAddServiceLang.IsExpired,
}
otherLang.Language = lang
if err = dao.CreateValueAddServiceLang(tx, &otherLang); err != nil {
@ -285,6 +305,14 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
if err = dao.UpdateValueAddService(tx, updateService); err != nil {
return res, errors.New("更新增值服务失败")
}
updataAllLangServiceType := map[string]interface{}{
"uuid": in.Uuid,
"service_type": in.ServiceType,
"unit": in.Unit,
}
if err = dao.UpdateAllValueAddServiceLangServiceType(tx, updataAllLangServiceType); err != nil {
return res, errors.New("更新增值服务失败")
}
}
//更新语言表
updateLangService := map[string]interface{}{
@ -297,6 +325,9 @@ func SaveValueAddService(in *bundle.ValueAddServiceLang) (res *bundle.SaveRespon
"price_type": in.PriceType,
"options": options,
"language": in.Language,
"quota_type": in.QuotaType,
"quota_value": in.QuotaValue,
"is_expired": in.IsExpired,
}
if err := dao.UpdateValueAddServiceLang(tx, updateLangService); err != nil {
return res, errors.New("更新增值服务失败")
@ -337,6 +368,9 @@ func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.Va
ServiceType: valueAddService.ServiceType,
}
for _, serviceLang := range valueAddService.ValueAddServiceLang {
if serviceLang.QuotaType == 0 && serviceInfo.ServiceType != msg.AccountService && serviceInfo.ServiceType != msg.AvailableTimeService {
serviceLang.QuotaType = msg.UnlimitedQuota
}
serviceLangInfo := &bundle.ValueAddServiceLang{
Uuid: valueAddService.UUID,
ServiceName: serviceLang.ServiceName,
@ -348,6 +382,14 @@ func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.Va
Language: serviceLang.Language,
CreatedAt: time.Unix(serviceLang.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(serviceLang.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
QuotaType: serviceLang.QuotaType,
QuotaValue: serviceLang.QuotaValue,
IsExpired: serviceLang.IsExpired,
}
if serviceLangInfo.Language == msg.ZH_CN && serviceInfo.ServiceType != 5 && serviceInfo.ServiceType != 4 {
serviceInfo.QuotaType = serviceLangInfo.QuotaType
serviceInfo.QuotaValue = serviceLangInfo.QuotaValue
serviceInfo.IsExpired = serviceLangInfo.IsExpired
}
if len(serviceLang.Options) > 0 {
var options []*bundle.ValueAddPriceOptions
@ -366,12 +408,17 @@ func ValueAddServiceList(req *bundle.ValueAddServiceListRequest) (res *bundle.Va
default:
return nil, errors.New("无效的价格模式")
}
//添加服务默认数量
if option.IsDefault && serviceLangInfo.Language == msg.ZH_CN {
serviceInfo.DefaultServiceValue = option.Num
}
options = append(options, &bundle.ValueAddPriceOptions{
Id: int64(option.Id),
Num: option.Num,
Symbol: option.Symbol,
Price: fmt.Sprintf("%.2f", option.Price),
SaveAmount: saveAmount.StringFixed(2),
IsDefault: option.IsDefault,
})
}
serviceLangInfo.Options = options
@ -407,6 +454,9 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
valueAddService.ServiceName = detail.ServiceName
valueAddService.ServiceType = detail.ServiceType
for _, serviceLang := range detail.ValueAddServiceLang {
if serviceLang.QuotaType == 0 && valueAddService.ServiceType != msg.AccountService && valueAddService.ServiceType != msg.AvailableTimeService {
serviceLang.QuotaType = msg.UnlimitedQuota
}
langOptions := []*bundle.ValueAddPriceOptions{}
if len(serviceLang.Options) > 0 {
for _, opt := range serviceLang.Options {
@ -430,6 +480,7 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
Symbol: opt.Symbol,
Price: fmt.Sprintf("%.2f", opt.Price),
SaveAmount: saveAmount.StringFixed(2),
IsDefault: opt.IsDefault,
})
}
}
@ -445,6 +496,9 @@ func ValueAddServiceDetail(req *bundle.ValueAddServiceDetailRequest) (res *bundl
Options: langOptions,
CreatedAt: time.Unix(serviceLang.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(serviceLang.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
QuotaType: serviceLang.QuotaType,
QuotaValue: serviceLang.QuotaValue,
IsExpired: serviceLang.IsExpired,
}
serviceLangs = append(serviceLangs, serviceLangInfo)
}
@ -513,6 +567,7 @@ func ValueAddServiceDetailByUuidAndLanguage(req *bundle.ValueAddServiceDetailReq
Symbol: opt.Symbol,
Price: fmt.Sprintf("%.2f", opt.Price),
SaveAmount: saveAmount.StringFixed(2),
IsDefault: opt.IsDefault,
})
}
}
@ -528,6 +583,9 @@ func ValueAddServiceDetailByUuidAndLanguage(req *bundle.ValueAddServiceDetailReq
Options: langOptions,
CreatedAt: time.Unix(detail.CreatedAt, 0).Format("2006-01-02 15:04:05"),
UpdatedAt: time.Unix(detail.UpdatedAt, 0).Format("2006-01-02 15:04:05"),
QuotaType: detail.QuotaType,
QuotaValue: detail.QuotaValue,
IsExpired: detail.IsExpired,
}
return
}
@ -600,6 +658,7 @@ func BatchGetValueAddServiceLang(req *bundle.BatchGetValueAddServiceLangRequest)
Symbol: opt.Symbol,
Price: fmt.Sprintf("%.2f", opt.Price),
SaveAmount: saveAmount.StringFixed(2),
IsDefault: opt.IsDefault,
})
}
}

View File

@ -49,6 +49,7 @@ type BundleToValueAddService struct {
ValueUid string `json:"valueUid" gorm:"column:value_uid;type:varchar(1024);comment:增值服务UUID"`
ValueAddService ValueAddService `gorm:"foreignKey:ValueUid;references:UUID" json:"valueAddService"`
IsDisplay bool `json:"isDisplay" gorm:"column:is_display;type:tinyint(1);comment:是否显示"`
BenefitsType int32 `json:"benefitsType" gorm:"column:benefits_type;type:int;comment:套餐权益类型 1:套餐权益 2:套餐可选附加权益"`
CreatedAt int64 `gorm:"column:created_at;autoCreateTime"`
UpdatedAt int64 `gorm:"column:updated_at;autoCreateTime"`
DeletedAt soft_delete.DeletedAt

View File

@ -52,13 +52,16 @@ type ValueAddServiceLang struct {
PriceMode int32 `json:"priceMode" gorm:"column:price_mode;type:int;comment:套餐价格类型 1:单价 2:总价"`
OriginalPrice float32 `json:"originalPrice" gorm:"column:original_price;type:decimal(12,2);comment:原单价"`
TotalPrice float32 `json:"totalPrice" gorm:"column:total_price;type:decimal(12,2);comment:增值服务总价"`
Unit string `json:"unit" gorm:"column:unit;type:varchar(50);comment:单位 1:个 2:条 3:天 4:月 5:年"`
Unit string `json:"unit" gorm:"column:unit;type:varchar(50);comment:单位 1:个 2:条 3:天 4:月 5:年 6:自然月 7:自然季度 8:半年 9:自然年"`
Language string `json:"language" gorm:"column:language;type:varchar(32);comment:套餐语言 zh-CN zh-TW EN de-DE ja-JP(中繁英德日)"`
PriceType int64 `json:"priceType" gorm:"column:price_type;type:int;comment:币种 1:人民币 2:美元 3:日元 4:欧元"`
Options PriceOptions `gorm:"column:options;type:json" json:"options"`
CreatedAt int64 `gorm:"column:created_at;autoCreateTime"`
UpdatedAt int64 `gorm:"column:updated_at;autoCreateTime"`
DeletedAt soft_delete.DeletedAt
QuotaType int32 `json:"quotaType" gorm:"column:quota_type;type:int;default:1;comment:额度类型 1:不限额度 2:每月限额度"`
QuotaValue int32 `json:"quotaValue" gorm:"column:quota_value;type:int;comment:额度值"`
IsExpired bool `json:"isExpired" gorm:"column:is_expired;default:false;comment:是否过期作废 false:不作废 true:作废"`
}
type ValueAddServiceHistory struct {
@ -74,10 +77,16 @@ type ValueAddServiceHistory struct {
type PriceOptions []*PriceOption
type PriceOption struct {
Id int32 `json:"id"`
Num int32 `json:"num"`
Symbol string `json:"symbol"` // 符号> < = >= <=
Price float32 `json:"price"` // 价格(根据priceMode决定是单价还是总价)
Id int32 `json:"id"`
Num int32 `json:"num"`
Symbol string `json:"symbol"` // 符号> < = >= <=
Price float32 `json:"price"` // 价格(根据priceMode决定是单价还是总价)
IsDefault bool `json:"isDefault"` // 是否为默认
}
type ValueUidWithBenefits struct {
ValueUid string `json:"valueUid"` //增值服务UUID
BenefitsType int32 `json:"benefitsType"` //权益类型
}
// 实现 driver.Valuer 接口
@ -179,3 +188,9 @@ func (options PriceOptions) CalculatePrice(priceMode, target int32) (float32, er
return 0, fmt.Errorf("未找到匹配规则")
}
// 额度信息
type QuotaInfo struct {
QuotaType int32 // 1:不限额度 2:每月限额度
QuotaValue int32 // 额度值
}

View File

@ -254,9 +254,10 @@ message BundleProfile {
string bgImg2 = 15 [json_name = "bgImg2"];
int64 shelfStatus = 16 [json_name = "shelfStatus"]; // 1 2
repeated SelectValueAddService selectValueAddService = 17 [json_name = "SelectValueAddService"];
repeated BundleProfileLang bundleProfileLang = 18 [json_name = "bundleProfileLang"];
int32 imgOption = 19 [json_name = "imgOption"];
string fontColor = 20 [json_name = "fontColor"];
repeated SelectValueAdditionalService selectValueAdditionalService = 18 [json_name = "SelectValueAdditionalService"];
repeated BundleProfileLang bundleProfileLang = 19 [json_name = "bundleProfileLang"];
int32 imgOption = 20 [json_name = "imgOption"];
string fontColor = 21 [json_name = "fontColor"];
}
message BundleProfileLang {
string uuid = 1 [json_name = "uuid"];
@ -276,20 +277,45 @@ message BundleProfileLang {
string bgImg2 = 15 [json_name = "bgImg2"];
int64 shelfStatus = 16 [json_name = "shelfStatus"]; // 1 2
int32 imgOption = 17 [json_name = "imgOption"];
repeated ServiceLangInfo serviceLangInfo = 18 [json_name = "serviceLangInfo"];//
//repeated ValueAddServiceLang valueAddServiceLang = 12 [json_name = "ValueAddServiceLang"];
}
message ServiceLangInfo {
string valueAddUuid = 1 [json_name = "valueAddUuid"];//uuid
int32 benefitsType = 2 [json_name = "benefitsType"];// 1 2
}
message SaveResponse {
string msg = 1 [json_name = "msg"];
string uuid = 2 [json_name = "uuid"];
int64 cancelNum = 3 [json_name = "cancelNum"];
}
//
message SelectValueAddService {
string valueAddUuid = 1 [json_name = "valueAddUuid"];
string serviceName= 2 [json_name = "serviceName"];
bool isDisplay = 3 [json_name = "isDisplay"];
int32 serviceType = 4 [json_name = "serviceType"];
string serviceName= 2 [json_name = "serviceName"];//
bool isDisplay = 3 [json_name = "isDisplay"];//
int32 serviceType = 4 [json_name = "serviceType"];//
int32 quotaType = 5 [json_name = "quotaType"];// 1 2
int32 quotaValue = 6 [json_name = "quotaValue"];//
bool isExpired = 7 [json_name = "isExpired"];//
int32 defaultServiceValue = 8 [json_name = "defaultServiceValue"];//
}
//
message SelectValueAdditionalService {
string valueAddUuid = 1 [json_name = "valueAddUuid"];
string serviceName= 2 [json_name = "serviceName"];//
bool isDisplay = 3 [json_name = "isDisplay"];//
int32 serviceType = 4 [json_name = "serviceType"];//
int32 quotaType = 5 [json_name = "quotaType"];// 1 2
int32 quotaValue = 6 [json_name = "quotaValue"];//
bool isExpired = 7 [json_name = "isExpired"];//
int32 defaultServiceValue = 8 [json_name = "defaultServiceValue"];//
}
message DelBundleRequest {
string uuid = 1 [json_name = "uuid"];
}
@ -501,21 +527,28 @@ message FinancialConfirmationRequest {
message ValueAddService {
string uuid = 1 [json_name = "uuid"];
string serviceName = 2 [json_name = "serviceName"]; //
int32 serviceType = 3 [json_name = "serviceType"];
repeated ValueAddServiceLang serviceLang = 4 [json_name = "serviceLang"];
int32 serviceType = 3 [json_name = "serviceType"]; //
repeated ValueAddServiceLang serviceLang = 4 [json_name = "serviceLang"]; //
int32 quotaType = 5 [json_name = "quotaType"];// 1 2
int32 quotaValue = 6 [json_name = "quotaValue"];//
bool isExpired = 7 [json_name = "isExpired"];//
int32 defaultServiceValue = 8 [json_name = "defaultServiceValue"];//
}
message ValueAddServiceLang {
string uuid = 1 [json_name = "uuid"];
string serviceName = 2 [json_name = "serviceName"]; //
int32 serviceType = 3 [json_name = "serviceType"];
int32 priceMode = 4 [json_name = "priceMode"];
string originalPrice = 5 [json_name = "originalPrice"];
string unit = 6 [json_name = "unit"];
int64 priceType = 7 [json_name = "priceType"];
string language = 8 [json_name = "language"];
int32 serviceType = 3 [json_name = "serviceType"]; // 1: 2: 3: 4: 5:
int32 priceMode = 4 [json_name = "priceMode"]; // 1: 2:
string originalPrice = 5 [json_name = "originalPrice"];//
string unit = 6 [json_name = "unit"];// 1: 2: 3: 4: 5: 6: 7: 8: 9:
int64 priceType = 7 [json_name = "priceType"];// 1: 2: 3: 4:
string language = 8 [json_name = "language"];// zh-CN zh-TW EN de-DE ja-JP()
string createdAt = 9 [json_name = "createdAt"];
string updatedAt = 10 [json_name = "updatedAt"];
repeated ValueAddPriceOptions options = 12 [json_name = "options"];
repeated ValueAddPriceOptions options = 11 [json_name = "options"];
int32 quotaType = 12 [json_name = "quotaType"]; // 1 2
int32 quotaValue = 13 [json_name = "quotaValue"]; //
bool isExpired = 14 [json_name = "isExpired"]; // false true
}
//
message ValueAddPriceOptions {
@ -524,14 +557,15 @@ message ValueAddPriceOptions {
string symbol = 3 [json_name = "symbol"];
string price = 4 [json_name = "price"];
string saveAmount = 5 [json_name = "saveAmount"];
bool isDefault = 6 [json_name = "isDefault"]; //
}
//
message ValueAddServiceListRequest {
int32 page = 1 [json_name = "page"];
int32 pageSize = 2 [json_name = "pageSize"];
string name = 3 [json_name = "name"];
string language = 4 [json_name = "language"];
string name = 3 [json_name = "name"]; //
int32 serviceType = 4 [json_name = "serviceType"]; //
string language = 5 [json_name = "language"]; // (使)
}
message ValueAddServiceListResponse {
int32 total = 1 [json_name = "total"];

File diff suppressed because it is too large Load Diff

View File

@ -95,6 +95,13 @@ func (this *BundleProfile) Validate() error {
}
}
}
for _, item := range this.SelectValueAdditionalService {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("SelectValueAdditionalService", err)
}
}
}
for _, item := range this.BundleProfileLang {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
@ -105,6 +112,16 @@ func (this *BundleProfile) Validate() error {
return nil
}
func (this *BundleProfileLang) Validate() error {
for _, item := range this.ServiceLangInfo {
if item != nil {
if err := github_com_mwitkow_go_proto_validators.CallValidatorIfExists(item); err != nil {
return github_com_mwitkow_go_proto_validators.FieldError("ServiceLangInfo", err)
}
}
}
return nil
}
func (this *ServiceLangInfo) Validate() error {
return nil
}
func (this *SaveResponse) Validate() error {
@ -113,6 +130,9 @@ func (this *SaveResponse) Validate() error {
func (this *SelectValueAddService) Validate() error {
return nil
}
func (this *SelectValueAdditionalService) Validate() error {
return nil
}
func (this *DelBundleRequest) Validate() error {
return nil
}

View File

@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-triple. DO NOT EDIT.
// versions:
// - protoc-gen-go-triple v1.0.5
// - protoc v6.32.0
// - protoc v5.26.0
// source: pb/bundle.proto
package bundle

View File

@ -18,6 +18,11 @@ const (
JA_JP = "ja-JP" //日语
)
const (
Benefits = 1 //套餐权益
OptionalBenefits = 2 //套餐可选附加权益
)
const (
Http = 200
OriginalPrice = 3500 // 注意!!!这边是原始价格如果发生更改,则默认增值套餐需要停用,并且新增新的增值套餐(功能未做)
@ -100,3 +105,18 @@ const (
ErrorValueServicePriceModeEmpty = "增值服务价格模式不能为空"
ErrorValueServiceOptionsEmpty = "增值服务选项不能为空"
)
// 服务额度信息
const (
UnlimitedQuota = 1 //不限额度
LimitedQuota = 2 //限制额度
)
// 服务类型
const (
VideoService = 1 //视频
TextService = 2 //图文
DataReportService = 3 //数据报表
AccountService = 4 //账号数
AvailableTimeService = 5 //可用时长
)

3
protocBundle.bat Normal file
View File

@ -0,0 +1,3 @@
@echo off
protoc -I . -I ./pb --proto_path=./pb --go_out=./pb --go-triple_out=./pb --govalidators_out=./pb ./pb/bundle.proto
.\clear.sh